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
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
Pattern
button and select theOther pattern
radio button.Enter the pattern created by you in the input box and press ENTER.
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