Ansicht
Dokumentation

DYNSQL_GENERATE_WHERE_CLAUSE - Dynamische SQL-Generierung (->ADK)

DYNSQL_GENERATE_WHERE_CLAUSE - Dynamische SQL-Generierung (->ADK)

BAL Application Log Documentation   TXBHW - Original Tax Base Amount in Local Currency  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Funktionalität

Dieser Funktionsbaustein generiert abhängig von Steuertabellen eine Where-Clause als interne Tabelle (WHERE_CLAUSE) für ein Select mit dynamischem SQL.

Beispiel

Als Eingabe wird eine interne Tabelle benötigt (CONTROL_TABLE), in der für verschiedene Kombinationen von zwei Schlüsselfeldern Werte für Bedingungen hinterlegt sind. Beispielsweise für die Archivierung der Materialbelege (Report RS07MARC) wird die Tabelle mit Kombinationen von Vorgangsart und Werk gefüllt, für die je ein Datum des frühesten Zeitpunkts der Archivierung festgelegt ist. Der Funktionsbaustein generiert für die in dieser Tabelle definierten Bedingungen die entsprechende Where-Clause.

Aus einer Steuertabelle (CONTROL_TABLE) mit den beiden Einträgen

FELD1 FELD2 FELD3
WA 0001 19980101
WE 0100 19980505

liefert der Aufruf

    CALL FUNCTION 'DYNSQL_GENERATE_WHERE_CLAUSE'
         EXPORTING
              FIELDNAME_KEY_1           = 'VGART'
              FIELDNAME_KEY_2           = 'WERKS'
              FIELDNAME_VALUE           = 'BUDAT'
              OPERATOR                  = '<='
         TABLES
              WHERE_CLAUSE              = DYN_SQL
              CONTROL_TABLE             = ZTVARA
              ALL_VALUES_KEY_1          = VGART_ALL
              VALUES_KEY_1              = VGART_TEIL
              ALL_VALUES_KEY_2          = WERKS_ALL
              VALUES_KEY_2              = WERKS_TEIL
         EXCEPTIONS
              WHERE_CLAUSE_TOO_LARGE         = 1
              WRONG_ENTRY_IN_CONTROL_TABLE   = 2
              KEY_VALUES_INCONSISTENT        = 3
              NO_ENTRY_FOUND                 = 4
              FUNCTION_ALREADY_CALLED        = 5.

die folgende Where-Clause zurück:

BUDAT <= '19980101' AND VGART = 'WA' AND WERKS = '0001' OR
BUDAT <= '19980505' AND VGART = 'WE' AND WERKS = '0100'

Damit nicht jede Kombination der Schlüsselfelder einzeln übergeben werden muß, sind generische Werte für die Schlüssel möglich. Die generischen Schlüssel werden mit Hilfe der vier weiteren Eingabetabellen behandelt. Pro Schlüssel werden dazu die Tabellen ALL_VALUES_KEY_1 bzw. ALL_VALUES_KEY_2 und VALUES_KEY_1 bzw. VALUES_KEY_2 benötigt. In ALL_VALUES_KEY_1 müssen alle auf der Datenbank vorhandenen Werte für den ersten Schlüssel und in VALUES_KEY_1 nur die Werte, die in der Where-Clause berücksichtigt werden sollen, übergeben werden. Für die generischen Werte der Schlüssel gilt, daß diese immer durch eindeutigere Einträge übersteuert werden. Die Steuertabelle mit

FELD1 FELD2 FELD3
W* * 19980101
WA 010* 19980505

und den übrigen Eingabetabellen mit den Einträgen

ALL_VALUES_KEY_1 : WA , WE , WI , WL
VALUES_KEY_1 : WA , WE , WI
ALL_VALUES_KEY_2 : 0001, 0100, 0101, 0102
VALUES_KEY_2 : 0001, 0100, 0101, 0102

ergibt die Where-Clause:

BUDAT <= '19980101' AND ( VGART BETWEEN 'WE' AND 'WL'  OR

                          VGART = 'WA' AND WERKS = '0001'   ) OR

BUDAT <= '19980505' AND   VGART = 'WA' AND

                          WERKS BETWEEN '0100' AND '0102'

Alle Bedingungen werden, um die Where-Clause möglichst kompakt zu halten, mit Hilfe von BETWEEN eingegrenzt. Wenn in der Steuertabelle zwei verschiedene generische Einträge für eine Kombination der Schlüsselfelder vorhanden sind, dann wird der Eintrag berücksichtigt, für den der Schlüssel 1 eindeutiger ist. Eine Steuertabelle mit

FELD1 FELD2 FELD3
* 0001 19980101
WA * 19980505

und den übrigen Eingabetabellen wie oben ergibt:

BUDAT <= '19980101' AND VGART BETWEEN 'WE' AND 'WI' AND

                     WERKS = '0001'                          OR

BUDAT <= '19980505' AND VGART = 'WA'

Für die Auftragsart 'WA' und die Verkaufsorganisation '0001' gilt damit das Buchungsdatum '19980505'. Neben der Bedingung die in der Where-Clause aufgenommen wird können mit der CONTROL_TABLE zwei weitere Felder übergeben werden. Mit Hilfe des Funktionsbausteins DYNSQL_READ_CONTROL_TABLE können diese Werte dann für jede Kombination der beiden Schlüsselfelder ausgelesen werden.





Parameter

ALL_VALUES_KEY_1
ALL_VALUES_KEY_2
CONTROL_TABLE
FIELDNAME_KEY_1
FIELDNAME_KEY_2
FIELDNAME_VALUE
KEY_1_IS_IN_WHERE_CLAUSE
KEY_2_IS_IN_WHERE_CLAUSE
OPERATOR
PRIO_FELD
VALUES_KEY_1
VALUES_KEY_2
WHERE_CLAUSE

Ausnahmen

DYNSQL_TOO_LARGE
FUNCTION_ALREADY_CALLED
KEY_VALUES_INCONSISTENT
NO_ENTRY_FOUND
WRONG_ENTRY_IN_CONTROL_TABLE

Funktionsgruppe

DYNS

TXBHW - Original Tax Base Amount in Local Currency   General Data in Customer Master  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 10308 Date: 20240523 Time: 150837     sap01-206 ( 89 ms )