Tabellen durchscannnen - Laufzeitoptimierung Z_SCAN_TABLE

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
2 Beiträge • Seite 1 von 1
2 Beiträge Seite 1 von 1

Tabellen durchscannnen - Laufzeitoptimierung Z_SCAN_TABLE

Beitrag von jspranz (ForumUser / 76 / 5 / 0 ) »
Hey,

da ich kein Tool kenne um die Tabellen in einem SAP-System zu durchsuchen (nicht eine einzelne und ein einzelnes Feld -> SE16), sondern über alle Tabellen, habe ich mir eins gebastelt.

Das Problem ist, daß es viel zu langsam ist. Vielleicht hat jemand eine Idee, wie man es anders hinbekommen könnte...

Code: Alles auswählen.


REPORT  z_scan_table                         .

DATA: itab  TYPE TABLE OF zide_scan_table WITH HEADER LINE.
DATA: lv_dummy_search(50).

DATA: BEGIN OF itab_verz OCCURS 0,
        tabname   TYPE tabname16,
      END OF itab_verz.
**************************************************************************
* Tabellenname
SELECT-OPTIONS: s_tabn FOR itab-tabname,
* Searchstring
                s_search FOR lv_dummy_search NO INTERVALS LOWER CASE.
* Groß-Kleinschreibung berücksichtigen
PARAMETERS:     p_upper AS CHECKBOX default 'X'.
* Protokolldatei löschen
PARAMETERS: p_delete AS CHECKBOX.


**************************************************************************
INITIALIZATION.
  itab-mandt = sy-mandt.
  itab-sysid = sy-sysid.
  itab-dbsys = sy-dbsys.
  itab-created_from = sy-uname.
  CALL FUNCTION 'BBP_PD_CONVERT_DATETIME_TO_TS'
    EXPORTING
      iv_date       = sy-datum
      iv_time       = sy-uzeit
      iv_time_zone  = sy-zonlo
    IMPORTING
      ev_timestamp  = itab-created_at
    EXCEPTIONS
      convert_error = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

START-OF-SELECTION.
* Groß-Kleinschreibung ignorieren -> in Großbuchstaben umwandeln
  IF p_upper = 'X'.
    LOOP AT s_search.
      TRANSLATE s_search-low TO UPPER CASE.
      TRANSLATE s_search-high TO UPPER CASE.
      MODIFY s_search.
    ENDLOOP.
  ENDIF.

  SELECT tabname FROM dd02l INTO TABLE itab_verz WHERE tabname IN s_tabn
                                                 AND tabclass = 'TRANSP'.
  LOOP AT itab_verz.
    PERFORM scan_table.
  ENDLOOP.
  PERFORM ausgabe.

*&---------------------------------------------------------------------*
*&      Form  scan_table
*&---------------------------------------------------------------------*
FORM scan_table.

  TYPE-POOLS: slis.
  DATA: ct_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

  DATA: lv_tabname TYPE slis_tabname.
  lv_tabname = itab_verz-tabname.
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = lv_tabname
    CHANGING
      ct_fieldcat      = ct_fieldcat[].
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  itab-tabname = itab_verz-tabname.
*
* Datendefintion
*
  DATA: itabref  TYPE REF TO data.
  CREATE DATA itabref TYPE STANDARD TABLE OF (itab-tabname).
  FIELD-SYMBOLS: <fs>  TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <fs_line> TYPE ANY.
  FIELD-SYMBOLS: <fs_value> TYPE ANY.
  ASSIGN itabref->* TO <fs>.

  REFRESH <fs>.
  SELECT * FROM (itab-tabname) INTO TABLE <fs>.

  DATA: lv_vgl_value TYPE char30k.

  LOOP AT <fs> ASSIGNING <fs_line>.
    LOOP AT ct_fieldcat.
      ASSIGN COMPONENT ct_fieldcat-fieldname OF STRUCTURE <fs_line> TO <fs_value>.
      lv_vgl_value = <fs_value>.
      IF p_upper = 'X'.
        TRANSLATE lv_vgl_value TO UPPER CASE.
      ENDIF.
      IF lv_vgl_value IN s_search.

        itab-fieldname = ct_fieldcat-fieldname.
        READ TABLE itab WITH KEY tabname   = itab-tabname
                                 fieldname = itab-fieldname.
        IF sy-subrc = 0.
          itab-anz = itab-anz + 1.
          MODIFY itab INDEX sy-tabix.
        ELSE.
          itab-anz = 1.
          APPEND itab.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

ENDFORM.                    "scan_table
*&---------------------------------------------------------------------*
*&      Form  ausgabe
*&---------------------------------------------------------------------*
FORM ausgabe .
*
* Ausgabe in Druck oder Bildschirm
*
  IF sy-batch = 'X'.
    DATA: lv_pripar TYPE pri_params,
          lv_arcpar TYPE arc_params.
    MOVE-CORRESPONDING sy TO lv_pripar.

    NEW-PAGE PRINT ON NO DIALOG
                      PARAMETERS lv_pripar.
*                    ARCHIVE PARAMETERS lv_arcpar.
  ENDIF.
  LOOP AT itab.
    WRITE: / itab-tabname, itab-fieldname, itab-anz.
    itab-spono = sy-spono. "Spoolnummer (wird für DB-dann benötigt)
    MODIFY itab.
  ENDLOOP.
*
* Datenbank
*
  IF p_delete = 'X'.
    DELETE FROM z_scan_table.
  ENDIF.

  INSERT  z_scan_table FROM TABLE itab ACCEPTING DUPLICATE KEYS.

ENDFORM.                    " ausgabe

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Hallo jspranz,

hier ein paar Anmerkungen zu deinem Tabellenscan:
- Beim Loop über ct_fieldcat würde ich auch mit ASSIGNING arbeiten. Da dieser Loop häufig durchlaufen wird, sollte das etwas bringen
- Vermutlich wird man in der Regel eher nach Zeichenketten suchen. Deshalb würde ich für die Suche nur reine Zeichenfelder berücksichtigen (Type F,I,P,N,D,T,X würde ich von der Suche ausschliessen). Man könnte dann noch zusätzlich die Feldlängen berücksichtigen: die zu durchsuchenden Felder müssen mindestens solange sein wie der kleinste eingegebene Suchstring. Ggf. könnte man einen Schalter einbauen, der diesen Filter steuert. Das setzt jedoch vorraus, das nicht mit EXCLUDE oder ähnlichem gesucht wird.
- Diesen "Filter" könntest du dann beim Select berücksichtigen, indem du nur die gewünschten Felder selektierst, was sehr viel Performance bringen kann.
- Ausserdem solltest du beim Loop über ct_fieldcat ebenfals mit WHERE entsprechend filtern, indem du nur die relevanten Felder bearbeitest.
- ich würde nicht mit einem Hilfsfeld (lv_vgl_value) arbeiten (das bringt nur unnötige Einschränkungen), sondern direkt auf dem Tabellenfeld (<fs_value>). ABAP machte beim Vergleich bereits eine Konvertierung.
- die Tabelle itab würde ich mit COLLECT aufbauen - der ist Pfeilschnell (siehe Doku dazu)

mfg dele

Seite 1 von 1

Vergleichbare Themen

5
Antw.
2268
Views
Laufzeitoptimierung
von ABAP_DEV » 27.07.2020 14:50 • Verfasst in ABAP® Core
0
Antw.
906
Views
SCAN ABAP-SOURCE
von ewx » 03.11.2016 17:38 • Verfasst in ABAP® Core
17
Antw.
12991
Views
Laufzeitoptimierung: Tuning-Challenge - Part I
von black_adept » 25.05.2004 15:41 • Verfasst in Tips + Tricks & FAQs
2
Antw.
1847
Views
Dynpro-Drucktasten per scan anprechen
von michi74 » 29.09.2011 20:10 • Verfasst in Dialogprogrammierung
0
Antw.
1908
Views
Livelink Enterprise Scan mit Ixos Software
von Nicole_80 » 21.07.2008 17:03 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 72
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141