[ABAP] Gültigkeit einer Postleitzahl prüfen

* Tabelle: T005 (Länder)
* Prüfung von Postleitzahlformat, Regionalcode und Länderschlüssel
CALL FUNCTION 'ADDR_POSTAL_CODE_CHECK'
  EXPORTING
    country                        = 'DE'
    postal_code_city               = '00000'
  EXCEPTIONS
    country_not_valid              = 1
    region_not_valid               = 2
    postal_code_city_not_valid     = 3
    postal_code_po_box_not_valid   = 4
    postal_code_company_not_valid  = 5
    po_box_missing                 = 6
    postal_code_po_box_missing     = 7
    postal_code_missing            = 8
    postal_code_pobox_comp_missing = 9
    po_box_region_not_valid        = 10
    po_box_country_not_valid       = 11
    pobox_and_poboxnum_filled      = 12
    OTHERS                         = 13.

IF sy-subrc NE 0.
  WRITE: / 'PLZ nicht ok.'.
ELSE.
  WRITE: / 'PLZ ok.'.
ENDIF.

[ABAP] Speicherbelegung eines ABAP-Objektes ermitteln

DATA: it_flight TYPE TABLE OF sflight.

PARAMETER: p_carrid TYPE sflight-carrid.

START-OF-SELECTION.

  SELECT * FROM sflight INTO TABLE @it_flight WHERE carrid = @p_carrid.

  cl_abap_memory_utilities=>get_memory_size_of_object( EXPORTING
                                                         object           = it_flight
                                                       IMPORTING
                                                         bound_size_alloc = DATA(lv_size_alloc)
                                                         bound_size_used  = DATA(lv_size_used) ).

  WRITE: / |{ lv_size_alloc } Bytes alloc.|.
  WRITE: / |{ lv_size_used } Bytes used.|.

[ABAP] System Callstack (Aufrufreihenfolge) lesen

Möglichkeit 1 (SYSTEM_CALLSTACK)

DATA: it_abap_callstack TYPE abap_callstack.
DATA: it_syst_callstack TYPE sys_callst.

* Callstack ermitteln
CALL FUNCTION 'SYSTEM_CALLSTACK'
  IMPORTING
    callstack    = it_abap_callstack
    et_callstack = it_syst_callstack.

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_abap_callstack ).
  cl_demo_output=>write_data( it_syst_callstack ).

* 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        = |Stackaufrufe|
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

Möglichkeit 2 (cl_abap_get_call_stack)

* Aufrufstapel auslesen
DATA(it_stack) = cl_abap_get_call_stack=>get_call_stack( ).
DATA(it_stack_formattet) = cl_abap_get_call_stack=>format_call_stack_with_struct( it_stack ).

IF sy-subrc = 0.
  cl_demo_output=>write_data( it_stack ).
  cl_demo_output=>write_data( it_stack_formattet ).

* 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        = |Stackaufrufe|
                                html_string  = lv_html
                                container    = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.
ENDIF.

[ABAP] SAP Release Information anzeigen

DATA: kern_rel TYPE thllines-thline. " Kernel Release
DATA: kern_make_variant TYPE thllines-thline. " Makevariante
DATA: kern_dblib TYPE thllines-thline. " Database libraries
DATA: kern_comp_on TYPE thllines-thline. " compiled on
DATA: kern_comp_time TYPE thllines-thline. " compile time
DATA: kern_patchlevel TYPE thllines-thline. " patch level
DATA: kern_supportlevel TYPE thllines-thline. " support level
DATA: kern_patchnumber TYPE thllines-thline. " patch number
DATA: kern_sourceid TYPE thllines-thline. " source id
DATA: kern_comp_level TYPE i. " compatibility level of the kernel
DATA: supp_db_sap TYPE TABLE OF thllines. " database release (SAP, table SVERS)
DATA: supp_db_vendor TYPE TABLE OF thllines. " databse release (vendor)
DATA: supp_op_sys TYPE TABLE OF thllines. " operation system
DATA: patchcomment TYPE TABLE OF thllines. " patch level information

CALL FUNCTION 'TH_SAPREL4'
  IMPORTING
    kern_rel          = kern_rel
    kern_make_variant = kern_make_variant
    kern_dblib        = kern_dblib
    kern_comp_on      = kern_comp_on
    kern_comp_time    = kern_comp_time
    kern_patchlevel   = kern_patchlevel
    kern_supportlevel = kern_supportlevel
    kern_patchnumber  = kern_patchnumber
    kern_sourceid     = kern_sourceid
    kern_comp_level   = kern_comp_level
  TABLES
    supp_db_sap       = supp_db_sap
    supp_db_vendor    = supp_db_vendor
    supp_op_sys       = supp_op_sys
    patchcomment      = patchcomment.

WRITE: / |Kernel Release: { kern_rel }|.
WRITE: / |Makevariante: { kern_make_variant }|.
WRITE: / |Database libraries: { kern_dblib }|.

WRITE: / |compiled on: { kern_comp_on }|.
WRITE: / |compile time: { kern_comp_time }|.
WRITE: / |patch level: { kern_patchlevel }|.
WRITE: / |support level: { kern_supportlevel }|.
WRITE: / |patch number: { kern_patchnumber }|.
WRITE: / |source id: { kern_sourceid }|.
WRITE: / |compatibility level of the kernel: { kern_comp_level }|.

WRITE: / |database release (SAP, table SVERS):|.
LOOP AT supp_db_sap INTO DATA(rel).
  WRITE: / |{ rel-thline }|.
ENDLOOP.

WRITE: / |databse release (vendor):|.
LOOP AT supp_db_vendor INTO DATA(ven).
  WRITE: / |{ ven-thline }|.
ENDLOOP.

WRITE: / |operation system:|.
LOOP AT supp_op_sys INTO DATA(op).
  WRITE: / |{ op-thline }|.
ENDLOOP.

WRITE: / |patch level information:|.
LOOP AT patchcomment INTO DATA(patch).
  WRITE: / |{ patch-thline }|.
ENDLOOP.

[ABAP] BDC (Batch Data Communication / Batch-Input)

Transaktionsrecorder zur Aufzeichnung der Bedienschritte: SHDB

Variante 1 (Sofortige Ausführung über CALL TRANSACTION)

DATA: it_batchdata TYPE STANDARD TABLE OF bdcdata.
DATA: it_params TYPE STANDARD TABLE OF rfc_spagpa.
DATA: it_msg TYPE STANDARD TABLE OF bdcmsgcoll.
DATA: lv_mode TYPE sy-ftype.
DATA: lv_update TYPE sy-ftype.

* A = Ausführen im Vordergrund (Hell abspielen, mit Bestätigungen)
* E = Ausführen im Hintergrund, aber Stoppen bei Fehler (dunkel abspielen, bei Fehler hell)
* N = Ausführen im Hintergrund, sammeln Fehler in Fehlertabelle (dunkel abspielen), bei Break-Point Abbruch
* P = Ausführen im Hintergrund, sammeln Fehler in Fehlertabelle (dunkel abspielen), bei Break-Point Sprung in Debugger
lv_mode = 'A'.
* A = Asynchrone Verbuchung. Verbuchungen des aufgerufenen Programms werden so durchgeführt, als sei bei der Anweisung COMMIT WORK der Zusatz AND WAIT nicht angegeben.
* S = Synchrone Verbuchung. Verbuchungen des aufgerufenen Programms werden so durchgeführt, als sei bei der Anweisung COMMIT WORK der Zusatz AND WAIT angegeben.
* L = Lokale Verbuchung. Verbuchungen des aufgerufenen Programms werden durchgeführt, als sei in ihm die Anweisung SET UPDATE TASK LOCAL ausgeführt worden.
lv_update = 'A'.

it_batchdata = VALUE #( ( program = 'SAPMV45A' dynpro = '0102' dynbegin = 'X' fnam = '' fval = '' )        " Einstiegsbildschirm aufrufen
                        ( program = '' dynpro = '' dynbegin = '' fnam = 'BDC_CURSOR' fval = 'VBAK-VBELN' ) " Einstiegsbildschirm aufrufen
                        ( program = '' dynpro = '' dynbegin = '' fnam = 'VBAK-VBELN' fval = '122' )    " OK-Code übergeben
                        ( program = '' dynpro = '' dynbegin = '' fnam = 'BDC_OKCODE' fval = '=SUCH' )
                        ( program = 'SAPMV45A' dynpro = '4001' dynbegin = 'X' fnam = '' fval = '' )
                        ( program = '' dynpro = '' dynbegin = '' fnam = 'BDC_OKCODE' fval = '/EBABA' ) ).       " Bildschirm füllen

* ohne neuen Task und ohne Berechtigungsprüfungen starten
*CALL TRANSACTION 'VA03'
*  USING it_batchdata
*  MODE lv_mode
*  UPDATE lv_update
*  MESSAGES INTO it_msg.

* in neuem Task (Fenster) mit Berechtigungsprüfung starten
CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'PROGRAM_1'
  EXPORTING
    tcode                   = 'VA03'
    skip_screen             = abap_false
    mode_val                = lv_mode
    update_val              = lv_update
  TABLES
    using_tab               = it_batchdata
    spagpa_tab              = it_params
    mess_tab                = it_msg
  EXCEPTIONS
    call_transaction_denied = 1
    tcode_invalid           = 2
    OTHERS                  = 3.

CASE sy-subrc.
  WHEN 0.
    WRITE: / 'Ok.'.
  WHEN 1.
    WRITE: / 'call_transaction_denied'.
  WHEN 2.
    WRITE: / 'tcode_invalid.'.
  WHEN OTHERS.
    WRITE: / 'Other error.'.
ENDCASE.

LOOP AT it_msg ASSIGNING FIELD-SYMBOL(<fl_msg>).
  WRITE: / <fl_msg>-dyname.
ENDLOOP.

Variante 2 (neue Mappe, die in der Transaktion SM35 (Batch-Input: Mappenübersicht) eingesehen werden kann, erstellen)

DATA: t_bdcdata LIKE TABLE OF bdcdata.
DATA: fs_bdcdata LIKE LINE OF t_bdcdata.

* Mappe öffnen
CALL FUNCTION 'BDC_OPEN_GROUP'
  EXPORTING
    client              = sy-mandt
    group               = 'MAPPENNAME' " hier Namen der Mappe eintragen
    keep                = 'X'
    user                = sy-uname
  EXCEPTIONS
    client_invalid      = 1
    destination_invalid = 2
    group_invalid       = 3
    group_is_locked     = 4
    holddate_invalid    = 5
    internal_error      = 6
    queue_error         = 7
    running             = 8
    system_lock_error   = 9
    user_invalid        = 10
    OTHERS              = 11.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

* Batchdaten zur Mappe hinzufügen (Beispiel)
* z.B. Programmaufruf
CLEAR fs_bdcdata.
fs_bdcdata-program = 'SAPMM06B'.  " Programmname
fs_bdcdata-dynpro = '0100'.       " Dynpro
fs_bdcdata-dynbegin = 'X'.        " Screen start
APPEND fs_bdcdata TO t_bdcdata.

* z.B. Feldwerte eintragen
CLEAR fs_bdcdata.
fs_bdcdata-fnam = 'EBAN-BSART'.   " Feldname
fs_bdcdata-fval = fs_field-bsart. " Feldwert
CONDENSE fs_bdcdata-fval.
APPEND fs_bdcdata TO t_bdcdata.

* z.B. Aktion auslösen
CLEAR fs_bdcdata.
fs_bdcdata-fnam = 'BDC_OKCODE'.   " OK-Code
fs_bdcdata-fval = '/00'.          " Enter (z.B. '=BU' -> Save, '=SAV' -> Save, '=BACK' -> Zurück)
CONDENSE fs_bdcdata-fval.
APPEND fs_bdcdata TO t_bdcdata.

CALL FUNCTION 'BDC_INSERT'
  EXPORTING
    tcode            = 'ME51'
  TABLES
    dynprotab        = t_bdcdata
  EXCEPTIONS
    internal_error   = 1
    not_open         = 2
    queue_error      = 3
    tcode_invalid    = 4
    printing_invalid = 5
    posting_invalid  = 6
    OTHERS           = 7.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

* Mappe schließen
CALL FUNCTION 'BDC_CLOSE_GROUP'
  EXCEPTIONS
    not_open    = 1
    queue_error = 2
    OTHERS      = 3.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Weiterführende Infos: Link

[ABAP] Klasse (cl_s_aut_bal_log) zur Verwendung des Business Application Log (BAL)

* cl_s_aut_bal_log implementiert die gundlegenden Funktionen (FuBas) des Application-Log
* Es werden z.B. NICHT implementiert: BAL_DB_SEARCH, BAL_DB_LOAD.
* Es kann nicht mit Verfallsdatum gearbeitet werden.
START-OF-SELECTION.
* Legt eine Protokoll-Instanz an
* Log-Objekte werden in der Transaktion SLG0 definiert --> es werden Transportaufträge generiert
* Anlegen der Objekte erfolgt in den Tabellen
*   BALOBJ (Anwendungs-Log: Objekte)
*   BALSUB (Anwendungs-Log: Unterobjekte)
  DATA(o_applog) = cl_s_aut_bal_log=>create( im_object    = 'Z_TEST_LOG'
                                             im_subobject = 'Z_TEST_LOG_U1' ).

* Protokolleinträge hinzufügen -> Nachrichten werden in der Transaktion SE91 gefplegt
* Beispiel: Verwendung der vordefinierten Nachrichtenklasse 'S_AUT', Nr. '128'
  o_applog->add_entry( im_msgtype = 'I'
                       im_msgid   = 'S_AUT'
                       im_msgno   = '128' ).

* Beispiel: Verwendung der generische Nachrichtenklasse mit & & & & für die Parameter msgv1 - msgv4
  o_applog->add_entry( im_msgtype = 'W'
                       im_msgid   = '01'
                       im_msgno   = '319'
                       im_msgv1   = 'Test1'
                       im_msgv2   = 'Test2'
                       im_msgv3   = 'Test3'
                       im_msgv4   = 'Test4' ).

  TRY.
* Ausnahme auslösen
      DATA(result) = 1 / 0.

    CATCH cx_root INTO DATA(e_txt).
* Fügt eine Ausnahme hinzu, wobei
* im_probclass: 1 - sehr wichtig
*               2 - wichtig
*               3 - mittel
*               4 - Zusatzinformationen
      o_applog->add_exception( im_probclass = '4'
                               im_msgtype = 'E'
                               im_exception = e_txt ).
  ENDTRY.

* Existieren Meldungen?
  IF o_applog->has_statistic( ) = abap_true.
* Protokoll anzeigen
    o_applog->show( im_title = 'Application-Log' ).
  ENDIF.

* Schließt und persistiert (speichert) das Protokoll
* Protokoll kann in der Transaktion SLG1 angeschaut werden
* Speicherung der Log-Daten erfolgt in den Tabellen
*   BALHDR (Anwendungs-Log: Protokollkopf)
*   BALDAT (Anwendungs-Log: Daten eines Protokolls)
  o_applog->close( im_save = CONV #( abap_true ) ).

Weiterführende Infos: Link, Link, Link und Link