[ABAP] SD: Alle Auftragsdaten zu Kundenaufträgen lesen

PARAMETERS: p_vbeln TYPE vbeln.

START-OF-SELECTION.

* Welche Daten sollen gelesen werden?
  DATA(lv_bapi_view) = VALUE order_view( header     = abap_true
                                         item       = abap_true
                                         sdschedule = abap_false
                                         business   = abap_false
                                         partner    = abap_false
                                         address    = abap_false
                                         status_h   = abap_false
                                         status_i   = abap_false
                                         sdcond     = abap_true
                                         sdcond_add = abap_true
                                         contract   = abap_false
                                         text       = abap_false
                                         flow       = abap_false
                                         billplan   = abap_false
                                         configure  = abap_false
                                         credcard   = abap_false
                                         incomp_log = abap_false
                                       ).

* Belegnummern (VBELN) die selektiert werden sollen
  DATA: it_sales_documents TYPE STANDARD TABLE OF sales_key WITH DEFAULT KEY.
  APPEND p_vbeln TO it_sales_documents.

* Ausgabetabellen
* VBAK (Kopf)
  DATA: it_order_headers_out TYPE STANDARD TABLE OF bapisdhd WITH DEFAULT KEY.
* VBAP (Positionen)
  DATA: it_order_items_out TYPE STANDARD TABLE OF bapisdit WITH DEFAULT KEY.
* KOMV (Konditionen)
  DATA: it_order_conditions_out TYPE STANDARD TABLE OF bapisdcond WITH DEFAULT KEY.

* Kundenauftrag: Liste aller Auftragsdaten (analog VA03)
* Werte für I_MEMORY_READ:
*  SPACE = zuerst Pufferzugriff, dann DB-Zugriff
*  'A'   = nur Datenbankzugriff
*  'B'   = nur Pufferzugriff
  CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
    EXPORTING
      i_bapi_view              = lv_bapi_view
      i_memory_read            = space
      i_with_header_conditions = abap_true
    TABLES
      sales_documents          = it_sales_documents
      order_headers_out        = it_order_headers_out
      order_items_out          = it_order_items_out
      order_conditions_out     = it_order_conditions_out.

* Datenausgabe
  cl_demo_output=>write_data( it_order_headers_out ).
  cl_demo_output=>write_data( it_order_items_out ).
  cl_demo_output=>write_data( it_order_conditions_out ).

* HTML-Code holen
  DATA(lv_html) = cl_demo_output=>get( ).
* Daten im Inline-Browser im SAP-Fenster anzeigen
  cl_abap_browser=>show_html( EXPORTING
                                title        = 'Daten zur Bestellung'
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).
* cl_gui_container=>default_screen erzwingen
  WRITE: space.

[ABAP] Klasse für die Anzeige von Funktionbuttons im Selektionsbild

* Quelle: https://abapblog.com/articles/tricks/127-selection-screen-function-key-in-form-function-module-or-method

* Klasse greift auf Systemprogramm RSDBRUNT im Paket SLDBV zu
CLASS zcl_sel_button DEFINITION FINAL.
  PUBLIC SECTION.
    CLASS-METHODS: activate
      IMPORTING i_btn_no TYPE i.

    CLASS-METHODS: deactivate
      IMPORTING i_btn_no TYPE i.

    CLASS-METHODS: set_info
      IMPORTING i_btn_no    TYPE i
                i_text      TYPE gui_text OPTIONAL
                i_icon      TYPE icon_d OPTIONAL
                i_icon_text TYPE gui_ictext OPTIONAL
                i_quickinfo TYPE gui_info OPTIONAL.

  PRIVATE SECTION.
    CONSTANTS: co_current_screen TYPE string VALUE '(RSDBRUNT)CURRENT_SCREEN'.
    CONSTANTS: co_current_scr TYPE string VALUE '(RSDBRUNT)CURRENT_SCR'.

    CLASS-METHODS: set_visible
      IMPORTING i_btn_no  TYPE i
                i_visible TYPE abap_bool.
ENDCLASS.

CLASS zcl_sel_button IMPLEMENTATION.

* Button aktivieren
  METHOD activate.
    set_visible( i_btn_no  = i_btn_no
                 i_visible = abap_true  ).
  ENDMETHOD.

* Button deaktivieren
  METHOD deactivate.
    set_visible( i_btn_no  = i_btn_no
                 i_visible = abap_false ).
  ENDMETHOD.

* Button-Infos setzen
  METHOD set_info.

    IF i_btn_no BETWEEN 1 AND 5 AND NOT i_text IS INITIAL AND NOT i_icon IS INITIAL.

      DATA(sscr) = CONV string( |({ sy-cprog })SSCRFIELDS| ).

      ASSIGN (sscr) TO FIELD-SYMBOL(<sscr>).
      IF <sscr> IS ASSIGNED.
        ASSIGN COMPONENT |FUNCTXT_0{ i_btn_no }| OF STRUCTURE <sscr> TO FIELD-SYMBOL(<btn_text>).
        IF <btn_text> IS ASSIGNED.
          <btn_text> = VALUE smp_dyntxt( icon_id   = i_icon
                                         icon_text = i_icon_text
                                         text      = i_text
                                         quickinfo = i_quickinfo
                                       ).
        ENDIF.
      ENDIF.
    ENDIF.

  ENDMETHOD.

* Button Sichtbarkeit setzen
  METHOD set_visible.

    IF i_btn_no BETWEEN 1 AND 5.
* Funktionsbutton aktivieren/deaktivieren
      FIELD-SYMBOLS: <screen> TYPE sydb0_screen.

      ASSIGN (co_current_screen) TO <screen>.
      IF <screen> IS ASSIGNED.

        DATA(idx) = i_btn_no - 1.
        <screen>-func_keys+idx(1) = i_visible.

      ENDIF.

* Funktionsbutton anzeigen/verbergen
      FIELD-SYMBOLS: <scr> TYPE sydb0_scr_stack_line.

      ASSIGN (co_current_scr) TO <scr>.
      IF <scr> IS ASSIGNED.

        DATA(button) = |FC0{ i_btn_no }|.

        IF i_visible EQ abap_true.
          DELETE <scr>-excl WHERE fcode EQ button.
        ELSE.
          IF NOT line_exists( <scr>-excl[ fcode = button ] ).
            APPEND VALUE #( fcode = button ) TO <scr>-excl.
          ENDIF.
        ENDIF.

      ENDIF.

    ENDIF.

  ENDMETHOD.
ENDCLASS.

PARAMETERS: p_active AS CHECKBOX USER-COMMAND cba.

INITIALIZATION.
* zwei Funktions-Buttons einfügen
  zcl_sel_button=>set_info( EXPORTING
                              i_btn_no    = 1
                              i_text      = 'Text1'
                              i_icon      =  icon_abc
                              i_icon_text = 'Text1'
                              i_quickinfo = 'Info1'
                          ).
  zcl_sel_button=>activate( 1 ).

  zcl_sel_button=>set_info( EXPORTING
                              i_btn_no    = 2
                              i_text      = 'Text2'
                              i_icon      =  icon_activate
                              i_icon_text = 'Text2'
                              i_quickinfo = 'Info2'
                          ).
  zcl_sel_button=>activate( 2 ).

AT SELECTION-SCREEN OUTPUT.
* je nach Status der Checkbox p_active Funktionsbutton 3 ein- oder ausblenden
  IF p_active EQ abap_true.
    zcl_sel_button=>set_info( EXPORTING
                                i_btn_no    = 3
                                i_text      = 'Text3'
                                i_icon      =  icon_add_row
                                i_icon_text = 'Text3'
                                i_quickinfo = 'Info3'
                            ).

    zcl_sel_button=>activate( 3 ).
  ELSE.
    zcl_sel_button=>deactivate( 3 ).
  ENDIF.

AT SELECTION-SCREEN.
* Kommando abfangen (Nummerierung 'FC01' ... 'FC05')
  CASE sy-ucomm.
* wenn Funktionstaste 1 gedrückt
    WHEN 'FC01'.
      MESSAGE sy-ucomm TYPE 'S'.
* wenn Funktionstaste 2 gedrückt
    WHEN 'FC02'.
      MESSAGE sy-ucomm TYPE 'S'.
* wenn Funktionstaste 3 gedrückt
    WHEN 'FC03'.
      MESSAGE sy-ucomm TYPE 'S'.
  ENDCASE.

[ABAP] Data Aging: DB-Zugriffssteuerung für S/4HANA Data Aging

Variante 1 (cl_abap_stack_temperature)

* https://blogs.sap.com/2016/10/03/how-to-perform-data-aging-in-s4hana/
* Transaktion: DAGOBJ
*              DAGPTC

* Flag für Historische Daten
DATA(lv_cold_access) = abap_true.

* Datum für Aging
DATA: lv_data_temperature TYPE data_temperature.
lv_data_temperature = sy-datum - 30.

TRY.
* data aging möglich (von db unterstützt und aktivgeschaltet)?
    IF abap_true = cl_data_aging_state=>is_enabled(  ).
      IF abap_true = lv_cold_access.
* datenfilter setzen: alle daten sichtbar
        cl_abap_stack_temperature=>set_cold( ).
      ELSE.
        IF lv_data_temperature IS INITIAL.
* datenfilter setzen: nur hot-daten sichtbar
          cl_abap_stack_temperature=>set_hot( ).
        ELSE.
          cl_abap_stack_temperature=>set_temperature( lv_data_temperature ).
        ENDIF.
      ENDIF.
    ENDIF.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: e_txt->get_text( ).
ENDTRY.

Variante 2 (cl_abap_session_temperature)

* https://blogs.sap.com/2016/10/03/how-to-perform-data-aging-in-s4hana/
* Transaktion: DAGOBJ
*              DAGPTC

* Flag für Historische Daten
DATA(lv_cold_access) = abap_true.

* Datum für Aging
DATA: lv_data_temperature TYPE data_temperature.
lv_data_temperature = sy-datum - 30.

TRY.
    DATA(o_ses) = cl_abap_session_temperature=>get_session_control( ).
* Data Aging möglich (von DB unterstützt und aktivgeschaltet)?
    IF abap_true = cl_data_aging_state=>is_enabled(  ).
      IF abap_true = lv_cold_access.
* Datenfilter setzen: Alle Daten sichtbar
        o_ses->set_cold( ).
      ELSE.
        IF lv_data_temperature IS INITIAL.
* Datenfilter setzen: Nur HOT-Daten sichtbar
          o_ses->set_hot( ).
        ELSE.
          o_ses->set_temperature( lv_data_temperature ).
        ENDIF.
      ENDIF.
    ENDIF.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: e_txt->get_text( ).
ENDTRY.

[ABAP] OpenSQL: Unterschied SELECT, SELECT SINGLE, SELECT DISTINCT

SELECT

* Selektiert alle Einträge für 'DE' und 'US', mit Mehrfachnennungen
SELECT cityto
  INTO TABLE @DATA(it_dest)
  FROM spfli
  WHERE countryfr = 'DE'
     OR countryfr = 'US'.

*CITYTO:
*SAN FRANCISCO
*NEW YORK
*FRANKFURT
*SAN FRANCISCO
*NEW YORK
*TOKYO
*NEW YORK
*FRANKFURT
*NEW YORK
*BERLIN
*FRANKFURT
*SINGAPORE
*SINGAPORE
*SAN FRANCISCO
*FRANKFURT
*FRANKFURT
*NEW YORK

cl_demo_output=>display_data( it_dest ).

SELECT DISTINCT

* Selektiert alle Einträge für 'DE' und 'US', ohne Mehrfachnennungen
SELECT DISTINCT cityto
  INTO TABLE @DATA(it_dest)
  FROM spfli
  WHERE countryfr = 'DE'
     OR countryfr = 'US'.

*CITYTO:
*TOKYO
*BERLIN
*NEW YORK
*SINGAPORE
*FRANKFURT
*SAN FRANCISCO
cl_demo_output=>display_data( it_dest ).

SELECT SINGLE

* Selektiert den ersten Datensatz für 'DE' und 'US'
SELECT SINGLE cityto
  INTO @DATA(lv_dest)
  FROM spfli
  WHERE countryfr = 'DE'
     OR countryfr = 'US'.

*CITYTO:
*SAN FRANCISCO
cl_demo_output=>display_data( lv_dest ).

[ABAP] Dateneingabe mit cl_demo_input

DATA: lv_carrid TYPE sflight-carrid VALUE 'AA'.
DATA: lv_date TYPE dats VALUE '20181231'.
DATA: lv_ok TYPE abap_bool VALUE abap_true.

* Eingabefelder
cl_demo_input=>add_field( EXPORTING
                            text  = 'Fluggesellschaft:'
                          CHANGING
                            field = lv_carrid ).

cl_demo_input=>add_field( EXPORTING
                            text  = 'Datum:'
                          CHANGING
                            field = lv_date ).

* Trennzeile
cl_demo_input=>add_line( ).

cl_demo_input=>add_field( EXPORTING
                            text        = 'Check:'
                            as_checkbox = abap_true
                          CHANGING
                            field       = lv_ok ).

* Eingabe anfordern
cl_demo_input=>request( ).

WRITE: / lv_carrid.
WRITE: / lv_date.
WRITE: / lv_ok.

[ABAP] OpenSQL: Zusammenführen von Tabelleninhalten mit SELECT UNION

Variante 1 (UNION == UNION DISTINCT – einfaches Auftreten der Datensätze)

DATA: lv_devclass TYPE string VALUE 'ZABAP2XLSX'.

SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'PROG' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'CLAS' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'FUGR' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DEVC' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DOMA' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DTEL' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'INTF' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'MSAG' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'TABL' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'TTYP' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'WDYA' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'XSLT' AND devclass = @lv_devclass
UNION DISTINCT
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'WDYN' AND devclass = @lv_devclass
 ORDER BY obj_name
 INTO TABLE @DATA(it_prog_range).

DATA(lv_lines) = lines( it_prog_range ).
cl_demo_output=>write_data( lv_lines ).
cl_demo_output=>write_data( it_prog_range ).
cl_demo_output=>display( ).

Variante 2 (UNION ALL – mehrfach auftretende Datensätze)

DATA: lv_devclass TYPE string VALUE 'ZABAP2XLSX'.

SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'PROG' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'CLAS' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'FUGR' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DEVC' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DOMA' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'DTEL' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'INTF' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'MSAG' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'TABL' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'TTYP' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'WDYA' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'XSLT' AND devclass = @lv_devclass
UNION ALL
SELECT obj_name
  FROM tadir
  WHERE pgmid = 'R3TR' AND object = 'WDYN' AND devclass = @lv_devclass
 ORDER BY obj_name
 INTO TABLE @DATA(it_prog_range).

DATA(lv_lines) = lines( it_prog_range ).
cl_demo_output=>write_data( lv_lines ).
cl_demo_output=>write_data( it_prog_range ).
cl_demo_output=>display( ).

Links

[ABAP] MM: Aktuelle Bedarfs-/Bestandsliste / reservierte Bestände analog zur Transaktion MMBE

* http://letscodeabap.blogspot.com/2015/03/get-reservations-in-abap.html
TYPES: BEGIN OF ty_xtab1,
         werks LIKE resb-werks,
         lgort LIKE resb-lgort,
         charg LIKE resb-charg,
         matnr LIKE resb-matnr,
         bdmng LIKE resb-bdmng,
         bdmns LIKE resb-bdmng,
         erfme LIKE resb-erfme,
         erfmg LIKE resb-erfmg,
       END OF ty_xtab1.

PARAMETERS: p_matnr TYPE marc-matnr DEFAULT '1234567890'.
PARAMETERS: p_werks TYPE marc-werks DEFAULT '10'.

START-OF-SELECTION.

  DATA: lv_detail TYPE bapi_mrp_stock_detail.
  DATA: lv_ret TYPE bapiret2.

* Material - Aktuelle Bedarfs-/Bestandsliste
  CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
    EXPORTING
      material         = p_matnr
      plant            = p_werks
    IMPORTING
      mrp_stock_detail = lv_detail
      return           = lv_ret.

  DATA: xbdart TYPE RANGE OF resb-bdart.

* Range Bedarfsarten
  DATA(rg_resb_bdart) = VALUE rseloption( ( sign   = 'I'
                                            option = 'EQ'
                                            low    = 'AR'
                                            high   = '' )
                                          ( sign   = 'I'
                                            option = 'EQ'
                                            low    = 'MR'
                                            high   = '' ) ).

* Range Werke
  DATA(rg_werks) = VALUE rseloption( ( sign   = 'I'
                                       option = 'EQ'
                                       low    = p_werks
                                       high   = '' ) ).

* Rückgabetabelle mit Beständen
  DATA: it_xtab1 type STANDARD TABLE OF ty_xtab1 WITH DEFAULT KEY.

* Lesen u. addieren v. reservierten Beständen
  CALL FUNCTION 'MB_ADD_RESERVATION_QUANTITIES'
    EXPORTING
      x_kzear = space " Endausfassung der Reservierung
      x_matnr = p_matnr
      x_xloek = space " Position ist gelöscht
    TABLES
      xbdart  = rg_resb_bdart
      xtab1   = it_xtab1
      xwerks  = rg_werks.

  cl_demo_output=>write_data( lv_ret ).
  cl_demo_output=>write_data( lv_detail ).
  cl_demo_output=>write_data( it_xtab1 ).
  cl_demo_output=>display( ).