You are on page 1of 8

User Exit Examples

1. Extending Business Content - EXIT_SAPLRSAP_001


data: l_s_icctrcst like icctrcst,
l_s_icctract like icctract,
l_s_icctrsta like icctrsta,
l_tabix
like sy-tabix.
case i_isource.
when '0CO_OM_CCA_1'.
loop at c_t_data into l_s_icctrcst.
l_tabix = sy-tabix.
select single * from z0001 where kokrs = l_s_icctrcst-kokrs
and
kostl = l_s_icctrcst-kostl.
if sy-subrc = 0.
l_s_icctrcst-zfield1 = z0001-zfield1.
l_s_icctrcst-zfield2 = z0001-zfield2.
modify c_t_data from l_s_icctrcst index l_tabix.
endif.
endloop.
when '0CO_OM_CCA_2'.
...
when '0CO_OM_CCA_3'.
...
when others.
exit.
endcase.

2. User Exit after Data loading


(a) Delete old request
REPORT Z_RSSM_START_SECOND_PROCESS_1 .
TABLES: RSREQDONE,
RSSELDONE,
RSICCONT.

" Request-Data
" Selection for current Request
" Request posted to which InfoCube

DATA: L_T_SELDONE LIKE RSSELDONE OCCURS 0 WITH HEADER LINE.


DATA: L_T_ICUBE LIKE RSICCONT OCCURS 0 WITH HEADER LINE.

DATA:
DATA:
DATA:
DATA:
DATA:

L_LOGSYS LIKE RSSELDONE-LOGSYS.


L_SOURCE LIKE RSSELDONE-SOURCE.
L_SELDATE LIKE RSSELDONE-SELDATE.
L_SELTIME LIKE RSSELDONE-SELTIME.
BEGIN OF L_T_RNR_DEL OCCURS 0,
ICUBE LIKE RSICCONT-ICUBE,
RNR
LIKE RSSELDONE-RNR,
END OF L_T_RNR_DEL.

PARAMETER I_RNR LIKE RSREQDONE-RNR.


***********************
SELECT SINGLE * FROM RSSELDONE WHERE
RNR = I_RNR.
IF SY-SUBRC <> 0. "new rquest does not exist, wrong rnr !!!
EXIT.
ENDIF.
SELECT * FROM RSICCONT INTO TABLE L_T_ICUBE WHERE
RNR = I_RNR.
IF SY-SUBRC <> 0.
"New request is not posted to any IC
EXIT.
"nothing will be deleted
ENDIF.
L_SOURCE

= RSSELDONE-SOURCE.

L_LOGSYS = RSSELDONE-LOGSYS.
L_SELDATE = RSSELDONE-SELDATE.
L_SELTIME = RSSELDONE-SELTIME.
SELECT * FROM RSSELDONE INTO TABLE L_T_SELDONE WHERE
SOURCE = L_SOURCE AND
LOGSYS = L_LOGSYS.
DELETE L_T_SELDONE WHERE
RNR = I_RNR.

DELETE L_T_SELDONE
SELDATE >
( SELTIME >
SELDATE =

WHERE
L_SELDATE
L_SELTIME
L_SELDATE

"new request will be deleted

"delete younger requests


OR
AND
).

*Sort
SORT L_T_SELDONE BY SELDATE DESCENDING SELTIME DESCENDING.
REFRESH L_T_RNR_DEL.

LOOP AT L_T_SELDONE.
" Requests to be deleted
LOOP AT L_T_ICUBE.
" Request existing in InfoCubes
SELECT SINGLE * FROM RSICCONT WHERE
ICUBE = L_T_ICUBE-ICUBE AND
RNR
= L_T_SELDONE-RNR.
"check if posted to IC's
IF SY-SUBRC = 0.
L_T_RNR_DEL-ICUBE = L_T_ICUBE-ICUBE.
L_T_RNR_DEL-RNR
= L_T_SELDONE-RNR.
APPEND L_T_RNR_DEL.
ENDIF.
ENDLOOP.
IF NOT L_T_RNR_DEL[] IS INITIAL. " something found for rnr
EXIT.
ENDIF.
ENDLOOP.
LOOP AT L_T_RNR_DEL.
CALL FUNCTION 'RSSM_DELETE_REQUEST'
EXPORTING
REQUEST
INFOCUBE
EXCEPTIONS
REQUEST_NOT_IN_CUBE
INFOCUBE_NOT_FOUND
REQUEST_ALREADY_AGGREGATED
REQUEST_ALREADY_COMDENSED
OTHERS
IF SY-SUBRC <> 0.
* open for error-handling
ENDIF.
ENDLOOP.

= L_T_RNR_DEL-RNR
= L_T_RNR_DEL-ICUBE
=
=
=
=
=

1
2
3
4
5.

(b) Send Mail after data load


data: document_data like

sodocchgi1,

object_content like solisti1 occurs 0 with header line,


receivers like somlreci1 occurs 0 with header line.
concatenate tstatus 'Request' rnr 'uploaded'
into document_data-obj_descr
separated by space.
concatenate 'Request' rnr 'for Infosource' source 'uploaded'
into object_content-line separated by space.

append object_content.
concatenate

'from sourcesystem' logsys into object_content-line


separated by space.
append object_content.

move 'METTEJ' to receivers-receiver. append receivers.


move 'D020095' to receivers-receiver. append receivers.
all function 'SO_NEW_DOCUMENT_SEND_API1'
exporting
document_data
= document_data
document_type
= 'RAW'
put_in_outbox
= ' '
IMPORTING
SENT_TO_ALL
=
NEW_OBJECT_ID
=
tables
OBJECT_HEADER
=
object_content
= object_content
OBJECT_PARA
=
OBJECT_PARB
=
receivers
= receivers
EXCEPTIONS
TOO_MANY_RECEIVERS
= 1
DOCUMENT_NOT_SENT
= 2
DOCUMENT_TYPE_NOT_EXIST
= 3
OPERATION_NO_AUTHORIZATION = 4
PARAMETER_ERROR
= 5
X_ERROR
= 6
ENQUEUE_ERROR
= 7
OTHERS
= 8.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.

3. User Exit for Variables


DATA: L_S_RANGE TYPE RSR_S_RANGESID.
DATA: LOC_VAR_RANGE LIKE RRRANGEEXIT.
DATA: LOC_YEAR

LIKE

T009B-BDATJ,

LOC_POPER
LOC_DATE

LIKE
LIKE

T009B-POPER,
SY-DATUM.

CASE I_VNAM.
*-- SINGVAR - Variables: Variable SalesOrg, User-Exit, SingleValue
WHEN 'SINGVAR'.
CLEAR L_S_RANGE.
L_S_RANGE-LOW
= '4000'.
L_S_RANGE-SIGN
= 'I'.
L_S_RANGE-OPT
= 'EQ'.
APPEND L_S_RANGE TO E_T_RANGE.
*-- INTVAR - Variables: Variable SalesOrg, User-Exit, Interval
WHEN 'INTVAR'.
L_S_RANGE-LOW
= '1000'.
L_S_RANGE-HIGH
= '4000'.
L_S_RANGE-SIGN
= 'I'.
L_S_RANGE-OPT
= 'BT'.
APPEND L_S_RANGE TO E_T_RANGE.
*-- HIERVAR - Variables: Variable SalesOrg, User-Exit, Hierarchy
WHEN 'HIERVAR'.
L_S_RANGE-LOW
= 'SD_DEMO5_SAL_HIER'.
L_S_RANGE-SIGN
= 'I'.
L_S_RANGE-OPT
= 'EQ'.
APPEND L_S_RANGE TO E_T_RANGE.
*-- HNODEVAR - Variables: Variable SalesOrg, User-Exit, Hierarchy
WHEN 'HNODEVAR'.
L_S_RANGE-LOW
= 'EUROPE'.
L_S_RANGE-HIGH
= '0HIER_NODE'.
L_S_RANGE-SIGN
= 'I'.
L_S_RANGE-OPT
= 'EQ'.
APPEND L_S_RANGE TO E_T_RANGE.
*-- DMDATEFR - Variables: User-ExitExample, I_T_VAR_RANGE,
*-- determine the end of the period for a day
WHEN 'DMDATETO'.
LOOP AT I_T_VAR_RANGE INTO LOC_VAR_RANGE
WHERE VNAM = 'DMDATEIN'.
CLEAR L_S_RANGE.
LOC_YEAR = LOC_VAR_RANGE-LOW(4).
CONCATENATE '0' LOC_VAR_RANGE-LOW+4(2) INTO LOC_POPER.
CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET'
EXPORTING
I_GJAHR
= LOC_YEAR

I_PERIV
= '01'
I_POPER
= LOC_POPER
IMPORTING
E_DATE
= LOC_DATE
EXCEPTIONS
INPUT_FALSE
= 1
T009_NOTFOUND = 2
T009B_NOTFOUND = 3
OTHERS
= 4.
L_S_RANGE-LOW
= LOC_DATE.
L_S_RANGE-SIGN
= 'I'.
L_S_RANGE-OPT
= 'EQ'.
APPEND L_S_RANGE TO E_T_RANGE.
EXIT.
ENDLOOP.

(4) User Exit Virtual Characteristics and Key figures


Example: InfoCube DEMOCUBE has the characteristic PRODUCT PRICE_TP and the
key figure ACT_PRICE and QUANTITY. In the enhancement, the product from the
current price for PRODUCT and the key figure QUANTITY should be determined.
If successful, the characteristic PRICE_TP should contain the
characteristic value '1'.
The include ZXRSRU02: Definition
***INCLUDE ZXRSRU02
DATA: L_S_CHANM TYPE RRKE_S_CHANM.
CASE I_S_RKB1D-INFOCUBE.
WHEN 'DEMOCUBE'.
L_S_CHANM-CHANM = 'PRODUCT'.
L_S_CHANM-MODE = RRKE_C_MODE-READ.
APPEND L_S_CHANM TO E_T_CHANM.
L_S_CHANM-CHANM = 'PRICE_TP'.
L_S_CHANM-MODE = RRKE_C_MODE-NO_SELETION.
APPEND L_S_CHANM TO E_T_CHANM.
APPEND 'ACT_PRICE' TO E_T_KYFNM.
APPEND 'QUANTITY' TO E_T_KYFNM.
ENDCASE.

The include ZXRSRTOP: global data


***INCLUDE ZXRSRTOP .
DATA:
DATA:
DATA:
DATA:

G_POS_DEMOCUBE_PRODUCT
G_POS_DEMOCUBE_PRICE_TP
G_POS_DEMOCUBE_ACT_PRICE
G_POS_DEMOCUBE_QUANTITY

The Include ZXRSRZZZ:

TYPE
TYPE
TYPE
TYPE

I.
I.
I.
I.

Changing the data

***INCLUDE ZXRSRZZZ .
FORM USER_DEMOCUBE USING
I_S_RKB1D TYPE RSR_S_RKB1D
CHANGING C_S_DATA TYPE ANY.
FIELD-SYMBOLS
FIELD-SYMBOLS
FIELD-SYMBOLS
FIELD-SYMBOLS

<L_PRODUCT>.
<L_PRICE_TP>.
<L_ACT_PRICE>.
<L_QUANTITY>.

ASSIGN COMPONENT G_POS_DEMOCUBE_PRODUCT


OF STRUCTURE C_S_DATA TO <L_PRODUCT>.
ASSIGN COMPONENT G_POS_DEMOCUBE_PRICE_TP
OF STRUCTURE C_S_DATA TO <L_PRICE_TP>.
ASSIGN COMPONENT G_POS_DEMOCUBE_ACT_PRICE
OF STRUCTURE C_S_DATA TO <L_ACT_PRICE>.
ASSIGN COMPONENT G_POS_DEMOCUBE_QUANTITY
OF STRUCTURE C_S_DATA TO <L_QUANTITY>.
* Routine to get the price
* PERFORM GET_PRICE USING
<L_PRODUCT>
*
CHANGING <L_ACT_PRICE>.
IF <L_ACT_PRICE> GT 0.
<L_ACT_PRICE> = <L_ACT_PRICE> * <L_QUANTITY>.
<L_PRICE_TP> = '1'.
ENDIF.

ENDFORM.

You might also like