首页 > 嘉寅说说 > 回答了一个SDN的问题。
2008
03-13

回答了一个SDN的问题。

问题链接:reading masterdata of attribute in BI 7.0

因为我最近就这个问题有所总结。在我的SAP BW 350的课程中,我详细讲述了Transformation的一些应用场景。其中大概有8-10个小节讲述Transformation的内容。基本上涵盖了SAP BW中写Transformation中的Start routine和Transfer routine和End routine的各种场景。既有比较官方的内容讲述,也有来自于一些How-to文档的内容讲述,也有3个来自项目场景的内容提炼、精减后内容总结。其中SAPBI350_U和SAPBI350_V两个小节讲述了如下内容:

1. How to read externel table such as master date table or DSO table in start routine.
2. write transfer routine and get information of internal table created in start routine.
3. How to debug DTP and transformation.

回答了一个SDN的问题。 - 益泰 - 1

SDN上的回答内容如下:

The scenrio is simplied based on CVS file, our real scenrios are logistical data models which date are from shipping item, order itme data source.

We have a infoobject named material which has a attribute material type. its data like this:

Material Material_Type
MAT001 ZDIE
MAT002 ZIFG
MAT003 ZDIE
MAT004 ZIFG

We hava a another DSO named delivery ODS which data like below:
Material DeliveryDoc DeliveryItem DeliveryDate
MAT001 12345678 1 20070501
MAT002 12345679 1 20070502
MAT003 12000000 1 20070503
MAT004 12000001 1 20070504

We have a another DSO named invoice ODS which data like below:
Material InvoiceDoc InvoiceItem Billingdate ReferedDeliveryDoc ReferedDeliveryItem
MAT001 30000000 1 20080101 12345678 1
MAT002 30000001 1 20080102 12345679 1
MAT003 30000002 1 20080103 12000000 1
MAT004 30000003 1 20080104 12000001 1

Our business requirements is:
1. Need to create the third DSO which will merge data from the above two DSOs.
2. the third DSO name “Deliveried sales order info DSO” which has the following model:
Material InvoiceDoc InvoiceItem DeliveryDoc DeliveryItem Act_Goods_Issue_DATE
3. The Act_Goods_Issue_DATE will be filled from delivery ODS or invoice ODS, the rule is if material type is “ZDIE” which means it is a non-physical product (service product), the Act_Goods_Issue_DATE should be filled from Billingdate of invoice ODS. if the material type is “ZIFG” that means it is a physical product. the the Act_Goods_Issue_DATE should be filled from the DeliveryDate of delivery ODS.

Implement mothod:
1. We create a transformation from delivery ODS to “Deliveried sales order info DSO”, most infoobjects were mapped directly.
2. we create a transformation from invoice ODS to “Deliveried sales order info DSO”. we create a start routine for Act_Goods_Issue_DATE. the main code is like below.

*$*$ begin of global – insert your declaration only below this line *-*
DATA: G_MATERIAL TYPE TABLE OF /BIC/PIO_MATG.
DATA: G_DSO_DELI TYPE TABLE OF /BIC/AZ_ODS200.
*$*$ end of global – insert your declaration only before this line *-*

*$*$ begin of routine – insert your code only below this line *-*
… “insert your code here
*– fill table “MONITOR” with values of structure “MONITOR_REC”
*- to make monitor entries
… “to cancel the update process
* raise exception type CX_RSROUT_ABORT.

* Get material master date into the internal table G_MATERIAL
SELECT * INTO TABLE G_MATERIAL
FROM /BIC/PIO_MATG
FOR ALL ENTRIES IN SOURCE_PACKAGE
WHERE /BIC/IO_MATG = SOURCE_PACKAGE-/BIC/IO_MATG.
SORT G_MATERIAL BY /BIC/IO_MATG.

* Get delivery DSO active table data into the internal table G_DSO_DELI
SELECT * INTO TABLE G_DSO_DELI
FROM /BIC/AZ_ODS200
FOR ALL ENTRIES IN SOURCE_PACKAGE
WHERE /BIC/ZDOC002 = SOURCE_PACKAGE-/BIC/ZDOC001
AND /BIC/ZITEM02 = SOURCE_PACKAGE-/BIC/ZITEM0001.
SORT G_DSO_DELI BY /BIC/ZDOC002 /BIC/ZITEM02.

*$*$ end of routine – insert your code only before this line *-*

3. Then add the fields Material,Billingdate,ReferedDeliveryDoc,and ReferedDeliveryItem as input for the infoobject Act_Goods_Issue_DATE and write transfer routine like below:

*$*$ begin of routine – insert your code only below this line *-*
… “insert your code here
*– fill table “MONITOR” with values of structure “MONITOR_REC”
*- to make monitor entries
… “to cancel the update process
* raise exception type CX_RSROUT_ABORT.
… “to skip a record”
* raise exception type CX_RSROUT_SKIP_RECORD.
* result value of the routine
DATA : W_MATERIAL TYPE /BIC/PIO_MATG.
DATA : W_DELIVERY TYPE /BIC/AZ_ODS200.

READ TABLE G_MATERIAL INTO W_MATERIAL WITH KEY /BIC/IO_MATG =
SOURCE_FIELDS-/BIC/IO_MATG
BINARY SEARCH.
IF SY-SUBRC EQ 0.

IF W_MATERIAL-/BIC/IO_MATTY = ‘ZDIE’.
* if the material is a service product.
RESULT = SOURCE_FIELDS-/BIC/ZDATE01.
ELSE.
* if the material is a non service product, then search internal table G_DSO_DELI to get DeliveryDate.
READ TABLE G_DSO_DELI INTO W_DELIVERY WITH KEY
/BIC/ZDOC002 = SOURCE_FIELDS-/BIC/ZDOC001
/BIC/ZITEM02 = SOURCE_FIELDS-/BIC/ZITEM0001
BINARY SEARCH.
IF SY-SUBRC EQ 0.

* Assign DeliveryDate “/BIC/ZDATE02″ to result.
RESULT = W_DELIVERY-/BIC/ZDATE02.
ENDIF.
ENDIF.
ENDIF.
*$*$ end of routine – insert your code only before this line *-*

最后编辑:
作者:yitai
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。