Kategorien
-
Neueste Beiträge
- [ABAP] Model-Provider (MPC) und Data-Providerklassen (DPC) zu einem OData-Service ermitteln
- [SAP] Anpassungen von Datenbanktabellen umsetzen
- [SAP] Übersicht modulspezifischer SAP-Tabellen
- [ABAP] BDS-Grafiken (Bitmaps) auslesen und anzeigen
- [ABAP] Benutzerparameter lesen/setzen
- [ABAP] CDS-View zur Anzeige von Änderungsbelegen
- Physik
- [ABAP] ABAP-Sprache aus T002, T002T und T002TX lesen (xco_cp_language)
- [ABAP] Workflow: Inhalt (Workitems) der MyInbox eines Users auflisten
- [ABAP] SAP-Office: Emails und Attachements lesen
Schlagwort: AMDP
[ABAP] Dynamische WHERE-Clause für AMDP aus SELECT-OPTIONS / RANGES generieren
Bei Datenbankzugriffen mit AMDP / NATIVE SQL besteht nicht die Möglichkeit einfach RANGES in den SELECT-Statements zu übergeben.
Die RANGES müssen dazu zuerst in einen String umgewandelt werden. Dieser String kann dann in der WHERE-Condition verarbeitet werden.
Variante 1 (cl_shdb_seltab)
DATA: lv_usnam TYPE rkpf-usnam.
SELECT-OPTIONS: so_usnam FOR lv_usnam.
INITIALIZATION.
so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' )
( sign = 'I' option = 'EQ' low = 'USER2' high = '' )
).
START-OF-SELECTION.
* wandelt ein SELECT-OPTIONS / RANGE in WHERE-String um
TRY.
* WHERE-Condition ohne fehlerhaft gesetzte Klammern und unnötige Leerzeichen
DATA(lv_where) = condense( cl_shdb_seltab=>new( so_usnam[] )->sql_where_condition( 'USNAM' ) ).
WRITE: / lv_where.
CATCH cx_root INTO DATA(e_txt).
ENDTRY.
Variante 2 (cl_shdb_seltab, erzeugt fehlerhaftes WHERE-Statement)
DATA: lv_usnam TYPE rkpf-usnam.
SELECT-OPTIONS: so_usnam FOR lv_usnam.
INITIALIZATION.
so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' )
( sign = 'I' option = 'EQ' low = 'USER2' high = '' )
).
START-OF-SELECTION.
* wandelt ein oder mehrere SELECT-OPTIONS / RANGE in WHERE-String um
TRY.
* WHERE-Condition mit fehlerhaft gesetzte Klammern und unnötigen Leerzeichen
DATA(lv_where) = cl_shdb_seltab=>combine_seltabs(
it_named_seltabs = VALUE #(
(
name = 'USNAM' " RKPF-USNAM
dref = REF #( so_usnam[] ) " Referenz auf SELECT-OPTIONS / RANGE
)
)
).
WRITE: / lv_where.
CATCH cx_root INTO DATA(e_txt).
ENDTRY.
Variante 3 (cl_lib_seltab, OBSOLET)
DATA: lv_usnam TYPE rkpf-usnam.
SELECT-OPTIONS: so_usnam FOR lv_usnam.
INITIALIZATION.
so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' )
( sign = 'I' option = 'EQ' low = 'USER2' high = '' )
).
START-OF-SELECTION.
* wandelt ein SELECT-OPTIONS / RANGE in WHERE-String um
TRY.
* WHERE-Condition ohne fehlerhaft gesetzte Klammern und unnötige Leerzeichen
DATA(lv_where) = condense( cl_lib_seltab=>new( so_usnam[] )->sql_where_condition( 'USNAM' ) ).
WRITE: / lv_where.
CATCH cx_root INTO DATA(e_txt).
ENDTRY.
Variante 4 (FREE_SELECTIONS_RANGE_2_WHERE)
DATA: lv_usnam TYPE rkpf-usnam.
SELECT-OPTIONS: so_usnam FOR lv_usnam.
INITIALIZATION.
so_usnam[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'USER1' high = '' )
( sign = 'I' option = 'EQ' low = 'USER2' high = '' )
).
START-OF-SELECTION.
DATA(it_ranges) = VALUE rsds_trange(
(
* Tabellenname
tablename = 'RKPF'
frange_t = VALUE #(
(
* Feldname
fieldname = 'USNAM'
* RANGE aus SELECT-OPTIONS
selopt_t = VALUE #( FOR <so> IN so_usnam
(
sign = <so>-sign
option = <so>-option
low = <so>-low
high = <so>-high
)
)
)
)
)
).
* Rückgabe
DATA: it_where TYPE rsds_twhere.
* Freie Abgrenzungen: Konvertierung Format RSDS_TRANGE ==> RSDS_TWHERE
CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'
EXPORTING
field_ranges = it_ranges
IMPORTING
where_clauses = it_where.
* Ausgabe
LOOP AT it_where ASSIGNING FIELD-SYMBOL(<e>).
WRITE: / 'Table:', <e>-tablename.
LOOP AT <e>-where_tab ASSIGNING FIELD-SYMBOL(<w>).
WRITE: / <w>-line.
ENDLOOP.
ENDLOOP.
Links
[AMDP] Mit AMDP arbeiten
- Step-by-Step procedure for creation, execution and storing of ABAP Managed Database Procedures in HANA
http://www.sapyard.com/abap-on-sap-hana-part-ix-amdp-abap-managed-database-procedure/
- ABAP Managed Database Procedure
https://blogs.sap.com/2021/10/26/abap-managed-database-procedure/
- Tutorial zu AMDP
https://otremba.net/wiki/AMDP_(ABAP)
- Übersicht zu AMDP
https://www.brandeis.de/blog/amdp-coding-guidelines
- AMDP Coding Guidelines