Während der ABAP-Codierung tritt häufig eine typische Aufgabe auf - andere Felder anhand der Werte einiger Felder der internen Tabelle zu initialisieren (Auswahl aus der Datenbanktabelle durch Aufrufen von FM-Unterprogrammen). Und der Code ist in diesem Fall in Bezug auf den Algorithmus sehr einfach, aber es ist ziemlich viel. Ich wollte immer den Zeitaufwand für solche Routineoperationen reduzieren. Und er schrieb sogar eine Methode, die auf der dynamischen Erstellung von Programmen basiert,
um Referenzwerte anhand ihrer Schlüssel aus den Datenbanktabellen auszuwählen .
In den Kommentaren darauf hingewiesen
"
Unlesbarkeit des Codes " ist Ihre Mikrosprache, die Sie lernen müssen.
"
Dynamische Aufrufe " -
Dynamische Aufrufe sind nicht erwünscht. In diesem Fall findet das Nutzungsprotokoll keinen Platz für die Verwendung der entsprechenden Tabellen / Felder.
Als Alternative schlug ich immer noch eine Option mit automatischer Codegenerierung vor, aber erst jetzt brachte ich dieses Ding zu einem
fertigen Werkzeug . Wen kümmert es bitte unter der Katze.
Die Idee ist einfach: Es gibt eine Reihe von Parametern, mit denen ein ABAP-Code gemäß einer bestimmten Vorlage generiert wird.
Nehmen wir ein einfaches Beispiel: Geben Sie in der internen Tabelle den Namen des BE in den Wert des BE ein. Sprechen in der Fachsprache des Entwicklers:
Geben Sie in der internen Tabelle den Wert des Feldes BUTXT gemäß der Datenbanktabelle T001 durch den Wert des Felds BUKRS ein .
Einfache Aussage in nur einem Satz. Um dies zu realisieren, müssen Sie entweder LOOP für die interne Tabelle und SELECT SINGLE in einer Schleife ausführen (was schnell ist, aber aus Sicht der Geschwindigkeit nicht sehr willkommen ist, insbesondere wenn die interne Tabelle viele Zeilen enthält) oder eindeutige BUKRS-Werte auswählen, eine Abfrage an die Datenbanktabelle T001, und dann setzen wir die entsprechenden Werte des BUTXT-Feldes durch READ TABLE. In diesem Fall ist der Code optimaler, aber das Schreiben ist nicht so schnell, da dieser Code bereits viel ist. Darüber hinaus ist nichts Kompliziertes daran - eine fast einfache „Affen“ -Aufgabe zum Tippen.
Und hier kommt der automatische Generator zur Rettung, weil ein solcher Code eine Boilerplate-Form hat, was bedeutet, dass sein Schreiben automatisiert werden kann.
Geben Sie die folgenden Parameter an:
DB-Tabelle:
T001Kommunikationsfelder:
BUKRSinitialisierte Felder:
BUTXTund erhalten Sie den folgenden generierten Code*-- T001 FORM values_from_tab_T001 USING "-- () uv_in_BUKRS TYPE any "-- uv_out_BUTXT TYPE any CHANGING "-- ct_table TYPE ANY TABLE . "-- ? CHECK NOT ( ct_table[] IS INITIAL ). "-- TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "-- LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "-- SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "-- SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "-- SORT lt_item BY BUKRS. "-- LOOP AT ct_table ASSIGNING <ls_table>. "-- ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "-- ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "-- READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM.
Jetzt reicht es aus, die generierte Unterroutine in Ihrem Programm aufzurufen
PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE.
Zeigen Sie den Code auf der
ABAP-Generator- Website an
Die Namen der Felder in der internen Tabelle und der internen Tabelle selbst werden als Parameter an das Unterprogramm übergeben. Nach dem Aufruf hat das Feld BUTXT den gewünschten Wert.
Die Namen der Felder in der internen Tabelle werden in Form von Parametern erstellt, sodass dieselbe Unterroutine für verschiedene Felder aufgerufen werden kann. Das heißt, Wenn die interne Tabelle zwei BE-Felder enthält (z. B. BUKRS1 und BUKRS2), müssen Sie nur eine Unterroutine generieren und zweimal aufrufen
PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE.
In diesem Fall wird "Nichtoptimalität" angezeigt, da zwei SELECT aus der Datenbanktabelle T001 vorhanden sind. Im Idealfall können Sie jedoch alles über eine ausführen. Dies sind jedoch die Kosten für die Automatisierung. Es ist unwahrscheinlich, dass dies die Ausführung des Programms erheblich verlangsamt. Bei Bedarf können Sie das Unterprogramm jedoch jederzeit für Ihre privaten Anforderungen „fertigstellen“.
Sie können mehrere Felder gleichzeitig initialisieren und unter Bedingungen Konstanten angeben (z. B. Sy-Sprache, die häufig bei der Auswahl von Texten verwendet wird). Im Standardbeispiel werden die
Namen des UE gemäß Tabelle T006A ausgewählt.
Beim Generieren des Codes wird auch ein Link erstellt, über den das erstellte Beispiel im Browser geöffnet werden kann.
Derzeit befinden sich mehrere Vorlagen im Generator:
- Struktur definieren [+ Tabellentyp] - Struktur + Tabellentyp + Tabelle dieses Typs + Tabellenarbeitsbereich + Feldsymbol der Tabelle definieren. Dies ist nicht immer erforderlich, aber es ist einfacher, die generierte zu löschen, als sie manuell einzugeben
- Das Entfernen doppelter Datensätze aus der internen Tabelle nach Feldern ist ein sehr einfacher Generator. Im Allgemeinen kann ein solcher Code manuell geschrieben werden. Wenn jedoch viele Felder vorhanden sind, ist es meiner Meinung nach besser, diese Vorlage zu verwenden
- Wählen Sie Referenzwerte aus der Datenbanktabelle aus - die oben beschriebene Vorlage
- Referenzwerte auswählen - Mit der Vorlage können Sie Feldwerte über einen Aufruf von FM-Unterprogrammen festlegen. In diesem Fall werden die Anrufe zwischengespeichert.
- Wählen Sie Referenzwerte aus der Domäne aus. Diese Vorlage enthält keine Parameter und wurde hinzugefügt, um diesen Code nur in Ihr Programm kopieren zu können
Ich denke, eine detaillierte Beschreibung der Funktionsweise jeder Vorlage ist nicht sinnvoll, da es einfacher ist, das Ergebnis ihrer Arbeit auf der
Website zu sehen . Jede Vorlage hat Standardwerte für ihre Parameter. Wenn Sie ein Abap-Entwickler sind, werden Sie den Code schnell verstehen.