[ABAP] Listausgabe eines Reports holen, anzeigen, in ASCII wandeln

* https://blogs.sap.com/2016/12/29/exporting-list-to-memory-and-its-dangers/
* beliebigen Report ausführen, der eine Listausgabe hat
SUBMIT showcolo EXPORTING LIST TO MEMORY AND RETURN.

DATA: it_list TYPE STANDARD TABLE OF abaplist WITH DEFAULT KEY.

* Einlesen aufbereiteter Liste aus Memory
CALL FUNCTION 'LIST_FROM_MEMORY'
  TABLES
    listobject = it_list
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.

IF sy-subrc = 0.
* Speicher (Liste) freigeben
* Löschen der letzten gespeicherten Liste aus dem Memory
  CALL FUNCTION 'LIST_FREE_MEMORY'.
ENDIF.

IF sy-subrc = 0.
  WRITE: / 'Listausgabe aus Report SHOWCOLO:'.

* Listausgabe des aufgerufenen Reports hier wieder anzeigen
* Anzeigen eines (gesicherten) Listobjekts
  CALL FUNCTION 'WRITE_LIST'
    TABLES
      listobject = it_list
    EXCEPTIONS
      empty_list = 1
      OTHERS     = 2.

  IF sy-subrc = 0.
    DATA: it_list_ascii TYPE list_string_table.

* Konvertieren eines (gesicherten) Listobjekts nach ASCI
    CALL FUNCTION 'LIST_TO_ASCI'
      IMPORTING
        list_string_ascii  = it_list_ascii
      TABLES
        listobject         = it_list
      EXCEPTIONS
        empty_list         = 1
        list_index_invalid = 2
        OTHERS             = 3.

    IF sy-subrc = 0.

      ULINE.

      WRITE: / 'Listausgabe ASCII-konvertiert hier im Report:'.

      LOOP AT it_list_ascii ASSIGNING FIELD-SYMBOL(<s>).
        WRITE: / <s>.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDIF.

[ABAP] Materialbelegliste (MB51) anzeigen

Variante 1 (CALL TRANSACTION)

PARAMETERS: p_werk TYPE werks DEFAULT '10'.
PARAMETERS: p_matnr TYPE matnr.
PARAMETERS: p_lgort TYPE lgort_d.
PARAMETERS: p_bwart TYPE bwart.
PARAMETERS: p_charg TYPE charg_d.
PARAMETERS: p_lifnr TYPE lifnr.
PARAMETERS: p_kunnr TYPE kunnr.
PARAMETERS: p_kdauf TYPE kdauf.

START-OF-SELECTION.

* Werk
  SET PARAMETER ID 'WRK' FIELD p_werk.
* Material
  SET PARAMETER ID 'MAT' FIELD p_matnr.
* Lagerort
  SET PARAMETER ID 'LAG' FIELD p_lgort.
* Bewegungsart
  SET PARAMETER ID 'BWA' FIELD p_bwart.
* Charge
  SET PARAMETER ID 'CHA' FIELD p_charg.
* Lieferant
  SET PARAMETER ID 'LIF' FIELD p_lifnr.
* Kunde
  SET PARAMETER ID 'KUN' FIELD p_kunnr.
* Kundenuftrag
  SET PARAMETER ID 'AUN' FIELD p_kdauf.

  CALL TRANSACTION 'MB51' AND SKIP FIRST SCREEN.

Variante 2 (SUBMIT)

* Werk
DATA(lv_werk) = VALUE werks( ).
SELECT-OPTIONS: so_werk FOR lv_werk.
* Warenbegleitscheinnummer
DATA(lv_xabln) = VALUE xabln( ).
SELECT-OPTIONS: so_xabln FOR lv_xabln.
* Referenz-Belegnummer
DATA(lv_xblnr) = VALUE xblnr1( ).
SELECT-OPTIONS: so_xblnr FOR lv_xblnr.

INITIALIZATION.
* Vorbelegung für Werk
  so_werk[] = VALUE #( ( sign = 'I' option = 'EQ' low = '10' high = '' ) ).
  
START-OF-SELECTION.

* MB51 ist eine Reporttransaktion, also kann auch der dahinter
* liegende Report RM07DOCS direkt mit Übergabewerten aufgerufen werden
  SUBMIT rm07docs
    WITH werks IN so_werk
    WITH xabln IN so_xabln
    WITH xblnr IN so_xblnr
    WITH rhier_l = abap_true  " Radiobutton "Hierarchische Liste" aktiv setzen
    WITH rflat_l = abap_false " Radiobutton "Flache Liste" deaktivieren
    AND RETURN.

[ABAP] Popupfenster mit Eingabefeldern (cl_gui_combobox, cl_gui_input_field)

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      on_close FOR EVENT close OF cl_gui_dialogbox_container
        IMPORTING sender.

    CLASS-METHODS:
      on_select FOR EVENT selected OF cl_gui_combobox
        IMPORTING
            key
            sender.

    CLASS-METHODS:
      on_submit FOR EVENT submit OF cl_gui_input_field
        IMPORTING
            input
            sender.

    CLASS-METHODS:
      on_auto_submit FOR EVENT auto_submit OF cl_gui_input_field
        IMPORTING
            input
            sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD on_close.
    IF sender IS NOT INITIAL.
      sender->free( ).
    ENDIF.
  ENDMETHOD.

  METHOD on_select.

    MESSAGE key && ' -> ' && sender->get_selected_item( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.

  METHOD on_submit.

    MESSAGE 'Submit:' && input && ' -> ' && sender->get_text( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.

  METHOD on_auto_submit.

    MESSAGE 'Auto-Submit:' &&  input && ' -> ' && sender->get_text( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.
ENDCLASS.

SELECTION-SCREEN: PUSHBUTTON 2(20) btn1 USER-COMMAND cmd_show.

AT SELECTION-SCREEN.
* wenn Button-Kommando 'CMD_SHOW'
  IF sy-ucomm = 'CMD_SHOW'.
* Container
    DATA(o_cnt) = NEW cl_gui_dialogbox_container( no_autodef_progid_dynnr = abap_true
                                                  caption                 = 'Werte'
                                                  top                     = 5
                                                  left                    = 5
                                                  width                   = 640
                                                  height                  = 240 ).

    SET HANDLER lcl_events=>on_close FOR o_cnt.

* Input
    DATA(o_input) = NEW cl_gui_input_field( parent               = o_cnt
                                            label_text           = 'InputLabel'
                                            label_width          = 10
                                            input_prompt_text    = 'Text'
                                            activate_find_button = abap_false
                                            activate_auto_submit = abap_true ).

    o_input->set_top( 30 ).
    o_input->set_text( '<default>' ).

    SET HANDLER lcl_events=>on_submit FOR o_input.
    SET HANDLER lcl_events=>on_auto_submit FOR o_input.

* Combobox
    DATA(o_combo) = NEW cl_gui_combobox( parent      = o_cnt
                                         label_text  = 'ComboLabel'
                                         label_width = 10 ).

    o_combo->set_items( VALUE vrm_values( ( key = 'A' text = 'Wert1' )
                                          ( key = 'B' text = 'Wert2' )
                                          ( key = 'C' text = 'Wert3' ) ) ).

    o_combo->set_selected_item( 'A' ).

    o_combo->activate_selection_event( ).

    o_combo->set_top( 10 ).

    SET HANDLER lcl_events=>on_select FOR o_combo.
  ENDIF.

[ABAP] Dynamisch Programmcode erzeugen und persistent auf der Datenbank speichern

* Programmname
DATA: lv_prg_name TYPE sy-repid VALUE 'ZREPORT1'.
* Compilerausgaben
DATA: lv_msg TYPE string.
DATA: lv_line TYPE string.
DATA: lv_word TYPE string.
DATA: lv_off TYPE string.
* iTab mit Quellcode
DATA: it_src TYPE STANDARD TABLE OF char1024.

* Codezeilen zu iTab hinzufügen
APPEND |REPORT { lv_prg_name }.| TO it_src.
APPEND |WRITE: / 'Hallo Welt!'.| TO it_src.

* ausführbares Programm (TYPE '1') anlegen, es wird persistent auf der Datenbank gespeichert,
* aber keinem Paket zugeordnet und ist global verfügbar
INSERT REPORT lv_prg_name FROM it_src PROGRAM TYPE '1' UNICODE ENABLING 'X'.

* Programmcode compilieren, existierender Programmcode wird überschrieben
GENERATE REPORT lv_prg_name MESSAGE lv_msg LINE lv_line WORD lv_word OFFSET lv_off.

IF sy-subrc = 0.
* wenn Compilierung ok: Code ausführen
  SUBMIT (lv_prg_name) AND RETURN.
ELSE.
* Im Fehlerfall: Fehlerausgabe
  WRITE: / 'Error during generation in line: ', lv_line.
  IF lines( it_src ) > 0.
    WRITE: it_src[ lv_line ].
  ENDIF.
  WRITE: / lv_msg.
  WRITE: / 'Word: ', lv_word.
  WRITE: / 'Offset: ', lv_off.
ENDIF.

* aktives Programm wieder aus der DB löschen
DELETE REPORT lv_prg_name.

CASE sy-subrc.
  WHEN 0.
    WRITE: / |{ lv_prg_name } gelöscht.|.
  WHEN 4.
    WRITE: / |{ lv_prg_name } nicht vorhanden.|.
  WHEN OTHERS.
    WRITE: / |Anderer Fehler.|.
ENDCASE.

Weiterführende Infos: Link