SAP-Formulare ohne Frust: Mein Workflow mit dox42
Wer im SAP-Umfeld entwickelt, weiß: Formulare sind oft ein Klotz am Bein. Man verbringt Stunden mit Adobe Forms…
Mit dem ABAP Release 7.50 führte SAP die SQL Host Expressions ein.
Damit ist es möglich, direkt im SQL Statement ABAP Ausdrücke bzw. ABAP Coding zu verwenden.
SELECT … @( HOST-EXPRESSION ) …
Host Expressions können überall im SQL Statement verwendet werden, wo auch Host Variablen verwendet werden können. Und damit ist auch der primäre Nutzen klar:
Wir können Variablendeklarationen einsparen und damit kompakteren Code schreiben.
Aus 2 Kommandos
DATA(firstfoundpartner) = but000_records[ 1 ]-partner.
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName
WHERE BusinessPartner = @firstfoundpartner
INTO TABLE @DATA(partners).wird eines:
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName
WHERE BusinessPartner = @( but000_records[ 1 ]-partner )
INTO TABLE @DATA(partners).Und das funktioniert an vielen Stellen und auch mit funktionalen Methoden (mit Returning Parameter)
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName,
@( get_table_name( ) ) AS TableName
WHERE BusinessPartner = @( get_partner( ) )
INTO TABLE @DATA(partners)
UP TO @( get_upto( ) ) ROWS.aber nicht überall! Bei LIKE und IN geht es leider nicht
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName
WHERE BusinessPartner IN @( host_expression->get_partner_range( ) )
INTO TABLE @DATA(partners)Was aber funktioniert, ist die Datenbereitstellung (ITabs oder Workareas) für INSERT, UPDATE, MODIFY und DELETE
UPDATE but000 FROM TABLE @( get_but000_records( ) ).
DELETE but000 FROM @( VALUE #( partner = 'YYDUMMY121' ) ).
Aufgelöst werden die Host Expressions von links beginnend. Bei dem SELECT würden die Methoden in dieser Reihenfolge ausgeführt:
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName,
@( get_table_name( ) ) AS TableName
WHERE BusinessPartner = @( get_partner( ) )
INTO TABLE @DATA(partners)
UP TO @( get_upto( ) ) ROWS.Da die Expressions bzw. das ABAP Coding ausgeführt werden muss und die Werte auch, wie bei Hostvariablen, an die Datenbank übertragen werden müssen, ergeben sich keine relevanten Laufzeitunterschiede.
Da die Host Expressions zusammen mit dem SQL Befehl ausgeführt werden, sind sie nur bedingt „debuggbar“ und ein ändern der Werte im Debugger wird erschwert.
Ein super Beispiel, wie wir die Sicherheit unserer Codings durch Host Expressions verbessern können, sehen wir in diesem SELECT:
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName
WHERE CreatedByUser = @sy-uname
INTO TABLE @DATA(my_partners).Mit den entsprechenden Berechtigungen kann der Benutzer den Wert von SY-UNAME im Debugger ändern und Einträge anderer Benutzer selektieren.
Mit einer Hostexpression und der passenden Methode, ist das nicht mehr möglich:
SELECT FROM I_BusinessPartner
FIELDS BusinessPartner,
BusinessPartnerName
WHERE CreatedByUser = @( cl_abap_syst=>get_user_name( ) )
INTO TABLE @DATA(really_my_partners).Hinweis: Bei CDS Entities sollte das natürlich über ABAP CDS – Access Control (Data Control Language – DCL) gelöst werden!
Host Expressions revolutionieren jetzt nicht die Verwendung von SQL im ABAP Coding. Sie sind aber ein nettes Feature und richtig eingesetzt, machen sie unser Coding kompakter und sicherer!