Shared Top Border

Enterprise Resource
Planning Portal

 

Advertise | Founder BLOG

ERPGenie.COM ABAP Tips and Tricks Database

THE ultimate
ERP website

 

Forums | Vote for us |

Google    Other Search Options

Login

Login to view more content!!!





Lost Password?
No account yet? Register

Registered Access

Poll

What area of ABAP are you interested in?
 
Home arrow Tips and Tricks arrow Connectors / BAPIs arrow Source Code Patterns
Source Code Patterns PDF Print E-mail
User Rating: / 2
PoorBest 
Written by Rich   
Wednesday, 16 May 2007

Source Code Patterns.

In the ABAP editor there is the functionality to insert code into your program using what is called a pattern. You use this functionality each time you insert a function call for example. This menu option is reached via the menu path SE38->Edit->Pattern:
 



By entering a function module name, or selecting one of the other options SAP will automatically enter the correct code into your program enabling you to just "fill in the blanks".

One of the things that I do when I get to a new site is to enter my own program header and procedure headers as a pattern using the Pattern Editor (SE38->Utilities->More Utilities->Edit Pattern. You provide a pattern name (such as 'Header'), enter the text using SE38, save it and then use it. By selecting the 'Other Pattern' radio button in the pattern selection window shown above and entering your pattern name in the relevant field, the lines of text you have defined will be entered into your source code at the current cursor location.

This works well for static patterns, Ie patterns that do not have any variable text in them. However, Rob Dielemans (Rob) has sent in some code that allows you to define a dynamic pattern, again a header which automatically fills in various fields.

This has been tested in 4.6c, but not on any other versions although the pattern editor has been around since 3.1 so you might be lucky.....

Whilst this has been written to produce a program header, SAP when inserting a pattern looks for a function module that contains the name of your pattern followed by the string '_editor_exit'. This is then called allowing you to do whatever processing you require before returning any results back to the editor where they are dumped into your source code.

To implement this, create your pattern in the pattern editor as described above. The pattern should contain only one line of text:

Code:
*$&$MUSTER
The next thing to do is to create the function module that is called. Create a new function group first (because I can see this becoming extremely useful.....) and then insert a new function module into the group. This function module should have a single table parameter of structure 'ABAPSOURCE'.

Anything that you place in this table will be copied back to your own source.

Taking Robs example function, he is inserting the user name, department and a few other bits and bobs into the header:

Code:
FUNCTION ZIPS_MODEL_HEADER_EDITOR_EXIT.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" BUFFER STRUCTURE ABAPSOURCE
*"----------------------------------------------------------------------

* <DATA>
DATA: l_commentline1 LIKE LINE OF buffer,
l_commentline2 LIKE LINE OF buffer,
l_commentline3 LIKE LINE OF buffer,
l_firstname LIKE adrp-name_first,
l_lastname LIKE adrp-name_last,
l_function LIKE adcp-function,
l_department LIKE adcp-department,
l_datum(10).

* <TABLES>
TABLES: usr21, "Assign user name address key
adrp, "Persons (central address administration)
adcp. "Person/Address assignment (central address administration)

*additional:, although using the comment charater '"', the system
* converts it to '*'
CONCATENATE '"##############################'
'#########################################' INTO l_commentline1.

CONCATENATE '"------------------------------------'
'-----------------------------------' INTO l_commentline2.
CONCATENATE '"=================================='
'=====================================' INTO l_commentline3.

buffer = l_commentline1.
APPEND buffer.

buffer = '* Report : '.
APPEND buffer.

buffer = '* Version : 1.00'.
APPEND buffer.

* initialize first and last name, if not found in database
l_firstname = 'first name'.
l_lastname = 'last name'.

* retrieval of first and last name in database
SELECT SINGLE * FROM usr21 WHERE bname = sy-uname.
IF sy-subrc = 0.

SELECT SINGLE * FROM adrp WHERE persnumber = usr21-persnumber.
IF sy-subrc = 0.
l_firstname = adrp-name_first.
l_lastname = adrp-name_last.

* retrtieval of function and department of user
SELECT SINGLE * FROM adcp WHERE persnumber = usr21-persnumber.
IF sy-subrc = 0.
l_function = adcp-function.
l_department = adcp-department.

ENDIF.
ENDIF.
ENDIF.

CONCATENATE '* Author :' sy-uname' -' l_firstname l_lastname INTO
buffer SEPARATED BY space.
APPEND buffer.

CONCATENATE '* Function :' l_function
' Department :' l_department
INTO buffer SEPARATED BY space.
APPEND buffer.

WRITE sy-datum DD/MM/YYYY TO l_datum.
CONCATENATE '* Date : ' l_datum INTO buffer SEPARATED BY space.
APPEND buffer.

buffer = l_commentline2.
APPEND buffer.

buffer = '* Title : '.
APPEND buffer.

buffer = '* Purpose : '.
APPEND buffer.

buffer = '* Details : '.
APPEND buffer.

buffer = l_commentline3.
APPEND buffer.

buffer = '* Change History'.
APPEND buffer.

buffer = l_commentline2.
APPEND buffer.

buffer = '* Correction on version : 1.00'.
APPEND buffer.

buffer = '* New version : 1.01'.
APPEND buffer.

buffer = '* Author :'.
APPEND buffer.

buffer = '* Date :'.
APPEND buffer.

buffer = '* Reason :'.
APPEND buffer.

buffer = '* Change :'.
APPEND buffer.

buffer = l_commentline1.
APPEND buffer.

ENDFUNCTION.
Activate the function and away you go!

Entering the pattern name 'ZIPS_MODEL_HEADER' into the pattern name field produces the following output in the ABAP Editor:

Code:
*#######################################################################
* Report :
* Version : 1.00
* Author : BCUSER - Richard Harper
* Function : ABAP Programmer Department : My Office
* Date : 18.06.2004
*-----------------------------------------------------------------------
* Title :
* Purpose :
* Details :
*=======================================================================
* Change History
*-----------------------------------------------------------------------
* Correction on version : 1.00
* New version : 1.01
* Author :
* Date :
* Reason :
* Change :
*#######################################################################
Neat huh ??

Thanks Rob!

Further to this, Mattg has also been doing some research into editor patterns and has come up with the following:

If the pattern contains *$&$EXIT at the start of line 1, then a standard user exit is called.

The userexit enhancement is SEUED001, the component to change is EXIT_SAPLLOCAL_EDT1_001.

Now this allows you to add the code from before. This is the UE code;

Code:
CASE KEYWORD.
WHEN 'MATTG_HEADER'.
PERFORM MATTG_HEADER TABLES BUFFER.

WHEN 'MATTG_HISTORY'.
CALL FUNCTION 'ZZMATT_HISTORY_EDITOR_EXIT'
TABLES
BUFFER = BUFFER.

ENDCASE.
Just the change the function call to a perform, as above, BUFFER has type ABAPSOURCE.

If you want to get the Transport Request information for the object you are editing try the following code;

Code:
TABLES: E07T. "WBO and Transport: Short Texts for Requests/Tasks

DATA: WA_BUFFER TYPE ABAPSOURCE,
ORDERNUM LIKE E070-TRKORR,
L_PROGFIELD LIKE BDCDATA-FNAM.

FIELD-SYMBOLS: <TRDIR> LIKE TRDIR,
<TRKEY> LIKE TRKEY.



* Additional:, although using the comment character '"', the system
* converts it to '*'
CONCATENATE '"------------------------------------'
'----------------------------------*'
INTO L_COMMENTLINE2.

PERFORM GET_DEVELOPER_NAME USING SY-UNAME
CHANGING L_FIRSTNAME
L_LASTNAME
L_FUNCTION
L_DEPARTMENT.

WRITE SY-DATUM DD/MM/YYYY TO L_DATUM.
CONCATENATE '* Date:' L_DATUM
'Author:' SY-UNAME '-' L_FIRSTNAME L_LASTNAME
INTO WA_BUFFER SEPARATED BY SPACE.
IF WA_BUFFER+71(1) = SPACE.
WA_BUFFER+71(1) = '*'.
ENDIF.
APPEND WA_BUFFER TO BUFFER.


L_PROGFIELD = '(SAPLS38E)TRDIR'.
ASSIGN (L_PROGFIELD) TO <TRDIR>.
IF SY-SUBRC EQ 0.
CALL FUNCTION 'RS_CORR_INSERT'
EXPORTING
OBJECT = <TRDIR>-NAME
OBJECT_CLASS = 'ABAP'
* MODE = ' '
* GLOBAL_LOCK = ' '
* DEVCLASS = ' '
* KORRNUM = ' '
* AUTHOR = ' '
* MASTER_LANGUAGE = ' '
* GENFLAG = ' '
* PROGRAM = ' '
* OBJECT_CLASS_SUPPORTS_MA = ' '
* EXTEND = ' '
IMPORTING
* DEVCLASS =
* KORRNUM = "Task number
ORDERNUM = ORDERNUM "Request number
* NEW_CORR_ENTRY =
* AUTHOR =
* TRANSPORT_KEY =
* NEW_EXTEND =
EXCEPTIONS
CANCELLED = 1
PERMISSION_FAILURE = 2
UNKNOWN_OBJECTCLASS = 3
OTHERS = 4
.
IF SY-SUBRC = 0.
IF NOT ORDERNUM IS INITIAL.
SELECT SINGLE * FROM E07T
WHERE TRKORR = ORDERNUM.
IF SY-SUBRC <> 0.
CLEAR E07T.
ENDIF.
CONCATENATE '*' ORDERNUM E07T-AS4TEXT
INTO WA_BUFFER SEPARATED BY SPACE.

ELSE.
L_PROGFIELD = '(SAPLS38E)TRANSPORT_KEY'.
ASSIGN (L_PROGFIELD) TO <TRKEY>.
CONCATENATE '* Development class;' <TRKEY>-DEVCLASS
'WYTK9&$&$' INTO WA_BUFFER SEPARATED BY SPACE.
ENDIF.

ELSE.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
L_PROGFIELD = '(SAPLS38E)TRANSPORT_KEY'.
ASSIGN (L_PROGFIELD) TO <TRKEY>.
CONCATENATE '* Development class;' <TRKEY>-DEVCLASS
'WYTK9&$&$' INTO WA_BUFFER SEPARATED BY SPACE.
ENDIF.
ELSE.
L_PROGFIELD = '(SAPLS38E)TRANSPORT_KEY'.
ASSIGN (L_PROGFIELD) TO <TRKEY>.
CONCATENATE '* Development class;' <TRKEY>-DEVCLASS
'WYTK9&$&$' INTO WA_BUFFER SEPARATED BY SPACE.
ENDIF.

IF WA_BUFFER+71(1) = SPACE.
WA_BUFFER+71(1) = '*'.
ENDIF.
APPEND WA_BUFFER TO BUFFER.


* L_PROGFIELD = '(SAPLS38E)KORRNUM'.
* ASSIGN (L_PROGFIELD) TO <KORRNUM>.

WA_BUFFER = '* Description: '.
WA_BUFFER+71(1) = '*'.
APPEND WA_BUFFER TO BUFFER.

CLEAR WA_BUFFER.
WA_BUFFER+00(1) = '*'.
WA_BUFFER+71(1) = '*'.
APPEND WA_BUFFER TO BUFFER.
APPEND WA_BUFFER TO BUFFER.

APPEND L_COMMENTLINE2 TO BUFFER.

The FORM GET_DEVELOPER_NAME is just the code from your existing example.

This is on a 4.6B system (patch level 7), so should be usable by most people.

4.7 Enterprise

This functionality is still available in 4.7, the modifications required to the function module have been sent in by jpb2001. The only change required is that the table BUFFER must be of type RSWSOURCET instead of ABAPSOURCE to cope with the extra line size allowed in Enterprise.

Related Items:

 
< Prev   Next >

Google Search

Statistics

Contribution Activity
Utilities: 38
Tips and Tricks: 333
Sample Code: 164
Total Contributions: 550

Member Activity
Members: 6197 since 2/1/2007!
New: 5 since yesterday!
Visitors: 1023815
We have 1 guest online

Newest Members

Welcome our newest members:

Google Ads

Shared Bottom Border

Contact Us | Polls | Add URL | Contribute | Privacy | Terms | Feedback

Discussion Forum | BLOG | Consultants: Post your resume | Companies: Advertise on ERPGenie.COM | Post Job
Financials Consultant | Consultant Review | Gallia Consulting | Supply Chain Project | SAP Financials Forum
GenieHoldings.COM, Inc. | Genie Press | WorkflowGenie | ESAGenie | ERPTopSites | ABAP Tips and Tricks | SAP Solutions Database

EDIGenie | Searching Survivor