Pimp my Dynpro

Diese Artikel soll einen ersten Einblick darüber verschaffen, wie ein Windows Steuerelement (Custom Control) in eine SAP Dynpro Oberfläche zu integrieren ist. Für einen ersten Ansatz bedienen wir uns dem ohnehin schon reichhaltigen Angebot. (nicht gewußt? .. nicht schlimm!)

..und was gibt’s denn so ?

Generell hängt das davon ab, was man so installiert hat.
Z.B kommen mit der Installation des SAPGUI ca 72 Custom Controls.Informieren könnte man sich, indem man seine Festplatte oder Registry nach *.ocx absucht, oder in Excel/Word nach „Verweisen/einfügbaren Objekten“ gräbt.
Manchmal sind es allerdings auch DLL Dateien. (siehe scintilla.org ein Freeware Sourcecode Editor mit Syntax Highlighting und Code-Folding, sehr ähnlich dem neuen ABAP Editor).

Eine der populärsten Control-Collections stammt von MS selbst, genauer: „C:\WINDOWS\system32\FM20.DLL“. Diese Datei wird für das kleine Beispiel zwingend benötigt und ist auf Windows XP / Win7 standardmäßig vorhanden !
Was in dieser Wundertüte enthalten ist, kann man in Excel oder Word Toolbox etc. betrachten.

Beispiel mit Elementen der Forms 2 Collection:

Wichtiger Hinweis des Authors :
Diese Art der „Oberflächengestaltung“ bitte nicht nachmachen !

Darum geht es jetzt!

Ein Button Control (mit Uhrzeit Caption)

Wir gehen nun nach folgendem Prinzip vor:

  • Erstellung einer ABAP OO-Klasse, welche das OCX Control auf Betriebssystemebene anspricht und Methoden und Events des Controls an das aufrufende ABAP weiterreicht.
  • Erstellung eines Reports mit Dynpro zum Aufruf und Test der Klasse.

 

Die Abap OO – Klasse / the Core

Für unsere Klasse, (gern auch als „Wrapper class“ bezeichnet, wegen der „Ummantelung“ des eigentlichen Controls), legen wir mit der Transaktion SE24 oder SE80 die Klasse an.

Wir „vererben“ die Klasse CL_GUI_CONTROL und haben dadurch Zugang zum CFW, dem Control Framework. Desweiteren die Typgruppe CNTL, mit einigen wichtigen Definitionen. Durch das „Erbe“ wird auch der Constructor von CL_GUI_CONTROL vererbt, der aber für unser Control so nicht brauchbar ist und REDEFINIERT werden muß! Der Constructor ist eine sehr spezielle Methode, die eine Klasse initialisiert, bzw das Control im umgebenen Custom Container zum Vorschein bringt.

 abap |  copy code |? 
METHOD CONSTRUCTOR .       
  DATA prog_id(80).       
  DATA style TYPE i.       
  IF parent IS INITIAL.       
    RAISE error_cntl_create.       
  ENDIF.       
  CLASS cl_gui_cfw DEFINITION LOAD.       
* assign prog_id to get the frontend specific control       
  IF NOT activex IS INITIAL.       
    prog_id = 'Forms.CommandButton.1'.       
  ELSEIF NOT javabean IS INITIAL.       
    RAISE gui_type_not_supported.       
  ENDIF.       
  IF prog_id IS INITIAL.       
    RAISE gui_type_not_supported.       
  ENDIF.       
* Set the window styles of the control when style parameter was not       
* set with constructor call.       
* For more information on the styles see WIN32 SDK       
  IF style IS INITIAL.       
* otherwise the control would be invisible and the mistake would be       
* hard to find       
    style = cl_gui_control=>ws_visible       
            + cl_gui_control=>ws_child       
            + cl_gui_control=>ws_clipsiblings.       
  ENDIF.       
* Create the control       
  CALL METHOD super->constructor       
    EXPORTING       
      clsid      = prog_id       
      shellstyle = style       
      parent     = parent       
      lifetime   = lifetime       
      name       = name       
    EXCEPTIONS       
      OTHERS     = 1.       
  IF sy-subrc <> 0.       
    RAISE error_cntl_create.       
  ENDIF.       
* register instance at framework       
  CALL METHOD cl_gui_cfw=>subscribe       
    EXPORTING       
      shellid = h_control-shellid       
      ref     = me       
    EXCEPTIONS       
      OTHERS  = 1.       
  IF sy-subrc <> 0.       
    RAISE error_cntl_create.       
  ENDIF.       
* create and initialize dataprovider =>  m_dp_handle       
  CALL FUNCTION 'DP_CREATE'       
    CHANGING       
      h_dp             = m_dp_handle       
    EXCEPTIONS       
      dp_create_error  = 1       
      dp_install_error = 2       
      dp_error         = 3       
      OTHERS           = 4.       
  IF sy-subrc <> 0.       
    RAISE error_dp_create.       
  ENDIF.       
ENDMETHOD.       

Report YBC_TEST_COMMAND_BUTTON
 abap |  copy code |? 
*&---------------------------------------------------------------------*                                  
*& Report  YBC_TEST_COMMAND_BUTTON                                     *                                  
*&                                                                     *                                  
*&---------------------------------------------------------------------*                                  
*&                                                                     *                                  
*&                                                                     *                                  
*&---------------------------------------------------------------------*                                  
REPORT  ybc_test_command_button                                     .                                  
DATA: button TYPE REF TO ycl_gui_button_control.                                  
DATA: ccont TYPE REF TO cl_gui_custom_container.                                  
DATA ok_code TYPE sy-ucomm.                                  
DATA gv_color(4) TYPE x value '00C0E0FF'.                                  
*---------------------------------------------------------------------*                                  
*       CLASS lcl_application DEFINITION                                  
*---------------------------------------------------------------------*                                  
*       ........                                                      *                                  
*---------------------------------------------------------------------*                                  
CLASS lcl_application DEFINITION.                                  
  PUBLIC SECTION.                                  
    METHODS:                                  
      handle_click                                  
        FOR EVENT click OF ycl_gui_button_control.                                  
ENDCLASS.                    "lcl_application DEFINITION                                  
*---------------------------------------------------------------------*                                  
*       CLASS lcl_application IMPLEMENTATION                                  
*---------------------------------------------------------------------*                                  
*       ........                                                      *                                  
*---------------------------------------------------------------------*                                  
CLASS lcl_application IMPLEMENTATION.                                  
  METHOD handle_click.                                  
    PERFORM handle_click.                                  
  ENDMETHOD.                    "handle_click                                  
ENDCLASS.                    "lcl_application IMPLEMENTATION                                  
DATA: g_application TYPE REF TO lcl_application.                                  
START-OF-SELECTION.                                  
  CALL SCREEN 100.                                  
  EXIT.                                  
*&---------------------------------------------------------------------*                                  
*&      Module  STATUS_0100  OUTPUT                                  
*&---------------------------------------------------------------------*                                  
*       text                                  
*----------------------------------------------------------------------*                                  
MODULE status_0100 OUTPUT.                                  
  SET PF-STATUS 'CLICK'.                                  
*  SET TITLEBAR 'xxx'.                                  
  IF ccont IS INITIAL.                                  
****Create the local event callback class                                  
    IF g_application IS INITIAL.                                  
      CREATE OBJECT g_application.                                  
    ENDIF.                                  
****Create the container for the Button                              
    CREATE OBJECT ccont                                  
      EXPORTING                                  
        container_name = 'CCONT'.                                  
****Create the Button                                  
    CREATE OBJECT button                                  
      EXPORTING                                  
        parent                 = ccont                                  
*    LIFETIME               =                                  
*    NAME                   =                                  
      EXCEPTIONS                                  
        gui_type_not_supported = 1                                  
        error_cntl_create      = 2                                  
        error_dp_create        = 3                                  
        OTHERS                 = 4.                                  
    IF sy-subrc <> 0.                                  
    ENDIF.                                  
****Set Event handler for Button                                  
    SET HANDLER g_application->handle_click FOR button.                                  
    DATA: my_simple_event TYPE cntl_simple_event.                                  
    DATA: my_simple_events TYPE cntl_simple_events.                                  
****Register button Event with CFW                                  
    my_simple_event-eventid = button->evt_click.                                  
* Specify that it's an application event                                  
    my_simple_event-appl_event = ''.                                  
    APPEND my_simple_event TO my_simple_events.                                  
    CALL METHOD button->set_registered_events                                  
      EXPORTING                                  
        events                    = my_simple_events                                  
      EXCEPTIONS                                  
        cntl_error                = 1                                  
        cntl_system_error         = 2                                  
        illegal_event_combination = 3                                  
        OTHERS                    = 4.                                  
    IF sy-subrc <> 0.                                  
    ENDIF.                                  
    CALL METHOD button->set_backcolor                                  
      EXPORTING                                  
        color = gv_color.                                  
    CALL METHOD button->set_caption                                  
      EXPORTING                                  
        text = 'Press to delete everything'.                                  
  ENDIF.                                  
ENDMODULE.                 " STATUS_0100  OUTPUT                                  
*&---------------------------------------------------------------------*                                  
*&      Module  USER_COMMAND_0100  INPUT                                  
*&---------------------------------------------------------------------*                                  
*       text                                  
*----------------------------------------------------------------------*                                  
MODULE user_command_0100 INPUT.                                  
  CASE ok_code.                                  
    WHEN 'BACK'.                                  
      IF NOT button IS INITIAL.                                  
        CALL METHOD button->free.                                  
        FREE button.                                  
      ENDIF.                                  
      IF NOT ccont IS INITIAL.                                  
        CALL METHOD ccont->free                                  
          EXCEPTIONS                                  
            OTHERS = 1.                                  
        IF sy-subrc <> 0.                                  
*         MESSAGE E002 WITH F_RETURN.                                  
        ENDIF.                                  
        FREE ccont.                                  
      ENDIF.                                  
      LEAVE PROGRAM.                                  
  ENDCASE.                                  
ENDMODULE.                 " USER_COMMAND_0100  INPUT                                  
*&---------------------------------------------------------------------*                                  
*&      Form  handle_click                                  
*&---------------------------------------------------------------------*                                  
*       text                                  
*----------------------------------------------------------------------*                                  
*      -->PERCENTDONE  text                                  
*----------------------------------------------------------------------*                                  
FORM handle_click.                                  
  DATA rc TYPE i.                                  
  data txtstr type string.                                  
  data txt(40).                                  
*  ADD 251 TO gv_color.                                  
*                                  
*  CALL METHOD button->set_backcolor                                  
*    EXPORTING                                  
*      color = gv_color.  "Rot                                  
  CALL METHOD cl_gui_cfw=>set_new_ok_code                                  
    EXPORTING                                  
      new_code = 'ENT'                                  
    IMPORTING                                  
      rc       = rc.                                  
write sy-uzeit to txt.                                  
concatenate 'Zeit:' txt into txtstr separated by space.                                  
    CALL METHOD button->set_caption                                  
      EXPORTING                                  
        text = txtstr.                                  
ENDFORM.                    "handle_progress                                  

Das Miniprojekt im SAPLINK - format zum Downloaden