Generic Object Services

Hier demonstrieren wir Ihnen, wie Sie den Knopf “Generische Objektdienste”, der in einigen Standardtransaktionen verwendet wird, um Notizen oder den Workflow zu bearbeiten, in Ihre eigenen Programme einbauen können.

In diesem Beispiel beziehen sich die generischen Objektdienste auf das Eingabefeld “Materialnummer” im Programm. Das ist in diesem Sinne natürlich nicht “generisch”, verdeutlicht aber die Vorgehensweise.

Sie können die Objektdienste einfach in jedem Programm einbinden, indem Sie das Coding als Include in Ihre eigenen Programme einbinden. Achten Sie jedoch darauf, dass die Objekte zum Zeitpunkt “INITIALIZATION” erzeugt werden. Das bedeutet, dass Sie das Coding hierfür eventuell in einen anderen Include packen sollten, um in Ihren Programmen auch weiterhin den Zeitpunkt “INITIALIZATION” verwenden können.

Vielen Dank an Haubi für das Coding!!

Weiterführende Informationen stehen hier:
http://help.sap.com/printdocu/
core/Print46c/de/data/pdf/BCSRVOBS/BCSRVOBS.pdf

Coding

REPORT Z_GOS_CONTAINTER.
*&———————————————————————*
*& Report  Z_GOS_CONTAINTER                                            *
*&                                                                     *
*&———————————————————————*

PARAMETERS: p_matnr TYPE matnr.

*———————————————————————*
*       CLASS lcl_event_receiver DEFINITION
*———————————————————————*
*  Handler fuer Events der Toolbar
*———————————————————————*

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    DATA
*       Toolbar
      : x_tb         TYPE REF TO cl_gui_toolbar

*       Kontextmenü
      , x_ctmenu     TYPE REF TO cl_ctmenu.

    METHODS
*       Konstruktor
      : constructor
           IMPORTING
              ix_cont   TYPE REF TO cl_gui_gos_container

*       Handling des Dropdown-Menüs zum einzigen Button
      , eh_dropdown_clicked
           FOR EVENT dropdown_clicked OF cl_gui_toolbar
           IMPORTING
              fcode
              posx
              posy

*       Handler für Funktionscodes zum Kontextmenü
      , eh_function_selected
           FOR EVENT function_selected OF cl_gui_toolbar
           IMPORTING
              fcode.
ENDCLASS.                    “lcl_event_receiver DEFINITION

*———————————————————————*
*       CLASS lcl_event_receiver IMPLEMENTATION
*———————————————————————*
*  Handler fuer Events der Toolbar
*———————————————————————*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD constructor.

    DATA
*         Feld für Icon-ID
        : l_id      TYPE icon_d

*         Tabelle der zu behandelnden Events der Toolbar
        , lt_events TYPE cntl_simple_events
        , ls_events TYPE cntl_simple_event.

*   Toolbar erstellen
    CREATE OBJECT x_tb
      EXPORTING
        parent             = ix_cont
      EXCEPTIONS
        cntl_install_error = 1
        cntl_error         = 2
        cntb_wrong_version = 3
        OTHERS             = 4.

    IF sy-subrc <> 0.
      MESSAGE a001(00) WITH ‘Control-Fehler, SY-SUBRC=’ sy-subrc.
    ENDIF.

*   Icon holen
    SELECT SINGLE id
           FROM  icon
           INTO  l_id
           WHERE name EQ ‘ICON_ANNOTATION’.

*   Dropdown-Button zur Toolbar hinzufügen
    CALL METHOD x_tb->add_button
      EXPORTING
        fcode            = ‘DROPDOWN’
        icon             = l_id
        butn_type        = 2
      EXCEPTIONS
        cntl_error       = 1
        cntb_btype_error = 2
        cntb_error_fcode = 3
        OTHERS           = 4.

    IF sy-subrc <> 0.
      MESSAGE a001(00) WITH ‘Control-Fehler, SY-SUBRC=’ sy-subrc.
    ENDIF.

*   Tabelle der zu behandelnden Events füllen
    MOVE: x_tb->m_id_dropdown_clicked  TO ls_events-eventid.
    APPEND ls_events TO lt_events.

*   FUNCTION_SELECTED als Applikationsevent (damit PAI ausgeführt wird)
    MOVE: x_tb->m_id_function_selected TO ls_events-eventid
        , ‘X’                          TO ls_events-appl_event.
    APPEND ls_events TO lt_events.

*   Events registrieren
    CALL METHOD x_tb->set_registered_events
      EXPORTING
        events                    = lt_events
      EXCEPTIONS
        cntl_error                = 1
        cntl_system_error         = 2
        illegal_event_combination = 3
        OTHERS                    = 4.
    IF sy-subrc <> 0.
      MESSAGE a001(00) WITH ‘Control-Fehler, SY-SUBRC=’ sy-subrc.
    ENDIF.

*   Behandler setzen
    SET HANDLER me->eh_dropdown_clicked  FOR me->x_tb.
    SET HANDLER me->eh_function_selected FOR me->x_tb.
  ENDMETHOD.                    “constructor

  METHOD eh_dropdown_clicked.

    CASE fcode.

      WHEN ‘DROPDOWN’.
*       Dropdown-Button geklickt
*
*       Kontextmenü anlegen, sofern noch nicht geschehen

        IF x_ctmenu IS INITIAL.
          CREATE OBJECT x_ctmenu.
        ENDIF.

*       Kontextmenü leeren
        CALL METHOD x_ctmenu->clear.

*       Neues Menü aufbauen
        CALL METHOD x_ctmenu->add_function
          EXPORTING
            fcode = ‘CTMM03’
            text  = ‘Materialstamm’.

        CALL METHOD x_ctmenu->add_function
          EXPORTING
            fcode = ‘CTCS03’
            text  = ‘Stückliste’.

        CALL METHOD x_ctmenu->add_separator.

        CALL METHOD x_ctmenu->add_function
          EXPORTING
            fcode = ‘CTEXIT’
            text  = ‘Verlassen’.

*       Handler zum Kontextmenü an Toolbar übergeben. Die Funktions-
*         codes werden dann über FUNCTION_SELECTED gehandelt.
        CALL METHOD x_tb->track_context_menu
          EXPORTING
            context_menu = x_ctmenu
            posx         = posx
            posy         = posy.

    ENDCASE.
  ENDMETHOD.                    “eh_dropdown_clicked

  METHOD eh_function_selected.

    CASE fcode.
      WHEN ‘CTMM03’.
*       Aufruf der Materialstammanzeige
        SET PARAMETER ID ‘MAT’ FIELD p_matnr.
        CALL TRANSACTION ‘MM03’.

      WHEN ‘CTCS03’.
*       Aufruf der Stücklistenanzeige
        SET PARAMETER ID ‘MAT’ FIELD p_matnr.
        CALL TRANSACTION ‘CS03’.

      WHEN ‘CTEXIT’.
*       Verlassen des Programms
        LEAVE PROGRAM.
    ENDCASE.

  ENDMETHOD.                    “eh_FUNCTION_SELECTED

ENDCLASS.                    “lcl_event_erceiver IMPLEMENTATION

DATA
*     Referenz auf den GOS-Container
    : gx_gos TYPE REF TO cl_gui_gos_container

*     Referenz auf den lokalen Eventhandler
    , gx_er  TYPE REF TO lcl_event_receiver.

INITIALIZATION.

  CREATE OBJECT gx_gos
    EXCEPTIONS
      cntl_error        = 1
      cntl_system_error = 2
      create_error      = 3
      lifetime_error    = 4
      OTHERS            = 5.

  IF sy-subrc <> 0.
    MESSAGE a001(00) WITH ‘Control-Fehler, SY-SUBRC=’ sy-subrc.
  ENDIF.

  CREATE OBJECT gx_er
         EXPORTING ix_cont = gx_gos.

Enno Wulff