Via Content in SCN
Business Scenario:
1. Need to have additional fields from Sales Partner Table (VBPA) for all Order Line Items in Sales Item Table (VBAP) for Sales Order Line Item Level Reporting. Standard data sources cannot be used as many info providers such as DSO's; Cubes are using them so it involves lots of effort in terms of time and money maintaining the same. Also this approach involves a lot of risk considering if anything gets deactivated during Transports.
2. In addition to this Curren cy Conversion has to be done in Source system as per client norms.
Note: It is recommended to do currency conversions in BW system.
R3 Side: In order to meet the above 2 requirements we decided to go for Generic Delta Extraction using Function Module. Need to make sure that Generic Extraction is Delta Based as Sales Order Items Table (VBAP) contains all the line item level information for Orders and its not easy extracting everything i.e. doing full update on daily basis and then maintaining the same in BW. Here, we shall be building a logic using AEDAT (Created on) and ERDAT (Changed on) of VBAP to extract the order Items getting changed/Created since the last BW Extrac tion.
Steps for Delta Enabled, Function Module Based Data source
INCLUDE LZRSAX_TESTTOP.
* Structure for the Cursor - extraction of data
TYPES: BEGIN OF ty_vbap,
Vbeln TYPE vbeln,
Posnr TYPE posnr,
Netwr TYPE netwr,
Waerk TYPE waerk,
Dltdate TYPE dats,
END OF ty_vbap.
< p>* Structure for VBPA to extract PERNR
1. Need to have additional fields from Sales Partner Table (VBPA) for all Order Line Items in Sales Item Table (VBAP) for Sales Order Line Item Level Reporting. Standard data sources cannot be used as many info providers such as DSO's; Cubes are using them so it involves lots of effort in terms of time and money maintaining the same. Also this approach involves a lot of risk considering if anything gets deactivated during Transports.
2. In addition to this Curren cy Conversion has to be done in Source system as per client norms.
Note: It is recommended to do currency conversions in BW system.
1. Create an Extract structure including DLTDATE field in addition to all other required fields. DLTDATE would be used to build the logic to extract the delta using AEDAT and ERDAT.
Reason for Addition of a DLTDATE Field in Extract Structure
While configuring delta in the RSO2 screen, the field on which the delta is requested must be a field present in the extract structure. To allow the extractor to provide delta on timestamp, there must be a timestamp field in the extract structure. Hence the timestamp field is added here – it is merely a dummy field created to allow us to use the extractor for delta purposes, as will become clear later.
2. Copy the Function group RSAX from SE80, give new function group as ZRSAX_TEST.
3. Copy function module. Deselect all and then select only RSAX_BIW_GET_DATA_SIMPLE name it as ZBW_FUNCTION.
4. Go to the Include folder and double-click on LZRSAX_TESTTOP define the structure and Field symbol and internal table as below.
TYPES: BEGIN OF ty_vbap,
Vbeln TYPE vbeln,
Posnr TYPE posnr,
Netwr TYPE netwr,
Waerk TYPE waerk,
Dltdate TYPE dats,
END OF ty_vbap.
Vbeln TYPE vbeln,
Posnr TYPE posnr,
Pernr TYPE pernr,
END OF ty_vbap.
TYPES: BEGIN OF ty_ord_f inal,
Vbeln TYPE vbeln,
Posnr TYPE posnr,
Pernr TYPE pernr,
Dltdate TYPE datum,
Netwr TYPE netwr,
Waerk TYPE waerk,
Netwr_loc_val TYPE WERTV8,
Loc_curr TYPE waers,
Netwr_rep_val TYPE WERTV8,
Rep_curr TYPE waers,
END OF ty_ord_final.
DATA: t_vbap TYPE STANDARD TABLE OF ty_vbap,
t_vbpa TYPE STANDARD TABLE OF ty_vbpa.
DATA: wa_vbap TYPE ty_vbap,
wa_vbpa TYPE ty_vbpa.
DATA: lv_bukrs TYPE bukrs,
lv_vkorg TYPE vkorg,
lv_waers TYPE waers,
lv_prsdt TYPE prsdt,
lv_netwr TYPE netwr.
DATA: save_ukurs LIKE tcurr-ukurs,
save_kurst LIKE tcurr-kurst,
save_ukurx(8) TYPE p,
save_ffact1 LIKE tcurr-ffact,
save_tfact LIKE tcurr-tfact,
save_ffact LIKE tcurr-ffact,
save_ukurs1(11) TYPE p DECIMALS 5.
FIELD-SYMBOLS: <i_fs_order_item> LIKE LINE OF t_vbap.
DATA: l_s_select TYPE srsc_s_select.
STATICS: s_s_if TYPE srsc_s_if_simple,
s_counter_datapakid LIKE sy-tabix,
s_cursor TYPE cursor.
RANGES: l_r_vbeln FOR vbap-vbeln, "DOC
l_r_posnr FOR vbap-posnr, "ITEM
i_r_dltdate FOR vbap-erdat. "DELTA DATE
* 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
************************************************************************
CASE i_dsource.
WHEN 'ZBW_DS_TEST'.
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.
s_s_if-requnr = i_requnr.
s_s_if-dsource = i_dsource.
s_s_if-maxsize = i_maxsize.
* (in case that there is no 1:1 relation between InfoSource fields
* and database table fields this may be far from beeing trivial)
APPEND LINES OF i_t_fields TO s_s_if-t_fields.
* Data transfer: First Call OPEN CURSOR + FETCH
* Following Calls FETCH only
************************************************************************
IF s_counter_datapakid = 0.
* of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'.
LOOP AT s_s_if-t_select INTO l_s_select.
CASE l_s_select-fieldnm.
WHEN 'VBELN'.
ls_vbeln-sign = ls_select-sign.
ls_vbeln-option = ls_select-option.
ls_vbeln-low = ls_select-low.
ls_vbeln-high = ls_select-high.
APPEND l_r_vbeln.
WHEN 'POSNR'.
ls_posnr-sign = ls_select-sign.
ls_posnr-option = ls_select-option.
ls_posnr-low = ls_select-low.
ls_posnr-high = ls_select-high.
APPEND l_r__posnr.
WHEN 'DLTDATE'.
ls_delta_date-sign = ls_select-sign.
ls_delta_date-option = ls_select-option.
ls_delta_date-low = ls_select-low.
ls_delta_date-high = ls_select-high.
APPEND l_r_dltdate.
ENDCASE.
ENDLOOP.
* from input parameter I_MAXSIZE. If there is a one to one relation
* between DataSource table lines and database entries, this is trivial.
* In other cases, it may be impossible and some estimated value has to
* be determined.
itm~netwr AS netwr itm~waerk AS waerk itm~aedat
AS dltdate FROM vbap AS itm
WHERE itm~vbeln IN ls_vbeln
AND itm~posnr IN ls_posnr
AND ( ( itm~aedat EQ '00000000'
AND itm~erdat IN ls_dltdate )
OR ( itm~aedat NE '00000000'
AND itm~aedat IN ls_dltdate ) ).
ENDIF. "First data package ?
* named E_T_'Name of extract structure'.
FETCH NEXT CURSOR s_cursor
APPENDING CORRESPONDING FIELDS
OF TABLE t_vbap
PACKAGE SIZE s_s_if-maxsize.
IF sy-subrc <> 0.
CLOSE CURSOR ls_cur sor.
RAISE no_more_data.
ENDIF..
* Loop at it_vbap to build the final table
CLEAR: t_final, lv_vkorg,lv_bukrs,lv_waers,lv_prsdt.
MOVE: <i_fs_order_item>-vbeln TO t_final-vbeln,
<i_fs_order_item>-posnr TO t_final-posnr,
<i_fs_order_item>-netwr TO t_final-netwr,
<i_fs_order_item>-waerk TO t_final-waerk,
<i_fs_order_item>-dldat TO t_final-dltdate.
WHERE vbeln = <i_fs_order_item>-vbeln
AND posnr = '000000'
AND parvw = 'ZM'.
IF sy-subrc NE 0.
t_final-pernr = space.
ENDIF.
SELECT SINGLE vkorg FROM vbak INTO lv_vkorg
WHERE vbeln = <i_fs_order_item>-vbeln.
IF sy-subrc = 0.
* Select the company code based on sales org
SELECT SINGLE bukrs FROM tvko INTO lv_bukrs
WHERE vkorg = lv_vkorg.
IF sy-subrc = 0.
* Select the local currency based on company code
SELECT SINGLE waers FROM t001 INTO lv_waers
WHERE bukrs = lv_bukrs.
IF sy-subrc = 0.
t_final-loc_curr = lv_waers.
t_final-rep_curr = 'USD'.
ENDIF.
SELECT SINGLE prsdt FROM vbkd INTO lv_prsdt
WHERE vbeln = <i_fs_order_item>-vbeln
AND posnr = & lt;i_fs_order_item>-posnr.
IF sy-subrc NE 0.
SELECT SINGLE erdat FROM vbap INTO lv_prsdt
WHERE vbeln = <i_fs_order_item>-vbeln
AND posnr = <i_fs_order_item>-posnr.
ENDIF.
IF
EXPORTING
date = lv_prsdt
foreign_amount = 1
foreign_currency = <i_fs_order_item>-waerk
local_currency = lv_waers
type_of_rate = 'M'
IMPORTING
exchange_rate = save_ukurs
foreign_factor = save_ffact
local_amount = save_tfact
local_factor = save_ffact1
exchange_ratex = save_ukurx
derived_rate_type = save_kurst
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
no_spread_found = 4
derived_2_times = 5.
IF sy-subrc = 0.
save_ukurs1 = save_ukurs / save_ffact.
IF save_ffact1 NE 0 .
save_ukurs1 = save_ukurs1 * save_ffact1.
ENDIF.
lv_netwr = <i_fs_order_item>-net wr * save_ukurs1.
t_final-netwr_loc_val = lv_netwr.
ENDIF.
ELSE.
t_final-netwr_loc_val = <i_fs_order_item>-netwr.
ENDIF.
IF lv_waers NE 'USD' .
* Convert the currency in the reporting currency
CLEAR : save_ukurs1,lv_netwr,save_ukurs,
save_ffact,save_tfact,save_ffact1,
save_ukurx,save_kurst.
EXPORTING
date = lv_prsdt
foreign_amount = 1
foreign_currency = lv_waers
local_currency = 'USD'< /span>
type_of_rate = 'M'
IMPORTING
exchange_rate = save_ukurs
foreign_factor = save_ffact
local_amount = save_tfact
local_factor = save_ffact1
exchange_ratex = save_ukurx
derived_rate_type = save_kurst
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
no_spread_found = 4
derived_2_times = 5.
IF sy-subrc = 0.
save_ukurs1 = save_ukurs / save_ffact.
IF save_ffact1 NE 0 .
save_ukurs1 = save_ukurs1 * save_ffact1.
ENDIF.
lv_netwr = t_final-netwr_loc_val * save_ukurs1.
t_final-netwr_rep_val = lv_netwr.
ENDIF.
ELSE.
t_final-netwr_rep_val = t_final-netwr_loc_val.
ENDIF.
ENDIF.
ENDIF.
APPEND t_final TO e_t_data.
ENDLOOP.
s_counter_datapakid = s_counter_datapakid + 1.
ENDIF. "Initialization mode or data extraction ?
l_r_posnr FOR vbap-posnr, "ITEM
l_r_delta_date FOR vbap-erdat. "DELTA DATE
CASE l_s_select-fieldnm.
WHEN 'VBELN'.
ls_vbeln-sign = ls_select-sign.
ls_vbeln-option = ls_select-option.
ls_vbeln-low = ls_select-low.
ls_vbeln-high = ls_select-high.
APPEND l_r_vbeln.
itm~netwr AS netwr itm~waerk AS waerk itm~aedat
AS delta_date FROM vbap AS itm
WHERE itm~vbeln IN ls_vbeln
AND itm~posnr IN ls_posnr
AND ( ( itm~aedat EQ '00000000'
AND itm~erdat IN ls_delta_date )
OR ( itm~aedat NE '00000000'
AND itm~aedat IN ls_delta_date ) ).
1. ( ( itm~aedat EQ '00000000' AND itm~erdat IN ls_delta_date ) – For New records
2. ( ( itm~aedat NE '00000000' AND itm~aedat IN ls_delta_date ) ) – For Changed records.
WHERE vbeln = <i_fs_order_item>-vbeln
AND posnr = '000000'
AND parvw = 'ZM'.
IF sy-subrc NE 0.
t_final-pernr = space.
ENDIF.
2. Local Currency: The Company Code Currency is called Local Currency. It is stored at Compan y Code level in T001 Table.
3. Reporting Currency: In our case it is fixed as 'USD'.
Logic to get Local Currency:
SELECT SINGLE vkorg FROM vbak INTO lv_vkorg
WHERE vbeln = <i_fs_order_item>-vbeln.
SELECT SINGLE bukrs FROM tvko INTO lv_bukrs
WHERE vkorg = lv_vkorg.
SELECT SINGLE waers FROM t001 INTO lv_waers
WHERE bukrs = lv_bukrs.
Date – PRSDT "Pricing Date". Need to fetch it for doing conversions.
From Currency - already fetched above.
To Currency – already fetched above.
Type of Conversion: Fix ed as 'M' in our case
WHERE vbeln = <i_fs_order_item>-vbeln
AND posnr = <i_fs_order_item>-posnr.
Finally we are passing everything to the Function Module to have the Conversion done to Local Currency first and later to Reporting Currency.
2. Fill in the various Details including the Function module and Structure name.
Note: We could have selected Calend. Day but in that case the delta extraction can only be done once in a day.
Note that the DLTDATE field is disabled for selection; this is because this will be populated automatically as part of the delta. As a result, it will be unavailable for manual entry in the Info package or in RSA3
Following this step, create the corresponding ODS, Data source etc. in BW side and replicate. These steps are similar to what would be done for a normal generic data source.
Later this ODS active table is read to have these additional fields in BW Old Flow.
No comments:
Post a Comment