Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

We are all familiar with the "Patterns" button in the ABAP Editor which helps us to generate templates for function modules,classes and standard SAP Objects.In this blog I would like to talk about creating our own dynamic patterns in the ABAP Editor and calling it via the "Pattern" button.In this blog I will explain how to create a dynamic pattern for the "TYPES" statement in ABAP.





STEPS







1.Creation of pattern
Menu -> Utilities->More Utilities->Edit Pattern->Create Pattern from SE38 Editor

.



FUNCTION ztype_editor_exit.

*"----


""Local Interface:

*"  TABLES

*"      BUFFER TYPE  RSWSOURCET

*"  EXCEPTIONS

*"      CANCELLED

*"----


  FREE buffer[].

  CALL SCREEN 9900 STARTING AT 1 1 ENDING AT 54 18.

  IF LINES( gt_buffer ) GT 0.

    APPEND LINES OF gt_buffer TO buffer.

  ENDIF.

ENDFUNCTION.







3. Screen 9900









Screen 9900 Flow Logic




PROCESS BEFORE OUTPUT.


MODULE STATUS_9900.


PROCESS AFTER INPUT.


MODULE EXIT-PROCESSING AT EXIT-COMMAND.


MODULE USER_COMMAND_9900.




Code in the above modules written in the function pool






FUNCTION-POOL zravi.                        "MESSAGE-ID ..

TYPE-POOLS : vrm.

TYPES :

BEGIN OF t_type,

tabname   TYPE tabname,    "Table name

fieldname TYPE fieldname,  "Fieldname

rollname  TYPE rollname,   "Dataelement

ddtext    TYPE as4text,    "Description

END OF t_type.

DATA :

gv_visible(6)   TYPE c VALUE 'GLOBAL', "Visibility

gv_typename(20) TYPE c VALUE 'T_*',    "Typename

gv_include(20)  TYPE c ,               "Include type

gv_table        TYPE tabname,          "Table name

gt_type         TYPE STANDARD TABLE OF t_type,

ok_code         TYPE syucomm,

fcode           TYPE syucomm,

gt_values       TYPE TABLE OF vrm_value,

wa_values       TYPE vrm_value,

gv_value        TYPE  vrm_id,

gt_buffer       TYPE  rswsourcet,

gt_collect      TYPE  TABLE OF string,

gv_buffer       TYPE string,

ob_grid  TYPE REF TO cl_gui_alv_grid,

ob_custom_container TYPE REF TO cl_gui_custom_container,

gt_fieldcat TYPE lvc_t_fcat,

gv_layout TYPE lvc_s_layo,

wa_str    TYPE string.

&----


*&      Module  STATUS_9900  OUTPUT

&----


  •       text

----


MODULE status_9900 OUTPUT.

  SET PF-STATUS 'BASIC1'.

  SET TITLEBAR '007'.

  PERFORM zf_visiblity_fill.

  IF ob_custom_container IS INITIAL.

    PERFORM zf_create_and_init_alv.

  ENDIF.

ENDMODULE.                 " STATUS_9900  OUTPUT

&----


*&      Module  USER_COMMAND_9900  INPUT

&----


  •       text

----


MODULE user_command_9900 INPUT.

  fcode = ok_code.

  CLEAR fcode.

  CASE ok_code.

    WHEN 'CANC'.

      CLEAR gt_buffer.

      SET SCREEN 0.

      LEAVE SCREEN.

    WHEN 'CONT'.

      PERFORM zf_add_to_type.

*End the Type here

      CLEAR gv_buffer.

      CONCATENATE 'TYPES END OF '

                   gv_typename '.'

                   INTO gv_buffer

                   SEPARATED BY space.

      SEARCH gt_collect FOR gv_buffer.

      IF sy-subrc NE 0.

        APPEND gv_buffer TO gt_collect.

      ENDIF.

      IF LINES( gt_collect ) GT 0.

        CLEAR gt_buffer.

        APPEND LINES OF gt_collect TO gt_buffer.

      ENDIF.

      FREE gt_collect.

      SET SCREEN 0.

      LEAVE SCREEN.

    WHEN 'LIST'.

      IF gv_visible = 'GLOBAL'.

        gv_typename = 'T_*'.

      ELSE.

        gv_typename = 'LS_*'.

      ENDIF.

    WHEN 'GET'.

      PERFORM zf_fieldinfo_get.

      CALL METHOD ob_grid->refresh_table_display.

    WHEN 'ADD'.

      PERFORM zf_add_to_type.

    WHEN 'UNDO'.

      CLEAR gv_buffer.

      FREE gt_collect.

  ENDCASE.

ENDMODULE.                 " USER_COMMAND_9900  INPUT

&----


*&      Form  zf_visiblity_fill

&----


FORM zf_visiblity_fill .

  CLEAR : gt_values,wa_values,gv_value.

  wa_values-key = 'GLOBAL'.

  wa_values-text = 'GLOBAL'.

  APPEND wa_values TO gt_values.

  wa_values-key = 'LOCAL'.

  wa_values-text = 'LOCAL'.

  APPEND wa_values TO gt_values.

  gv_value = 'GV_VISIBLE'.

  CALL FUNCTION 'VRM_SET_VALUES'

    EXPORTING

      id              = gv_value

      values          = gt_values[]

    EXCEPTIONS

      id_illegal_name = 1

      OTHERS          = 2.

ENDFORM.                    " zf_visiblity_fill

&----


*&      Form  zf_fieldinfo_get

&----


FORM zf_fieldinfo_get .

  CLEAR gt_type.

  SELECT dd03ltabname dd03lfieldname dd03l~rollname

         dd04t~ddtext FROM ( dd03l AS dd03l INNER JOIN

                             dd04t AS dd04t

                             ON dd03lrollname = dd04trollname )

                   INTO CORRESPONDING FIELDS OF TABLE gt_type

                   WHERE dd03l~tabname = gv_table

                   AND   ddlanguage    = sy-langu.

ENDFORM.                    " zf_fieldinfo_get

&----


*&      Form  zf_create_and_init_alv

&----


FORM zf_create_and_init_alv .

  DATA:lwa_exclude TYPE ui_func,

       lt_exclude TYPE ui_functions.

  CREATE OBJECT ob_custom_container

           EXPORTING container_name = 'CONTAINER'.

  CREATE OBJECT ob_grid

         EXPORTING i_parent = ob_custom_container.

  • Build fieldcat and set columns edit enabled.

  PERFORM zf_build_fieldcat.

  gv_layout-grid_title = 'Fields with data elements'.

  gv_layout-cwidth_opt = 'X'.

*Exclude all functions of alv

  lwa_exclude = cl_gui_alv_grid=>mc_fc_excl_all.

  APPEND lwa_exclude TO lt_exclude.

  CALL METHOD ob_grid->set_table_for_first_display

    EXPORTING

      it_toolbar_excluding = lt_exclude

      is_layout            = gv_layout

    CHANGING

      it_fieldcatalog      = gt_fieldcat

      it_outtab            = gt_type[].

  • Set editable cells to ready for input initially

  CALL METHOD ob_grid->set_ready_for_input

    EXPORTING

      i_ready_for_input = 1.

  • Controls are not integrated into the TAB-Order

  • Call "set_focus" if you want to make sure that 'the cursor'

  • is active in your control.

  CALL METHOD cl_gui_control=>set_focus

    EXPORTING

      control = ob_grid.

ENDFORM.                    " zf_create_and_init_alv

&----


*&      Form  zf_build_fieldcat

&----


FORM zf_build_fieldcat .

  DATA : ls_fieldcat TYPE lvc_s_fcat,

       lv_pos TYPE i VALUE 1.

*Fieldname

  ls_fieldcat-col_pos   = lv_pos.

  ls_fieldcat-fieldname = 'FIELDNAME'.

  ls_fieldcat-key        = 'X'.

  ls_fieldcat-edit       = 'X'.

  ls_fieldcat-scrtext_m  = 'Fieldname'.

  ls_fieldcat-colddictxt = 'M'.

  ls_fieldcat-tipddictxt = 'M'.

  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.

*Data Element

  lv_pos = lv_pos + 1.

  ls_fieldcat-col_pos    = lv_pos.

  ls_fieldcat-fieldname  = 'ROLLNAME'.

  ls_fieldcat-key        = 'X'.

  ls_fieldcat-edit       = ''.

  ls_fieldcat-scrtext_m  = 'Data Element'.

  ls_fieldcat-colddictxt = 'M'.

  ls_fieldcat-tipddictxt = 'M'.

  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.

*Description

  lv_pos = lv_pos + 1.

  ls_fieldcat-col_pos    = lv_pos.

  ls_fieldcat-fieldname  = 'DDTEXT'.

  ls_fieldcat-key        = 'X'.

  ls_fieldcat-edit       = ''.

  ls_fieldcat-scrtext_m  = 'Description'.

  ls_fieldcat-colddictxt = 'M'.

  ls_fieldcat-tipddictxt = 'M'.

  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.

ENDFORM.                    " zf_build_fieldcat

&----


*&      Form  ZF_ADD_TO_TYPE

&----


FORM zf_add_to_type .

  DATA : lt_row_table    TYPE lvc_t_row,  " selected rows

       lwa_row         TYPE lvc_s_row,

       lwa_type        TYPE t_type.

*Call check_changed_data

  CALL METHOD ob_grid->check_changed_data.

  CONCATENATE 'TYPES BEGIN OF '

               gv_typename '.'

               INTO gv_buffer

               SEPARATED BY space.

  SEARCH gt_collect FOR gv_buffer.

  IF sy-subrc NE 0.

    APPEND gv_buffer TO gt_collect.

  ENDIF.

  CALL METHOD ob_grid->get_selected_rows

    IMPORTING

      et_index_rows = lt_row_table[].

  IF LINES( lt_row_table ) GT 0.

    LOOP AT lt_row_table INTO lwa_row.

      READ TABLE gt_type INTO lwa_type

               INDEX lwa_row-index.

      IF sy-subrc EQ 0.

*Add data to gt_buffer

        CLEAR gv_buffer.

        CONCATENATE 'TYPES' lwa_type-fieldname

                     'TYPE' lwa_type-rollname

                     '.' INTO gv_buffer

                     SEPARATED BY space.

        SEARCH gt_collect FOR gv_buffer.

        IF sy-subrc NE 0.

          APPEND gv_buffer TO gt_collect.

        ENDIF.

      ENDIF.

    ENDLOOP.

  ENDIF.

*Check if user has inputted an include type

  IF NOT gv_include IS INITIAL.

    CLEAR gv_buffer.

    CONCATENATE 'INCLUDE TYPE'

                 gv_include '.'

                 INTO gv_buffer

                 SEPARATED BY space.

    SEARCH gt_collect FOR gv_buffer.

    IF sy-subrc NE 0.

      APPEND gv_buffer TO gt_collect.

    ENDIF.

  ENDIF.

ENDFORM.                    " ZF_ADD_TO_TYPE

&----


*&      Module  EXIT-PROCESSING  INPUT

&----


  •       text

----


MODULE exit-processing INPUT.

  fcode = ok_code.

  CLEAR fcode.

  CASE ok_code.

    WHEN 'CANCEL' OR 'EXIT' OR 'CANCEL'.

      REFRESH gt_buffer.

      SET SCREEN 0.

      LEAVE SCREEN.

  ENDCASE.

ENDMODULE.                 " EXIT-PROCESSING  INPUT







3. Test Program calling the pattern






Create a program in SE38.Click on the

Pattern

button and select the

Other pattern

radio button.Enter the pattern created by you in the input box and press ENTER.


The following popup screen will be displayed.





The following features are possible in this application.


1.You can include another type within your type by inputting the "Include Type" name.


2.Entering the table name and clicking on the "LIST" button will populate the fieldnames of the table along with their data elements.


3.You can edit the fieldnames as per your requirements.Clicking the 'ADD" button below the ALV grid will add the fields to the type.The "UNDO" button will clear the fields added to the type.


4.Clicking the "CONTINUE" arrow will insert the generated type within your program.


5.Clicking the "CANCEL" cross will exit the popup box and clear the selection.




A sample test program is as shown below .








You can transport your created pattern by clicking on the "Transport" option in the pattern editor

10 Comments