[ABAP] OpenSQL: NULL-Indicator zum Anzeigen von leeren Rückgabemengen

* in OpenSQL ist es ab Rel. 7.55 möglich einen NULL-Indikators anzugeben
* somit ist es möglich, bei SELECTS Spalten zu kennzeichnen, deren Ergebnismenge NULL enthält
* alternativ siehe auch SQL-Expression COALESCE

SELECT FROM scarr
  LEFT OUTER JOIN spfli ON scarr~carrid = spfli~carrid
FIELDS scarr~carrid,
       spfli~distid
INTO TABLE @DATA(it_res) INDICATORS NULL STRUCTURE null_ind.

* Hier Objekte für die Ausgabe hinzufügen
cl_demo_output=>write_data( it_res ).

* HTML-Code vom Demo-Output holen
DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING title       = 'Daten'
                                      html_string = lv_html
                                      container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
WRITE: space.

Links

[ABAP] OpenSQL: Set-Indicator für das Aktualisieren von Spalten

* Set-Indikatoren (ab Rel. 7.55) dienen dem Kennzeichnen von zu aktualisierenden Spalten
* bei Verwendung von Set-Indikatoren werden nur die gekennzeichneten Felder auf der DB aktualisiert

* Datenstruktur mit zusätzlichem Set-Indicator
TYPES: ty_sflight TYPE sflight WITH INDICATORS set_ind.

DATA: it_sflight TYPE STANDARD TABLE OF ty_sflight WITH DEFAULT KEY.

* Daten holen
SELECT FROM sflight
  FIELDS carrid, connid, fldate, price
  WHERE carrid = 'AA'
    AND connid = '0017'
   INTO CORRESPONDING FIELDS OF TABLE @it_sflight.

IF sy-subrc  = 0.
* Daten anpassen
  LOOP AT it_sflight ASSIGNING FIELD-SYMBOL(<f>).
    <f>-price *= '0.1'.
    <f>-set_ind-price = abap_true.
  ENDLOOP.

* nur die Spalten mit Set-Indicator='X' achreiben
  UPDATE sflight FROM TABLE @it_sflight INDICATORS SET STRUCTURE set_ind.
ENDIF.

Links

[ABAP] Retourenumlagerungsbestellungen lesen

* Bestellung
PARAMETERS: p_ebeln TYPE ekko-ebeln.

START-OF-SELECTION.

* Retourenumlagerungsbestellungen zur Bestellung lesen
  SELECT FROM ekko AS e
    INNER JOIN ekpo AS p ON ( e~ebeln EQ p~ebeln )
* Verwendung von CAST und substring, da Belegposition unterschiedliche Typen (NUMC5 und NUMC10) verwendet
    INNER JOIN msr_d_executed AS r ON ( p~ebeln EQ r~ref_doc_nr ) AND ( CAST( p~ebelp AS CHAR ) EQ substring( CAST( r~ref_doc_item AS CHAR ), 6, 5 ) )
  FIELDS DISTINCT
      e~ebeln,
      p~ebelp,
      p~matnr,
      p~txz01,
      p~menge,
      p~meins,
      p~netpr,
      r~doc_nr,
      r~doc_item
  WHERE e~ebeln EQ @p_ebeln
  INTO TABLE @DATA(it_ebeln).

  IF sy-subrc = 0.
    cl_demo_output=>write_data( it_ebeln ).
    DATA(lv_html) = cl_demo_output=>get( ).
    cl_abap_browser=>show_html( EXPORTING title       = 'Daten'
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

    WRITE: space.
  ENDIF.

Links

[ABAP] Datenbanktabellen mittels SE16N editieren

* Tabellename
PARAMETERS: lv_tab TYPE se16n_tab DEFAULT 'T024'.
* max. Anzahl Datensätze für die Anzeige
PARAMETERS: lv_maxl TYPE sytabix DEFAULT 500.
* Edit-Parameter, diese entsprechen den Variablen GD-EDIT und GD-SAPEDIT in der SE16N
PARAMETERS: lv_edit TYPE abap_bool AS CHECKBOX DEFAULT abap_true.
PARAMETERS: lv_sedit TYPE abap_bool AS CHECKBOX DEFAULT abap_true.
* Mandantenspalte ausblenden
PARAMETERS: lv_clnt TYPE abap_bool AS CHECKBOX DEFAULT abap_false.
* technische Namen anzeigen
PARAMETERS: lv_tech TYPE abap_bool AS CHECKBOX DEFAULT abap_false.

INITIALIZATION.
  %_lv_tab_%_app_%-text = 'Tabelle:'.
  %_lv_edit_%_app_%-text = 'Edit Parameter 1 (GD-EDIT)'.
  %_lv_sedit_%_app_%-text = 'Edit Parameter 2 (GD-SAPEDIT)'.
  %_lv_maxl_%_app_%-text = 'Maximale Trefferzahl'.
  %_lv_clnt_%_app_%-text = 'Tabelle ist mandantenabhängig'.
  %_lv_tech_%_app_%-text = 'Technische Namen'.

START-OF-SELECTION.
* Anzeige einer Tabelle als Vollbild, analog SE16N
* Achtung: Tabelle lv_tab kann analog zum bekannten SE16N-Parameter &sap_edit vollumfänglich editiert werden,
*          dies kann bei Fehlbedienung zu Dateninkonsistenzen führen --> Funktion daher nicht im Produktivsystem verwenden!
  CALL FUNCTION 'SE16N_INTERFACE'
    EXPORTING
      i_tab        = lv_tab
      i_edit       = lv_edit
      i_sapedit    = lv_sedit
      i_max_lines  = lv_maxl
      i_clnt_dep   = lv_clnt
      i_tech_names = lv_tech
* CHANGING
*     IT_AND_SELFIELDS            =
    EXCEPTIONS
      no_values    = 1
      OTHERS       = 2.

  IF sy-subrc <> 0.
    WRITE: / 'Fehler:', sy-subrc.
  ENDIF.

Links

[ABAP] Neue / obsolete Transaktionscodes für S/4 HANA suchen

* https://thinkdoforward.com/neue-transaktionen-mit-s-4hana-so-einfach-findest-zu-sie/
PARAMETERS: p_rel TYPE saprl DEFAULT '751'.
SELECT-OPTIONS: so_ta FOR lv_s_tcode.

START-OF-SELECTION.

  SELECT c~rel_name, c~s_tcode, c~t_tcode, tx~ttext
    INTO TABLE @DATA(it_prgn_corr2)
    FROM prgn_corr2 AS c
    INNER JOIN tstc AS t ON ( c~t_tcode = t~tcode )
    RIGHT OUTER JOIN tstct AS tx ON ( t~tcode = tx~tcode )
    WHERE c~rel_name >= @p_rel
      AND c~s_tcode IN @so_ta
      AND tx~sprsl = @sy-langu.

  SORT: it_prgn_corr2 BY s_tcode rel_name.


  TRY.
* SALV-Table
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING
                                r_salv_table = o_salv
                              CHANGING
                                t_table      = it_prgn_corr2 ).

* Grundeinstellungen
      o_salv->get_functions( )->set_all( abap_true ).
      o_salv->get_columns( )->set_optimize( abap_true ).
      o_salv->get_display_settings( )->set_list_header( 'Überschrift' ).
      o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
      o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

      LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
        DATA(o_col) = <c>-r_column.
        o_col->set_short_text( || ).
        o_col->set_medium_text( || ).
        o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
      ENDLOOP.

      o_salv->display( ).
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] Mandanten und zugeordnete logische Systeme auslesen

* Mandantenpflege: SCC4
* Zuweisung logisches System zu Mandant: Springen -> Detail
* Tabelle Mandanten: T000

* Tabelle Logische Systeme: TBDLS

* Sucht aus der Liste der gepflegten logischen Systeme diejenigen heraus,
* die mit dem akt. System und Mandanten verknüpft sind
SELECT t000~mandt,
       tbdls~logsys,
       tbdlst~stext
  INTO TABLE @DATA(it_syst)
  FROM t000
  INNER JOIN tbdls ON t000~logsys = tbdls~logsys
  INNER JOIN tbdlst ON tbdls~logsys = tbdlst~logsys.

IF sy-subrc = 0.
  cl_demo_output=>display_data( it_syst ).
ENDIF.

[ABAP] Transaktionscode zu einer IMG-Aktivität suchen

* IMG-Activität
PARAMETERS: p_imgact TYPE cus_imgach-activity DEFAULT 'SAPC_LGNUM'.

START-OF-SELECTION.

  SELECT cus_imgach~activity,
         cus_imgach~tcode,
         cus_imgact~text
    INTO TABLE @DATA(it_img)
    FROM cus_imgach
    INNER JOIN cus_imgact ON cus_imgach~activity = cus_imgact~activity
    WHERE cus_imgach~activity = @p_imgact
      AND cus_imgact~spras = @sy-langu.

  IF sy-subrc = 0.
    cl_demo_output=>display_data( it_img ).
  ENDIF.

[ABAP] Customizing-Objekte zu einem Datenfeld lesen

TYPES : BEGIN OF ty_s_customizing_tables,
          tabname TYPE dd02l-tabname,
          ddtext  TYPE dd02t-ddtext,
        END OF ty_s_customizing_tables.

TYPES: ty_it_customizing_tables TYPE STANDARD TABLE OF ty_s_customizing_tables WITH DEFAULT KEY.

DATA: it_customizing_tables TYPE ty_it_customizing_tables.

* Klasse für Eventhandling definieren
CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
* Doppelklick
    CLASS-METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table
      IMPORTING
          row
          column
          sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD on_double_click.
* Tabelle / Pflegeview
    DATA(lv_tab) = CONV dd02l-tabname( it_customizing_tables[ row ]-tabname ).

* Customizingobjekte zu Tabelle anzeigen, ins SAP-IMG abspringen
    CALL FUNCTION 'OBJECT_MAINTENANCE_CALL'
      EXPORTING
        tabname                        = lv_tab
      EXCEPTIONS
        interface_not_correct          = 1
        transaction_not_maintained     = 2
        transaction_not_found          = 3
        table_not_activ                = 4
        table_not_found                = 5
        subobject_not_found_in_project = 6
        subobject_not_found_in_guide   = 7
        object_not_found_in_project    = 8
        object_not_found_in_guide      = 9
        table_has_no_object_in_project = 10
        table_has_no_object_in_guide   = 11
        outline_not_found              = 12
        call_transaction_recurring     = 13
        system_failure                 = 14
        OTHERS                         = 15.

    DATA(lv_err) = ||.

    CASE sy-subrc.
      WHEN 1.
        lv_err = |INTERFACE_NOT_CORRECT|.
      WHEN 2.
        lv_err = |TRANSACTION_NOT_MAINTAINED|.
      WHEN 3.
        lv_err = |TRANSACTION_NOT_FOUND|.
      WHEN 4.
        lv_err = |TABLE_NOT_ACTIV|.
      WHEN 5.
        lv_err = |TABLE_NOT_FOUND|.
      WHEN 6.
        lv_err = |SUBOBJECT_NOT_FOUND_IN_PROJECT|.
      WHEN 7.
        lv_err = |SUBOBJECT_NOT_FOUND_IN_GUIDE|.
      WHEN 8.
        lv_err = |OBJECT_NOT_FOUND_IN_PROJECT|.
      WHEN 9.
        lv_err = |OBJECT_NOT_FOUND_IN_GUIDE|.
      WHEN 10.
        lv_err = |TABLE_HAS_NO_OBJECT_IN_PROJECT|.
      WHEN 11.
        lv_err = |TABLE_HAS_NO_OBJECT_IN_GUIDE|.
      WHEN 12.
        lv_err = |OUTLINE_NOT_FOUND|.
      WHEN 13.
        lv_err = |CALL_TRANSACTION_RECURRING|.
      WHEN 14.
        lv_err = |SYSTEM_FAILURE|.
      WHEN 15.
        lv_err = |OTHERS|.
    ENDCASE.

    MESSAGE |{ lv_err }| TYPE 'S' DISPLAY LIKE 'E'.

  ENDMETHOD.
ENDCLASS.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) l_field FOR FIELD p_field.
PARAMETER: p_field TYPE dd03vv-fieldname DEFAULT 'VSBED'.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.

  l_field = 'Feldname:'.

START-OF-SELECTION.

* Customizingtabellen zu einem Datenfeld lesen
  SELECT t~tabname,
         tx~ddtext
    FROM dd03vv AS t
    INNER JOIN dd02l AS c ON t~tabname = c~tabname
    INNER JOIN dd02t AS tx ON t~tabname = tx~tabname
    INTO TABLE @it_customizing_tables
    WHERE t~fieldname = @p_field     " Feldname
      AND t~tabclass = 'TRANSP'      " transparente Tabellen
      AND t~as4local = 'A'           " aktive Objekte
      AND c~contflag IN ('C', 'G')   " Typ: Customizing-Tabellen
      AND tx~ddlanguage = @sy-langu. " Anmeldesprache

  TRY.
* SALV-Table
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING
                                r_salv_table   = o_salv
                              CHANGING
                                t_table        = it_customizing_tables ).

* Grundeinstellungen
      o_salv->get_functions( )->set_all( abap_true ).
      o_salv->get_columns( )->set_optimize( abap_true ).
      o_salv->get_display_settings( )->set_list_header( |Customizing-Tabellen zu Datenfeld { p_field } (Doppelklick -> IMG)| ).
      o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
      o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte
      LOOP AT o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
        DATA(o_col) = <c>-r_column.
        o_col->set_short_text( || ).
        o_col->set_medium_text( || ).
        o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
      ENDLOOP.

* Handler registrieren
      SET HANDLER lcl_events=>on_double_click FOR o_salv->get_event( ).

      o_salv->display( ).
    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

Links