[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] Verschieben von Nodes per Drag & Drop innerhalb einer Baumansicht (CL_COLUMN_TREE_MODEL)

* globale Objektreferenz für Tree-Objekt
DATA: o_tree TYPE REF TO cl_column_tree_model.

* Übergabeobjekt für Drag-Drop-Events
CLASS lcl_dd_object DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor
      IMPORTING
        i_drag_node_text TYPE tm_nodekey.

    METHODS: get_value
      RETURNING VALUE(rv_ret) TYPE tm_nodekey.

  PRIVATE SECTION.
    DATA: gv_drag_node_text TYPE tm_nodekey.
ENDCLASS.

CLASS lcl_dd_object IMPLEMENTATION.
  METHOD constructor.
    gv_drag_node_text = i_drag_node_text.
  ENDMETHOD.

  METHOD get_value.
    rv_ret = gv_drag_node_text.
  ENDMETHOD.
ENDCLASS.

* Demoprogramm: SAPSIMPLE_TREE_DRAG_DROP_DEMO
* http://saphelp.ucc.ovgu.de/NW750/EN/4d/88f020981740abe10000000a15822b/frameset.htm
* Eventhandler-Klasse
CLASS lcl_events DEFINITION.
  PUBLIC SECTION.

    TYPES: ty_it_events TYPE STANDARD TABLE OF cntl_simple_event WITH DEFAULT KEY.

    CLASS-METHODS: on_drag FOR EVENT drag OF cl_column_tree_model
      IMPORTING
        node_key
        item_name
        drag_drop_object
        sender.

    CLASS-METHODS: on_drop FOR EVENT drop OF cl_column_tree_model
      IMPORTING
        node_key
        drag_drop_object
        sender.

    CLASS-METHODS: on_drop_complete FOR EVENT drop_complete OF cl_column_tree_model
      IMPORTING
        node_key
        item_name
        drag_drop_object
        sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
* Quell-Node
  METHOD on_drag.

* Übergabe Name der Quell-Node
    drag_drop_object->object = NEW lcl_dd_object( node_key ).

  ENDMETHOD.

* Ziel-Node
  METHOD on_drop.
    TRY.
* Holen Name der Quell-Node
        DATA(o_dd_obj) = CAST lcl_dd_object( drag_drop_object->object ).

        IF o_tree IS BOUND.
* Quell-Node an Ziel-Node umhängen
          o_tree->move_node(
                              node_key          = o_dd_obj->get_value( )
                              relative_node_key = node_key
                              relationship      = cl_tree_model=>relat_last_child
                           ).
        ENDIF.
      CATCH cx_root.
* Abbruch bei Cast-Fehler
        drag_drop_object->abort( ).
    ENDTRY.
  ENDMETHOD.

  METHOD on_drop_complete.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Tree-Control erzeugen
* item_selection = abap_true wegen der CheckBoxen
  o_tree = NEW cl_column_tree_model( node_selection_mode   = cl_column_tree_model=>node_sel_mode_single
                                     hierarchy_column_name = 'FOLDER'
                                     hierarchy_header      = VALUE #( t_image = icon_folder
                                                                      heading = 'Beispiel'
                                                                      tooltip = 'Tooltip'
                                                                      width   = 30
                                                                    )
                                     item_selection        = abap_true
                                   ).
* Spalten hinzufügen
  o_tree->add_column( EXPORTING
                        name                = 'COL1'
                        width               = 30
                        header_text         = 'Column1' ).

  o_tree->add_column( EXPORTING
                        name                = 'COL2'
                        width               = 30
                        header_text         = 'Column2' ).

* in default_screen einbetten
  o_tree->create_tree_control( parent = cl_gui_container=>default_screen ).

* Drag-Drop-Verhalten definieren
  DATA(o_behaviour) = NEW cl_dragdrop( ).

  o_behaviour->add( EXPORTING
                      flavor = 'Filestest'
                      dragsrc = abap_true
                      droptarget = abap_true
                      effect = CONV i( cl_dragdrop=>move + cl_dragdrop=>copy )
                  ).

  DATA: lv_handle_dd TYPE i.

  o_behaviour->get_handle( IMPORTING handle = lv_handle_dd ).

* Beispielhaft Nodes und Subnodes erzeugen
  o_tree->add_node( EXPORTING
                      isfolder          = abap_true
                      node_key          = 'NODE1'
                      relative_node_key = ''
                      relationship      = cl_tree_model=>relat_last_child
                      expanded_image    = CONV tv_image( icon_folder )
                      image             = CONV tv_image( icon_folder )
                      item_table        = VALUE #( ( class     = cl_column_tree_model=>item_class_checkbox
                                                     item_name = 'FOLDER'
                                                     text      = 'Obj1'
                                                     editable  = abap_true
                                                   )
                                                 )

                      drag_drop_id      = lv_handle_dd
                  ).

  o_tree->add_node( EXPORTING
                      isfolder          = abap_true
                      node_key          = 'NODE1_1'
                      relative_node_key = 'NODE1'
                      relationship      = cl_tree_model=>relat_last_child
                      expanded_image    = CONV tv_image( icon_oo_object )
                      image             = CONV tv_image( icon_oo_object )
                      item_table        = VALUE #( ( class     = cl_column_tree_model=>item_class_link
                                                     item_name = 'FOLDER'
                                                     text      = 'Obj4'
                                                   )
                                                   ( class     = cl_column_tree_model=>item_class_text
                                                     item_name = 'COL1'
                                                     text      = 'Wert1'
                                                     style     = cl_column_tree_model=>style_intensified
                                                     font      = cl_column_tree_model=>item_font_prop
                                                   )
                                                   ( class     = cl_column_tree_model=>item_class_text
                                                     item_name = 'COL2'
                                                     text      = 'Wert2'
                                                   )
                                                 )

                      drag_drop_id      = lv_handle_dd
                  ).

  o_tree->add_node( EXPORTING
                      isfolder          = abap_true
                      node_key          = 'NODE2'
                      relative_node_key = ''
                      relationship      = cl_tree_model=>relat_last_child
                      expanded_image    = CONV tv_image( icon_folder )
                      image             = CONV tv_image( icon_folder )
                      item_table        = VALUE #( ( class     = cl_column_tree_model=>item_class_checkbox
                                                     item_name = 'FOLDER'
                                                     text      = 'Obj2'
                                                     editable  = abap_true
                                                   )
                                                 )

                      drag_drop_id      = lv_handle_dd
                  ).

  o_tree->add_node( EXPORTING
                      isfolder          = abap_true
                      node_key          = 'NODE2_1'
                      relative_node_key = 'NODE2'
                      relationship      = cl_tree_model=>relat_last_child
                      expanded_image    = CONV tv_image( icon_oo_object )
                      image             = CONV tv_image( icon_oo_object )
                      item_table        = VALUE #( ( class     = cl_column_tree_model=>item_class_button
                                                     item_name = 'FOLDER'
                                                     text      = 'Obj3'
                                                   )
                                                   ( class     = cl_column_tree_model=>item_class_text
                                                     item_name = 'COL1'
                                                     text      = 'Wert1'
                                                     style     = cl_column_tree_model=>style_inactive
                                                     font      = cl_column_tree_model=>item_font_prop
                                                   )
                                                   ( class     = cl_column_tree_model=>item_class_text
                                                     item_name = 'COL2'
                                                     text      = 'Wert2'
                                                   )
                                                 )

                      drag_drop_id      = lv_handle_dd
                  ).

* Nodes expandieren
  o_tree->expand_root_nodes( expand_subtree = abap_true
                             level_count = 10 ).

* Events registrieren
* ITEM_DOUBLE_CLICK            Doppelklick auf Item
* BUTTON_CLICK                 Drucktaste wurde gedrückt
* LINK_CLICK                   Link geklickt
* CHECKBOX_CHANGE              Zustandsänderung einer Checkbox
* ITEM_KEYPRESS                Taste wurde gedrückt, Item war selektiert
* HEADER_CLICK                 Header geklickt
* ITEM_CONTEXT_MENU_REQUEST    Anforderung eines Kontext-Menüs für ein Item
* ITEM_CONTEXT_MENU_SELECT     Kontext-Menü Eintrag wurde ausgewählt
* HEADER_CONTEXT_MENU_REQUEST  Anforderung eines Kontext-Menüs für einen Header
* HEADER_CONTEXT_MENU_SELECT   Kontext-Menü Eintrag wurde ausgewählt
* DRAG                         Ereignis zum Füllen des Drag Drop Daten - Objekts
* DRAG_MULTIPLE                Ereignis zum Füllen des Drag Drop Daten - Objekts
* DROP_COMPLETE                Ereignis nach erfolgreichem Drop
* DROP_COMPLETE_MULTIPLE       Ereignis nach erfolgreichem Drop
  SET HANDLER lcl_events=>on_drag FOR o_tree.
  SET HANDLER lcl_events=>on_drop FOR o_tree.
  SET HANDLER lcl_events=>on_drop_complete FOR o_tree.

* Erzeugung von cl_gui_container=>default_screen erzwingen
  WRITE: space.

[SAP] Screen Personas

Transaktionen

/PERSONAS/ADMIN (Administration SAP Screen Personas)
/PERSONAS/ANALYTICS (Personas – Analyse)
/PERSONAS/FLAVORS (Personas – Flavors)
/PERSONAS/HEALTH (Personas Health Check)
/PERSONAS/LAUNCH (Personas Flavor Launcher)
/PERSONAS/LIBRARY (MIME Object Library)
/PERSONAS/RESOURCES (Resource Maintenance)
/PERSONAS/ROLES (Role Maintenance)
/PERSONAS/SE (Slipstream Engine starten)
/PERSONAS/SETTINGS (Personas – Globale Einstellungen)
/PERSONAS/TEMPLATES (Templates Maintenance)
/PERSONAS/THEMES (Theme Maintenance)
/PERSONAS/TRANSPORTS (Transports UI)
/PERSONAS/USERS (User Maintenance)

Aufruf

  • Service Pfad
    SICF
    Service Pfad: /default_host/sap/bc/personas (SAP Screen Personas 3.0)
    Rechtsklick + Service testen.
    
  • URL
    https://host.domain:port/sap/bc/personas
    
  • Slipstream Engine
    https://host.domain:port/sap/bc/se/m
    

SICF-Services

/default_host/sap/bc/personas (SAP Screen Personas 3.0 Vorkonfigurierte SAP GUI for HTML mit aktivem SAP Screen Personas 3.0.)
/default_host/sap/bc/personas3 (/PERSONAS/CL_MIME_ZIP_HANDLER)
/default_host/sap/bc/gui/sap/its/webgui (SAP GUI for HTML)

/default_host/sap/public/bc/ui5_ui5 (SAPUI5-Bibliothek über HTTP aus MIME-Repository aufgerufen)
 
/default_host/sap/bc/se/ (Slipstream-Root-Service)
/default_host/sap/bc/se/m (Wurzelknoten für SE-Quellen)
/default_host/sap/bc/se/proxy (Proxy-Service für Slipstream Engine)
/default_host/sap/bc/se/rg (Einfacher ITS-Rest-GUI-Handler)

Vorkonfigurerte Rollen

/PERSONAS/ADMIN_ROLE (umfassende Berechtigungen für alle SAP-Screen-Personas-Funktionen)
/PERSONAS/CONSUMER_ROLE (Standardbenutzer mit der Berechtigung, Flavors zu verwalten)
/PERSONAS/EDITOR_ROLE (Geschäftsbenutzer mit Berechtigungen für eine vollständige Bearbeitung)

Links

[CDS-Views] Virtuelle Elemente: Aufruf von ABAP-Coding aus CDS-Views heraus

Virtuelle Elemente bieten Möglichkeiten Berechnungs- und Verarbeitungslogik von Feldwerten mittels ABAP-Klassen durchzuführen:

https://saplearners.com/virtual-elements-in-abap-cds-view/
https://help.sap.com/docs/SAP_NETWEAVER_AS_ABAP_751_IP/cc0c305d2fab47bd808adcad3ca7ee9d/a7fc007921d44263b09ccc092392b05f.html?version=7.51.7&locale=en-US

[ABAP] Versand von Emails auf Basis von CDS-Views

https://weberpatrick.de/e-mail-templates/
https://weberpatrick.de/e-mail-templates-einfaches-beispiel/

https://blogs.sap.com/2019/10/12/e-mail-templates-in-s4-hana/
https://blogs.sap.com/2020/05/07/e-mail-templates-in-s-4-hana-translations/
https://blogs.sap.com/2022/08/17/e-mail-templates-in-s-4-hana-display-table-in-the-email-template/