Das Nachlesen von Attributen ist ein häufiger Grund für eine Routine: die Warengruppe zum Material, das Land zum Kunden, die Kostenstelle zum Auftrag. In ABAP heißt das SELECT mit FOR ALL ENTRIES, das Ergebnis landet in einer internen Tabelle, und ein LOOP mit READ TABLE verteilt die Werte. In SQLScript ist das ein einziger Join.
FOR ALL ENTRIES
Die ABAP-Routine
Die Warengruppe aus der Stammdatentabelle des InfoObjects ZMATERIAL.
METHOD end_routine.
SELECT /bic/zmaterial, /bic/zmatlgrp
FROM /bic/pzmaterial
INTO TABLE @DATA(lt_material)
FOR ALL ENTRIES IN @result_package
WHERE /bic/zmaterial = @result_package-/bic/zmaterial
AND objvers = 'A'.
LOOP AT result_package ASSIGNING FIELD-SYMBOL(<ls_result>).
READ TABLE lt_material INTO DATA(ls_material)
WITH KEY /bic/zmaterial = <ls_result>-/bic/zmaterial.
IF sy-subrc = 0.
<ls_result>-/bic/zmatlgrp = ls_material-/bic/zmatlgrp.
ENDIF.
ENDLOOP.
ENDMETHOD.
Die SQLScript-Fassung
Jede Datenbanktabelle außer inTab und outTab muss in der USING-Klausel der Methode stehen, sonst lässt sich die Routine nicht aktivieren.
METHOD procedure BY DATABASE PROCEDURE FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING /bic/pzmaterial.
Der Rumpf ersetzt SELECT, LOOP und READ TABLE durch einen Join. Tabellen- und Feldnamen mit Schrägstrich stehen in doppelten Anführungszeichen und in Großbuchstaben.
outTab = SELECT src."/BIC/ZMATERIAL",
src.calmonth,
src.amount,
IFNULL( mat."/BIC/ZMATLGRP", '' ) AS "/BIC/ZMATLGRP",
src.record,
src.sql__procedure__source__record
FROM :inTab AS src
LEFT OUTER JOIN "/BIC/PZMATERIAL" AS mat
ON mat."/BIC/ZMATERIAL" = src."/BIC/ZMATERIAL"
AND mat.objvers = 'A';
Die ABAP-Routine prüft sy-subrc und lässt Sätze ohne Treffer unverändert stehen. Genau das tut ein LEFT OUTER JOIN: Jeder Satz aus inTab bleibt erhalten, ob er einen Partner findet oder nicht. Ein INNER JOIN würde Sätze ohne Stammdatum verschlucken. Fehlt der Partner, sind seine Felder NULL; BW erwartet Initialwerte, deshalb IFNULL( …, '' ) bei Zeichenfeldern und IFNULL( …, 0 ) bei Zahlen.