Bei der Entwicklung von ABAP-Programmen stößt man ab und zu auf Szenarien, in denen SQL-Abfragen dynamisch erstellt werden müssen, um den unterschiedlichen Anforderungen gerecht zu werden. In solchen Fällen kann der SAP-Funktionsbaustein RH_DYNAMIC_WHERE_BUILD eine große Hilfe sein, um dynamische Where-Bedingungen zu generieren. In dieser Anleitung möchte ich zeigen, wie der Funktionsbaustein verwendet werden kann und was es dabei zu beachten gibt.
Beispielanwendung des Funktionsbausteins RH_DYNAMIC_WHERE_BUILD
Werfen wir einen Blick auf ein einfaches Codebeispiel, das zeigt, wie dieser Funktionsbaustein verwendet werden kann. Im Folgenden erkläre ich die relevanten Strukturen und den Ablauf des Codes:
TYPES : BEGIN OF ty_where_clause,
line TYPE char72,
END OF ty_where_clause.
DATA: lt_condtab TYPE TABLE OF hrcond,
lt_where_clause TYPE STANDARD TABLE OF ty_where_clause.
DATA: lv_table_name TYPE dd02l-tabname.
CALL FUNCTION ‘RH_DYNAMIC_WHERE_BUILD’
EXPORTING
dbtable = lv_table_name
TABLES
condtab = lt_condtab
where_clause = lt_where_clause
EXCEPTIONS
empty_condtab = 1
no_db_field = 2
unknown_db = 3
wrong_condition = 4
OTHERS = 5.
Codeanalyse
- Typdefinition und Datendeklaration: Zuerst wird der Typ ty_where_clause definiert. Dieser Typ enthält eine Zeile vom Typ char72. Diese Tabelle wird später verwendet, um die generierte WHERE-Klausel zu speichern. Anschließend werden die internen Tabellen lt_condtab und lt_where_clause sowie die Variable lv_table_name definiert. lt_condtab wird für die Bedingungen verwendet, die zur Erstellung der WHERE-Klausel verwendet werden sollen.
- Aufruf des Funktionsbausteins: Der Funktionsbaustein RH_DYNAMIC_WHERE_BUILD wird aufgerufen, um eine dynamische WHERE-Klausel zu erzeugen. Dabei werden die relevanten Parameter übergeben:
- EXPORTING: Hier wird lv_table_name übergeben, was den Namen der Datenbanktabelle angibt, auf die sich die Bedingungen beziehen sollen.
- TABLES: lt_condtab enthält die Bedingungen, die für die WHERE-Klausel genutzt werden. lt_where_clause dient dazu, die resultierende dynamische WHERE-Klausel zu speichern.
Die Struktur HRCOND und deren Befüllung
Um den Funktionsbaustein RH_DYNAMIC_WHERE_BUILD korrekt nutzen zu können, ist es wichtig, die Struktur der Tabelle lt_condtab zu verstehen, die vom Typ hrcond ist. Die Struktur hrcond definiert die Bedingungen, die für die WHERE-Klausel verwendet werden. Sie enthält folgende Felder:
- FIELD (Typ CHAR, Länge 30): In diesem Feld wird das jeweilige Datenbankfeld angegeben, auf das die Bedingung angewendet werden soll. Zum Beispiel könnte hier der Name einer Spalte einer Tabelle stehen, wie z.B. MATNR für Materialnummer.
- OPERA (Typ CHAR, Länge 2): In diesem Feld wird der Operator angegeben, der für die Bedingung verwendet wird. Typische Beispiele sind EQ (Equal), NE (Not Equal), GT (Greater Than), LT (Less Than) und so weiter. Der Operator bestimmt, wie die Bedingung angewendet wird.
- LOW (Typ CHAR, Länge 20): Dieses Feld enthält den Wert, der für die Bedingung verwendet wird. Es handelt sich um den niedrigeren Wert in der Bedingung (z.B. bei Bereichsangaben).
- HIGH (Typ CHAR, Länge 20): Dieses Feld wird bei Bereichsangaben verwendet. Wenn beispielsweise geprüft werden soll, ob ein Wert in einem bestimmten Bereich liegt, wird hier der obere Wert des Bereichs angegeben. Bei einfachen Vergleichsoperatoren wird dieses Feld leer gelassen.
Beispiel für die Befüllung der Tabelle lt_condtab:
DATA: ls_condtab TYPE hrcond.
CLEAR ls_condtab.
ls_condtab-field = ‘MATNR’. ” Datenbankfeld Materialnummer
ls_condtab-opera = ‘EQ’. ” Gleichheitsoperator
ls_condtab-low = ‘1001’. ” Wert, der geprüft werden soll
APPEND ls_condtab TO lt_condtab.
Durch die Verwendung der Struktur hrcond können flexibel verschiedene Bedingungen definiert und diese später zur Erstellung der dynamischen WHERE-Klausel genutzt werden.
Vorteile der Verwendung von RH_DYNAMIC_WHERE_BUILD
Die Verwendung des Funktionsbausteins RH_DYNAMIC_WHERE_BUILD bietet mehrere Vorteile:
- Flexibilität: Der Funktionsbaustein ermöglicht es, WHERE-Klauseln zur Laufzeit dynamisch zu generieren. Das ist besonders hilfreich, wenn Programme, die eine Vielzahl an Bedingungen verarbeiten müssen, deren Kombination erst zur Laufzeit festlegen.
- Einfache Bedingungsdefinition: Die Bedingungen werden in einer internen Tabelle („condtab“) definiert. Dies ermöglicht eine Übersicht über die genutzten Bedingungen.
- Vermeidung von Fehlern bei der SQL-Generierung: Da der Funktionsbaustein die Bedingungen syntaktisch korrekt zu einer WHERE-Klausel verarbeitet, wird das Risiko von Fehlern durch falsch formatierte SQL-Befehle minimiert.
Fazit
Der Funktionsbaustein RH_DYNAMIC_WHERE_BUILD bietet eine einfache Lösung zur Erstellung dynamischer WHERE-Klauseln in ABAP. Besonders in Situationen, in denen die Bedingungen dynamisch zur Laufzeit generiert werden oder der Benutzer die Abfrageparameter selbst festlegen möchte, erweist sich der Einsatz als sehr vorteilhaft.