Regeln
Ein Skript enthält ein oder mehrere Statements, getrennt durch Semikolon. Das letzte braucht keines. Schlüsselwörter unterscheiden nicht zwischen Groß- und Kleinschreibung. Namen von Tabellen, Feldern, Funktionsbausteinen und Reports stehen so wie in SAP.
Strings stehen in einfachen oder doppelten Anführungszeichen, ein Anführungszeichen im String wird verdoppelt. Ein Pass-Through-String zwischen eckigen Klammern oder zwischen senkrechten Strichen geht unverändert an SAP und darf über mehrere Zeilen laufen. Er enthält MDX-Statements und Namen mit Sonderzeichen. Kommentare beginnen mit zwei Schrägstrichen und reichen bis zum Zeilenende, oder sie stehen zwischen /* und */.
Jedes Statement schreibt sein Ergebnis in eine Variable. Ohne INTO ist das @RETVAL, die Tabelle, die der Aufrufer bekommt. INTO @name legt ein Ergebnis unter einem anderen Namen für ein späteres Statement ab. INTO RESULTSET ist dasselbe wie INTO @RETVAL.
// Die Buchungskreise in Deutschland
SELECT BUKRS, BUTXT, ORT01 FROM T001 WHERE LAND1 = 'DE';
/* Aufbewahrt für ein späteres Statement */
SELECT TOP 100 * FROM T001W INTO @plants
Tabellen
Die Form des Statements:
SELECT [TOP n [SKIP n]] * | Feld [AS Alias], ...
FROM [TABLE] Name [INTO @Variable] [WHERE Ausdruck] [WITH-OPTIONS(...)]
TOP begrenzt das Ergebnis, SKIP lässt davor die ersten Zeilen aus. Die Feldliste nennt Spalten der Tabelle, AS gibt einer Spalte einen anderen Namen. Ein Name mit Leerzeichen steht in eckigen Klammern.
SELECT TOP 10 MATNR, MAKTX AS [Kurztext] FROM MAKT WHERE SPRAS = 'D'
Die Zeilen 201 bis 300 des Materialstamms:
SELECT TOP 100 SKIP 200 * FROM MARA
Die WHERE-Klausel ist ein boolescher Ausdruck mit AND, OR und Klammern. Sie vergleicht ein Feld mit einem Wert im internen SAP-Format, ein Datum steht also als JJJJMMTT. Die Operatoren:
= EQ gleich LIKE MP Muster mit % für beliebige Zeichen und _ für eines
<> NE ungleich BETWEEN BT von einem Wert bis zu einem anderen
> GT größer IN (...) einer der aufgezählten Werte
< LT kleiner IS NULL leer, auch IS NOT NULL
>= GE größer oder gleich NOT vor LIKE, BETWEEN und IN
<= LE kleiner oder gleich AND OR ( ) Bedingungen verknüpfen
Fertig- und Halbfabrikate in Stück, außerhalb der Warengruppen mit Z am Anfang, angelegt 2020:
SELECT MATNR, MTART, MEINS FROM MARA
WHERE (MTART = 'FERT' OR MTART = 'HALB')
AND MEINS = 'ST'
AND MATKL NOT LIKE 'Z%'
AND ERSDA BETWEEN '20200101' AND '20201231'
SY-DATUM steht für das aktuelle Datum des SAP-Systems. Die heute angelegten Kundenaufträge:
SELECT VBELN, AUART, VKORG FROM VBAK WHERE ERDAT = SY-DATUM
Der Standardbaustein zum Lesen von Tabellen, RFC_READ_TABLE, liefert höchstens 512 Zeichen je Zeile. Breite Tabellen wie MARA brauchen den Baustein Z_XTRACT_IS_TABLE von Theobald im SAP-System, benannt in WITH-OPTIONS. WITH ist ein Synonym für WITH-OPTIONS.
SELECT * FROM MARA WITH-OPTIONS(CUSTOMFUNCTIONNAME = 'Z_XTRACT_IS_TABLE')
Funktionsbausteine
EXECUTE FUNCTION 'Name'
[EXPORTS Parameter = Wert, ...]
[IMPORTS Parameter INTO @Variable | @Variable = Parameter, ...]
[TABLES Parameter [= Wert] [INTO @Variable], ...]
[CHANGING Parameter [= Wert] [INTO @Variable], ...]
Der Baustein muss remotefähig sein. Die Abschnitte sind aus Sicht des Aufrufers benannt. EXPORTS enthält die Werte, die das Statement hineingibt, IMPORTS die Werte, die es zurücknimmt, TABLES die Tabellenparameter in beide Richtungen und CHANGING die Parameter, die hineingehen und zurückkommen. Im Function Builder von SAP stehen dieselben Parameter umgekehrt, als Import und Export. EXPORTING und IMPORTING sind Synonyme.
Alle Kunden, deren Name mit Th beginnt. Die Tabelle CUSTOMER_T ist das Ergebnis:
EXECUTE FUNCTION 'SD_RFC_CUSTOMER_GET'
EXPORTS NAME1 = 'Th*'
TABLES CUSTOMER_T INTO @RETVAL
Einzelwerte landen in einer Zeile von @RETVAL, in den Spalten, die nach dem Dollarzeichen benannt sind:
EXECUTE FUNCTION 'GET_SYSTEM_TIME_REMOTE'
IMPORTS L_TIME INTO @RETVAL$local, K_TIME INTO @RETVAL$kernel, L_DATE INTO @RETVAL$date
Ein Feld einer Struktur wird mit Bindestrich angesprochen, eine Ebene tief. Der Auftragskopf geht nach @header, die Komponenten werden das Ergebnis:
EXECUTE FUNCTION 'BAPI_PRODORD_GET_DETAIL'
EXPORTS NUMBER = '000060003912', ORDER_OBJECTS-HEADER = 'X', ORDER_OBJECTS-COMPONENTS = 'X'
TABLES HEADER INTO @header, COMPONENT INTO @RETVAL
Ein Tabellenwert beginnt mit seinen Spaltennamen, danach folgt je Klammer eine Zeile. Alle Werte sind Strings:
EXECUTE FUNCTION 'BAPI_USER_GETLIST'
TABLES
SELECTION_RANGE = ((PARAMETER, FIELD, SIGN, OPTION, LOW, HIGH),
('LOGONDATA', 'USTYP', 'I', 'EQ', 'A', ''),
('USERNAME', '', 'I', 'BT', 'A', 'C')),
USERLIST INTO @RETVAL
IMPORTS @name = Parameter behält einen Einzelwert. Ein späteres Statement benutzt ihn überall dort, wo ein Wert erlaubt ist, in einer WHERE-Klausel, in EXPORTS oder als Tabellenparameter. Die aufrufende Anwendung kann Variablen auf demselben Weg übergeben. Die Kundenaufträge zum aktuellen SAP-Datum, in zwei Schritten gelesen:
EXECUTE FUNCTION 'GET_SYSTEM_TIME_REMOTE' IMPORTS @today = L_DATE;
SELECT VBELN, AUART FROM VBAK WHERE ERDAT = @today
Reports
EXECUTE REPORT 'Name' [INTO @Variable] [WHERE Kriterien] [USING 'Variante'] [WITH-OPTIONS(...)]
Der Report läuft in SAP, seine Listausgabe kommt als Tabelle zurück. Dafür braucht es den Baustein Z_XTRACT_IS_REMOTE_REPORT von Theobald im SAP-System. Die Klauseln behalten die gezeigte Reihenfolge.
Mit der Variante VAR01:
EXECUTE REPORT 'RLT10010' USING 'VAR01'
Stattdessen mit einem Selektionsparameter. Mehrere Kriterien sind durch Komma oder AND getrennt:
EXECUTE REPORT 'RLT10010' WHERE T1_LGNUM EQ '001'
Bereiche wie in einer Select-Option, mit dem Vorzeichen I oder E für Einschließen und Ausschließen, einem Operator und einem oder zwei Werten:
EXECUTE REPORT 'RLT10010'
WHERE T1_LGNUM IN ((I, BT, '001', '010'), (E, EQ, '005'))
CUSTOMFUNCTION nennt einen anderen Baustein, SKIPTOPROWS lässt Kopfzeilen der Liste weg, USEBATCH führt den Report als Hintergrundjob aus und wartet auf ihn:
EXECUTE REPORT 'RQMELL10' USING 'VAR01'
WITH-OPTIONS(CUSTOMFUNCTION = 'Z_MY_REMOTE_REPORT', SKIPTOPROWS = '3', USEBATCH = 'true')
SAP Queries
SELECT [TOP n] Felder FROM QUERY 'Arbeitsbereich|Benutzergruppe|Query'
[INTO @Variable] [WHERE Kriterien] [USING 'Variante'] [WITH-OPTIONS(CUSTOMFUNCTIONNAME = '...')]
Der Arbeitsbereich ist G für den globalen Bereich oder S für den Standardbereich. Feldnamen stehen so wie in der Query-Definition, zum Beispiel LIPS-LFIMG. Die Kriterien sprechen die Selektionsfelder der Query an, getrennt durch Komma oder AND, jedes Feld einmal. OR und Klammern gibt es nicht. Die Operatoren sind EQ, NE, GT, LT, GE, LE, MP für ein Muster mit Stern, BT mit zwei Werten und IN mit Bereichen.
SELECT * FROM QUERY 'G|/SAPQUERY/ME/|MEBESTWERTAN' USING 'PLANT1000'
SELECT TOP 20 * FROM QUERY 'G|/SAPQUERY/ME/|MEBESTWERTAN'
WHERE S_WAERS EQ 'EUR', S_MATNR MP '100-4*'
SELECT TOP 30 LIPS-LFIMG, LIPS-MATNR, TEXT_LIKP_KUNNR AS Kundennummer
FROM QUERY 'S|ZTHEO02|ZLIKP'
WHERE SP$00002 BT '0080011000' AND '0080011999'
BW-Cubes
Zwei Wege führen zu einem BW-Cube. BWQUERY nimmt die Variablen einer BW-Query als Kriterien, in derselben Form wie die Bereiche bei Reports. EXECUTE MDX reicht ein MDX-Statement unverändert durch, in einem Pass-Through-String zwischen senkrechten Strichen.
SELECT * FROM BWQUERY '0D_DECU/VARDEMO01' WHERE SALESORG IN ((I, BT, '1000', '4000'))
EXECUTE MDX |
SELECT {[Measures].[0D_COST]} ON COLUMNS,
NON EMPTY [0D_CO_CODE].[LEVEL01].MEMBERS ON ROWS
FROM [$0D_DECU]
|
Metadaten
DESCRIBE liefert den Aufbau eines Objekts statt seiner Daten, zum Beispiel die Felder einer Tabelle, die Parameter eines Funktionsbausteins oder die Varianten eines Reports. CATALOG sucht Objekte nach Namen, LIKE nimmt einen Stern als Platzhalter. Jedes DESCRIBE akzeptiert INTO.
DESCRIBE TABLE 'MAKT' GET FIELDS
DESCRIBE TABLE CATALOG WHERE TABLENAME LIKE 'MAR*'
DESCRIBE STRUCTURE 'BAPIRET2'
GET EXPORTS listet die Parameter, die ein Statement hineingibt, GET IMPORTS die, die es zurückbekommt, GET TABLES die Tabellenparameter und GET TABLES-STRUCTURE die Felder eines davon:
DESCRIBE FUNCTION 'BAPI_USER_GETLIST' GET EXPORTS
DESCRIBE FUNCTION 'BAPI_USER_GETLIST' GET TABLES
DESCRIBE FUNCTION 'SD_RFC_CUSTOMER_GET' GET TABLES-STRUCTURE OF 'CUSTOMER_T'
DESCRIBE FUNCTION CATALOG WHERE FUNCTIONNAME LIKE 'BAPI_USER*'
DESCRIBE REPORT 'RLT10010' GET VARIANTS
DESCRIBE REPORT 'RLT10010' GET SELECTION-PARAMETERS
DESCRIBE REPORT CATALOG WHERE REPORTNAME LIKE 'RLT*'
DESCRIBE QUERY 'G|/SAPQUERY/ME/|MEBESTWERTAN' GET FIELDS
DESCRIBE QUERY 'G|/SAPQUERY/ME/|MEBESTWERTAN' GET SELECTION-PARAMETERS
DESCRIBE QUERY USERGROUP WHERE WORKSPACE EQ 'G'
DESCRIBE QUERY CATALOG WHERE WORKSPACE EQ 'G', USERGROUP LIKE '/SAPQUERY/*'
DESCRIBE BWQUERY '0D_DECU' GET DIMENSIONS
DESCRIBE BWQUERY '0D_DECU' GET MEASURES
DESCRIBE BWQUERY '0D_DECU' GET DIMENSIONS-PROPERTIES OF '0D_CO_CODE'
DESCRIBE BWQUERY '0D_DECU/VARDEMO01' GET VARIABLES
DESCRIBE BWQUERY CATALOG WHERE CUBENAME LIKE '0D_DECU'