You are on page 1of 8

Function Module to enhance data source with more than one field for generic delta mechanism

SAP provides a standard functionality to create a general delta. This can only build on one selected field. But in this project scenario we need to incorporate one more field in generic delta. The logic of the function module is based on two fields: ERDAT (creation date) and AEDAT (change date). The module should look for both days because when a new record is created the change date does not get populated in R3.So during delta load we need to take care of all the records which have been created or changed after last init load. For this case we need to follow these following steps: Create a function module through transaction SE37 using proper import export parameters. Some screen shots for the same are attached below.

Create the data source using this function module and selecting any one of the fields as generic delta, no matter whether it is creation date or change date. In this case I have selected ERDAT (creation date) as generic delta.

Select ERDAT as generic delta

Then incorporate the logic for two generic deltas in the function module Pseudo code for the function module FUNCTION /DS1/Z_DELTA_MEAS_POINT. *"---------------------------------------------------------------------*"*"Local interface: *" IMPORTING *" VALUE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR *" VALUE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL *" VALUE(I_MAXSIZE) TYPE SBIWA_S_INTERFACE-MAXSIZE OPTIONAL *" VALUE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL *" VALUE(I_READ_ONLY) TYPE SRSC_S_INTERFACE-READONLY OPTIONAL *" TABLES *" I_T_SELECT TYPE SBIWA_T_SELECT OPTIONAL *" I_T_FIELDS TYPE SBIWA_T_FIELDS OPTIONAL *" E_T_DATA STRUCTURE /DS1/ZIMPTT OPTIONAL *" EXCEPTIONS *" NO_MORE_DATA *" ERROR_PASSED_TO_MESS_HANDLER *"---------------------------------------------------------------------* Auxiliary Selection criteria structure DATA: L_S_SELECT TYPE SRSC_S_SELECT, L_S_IMPTT TYPE /DS1/ZIMPTT. * Maximum number of lines for DB table STATICS: S_S_IF TYPE SRSC_S_IF_SIMPLE,

* counter S_COUNTER_DATAPAKID LIKE SY-TABIX, * cursor S_CURSOR TYPE CURSOR. Select ranges

RANGES: The following range has been defined to capture the value stored in generic delta filed L_R_DATUM FOR SY-DATUM, These following fields are used for selection purpose in the data source L_R_MPTYP FOR /DS1/ZIMPTT-MPTYP, L_R_MLANG FOR /DS1/ZIMPTT-MLANG, L_R_POINT FOR /DS1/ZIMPTT-POINT, L_R_AEDAT FOR /DS1/ZIMPTT-AEDAT. * Initialization mode (first call by SAPI) or data transfer mode * (following calls) ? IF I_INITFLAG = SBIWA_C_FLAG_ON. ************************************************************************ * Initialization: check input parameters * buffer input parameters * prepare data selection ************************************************************************ * Check DataSource validity CASE I_DSOURCE. WHEN 'ZDSPOINT'. WHEN OTHERS. IF 1 = 2. MESSAGE E009(R3). ENDIF. * This is a typical log call. Please write every error message like this LOG_WRITE 'E' "message type 'R3' "message class '009' "message number I_DSOURCE "message variable 1 ' '. "message variable 2 RAISE ERROR_PASSED_TO_MESS_HANDLER. ENDCASE. APPEND LINES OF I_T_SELECT TO S_S_IF-T_SELECT. * Fill parameter buffer for data extraction calls S_S_IF-REQUNR = I_REQUNR. S_S_IF-DSOURCE = I_DSOURCE. S_S_IF-MAXSIZE = I_MAXSIZE. APPEND LINES OF I_T_FIELDS TO S_S_IF-T_FIELDS. ELSE. "Initialization mode or data extraction ?

************************************************************************ * Data transfer: First Call OPEN CURSOR + FETCH * Following Calls FETCH only ************************************************************************ * First data package -> OPEN CURSOR IF S_COUNTER_DATAPAKID = 0. * Fill range tables BW will only pass down simple selection criteria * of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'. Delta value is being captured in the following piece of codes. For the first load or init load this S_S_IF-T_SELECT has no value for ERDAT field(field used in generic delta).It will be blank initially, but after first successful init load this delta field will have last loading date or one day ahead the last loading date, depending on your safety interval settings, from which date you want to load the delta data. LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT. CASE L_S_SELECT-FIELDNM. WHEN 'ERDAT'. " delta relevant date This delta value will be stored into L_R_DATUM. MOVE-CORRESPONDING L_S_SELECT TO L_R_DATUM. CLEAR L_R_DATUM-HIGH. We have to select the delta records which have created on changed date greater or equal to delta date. L_R_DATUM-OPTION = 'GE'. L_R_DATUM-SIGN = 'I'. APPEND L_R_DATUM. WHEN OTHERS. ENDCASE. ENDLOOP. For init load L_R_DATUM has no value, so in this case all the records have to be selected from the table IF L_R_DATUM IS INITIAL. L_R_DATUM-LOW = '19000101'. L_R_DATUM-HIGH = '99991231'. L_R_DATUM-SIGN = 'I'. L_R_DATUM-OPTION = 'BT'. ENDIF. Selection fields value stored into some local fields LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'POINT'. MOVE-CORRESPONDING L_S_SELECT TO L_R_POINT. APPEND L_R_POINT. ENDLOOP. LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'MLANG'. MOVE-CORRESPONDING L_S_SELECT TO L_R_MLANG. APPEND L_R_MLANG. ENDLOOP. LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'MPTYP'. MOVE-CORRESPONDING L_S_SELECT TO L_R_MPTYP.

APPEND L_R_MPTYP. ENDLOOP. LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'AEDAT'. MOVE-CORRESPONDING L_S_SELECT TO L_R_AEDAT. APPEND L_R_AEDAT. ENDLOOP.

* Determine number of database records to be read per FETCH statement * from input parameter I_MAXSIZE. OPEN CURSOR WITH HOLD S_CURSOR FOR SELECT MANDT POINT PSORT PTTXT MLANG MPTYP ERDAT AEDAT ATINN FROM IMPTT WHERE POINT IN L_R_POINT AND MLANG IN L_R_MLANG AND MPTYP IN L_R_MPTYP AND AEDAT IN L_R_AEDAT Here we are selecting the records which have been created or changed on or after this delta date as this delta date ultimately kept in L_R_DATUM AND ( ERDAT IN L_R_DATUM OR AEDAT IN L_R_DATUM ). ENDIF. "First data package ? * Fetch records into interface table. * named E_T_'Name of extract structure'. FETCH NEXT CURSOR S_CURSOR APPENDING CORRESPONDING FIELDS OF TABLE E_T_DATA PACKAGE SIZE S_S_IF-MAXSIZE. IF SY-SUBRC <> 0. CLOSE CURSOR S_CURSOR. RAISE NO_MORE_DATA. ENDIF. S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1. ENDIF. "Initialization mode or data extraction ? ENDFUNCTION. So ultimately all the changed and new records will be extracted by this data source.

You might also like