Generic Datasource with Function module:
Whenever the given SAP solutions like Views and Infoset queries are not able to fulfil the requirement, then we need to replace it with custom program. We can do it with the help of creating Functional module.
Function modules are created in the transaction SE37. They need to be assigned to a group; You need to create a function group in SE80.
Steps to create a custom Datasource:
- Create Function group. Go to SE80, and create Function group to assign FM, as shown in the figure below.
2. Create a structure called ZSTRUCT. Go to SE11 and select data type radio button.
Give fields from the table SPFLI, these fields are:
CARRID, CONNID, COUNTRYFR, CITYFROM
AIRPFROM, COUNTRYTO, CITYTO, AIRPTO
3. Create a table type, Go to SE11 and select the data type radio button. Now select the table type and create. Give the name of the structure and activate.
4. In SE37, enter the Function module
Then, click copy button, and give to function module
Former Function module: RSAX_BIW_GET_DATA
To Function module : ZRSAX_BIW_GET_DATA
Function Group: ZFM_1
Now, click on copy.
Now open the function module you created. Give the name in SE37, then click on change button.
Go to source code, select everything and delete it as shown in the figure.
All the other tabs like Import, export, tables, exceptions will remain as we copied.
5. Click GOTO in the menu –> main program –> double-click on the top include.
TYPE-POOLS SBIWA. As shown in the figure below.
Now, activate it.
6. In function module, there is a tables tab. In tables tab, there are two internal tables *E_T_DATA* and *E_T_SOURCE_STRUCTURE*.
These two tables are important for the extract structure. So, it is important to declare these two tables as our structure as shown below.
7. As we have deleted the source code to write our code, we wrote our code as shown in the figure below.
The code we have written is:
STATICS C1 TYPE CURSOR.
RANGES R_CARRID FOR SPFLI_CARRID.
RANGES R_CONNID FOR SPFLI_CONNID.
IF I_INITFLAG = SPACE.
IF C1 IS INITIAL.
READ TABLE I_T_SELECT WITH KEY FIELDNM = *CARRID*.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING I_T_SELECT TO R_CARRID.
READ TABLE I_T_SELECT WITH KEY FIELDNM = *CONNID*.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING I_T_SELECT TO R_CONNID.
OPEN CURSOR WITH HOLD C1 FOR
WHERE CARRID IN R_CARRID AND CONNID IN R_CONNID.
FETCH NEXT CURSOR C1 INTO
CORRESPONDING FIELDS OF TABLE E_T_DATA
PACKAGE SIZE I_MAXSIZE.
IF SY-SUBRC <> 0.
CLOSE CURSOR C1.
After writing the code, given above, save and activate the function module.
8. Now, GO TO RSO2, and create a Generic datasource, *ZFM_DS*, as given below.
As you can see above, function module and the extract structure is given. Save your Datasource, and give selections.
9. Now, go to RSA3 to check the data in the Datasource, as shown below.
As you can see above, we have 26 data records available in this DS. Now, create the BI dataflow to extract this data.
Steps in BI side:
10. Replicate the DS in BI side:
Now, Go to RSOSFIELDMAP, and search for the infoobjects for your fields.
Create Transofrmation and DTP using source as ZTEST_DS, datasouece, and target as SDSO.
Create the Infocube.
Create Transformation and DTP using source as ZTEST_DS DS, and target as Infocube.
Create a Infopackage, and load the data to DS.
Execute the DTP and load the data to the Infoobject.
Please visit my website for more Bi posts and information.