文章目录
BW从其他系统拿数据源,现只讨论这个底层的系统是ECC。
那么除了它已经提供的好多标准数据源有extractor。我们还可以新建generic 数据源。
对于数据源增强,一般就是说增强SAP提供的标准数据源。
1.标准数据源增强
增强SAP数据源一般意思是:
需要扩展主数据或者交易数据的提取结构的字段。
主要包括:1. 添加字段 2.填充字段 3.复制数据源 4.加载数据
添加字段很容易,那么填充字段的必要条件就是:读取添加字段的必要主键已经存在于原始数据中。
那么具体怎么操作?
1. 客户出口 CMOD
SAP标准程序中预定义的一些点可以用来做客户出口,用于运行在用户自定义的子程序中。基于客户自己的需求来增强标准功能。这也是SAP此软件最大的可能的灵活之处。用户自定义的代码在用户命名空间内被当做单独的对象管理。所以不会被下次的SAP自身的修正版本覆盖。
详细的步骤就是:
- 在数据源的extract structure上面append一个append structure,这个新的append structure里面是你需要的字段。
- 写你的功能出口来获取相应数据
- 复制数据源到BW
- 提取增强的数据源的数据
1.1 创建维护append:添加字段
找到数据源,右击增强提取结构,系统自动分配ZA开头的接提取结构名的新扩展结构。维护字段。所有的客制化的扩展结构字段必须以ZZ开头以区分。最后生成扩展结构。
注意 LO数据源的增强要么从communication structure的未展示字段里面直接给展示出来,或者是从communication structure去增强。
1.2 function exit 功能出口
这种增强得先有个project。然后可以添加几个增强到这个project里面。SAP提供了增强RSAP0001.
一个增强不能被用在两个project里。
这个增强有四个增强组件。这四个组件有填充提取结构的代码:
EXIT_SAPLRSAP_001 : 交易数据
EXIT_SAPLRSAP_002 :主数据和文本
EXIT_SAPLRSAP_003 :文本
EXIT_SAPLRSAP_004 :层级
每个增强project都有个文档,解释了这个功能模块的参数。这个增强只有激活了才能用。展示文档要用CMOD下面的Utilities-Display Entire Docu
CMOD是个SAP增强的项目管理Tcode。
你在CMOD下面去找Z开头的project,进去找这个增强RSAP0001,如果它已经被别的project用了,那你就在那个project里面改吧。不能再新建一个新的project来用了。
2 .BAdI
ECC6.0之后呢,就是用BAdI来替代客户出口了。Business Add-In.
用户出口增强RSAP0001只能包含在一个项目中,而BAdI可以为RSU5_SAPI_BADI创建多个implementation,这就是说每个模块可以创建一个imlementation,每个数据源再建一个method。方便观看。
SE19: 创建BAdI RSU5_SAPI_BADI
创建Z开头的implementation name.
输入短文本,到interface标签下,有两个method,DATA_TRANSFORM和HIER_TRANSFORM。
选DATA_TRANSFORM.到类的创建。
激活,继续。
2. RSO2创建一般数据源
有时候客户需要的数据源需要好多个表的数据,标准的要去增强很麻烦。那不如就新建一个新的数据源。
RSO2新建一般数据源。数据源分为full抽取和delta抽取。
2.1 Full抽取-主数据属性或者文本
2.2 Delta抽取-交易数据
2.2.1 Function Module和timestamp创建delta数据源
a. 增量字段
要弄delta就得有delta字段,一般就是时间戳。表明什么时候建的,什么时候改的。
ERDAT: created on
ERZET: creation time
AEDAT: change date
要自己建delta数据源,要建提取结构(里面包含delta字段),还得自己写function module来提取值。
有两个模型function module 可以抄抄:
RSAX_BIW_GET_DATA_SIMPLE : 不支持增量
RSAX_BIW_GET_DATA : 支持增量
b. 提取结构
SE11新建structure。
把VBAK表include进去。
再添加一个新的时间字段。注意类型。
保存这个提取结构。
c. function module
找你自己的function group下面去新建一个。或者copy RSAX的。然后激活。
把它那个方法也copy一个出来。
然后SE37去修改,记得把tables下面的E_T_DATA给LIKE成你的结构ZZVBAK。
然后去代码那,粘贴它的代码。
FUNCTION Z_RSAX_BIW_GET_DATA_VBAK.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_REQUNR) TYPE SBIWA_S_INTERFACE-REQUNR
*" VALUE(I_ISOURCE) TYPE SBIWA_S_INTERFACE-ISOURCE OPTIONAL
*" VALUE(I_MAXSIZE) TYPE SBIWA_S_INTERFACE-MAXSIZE OPTIONAL
*" VALUE(I_INITFLAG) TYPE SBIWA_S_INTERFACE-INITFLAG OPTIONAL
*" VALUE(I_UPDMODE) TYPE SBIWA_S_INTERFACE-UPDMODE OPTIONAL
*" VALUE(I_DATAPAKID) TYPE SBIWA_S_INTERFACE-DATAPAKID OPTIONAL
*" VALUE(I_PRIVATE_MODE) OPTIONAL
*" VALUE(I_CALLMODE) LIKE ROARCHD200-CALLMODE OPTIONAL
*" VALUE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF
*" TABLES
*" I_T_SELECT TYPE SBIWA_T_SELECT OPTIONAL
*" I_T_FIELDS TYPE SBIWA_T_FIELDS OPTIONAL
*" E_T_ZZVBAK STRUCTURE ZZVBAK OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------
* THE INPUT PARAMETER I_DATAPAKID IS NOT SUPPORTED YET !
* EXAMPLE: INFOSOURCE CONTAINING TADIR OBJECTS
* TABLES: TADIR.
* AUXILIARY SELECTION CRITERIA STRUCTURE
DATA: L_S_SELECT TYPE SBIWA_S_SELECT,
STARTDATE LIKE SY-DATUM,
STARTTIME LIKE SY-UZEIT,
ENDDATE LIKE SY-DATUM,
ENDTIME LIKE SY-UZEIT,
TSTAMP LIKE TZONREF-TSTAMPS.
* MAXIMUM NUMBER OF LINES FOR DB TABLE
STATICS: L_MAXSIZE TYPE SBIWA_S_INTERFACE-MAXSIZE.
* SELECT RANGES
RANGES: L_R_TMPSTMP FOR ZZVBAK-ZTMSTMP.
* PARAMETER I_PRIVATE_MODE:
* SOME APPLICATIONS MIGHT WANT TO USE THIS FUNCTION MODULE FOR OTHER
* PURPOSES AS WELL (E.G. DATA SUPPLY FOR OLTP REPORTING TOOLS). IF THE
* PROCESSING LOGIC HAS TO BE DIFFERENT IN THIS CASE, USE THE OPTIONAL
* PARAMETER I_PRIVATE_MODE (NOT SUPPLIED BY BIW !) TO DISTINGUISH
* BETWEEN BIW CALLS (I_PRIVATE_MODE = SPACE) AND OTHER CALLS
* (I_PRIVATE_MODE = X).
* IF THE MESSAGE HANDLING HAS TO BE DIFFERENT AS WELL, DEFINE YOUR OWN
* MESSAGING MACRO WHICH INTERPRETS PARAMETER I_PRIVATE_MODE. WHEN
* CALLED BY BIW, IT SHOULD USE THE LOG_WRITE MACRO, OTHERWISE DO WHAT
* YOU WANT.
* 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
************************************************************************
* THE INPUT PARAMETER I_DATAPAKID IS NOT SUPPORTED YET !
* INVALID SECOND INITIALIZATION CALL -> ERROR EXIT
IF NOT G_FLAG_INTERFACE_INITIALIZED IS INITIAL.
IF 1 = 2. MESSAGE E008(R3). ENDIF.
LOG_WRITE 'E' "MESSAGE TYPE
'R3' "MESSAGE CLASS
'008' "MESSAGE NUMBER
' ' "MESSAGE VARIABLE 1
' '. "MESSAGE VARIABLE 2
RAISE ERROR_PASSED_TO_MESS_HANDLER.
ENDIF.
* CHECK INFOSOURCE VALIDITY
CASE I_ISOURCE.
WHEN 'ZDSVBAK' OR ''.
WHEN OTHERS.
IF 1 = 2. MESSAGE E009(R3). ENDIF.
LOG_WRITE 'E' "MESSAGE TYPE
'R3' "MESSAGE CLASS
'009' "MESSAGE NUMBER
I_ISOURCE "MESSAGE VARIABLE 1
' '. "MESSAGE VARIABLE 2
RAISE ERROR_PASSED_TO_MESS_HANDLER.
ENDCASE.
* CHECK FOR SUPPORTED UPDATE MODE
CASE I_UPDMODE.
WHEN 'F' OR ''.
WHEN 'C'. "
WHEN 'R'. "
WHEN 'S'. " DELTA INITIALIZATION
WHEN 'I'. " DELTA INIT FOR NON CUMMULATIVE
WHEN 'D'. " DELTA UPDATE
WHEN OTHERS.
IF 1 = 2. MESSAGE E011(R3). ENDIF.
LOG_WRITE 'E' "MESSAGE TYPE
'R3' "MESSAGE CLASS
'011' "MESSAGE NUMBER
I_UPDMODE "MESSAGE VARIABLE 1
' '. "MESSAGE VARIABLE 2
RAISE ERROR_PASSED_TO_MESS_HANDLER.
ENDCASE.
* CHECK FOR OBLIGATORY SELECTION CRITERIA
* READ TABLE I_T_SELECT INTO L_S_SELECT WITH KEY FIELDNM = 'ZTMSTMP'.
* IF SY-SUBRC <> 0.
* IF 1 = 2. MESSAGE E010(R3). ENDIF.
* LOG_WRITE 'E' "MESSAGE TYPE
* 'R3' "MESSAGE CLASS
* '010' "MESSAGE NUMBER
* 'PGMID' "MESSAGE VARIABLE 1
* ' '. "MESSAGE VARIABLE 2
* RAISE ERROR_PASSED_TO_MESS_HANDLER.
* ENDIF.
APPEND LINES OF I_T_SELECT TO G_T_SELECT.
* FILL PARAMETER BUFFER FOR DATA EXTRACTION CALLS
G_S_INTERFACE-REQUNR = I_REQUNR.
G_S_INTERFACE-ISOURCE = I_ISOURCE.
G_S_INTERFACE-MAXSIZE = I_MAXSIZE.
G_S_INTERFACE-INITFLAG = I_INITFLAG.
G_S_INTERFACE-UPDMODE = I_UPDMODE.
G_S_INTERFACE-DATAPAKID = I_DATAPAKID.
G_FLAG_INTERFACE_INITIALIZED = SBIWA_C_FLAG_ON.
* FILL FIELD LIST TABLE FOR AN OPTIMIZED SELECT STATEMENT
* (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 G_T_SEGFIELDS.
ELSE. "INITIALIZATION MODE OR DATA EXTRACTION ?
************************************************************************
* DATA TRANSFER: FIRST CALL OPEN CURSOR + FETCH
* FOLLOWING CALLS FETCH ONLY
************************************************************************
* FIRST DATA PACKAGE -> OPEN CURSOR
IF G_COUNTER_DATAPAKID = 0.
"LOOP AT I_T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'ZTMSTMP'.
LOOP AT G_T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'ZTMSTMP'.
TSTAMP = L_S_SELECT-LOW.
CONVERT TIME STAMP TSTAMP TIME ZONE SY-ZONLO INTO DATE STARTDATE TIME STARTTIME.
TSTAMP = L_S_SELECT-HIGH.
CONVERT TIME STAMP TSTAMP TIME ZONE SY-ZONLO INTO DATE ENDDATE TIME ENDTIME.
ENDLOOP.
* FILL RANGE TABLES FOR FIXED INFOSOURCES. IN THE CASE OF GENERATED
* INFOSOURCES, THE USAGE OF A DYNAMICAL SELECT STATEMENT MIGHT BE
* MORE REASONABLE. BIW WILL ONLY PASS DOWN SIMPLE SELECTION CRITERIA
* OF THE TYPE SIGN = 'I' AND OPTION = 'EQ' OR OPTION = 'BT'.
* LOOP AT G_T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'PGMID'.
* MOVE-CORRESPONDING L_S_SELECT TO L_R_PGMID.
* APPEND L_R_PGMID.
* ENDLOOP.
* LOOP AT G_T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'OBJECT'.
* MOVE-CORRESPONDING L_S_SELECT TO L_R_OBJECT.
* APPEND L_R_OBJECT.
* ENDLOOP.
* DETERMINE NUMBER OF DATABASE RECORDS TO BE READ PER FETCH STATEMENT
* FROM INPUT PARAMETER I_MAXSIZE. IF THERE IS A ONE TO ONE RELATION
* BETWEEN INFOSOURCE TABLE LINES AND DATABASE ENTRIES, THIS IS TRIVIAL.
* IN OTHER CASES, IT MAY BE IMPOSSIBLE AND SOME ESTIMATED VALUE HAS TO
* BE DETERMINED.
L_MAXSIZE = G_S_INTERFACE-MAXSIZE.
IF ENDDATE <> '00000000' AND ENDTIME <> '000000'.
OPEN CURSOR WITH HOLD G_CURSOR FOR
SELECT * FROM VBAK
WHERE
(
( ERDAT >= STARTDATE AND ERZET >= STARTTIME AND ERDAT <= ENDDATE AND ERZET <= ENDTIME )
OR ( AEDAT >= STARTDATE AND AEDAT <= ENDDATE )
).
ELSE.
OPEN CURSOR WITH HOLD G_CURSOR FOR
SELECT * FROM VBAK.
ENDIF.
ENDIF. "FIRST DATA PACKAGE ?
* FETCH RECORDS INTO INTERFACE TABLE. THERE ARE TWO DIFFERENT OPTIONS:
* - FIXED INTERFACE TABLE STRUCTURE FOR FIXED INFOSOURCES HAVE TO BE
* NAMED E_T_'NAME OF ASSIGNED SOURCE STRUCTURE IN TABLE ROIS'.
* - FOR GENERATING APPLICATIONS LIKE LIS AND CO-PA, THE GENERIC TABLE
* E_T_DATA HAS TO BE USED.
* ONLY ONE OF THESE INTERFACE TYPES SHOULD BE IMPLEMENTED IN ONE API !
FETCH NEXT CURSOR G_CURSOR
APPENDING CORRESPONDING FIELDS
OF TABLE E_T_ZZVBAK
PACKAGE SIZE 1000.
* PACKAGE SIZE L_MAXSIZE.
IF SY-SUBRC <> 0.
CLOSE CURSOR G_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
G_COUNTER_DATAPAKID = G_COUNTER_DATAPAKID + 1.
ENDIF. "INITIALIZATION MODE OR DATA EXTRACTION ?
ENDFUNCTION.
激活这个function module。
a. 创建数据源
RSO2创建数据源。填写描述,和分配个地址。
从FM提取:
然后设置增量,填写字段,设置成time stamp。
设置安全地低值1小时。每次抽取时间会往回退1小时。
保存后到数据源界面,可以选过滤的字段。
然后RSA2去看数据源。提取方式现在是F2(simple interface)要改成F1(complete interface)
去SE38建一个新的report来执行这个转换,或者把ROOSOURCE表里面的改掉。
然后确认下是不是改掉了。
检查并保存。
a. 测试数据源
可以去SE37执行一下初始化:
看看E_T_DATA这里有没有数。
或者RSA3去提取:
后续BW的初始化DTP创建好了之后,去ODQMON看它的增量。