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 ) …
Verwendung
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
1 2 3 4 5 6 7 |
DATA(firstfoundpartner) = but000_records[ 1 ]-partner. SELECT FROM I_BusinessPartner FIELDS BusinessPartner, BusinessPartnerName WHERE BusinessPartner = @firstfoundpartner INTO TABLE @DATA(partners). |
wird eines:
1 2 3 4 5 |
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)
1 2 3 4 5 6 7 |
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
1 2 3 4 5 |
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
1 2 3 |
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:
- get_table_name
- get_partner
- get_upto
1 2 3 4 5 6 7 |
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. |
Performance
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.
Security
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:
1 2 3 4 5 |
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:
1 2 3 4 5 |
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!
Fazit
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!