[ABAP] Objektliste zu Transportauftrag lesen

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (20) lbl1 FOR FIELD p_trkorr.
  PARAMETERS: p_trkorr LIKE e070-trkorr OBLIGATORY.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.

  lbl1 = 'Transport-Auftrag:'.

START-OF-SELECTION.
  DATA(lv_req) = VALUE trwbo_request_header( trkorr = p_trkorr ).
  DATA: it_objects TYPE scit_e071.
  DATA: it_keys	TYPE tr_keys.
  DATA: it_keys_str TYPE e071k_strtyp.

* erstellt Gesamt-Objektliste eines Auftrags und seiner Aufgaben
  CALL FUNCTION 'TR_GET_OBJECTS_OF_REQ_AN_TASKS'
    EXPORTING
      is_request_header      = lv_req
      iv_condense_objectlist = abap_true
    IMPORTING
      et_objects             = it_objects
      et_keys                = it_keys
      et_keys_str            = it_keys_str
    EXCEPTIONS
      invalid_input          = 1
      OTHERS                 = 2.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( p_trkorr ).
    cl_demo_output=>write_data( it_objects ).
    cl_demo_output=>write_data( it_keys ).
    cl_demo_output=>write_data( it_keys_str ).

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

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
    WRITE: / lv_msg.
  ENDIF.

[ABAP] Auswahl eines Transportauftrags (mit Anlegen)

* Tabellen:
*  E070 (Transportsystem: Header von Aufträgen/Aufgaben)
*  E07T (Transportsystem: Kurzbeschreibungen von Aufträgen/Aufgaben)
*  E070C (Transportsystem: Quell-/Zielmandant von Aufträgen/Aufgaben)
*  E071 (Transportsystem: Objekt-Einträge von Aufträgen/Aufgaben)
*  TADIR (Katalog der Repository-Objekte)
*  TPLOG (Logging der tp Aufrufe)

* https://www.berater-wiki.de/Transportauftrag
* https://www.berater-wiki.de/Access_Tabellenbeziehung_Transportauftrag/-Aufgabe
* http://sapyourself.com/2014/06/11/transporte-transporteur-ermitteln-und-analysieren-tabelle-tplog/

* TRFUNCTION
*  K  Workbench-Auftrag
*  W  Customizing-Auftrag
*  C  Umzug von Objekten ohne Paketwechsel
*  O  Umzug von Objekten mit Paketwechsel
*  E  Umzug eines kompletten Pakets
*  T  Transport von Kopien
*  S  Entwicklung/Korrektur
*  R  Reparatur
*  X  Unklassifizierte Aufgabe
*  Q  Customizing-Aufgabe
*  G  Stückliste für CTS-Projekt
*  M  Auftrag für Mandantentransport
*  P  Stückliste für Upgrade
*  D  Stückliste für Patch
*  F  Stückliste
*  L  Löschtransport
* TRSTATUS
*  D  Änderbar
*  L  Änderbar, geschützt
*  O  Freigabe gestartet
*  R  Freigegeben
*  N  Freigegeben (Importschutz für reparierte Objekte aktiv)
* KORRDEV
*  CUST  mandantenabhängiges Customizing
*  SYST  Repository, mandantenunabbhängige Objekte
* LOCKFLAG
*     nicht gesperrt
*  X  gesperrt
*  0  nicht importiert
*  1  importiert mit Fehler
*  2  erfolgreich importiert
*  3  erfolgreich aktiviert /After-Import-Methode ausgeführt
*  6  erfolgreich in Schattentabellen importiert
*  7  erfolgreich in neue Schattentabellen importiert
*  8  inaktiver Anteil erfolgreich importiert

* Auftragstyp
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (14) lbl1 FOR FIELD p_tfunc.
  PARAMETERS: p_tfunc TYPE trfunction.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  lbl1 = 'Auftragstyp:'.

START-OF-SELECTION.

  DATA: lv_req TYPE trwbo_request_header.

* Auswahl eines Transportauftrags (mit Anlegen)
  CALL FUNCTION 'TR_REQUEST_CHOICE'
    EXPORTING
      iv_request_types     = p_tfunc
    IMPORTING
      es_request           = lv_req
    EXCEPTIONS
      invalid_request      = 1
      invalid_request_type = 2
      user_not_owner       = 3
      no_objects_appended  = 4
      enqueue_error        = 5
      cancelled_by_user    = 6
      recursive_call       = 7
      OTHERS               = 8.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_req ).
    cl_demo_output=>display( ).
  ENDIF.

[ABAP] Breakpoints im Code setzen

Variante 1 (nutzerspezifischer Breakpoint)

* BREAK ist ein vordefiniertes Makro aus der Tabelle TRMAC
* Breakpoint wird nur getriggert, wenn Benutzer eingeloggt und Debugger-Rechte besitzt
BREAK <username>.

Variante 2 (Checkpoint-Gruppe mit Transaktion SAAB)

* flexibel in der Transaktion SAAB aktivierbar oder deaktivierbar
* Entwickler muss Berechtigung für Transaktion SAAB haben
BREAK-POINT ID <checkpoint>

Links

[ABAP] Quellcode Scan / Analyse

* https://blogs.sap.com/2019/04/22/how-to-scan-abap-code/

PARAMETERS: p_prog TYPE trdir-name DEFAULT 'SAPLSD_ENTRY'. " (SE11)

START-OF-SELECTION.

* Code Inspector: Quelltext für Include
  DATA(o_si) = cl_ci_source_include=>create( p_name = p_prog ).
* Code Inspector: Quelltext für SCAN  erzeugen
  DATA(o_scan) = NEW cl_ci_scan( p_include = o_si ).

* Include-Zeilen
  cl_demo_output=>write_data( o_si->lines ).
* Tokens
  cl_demo_output=>write_data( o_scan->tokens ).
* Anweisungen
  cl_demo_output=>write_data( o_scan->statements ).

* Verknüpfung Statements -> Tokens
* Statements
  LOOP AT o_scan->statements ASSIGNING FIELD-SYMBOL(<s>).

    DATA(idx) = sy-tabix.

* Tokens
    LOOP AT o_scan->tokens ASSIGNING FIELD-SYMBOL(<t>) FROM <s>-from TO <s>-to.
      cl_demo_output=>write_data( value = <t>-str name = |Statement { idx }| ).
    ENDLOOP.

    cl_demo_output=>line( ).

  ENDLOOP.

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

*   cl_gui_container=>default_screen erzwingen
  WRITE: space.

[ABAP] ABAP Programmdokumentation

SE80

  • Menü -> Springen -> Dokumentation

Abschnitte

  • Kurztext (Programmeigenschaften -> Titel (Kurztext))
  • Verwendung (&PURPOSE&)
  • Integration (&INTEGRATION&)
  • Voraussetzungen (&PREREQUISITES&)
  • Funktionsumfang (&FEATURES&)
  • Selektion (&SELECTION&)
  • Standardvarianten (&STANDARD_VARIANTS&)
  • Ausgabe (&OUTPUT&)
  • Aktivitäten (&ACTIVITIES&)
  • Beispiel (&EXAMPLE&)

[ABAP] Code-Vorlagen (ABAP Code Templates)

Im ABAP-Code Editor kann man sich Vorlagen (Templates) definieren: Using Code Templates oder auch berater-wiki.de

ifs (if mit sy-subrc)

IF sy-subrc = 0.
%SurroundedText%  |
ENDIF.

wri

WRITE: / |.

loop (einfacher LOOP it Feldsymbol)

LOOP AT %TABLE NAME% ASSIGNING FIELD-SYMBOL(<e>).
  |
ENDLOOP.

types (Struktur- und Tabellentyp)

TYPES : BEGIN OF ty_s_%TYPE NAME%,
%SurroundedText%          |
        END OF ty_s_%TYPE NAME%.

TYPES: ty_it_%TYPE NAME% TYPE STANDARD TABLE OF ty_s_%TYPE NAME% WITH DEFAULT KEY.

cla (lokale Klasse mit Constructor)

CLASS lcl_%CLASS_NAME% DEFINITION.
  PUBLIC SECTION.

    METHODS: constructor.

    METHODS: set_value
      IMPORTING
        par1 TYPE string.

    METHODS: get_value
      RETURNING VALUE(rv_ret) TYPE i.

  PRIVATE SECTION.
    DATA: gv_data TYPE i.
ENDCLASS.

CLASS lcl_%CLASS_NAME% IMPLEMENTATION.
  METHOD constructor.
  ENDMETHOD.

  METHOD set_value.
    gv_data = par1.
  ENDMETHOD.

  METHOD get_value.
    rv_ret = gv_data.
  ENDMETHOD.
ENDCLASS.

salv (SALV-Table mit Grundeinstellungen)

|
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        = %TABLE NAME% ).
  
* 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 ).
  
* Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
    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.

rem (Methodensignatur aus Eclipse)

|
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Public Method methodname - Text1
* |                            Text2
* |                            Text3
* +-------------------------------------------------------------------------------------------------+
* | [--->] i_var1  - Text1
* | [--->] i_var2  - Text2
* | [<---] ret_var - Text3
* +--------------------------------------------------------------------------------------</SIGNATURE>

cld (cl_demo_output in Vollbilddarstellung)

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

* 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.

[ABAP] Eclipse-ADT Codeschnipsel für Methoden-Signatur

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Public Method methodname - Text1
* |                            Text2
* |                            Text3
* +-------------------------------------------------------------------------------------------------+
* | [--->] i_var1  - Text1
* | [--->] i_var2  - Text2
* | [<---] ret_var - Text3
* +--------------------------------------------------------------------------------------</SIGNATURE>

[ABAP] Debuggen in Popup-Fenstern

  1. Text-Datei auf dem Desktop erstellen mit folgendem Inhalt
    [FUNCTION]
    Command=/H
    Title=Debugger
    Type=SystemCommand
    
  2. zu debuggendes ABAP-Programm ausführen und wenn das zu debuggende Popup hoch kommt -> per Drag&Drop die Text-Datei auf das Popupfenster ziehen

Links