Menu

ABAP Workbench Tricks #2: Dynamic Patterns

2014-08-06       

In yesterday’s post about patterns, I discussed the basic usage of the pattern feature and showed you how to create your own patterns. Today, I’ll take it further and demonstrate how you can add dynamic elements to your patterns, making your development process even more streamlined.

Dynamic patterns explained

So, what is this about? In regular (static) patterns, there is just ABAP code and possibly some comments. Useful, but not terribly sophisticated. With dynamic patterns however, you can emulate the behaviour of the built-in patterns: Take an argument (e.g. a structure name), do some processing, produce output based on the input.

As an example, we’ll create a dynamic pattern that lists all the fields of a given structure below each other in order to be filled with values. Of course, since you can execute code and pass parameters to your pattern, you can do pretty much anything that you can think of.

Creating a dynamic pattern

To create a dynamic pattern in SAP ERP, just perform the steps I discussed in yesterday’s post about patterns to create one: Select Utilities > More Utilities > Edit Pattern > Create Pattern and enter a name for your pattern. It will contain only the following line of code, nothing else:

*$&$MUSTER

Wait, that’s it? Of course, this doesn’t do anything yet. We’ve just told the pattern to call a specific function module, which I’ll discuss now.

Content of a Dynamic Pattern

Creating the function module for the dynamic pattern

This pattern will, when inserted, call a function module that is dependent on the pattern name:

<patternname>_EDITOR_EXIT

You need to create this function module. For my test pattern, the name is ZTESTDYNAMIC_EDITOR_EXIT accordingly. You will receive a notification that the name is reserved for SAP, but you can continue anyway. Create the function module with one TABLES parameter of type RSWSOURCET with the name BUFFER (attention: in ECC6, it’s a CHANGING instead of a TABLES parameter).

Function Module for Dynamic Pattern

In this function module, you can now do whatever you want to do with your dynamic pattern. You have all the possibilities of normal dialog programming. You could for example ask the user for input with a popup, as I’m doing in this example (find my example coding below).

Here, I’m asking the user for some input by using the function module POPUP_GET_VALUES. This is what appears after the pattern has been inserted via the dialog you already know.

Popup Sent from Dynamic Pattern

After entering a structure name, my coding appends a line to the BUFFER table for each element of the given structure. The output looks like this.

Output Created by Dynamic Pattern

Isn’t that cool? And that’s the end of this quick tutorial! Enjoy using dynamic patterns, as they can really get your ABAP development moving once you know how to use them effectively.

Example coding for function module


Here’s the coding I put into my function module to generate a list of structure fields to assign values.

 FUNCTION ztestdynamic_editor_exit.
 *"----------------------------------------------
 *"*"Local Interface:
 *"  TABLES
 *"      BUFFER TYPE  RSWSOURCET
 *"----------------------------------------------
 
   DATA lt_sval TYPE STANDARD TABLE OF sval.
   DATA ls_sval TYPE sval.
   DATA ls_dd02l TYPE dd02l.
   DATA ls_dd03l TYPE dd03l.
   DATA lt_dd03l TYPE STANDARD TABLE OF dd03l.
   DATA lv_strucname LIKE rsrd1-ddtype_val.
 
 * Get name of structure from user
   ls_sval-tabname = 'RSRD1'.
   ls_sval-fieldname = 'DDTYPE_VAL'.
   ls_sval-field_attr  = '00'.
   APPEND ls_sval TO lt_sval.
 
   CALL FUNCTION 'POPUP_GET_VALUES'
     EXPORTING
       popup_title     = 'Enter Structure Name'
     TABLES
       fields          = lt_sval
     EXCEPTIONS
       error_in_fields = 1
       OTHERS          = 2.
 
 * Get the given structure name
   READ TABLE lt_sval INTO ls_sval INDEX 1.
   lv_strucname = ls_sval-value.
 
 * Check if the structure exists
   SELECT SINGLE *
     FROM dd02l
     INTO ls_dd02l
     WHERE tabname = lv_strucname
       AND tabclass = 'INTTAB'.
   IF sy-subrc <> 0.
     RETURN.
   ENDIF.
 
 * Read table fields
   SELECT * FROM dd03l
     INTO TABLE lt_dd03l
     WHERE tabname = lv_strucname
     ORDER BY position ASCENDING.
 
 * Add a comment to the buffer
   CONCATENATE '* Set structure fields for variable lv_' lv_strucname INTO buffer.
   APPEND buffer.
   CONCATENATE 'DATA lv_' lv_strucname ' TYPE ' lv_strucname '.' INTO buffer.
   APPEND buffer.
 
 * Loop at fields and generate the output for each field
   LOOP AT lt_dd03l INTO ls_dd03l.
     CONCATENATE 'lv_' lv_strucname '-' ls_dd03l-fieldname ' =  .' INTO buffer.
     APPEND buffer.
   ENDLOOP.
 
 ENDFUNCTION.