本文翻译自SAP标准方法:
1. 事务码 FINF
2. 确定 业务发生事件(BTE)。
3. 1 点击示例函数模块,创建函数
3.2.1 SE11 基于EBKN 创建 一个 view ZEBKN。
3.2.2 查看VIEW中数据
3.3.1 以ZEBKN为基础,RSO2创建数据源 Z_BET_DELTA。
3.3.2 确认数据源的选择选项
3.3.3 SE38 创建Z_CHANGE_DELTA_PROCESS, 输入代码 (4.1)
3.3.4. 跑此程序,需要输入两个参数, 数据源名称和增量方式(此处填写 AIM)。
3.3.5 执行程序,会告诉此数据源正常更新。
3.4.1 FIBF 设置-产品-客户的
3.4.2 创建一个客户产品 Z_DELTA
3.4.3.FIBF 设置-发布/订阅模块-客户的
3.4.5 输入BTE名,产品Z_DELTA,和刚才制作的function module
3.5.1 到SE37中创建Z_WRITE_TO_QUEUE
3.5.2 拷贝代码 (见4.2)
3.5.3 在第一个FUNCTION MODULE 中拷贝代码 (4.3)
3.5.4 在3.5.3 中改数据源为:Z_BTE_DELTA
3.6.1 进 BW - RSA1复制元数据 激活 ,创建信息包,先初始化。
3.6.2 进源系统 RSA7 可以看到 Z_BTE_DELTA出现在delta queue中
3.6.6 修改一张现有的采购单数据
3.6.7 可以在BW中创建一个DELTA 包 ,可以抽取到修改后的 采购单数据。
4.1
Z_CHANGE_DELTA_PROCESS
*&---------------------------------------------------------------------*
*& Report Z_CHANGE_DELTA_PROCESS *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
report z_change_delta_process .
*P_DATAS DataSource
*P_DELTAP Delta Process for DataSource
parameters:
p_datas type roosource-oltpsource,
p_deltap type roosource-delta.
tables:
roosource.
data:
ls_roosource type roosource.
if p_datas(2) ne 'Z_'.
message 'The DataSource needs to begin with ''Z_''.' type 'E'.
endif.
select single * from roosource into ls_roosource
where oltpsource = p_datas
and objvers = 'A'.
if sy-subrc eq 0.
ls_roosource-delta = p_deltap.
update roosource from ls_roosource.
message 'The DataSource has been updated successfully.' type 'I'.
else.
message 'The DataSource entered is not valid, try again.' type 'E'.
endif.
4.2 4.2
Z_WRITE_TO_QUEUE
FUNCTION z_write_to_queue.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(I_DATASOURCE) TYPE ROOSOURCE-OLTPSOURCE
*" TABLES
*" I_T_DATA OPTIONAL
*"----------------------------------------------------------------------
* Developed by: Scott Cairncross
TYPE-POOLS:
sbiwa.
DATA:
- 14 -
l_exstruct TYPE roosource-exstruct,
l_initflag TYPE roosprmsc-initstate,
l_subrc TYPE sy-subrc,
lr_is_data TYPE REF TO data,
lr_es_data TYPE REF TO data,
lr_et_data TYPE REF TO data,
l_t_fields TYPE sbiwa_t_fields,
l_t_select TYPE sbiwa_t_select.
FIELD-SYMBOLS:
<i_s_data> TYPE ANY,
<e_s_data> TYPE ANY,
<e_t_data> TYPE STANDARD TABLE.
* Check to see if Delta initialization has been performed.
SELECT SINGLE initstate FROM roosprmsc INTO l_initflag
WHERE oltpsource = i_datasource
AND rlogsys NE space
AND slogsys NE space
AND initrnr NE space.
* If initialization has taken place continue
IF sy-subrc EQ 0 AND l_initflag EQ 'X'.
* grab the extraction structure from roosource based on the
* datasource parameter input.
SELECT SINGLE exstruct FROM roosource INTO l_exstruct
WHERE oltpsource = i_datasource
AND objvers = 'A'.
CHECK sy-subrc = 0.
CREATE DATA lr_is_data LIKE LINE OF i_t_data.
ASSIGN lr_is_data->* TO <i_s_data>.
CREATE DATA lr_es_data TYPE (l_exstruct).
ASSIGN lr_es_data->* TO <e_s_data>.
CREATE DATA lr_et_data TYPE STANDARD TABLE OF (l_exstruct).
ASSIGN lr_et_data->* TO <e_t_data>.
LOOP AT i_t_data ASSIGNING <i_s_data>.
CLEAR <e_s_data>.
MOVE-CORRESPONDING <i_s_data> TO <e_s_data>.
INSERT <e_s_data> INTO TABLE <e_t_data>.
ENDLOOP.
CALL FUNCTION 'EXIT_SAPLRSAP_001'
EXPORTING
i_datasource = i_datasource
i_isource = ''
i_updmode = ''
TABLES
i_t_select = l_t_select
i_t_fields = l_t_fields
c_t_data = <e_t_data>
EXCEPTIONS
rsap_customer_exit_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'RSC1_TRFC_QUEUE_WRITE'
EXPORTING
i_isource = i_datasource
- 15 -
- 16 -
i_no_flush = 'X'
IMPORTING
e_subrc = l_subrc
TABLES
i_t_data = <e_t_data>
EXCEPTIONS
name_too_long = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDFUNCTION.
*---------------------------------------------------------------------*
* FORM abs_type_to_rel_type *
*---------------------------------------------------------------------*
* The purpose of this subroutine is to convert an absolute type *
* name into a relative type name. *
* *
*---------------------------------------------------------------------*
* --> TYPE_NAME *
*---------------------------------------------------------------------*
form abs_type_to_rel_type changing type_name.
data junk(100) type c.
split type_name at '\TYPE=' into junk type_name.
endform.
4.3
*"*"Local interface:
*" TABLES
*" T_XEBAN STRUCTURE EBAN OPTIONAL
*" T_XEBKN STRUCTURE EBKN OPTIONAL
*" T_YEBAN STRUCTURE EBAN OPTIONAL
*" T_YEBKN STRUCTURE EBKN OPTIONAL
*"----------------------------------------------------------------------
data:
l_datasource type roosource-oltpsource.
l_datasource = 'Z_BTE_DELTA'.
if lines( t_xebkn[] ) gt 0.
call function 'Z_WRITE_TO_QUEUE'
exporting
i_datasource = l_datasource
tables
i_t_data = t_xebkn.
endif.
endfunction.