[ABAP] F4-Hilfe Popup

DATA: it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.
DATA: it_spfli_sel TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

PARAMETERS: p_test TYPE spfli-connid.

INITIALIZATION.
  SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE it_spfli.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.

  CLEAR: it_spfli_sel.

  DATA(o_f4) = cl_reca_gui_f4_popup=>factory_grid( id_title   = 'Flugdaten'
                                                   if_multi   = abap_false " Mehrfachauswahl
                                                   it_f4value = it_spfli ).

  o_f4->display( IMPORTING et_result = it_spfli_sel ).

  IF lines( it_spfli_sel ) > 0.
    p_test = it_spfli_sel[ 1 ]-connid.
  ENDIF.

[ABAP] SALV-Table in der Listausgabe in Custom-Container anzeigen

DATA: o_alv TYPE REF TO cl_salv_table.

START-OF-SELECTION.
  DATA: it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

  SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE it_spfli.

  WRITE: / 'GUI-Objekt in der Listanzeige'.

  ULINE.

* freier Custom-Container in der Listenansicht
  DATA(o_cnt) = NEW cl_gui_custom_container( container_name = ''
                                             repid          = 'SAPMSSY0'
                                             dynnr          = '0120' ).
* Position des Containers
  o_cnt->set_top( 50 ).
  o_cnt->set_left( 50 ).
  o_cnt->set_width( 1000 ).
  o_cnt->set_height( 200 ).


* SALV-Grid für Anzeige im Container
  TRY.
      cl_salv_table=>factory( EXPORTING
                                r_container  = o_cnt
                              IMPORTING
                                r_salv_table = o_alv
                              CHANGING
                                t_table      = it_spfli ).

      o_alv->display( ).

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

  DO 100 TIMES.
    WRITE: / |{ sy-index } Lorem ipsum.|.
  ENDDO.

[ABAP] Übersicht SAP-Programmerweiterungen

Übersicht

Typ                         Objekt                Transaktion       Bemerkung

User-Exit                   Unterprogramm (FORM)  SPDD, SPAM, SPAU  Modifikation
Customer-Exit               Funktionsbaustein     SMOD, CMOD        Erweiterung
Business Transaction Event  Funktionsbaustein                       Erweiterung
Business Add In (BAdI)      Interface, Klasse     SE18, SE19        Erweiterung
Enhancement Points          Interface, Klasse     SE18, SE19        Erweiterung, Verwaltung durch Enhancement Framework (+neue und alte BAdIs)

User-Exit

PERFORM userexit_<name>.

* z.B. Include MV45AFZB (vom SAP-Entwickler bereitgestellt)
FORM userexit_<name>.
ENDFORM.

Customer-Exit

Infos zu Customer-Exits: Link

CALL CUSTOMER-FUNCTION '001'
  EXPORTING
    ...
  IMPORTING
    ...

* Aufruf Include mit Quelltext
FUNCTION-POOL XYZ.
  FUNCTION exit_<programm_name>_001.
    ...
    INCLUDE zxaaau01.
    ...
  ENDFUNCTION.

BAdI

Infos zu BAdIs: Link
Infos zu BADI_SORTER: Link

* Objektreferenz für Methoden des BAdI-Interfaces
cl_exithandler=>get_instance( )
* Methoden der BAdI-Erweiterung aufrufen
o_badi->method_abc( )

* Tabellen
* SXS_ATTR (Feld EXIT_NAME, ACTIVE = 'X')
* SXC_ATTR (Feld EXIT_NAME)
* SXS_ATTRT (Feld EXIT_NAME)
* SXC_EXIT (Feld EXIT_NAME, IMP_NAME)

* Abarbeitungsrreihenfolge über Implementierung von BADI_SORTER erzwingen

Enhancement-Points

Infos zu Enhancement-Points: Link

* keine Import/Export-Schnittstelle
* implizit: automatisch vorhandene Absprungpunkte (z.B. Anfang/Ende des Quellcodes)
*           im Menu einblendbar
* explizit: von SAP vorbereitete Absprungpunkte
ENHANCEMENT-POINT EP_A SPOTS ESPOT_X.
  ...

ENHANCEMENT-SECTION ES_B SPOTS ESPOT_X.
  ...
END-ENHANCEMENT-SECTION.

[ABAP] Objekte über die Systemklasse CL_OS_STATE clonen (kopieren)

* die Klasse, deren Objekte geclont werden sollen, muss von CL_OS_STATE
* ableiten, damit das Interface IF_OS_CLONE implementiert wird
CLASS lcl_clone_test DEFINITION INHERITING FROM cl_os_state.

  PUBLIC SECTION.
* ALIAS für die Implementierung von cl_os_state=>if_os_clone~clone( )
* ruft SYSTEM-CALL OBJMGR CLONE me TO result.
    ALIASES: clone FOR if_os_clone~clone.

    METHODS:
      constructor
        IMPORTING i_text TYPE string.
    METHODS:
      get_text
        RETURNING VALUE(rv_text) TYPE string.

  PRIVATE SECTION.
    DATA:
      gv_text TYPE string.

ENDCLASS.

CLASS lcl_clone_test IMPLEMENTATION.

  METHOD constructor.
* Konstruktor der Basisklasse CL_OS_STATE rufen
    super->constructor( ).
    gv_text = i_text.
  ENDMETHOD.

  METHOD get_text.
    rv_text = gv_text.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  DATA(o_src) = NEW lcl_clone_test( 'SRC' ).
  WRITE: / o_src->get_text( ).

* Objekt O_SRC clonen, Rückgabe von REF TO object nach LCL_CLONE_TEST explizit casten
* es wird ein neues, zu O_SRC identisches, Objekt erzeugt
  DATA(o_clone) = CAST lcl_clone_test( o_src->clone( ) ).
  WRITE: / o_clone->get_text( ).

[ABAP] RTTS / RTTI: Beispiele für dynamische Typ- und Objekterzeugung

* dynamisch einen Typ char40 erzeugen
DATA(o_type_char40) = cl_abap_elemdescr=>get_c( 40 ).
* dynamisch einen Typ string erzeugen
DATA(o_type_string) = cl_abap_elemdescr=>get_string( ).
* dynamisch einen Typ i erzeugen
DATA(o_type_int) = cl_abap_elemdescr=>get_i( ).
* dynamisch einen Typ decfloat34 erzeugen
DATA(o_type_d34) = cl_abap_elemdescr=>get_decfloat34( ).

* Referenz auf Objekt vom Typ char40 erzeugen
DATA: o_ref_char40 TYPE REF TO data.
CREATE DATA o_ref_char40 TYPE HANDLE o_type_char40.

* Referenz auf Objekt vom Typ string erzeugen
DATA: o_ref_string TYPE REF TO data.
CREATE DATA o_ref_string TYPE HANDLE o_type_string.

* Referenz auf Objekt vom Typ i erzeugen
DATA: o_ref_int TYPE REF TO data.
CREATE DATA o_ref_int TYPE HANDLE o_type_int.

* Referenz auf Objekt vom Typ i erzeugen
DATA: o_ref_d34 TYPE REF TO data.
CREATE DATA o_ref_d34 TYPE HANDLE o_type_d34.

* Referenz einem Feldsymbol zuweisen
ASSIGN o_ref_char40->* TO FIELD-SYMBOL(<char40>).
ASSIGN o_ref_string->* TO FIELD-SYMBOL(<string>).
ASSIGN o_ref_int->* TO FIELD-SYMBOL(<int>).
ASSIGN o_ref_d34->* TO FIELD-SYMBOL(<d34>).

* Wert auf Feldsymbol schreiben
<char40> = 'char40'.
<string> = 'string'.
<int> = 1.
<d34> = '3.1415926535'.

WRITE: / <char40>.
WRITE: / <string>.
WRITE: / <int>.
WRITE: / <d34>.

[ABAP] Screenshot speichern

DATA: lv_mime_type TYPE string.
DATA: lv_image_bytes TYPE xstring.

TRY.
* Screenshot aufnehmen
    cl_gui_frontend_services=>get_screenshot( IMPORTING
                                                mime_type_str = lv_mime_type
                                                image         = lv_image_bytes ).

* MIME-Typ (PNG) ausgeben
    WRITE: / lv_mime_type.

    DATA: lv_action TYPE i.
    DATA: lv_filename TYPE string.
    DATA: lv_fullpath TYPE string.
    DATA: lv_path TYPE string.

* Savedialog anzeigen
    cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                  default_file_name = 'image.png'
                                                  default_extension = 'png'
                                                  file_filter       = '(*.png)|*.png|'
                                                CHANGING
                                                  filename          = lv_filename
                                                  path              = lv_path
                                                  fullpath          = lv_fullpath
                                                  user_action       = lv_action ).

    IF lv_action EQ cl_gui_frontend_services=>action_ok.

* XSTRING -> SOLIX (RAW)
      DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_image_bytes ).

* Daten lokal speichern
      cl_gui_frontend_services=>gui_download( EXPORTING
                                                filename     = lv_fullpath
                                                filetype     = 'BIN'
                                                bin_filesize = xstrlen( lv_image_bytes )
                                              CHANGING
                                                data_tab     = it_raw_data ).

    ENDIF.
  CATCH cx_root INTO DATA(e_txt).
ENDTRY.
ENDTRY.