[ABAP] AUTHORITY-CHECK – Objekte in OpenSQL-WHERE-Condition wandeln

* ab ABAP 7.50

* Koverter-Objekt erzeugen
DATA(o_auth) = cl_auth_objects_to_sql=>create_for_open_sql( ).

* Objekte für AUTHORITY-CHECK hinzufügen
o_auth->add_authorization_object( iv_authorization_object = 'S_CARRID'
                                  it_activities = VALUE #( ( auth_field = 'ACTVT' value = '03' ) )
                                  it_field_mapping = VALUE #( ( auth_field = 'CARRID'
                                                                view_field = VALUE #( table_ddic_name = 'SFLIGHT'
                                                                                      field_name      = 'CARRID'
                                                                                    )
                                                              )
                                                            )
                                ).

* Ist der Benutzer berechtigt?
IF abap_true = o_auth->is_authorized( ).

* WHERE-Condition erzeugen
  DATA(lv_where_cond) = o_auth->get_sql_condition( ).

* Wenn leer, dann hat der Benutzer alle Berechtigungen
  IF lv_where_cond IS INITIAL.
    cl_demo_output=>write_data( 'Alle Berechtigungen.' ).
  ELSE.
* Ansonsten eingeschränkte Berechtigungen
    cl_demo_output=>write_data( |Eingeschränkte Berechtigungen: { lv_where_cond }| ).
  ENDIF.

* SELECT mit WHERE-Condition durchführen
  SELECT *
    INTO TABLE @DATA(it_sflight)
    FROM sflight
    WHERE (lv_where_cond).

* Datenausgabe
  cl_demo_output=>write_data( it_sflight ).
  cl_demo_output=>display( ).

ENDIF.

Links

[ABAP] OpenSQL: Coalesce – Fehlende SQL-Werte (NULL) ersetzen

* http://www.cadaxo.com/sql-cockpit/neue-open-sql-features-ab-abap-7-40-sp8/

* DEMO_SQL_EXPR_COALESCE

* Null-Werte (Nicht vorhandene Email-Adressen), die sich aus dem LEFT OUTER JOIN ergeben, werden durch den String '<leer>' ersetzt
CONSTANTS: co_no_email TYPE ad_smtpadr VALUE '<leer>'.

SELECT u~bname,
       u~persnumber,
       u~addrnumber,
       COALESCE( a~smtp_addr, @co_no_email ) AS email
  INTO TABLE @DATA(it_usr)
  FROM usr21 AS u
  LEFT OUTER JOIN adr6 AS a ON a~persnumber = u~persnumber AND a~addrnumber = u~addrnumber.

IF sy-subrc = 0.
  cl_demo_output=>display( it_usr ).
ENDIF.

[ABAP] Datensätze aus einer internen Tabelle zu einer DB-Tabelle hinzufügen

  • COMMIT WORK wird am Programmende automatisch ausgeführt
  • Aktionen können mit ROLLBACK rückgängig gemacht werden

Variante 1 (einzelner Datensatz)

* Datensatz
DATA(lv_struct) = VALUE zxyz( col1 = 'Value1' col1 = 'Value2' ).

INSERT INTO zxyz VALUES @lv_struct.
IF sy-subrc = 0.
  WRITE : / 'Hinzufügen erfolgreich.'.
ELSE.
  WRITE : / 'Datensatz konnte nicht hinzugefügt werden.'.
ENDIF.

Variante 2 (mehrere Datensätze aus einer itab)

* itab mit Datensätzen
DATA(itab) = VALUE zxyz_tab(
                             ( col1 = 'Value1' col1 = 'Value2' )
                             ( col1 = 'Value3' col1 = 'Value4' )
                           ).
* Wenn der Zusatz ACCEPTING DUPLICATE KEYS angegeben ist, werden alle Zeilen eingefügt, für die dies möglich ist.
* Die restlichen Zeilen werden verworfen und sy-subrc wird auf 4 gesetzt.
INSERT zxyz FROM TABLE itab ACCEPTING DUPLICATE KEYS.

IF sy-subrc = 0.
  WRITE : / 'Hinzufügen erfolgreich.'.
ELSE.
  WRITE : / 'Nicht alle Zeilen der Tabelle itab wurden hinzugefügt.'.
ENDIF.

* sy-dbcnt = Anzahl der eingefügten Zeilen
WRITE: / 'Hinzugefügte Datensätze:', sy-dbcnt.