前段时间由于特殊情况R3系统和BW系统断开不能互联,但是用户还要查询系统数据,这就给IT提出了比较大的挑战,我们需要研究怎么把R3中Delta Queue的数据读取出来并且传送到BW系统中,要解决这一问题我们首先需要查询数据了解Delta Queue的存储原理及结构,然后查找Delta Queue的读取方法,最后还要处理读取的数据如何传送的BW系统中,以下是我们解决此问题采用的方法供大家参考,有不当之处请及时指出。
一、Delta Queue的存储原理及结构:
BW Delta Queue 是一种基于SAP Web Application servers RFC技术的队列功能(qRFC), Delta Queue的数据主要存放在以下三个表中:
a. TRFCQOUT :Client Dependent pointer table per queue name and destination
依赖Client的库表,主要存储每个TID 的RFC Queue的名称及RFC的目标客户端Destination,以及此RFC调用的Function Module名称还有TID的读取状态等信息;
b. ARFCSSTATE: Link between TRFCQOUT and ARFCSDARA
不依赖Client的库表,主要存放每个TID的读取状态,是连接库表TRFCQOUT和库表ARFCSDARA的中间桥梁;
c. ARFCSDATA:Compressed data for tRFC/qRFC
不依赖Client的库表,主要存放每个TID即Delta Queue的具体数据内容以压缩方式存放;
另外一个比较重要的库表ROOSPRMSC[Control Parameter Per DataSource Channel],主要存放每个DataSource的相关重 要信息,包括目标客户端,做Initial的Request Number及具体时间以及上一次做Delta的Request Number及时间,还有两个重要的字段GETTID和GOTID;
TID= Host ID (IP ID) +Process ID +Timestamp+Transaction ID (LUW)
GETTID:This field refers to the last but one delta TID
GOTTID:This field refers to the last delta TID (that has reached to BW)
当用户每次在BW做Delta数据拉取时,R3系统首先将大于GETTID并且小于等于GOTTID的DeltaQueue数据删除,然后将GETTID值更新为GOTTID的值,同时将新读取的TID作为GOTTID的值;
更详细内容可以参考:
http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/40427814-376a-2c10-5589-bc1aaa6692c3?QuickLink=index&overridelayout=true
http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/40427814-376a-2c10-5589-bc1aaa6692c3&prtmode=print
二、Delta Queue数据解析方法:
如何查找Delta Queue的读取方法,主要通过Debug系统标准程序方式来查找Delta Queue解析原理,目前发现有三种方式来解析Delta Queue的数据,其中综合起来第三种方式最方便和灵活,由于Delta Queue采用压缩机制,因此在读取时我们需要分批次按TID来读取压缩数据防止内表溢出,详细处理如下:
1.RSA3 的读取方式:
l_t_fields-fieldnm = 'CURRUNIT'.
APPEND l_t_fields.
l_t_fields-fieldnm = 'QUANTITY'.
APPEND l_t_fields.
l_t_fields-fieldnm = 'QUANUNIT'.
APPEND l_t_fields.
CALL FUNCTION 'RSFH_GET_DATA_SIMPLE'
EXPORTING
i_requnr = 'TEST'
i_osource = '0EC_PCA_1'
i_maxsize = '999999'
i_forcegen = ''
i_maxfetch = '9999'
i_updmode = 'F'
i_debugmode = ''
i_rlogsys = 'BWPCLNT891'
i_read_only = 'X'
TABLES
i_t_select = l_t_select
i_t_field = l_t_fields
e_t_data = e_t_data
EXCEPTIONS
generation_error = 1
interface_table_error = 2
metadata_error = 3
no_authority = 4
OTHERS = 5.
2.RSA7读取Delta Queue数据方式:
...
Data: Begin of Z1SCHAR30K.
WA(8000) TYPE C.
DATA: END OF Z1SCHAR30K.
Data:E_T_DATA like of Z1SCHAR30K.
SUBMIT zrsa1qmon WITH os = datasourcetype
WITH rs = 'BWPCLNT891'
WITH ss = 'CQA701'
WITH so_dpack IN so_dpack
WITH so_recno IN so_recno
WITH p_updmod = 'D'
WITH p_maxsz = '10'
WITH p_maxrec = '1000'
AND RETURN .
IMPORT e_t_data FROM MEMORY ID 'BW_DELTA_ID'.
…
3.直接读取ARFCSDATA的数据,解析压缩数据Function示例如下:
<例子:读取Sales段的Billing明细Delta Queue数据> /BI0/C_0006
DATA: l_func LIKE arfcsstate-arfcfnam .
data: lt_arfcsdata like STANDARD TABLE OF arfcsdata WITH HEADER LINE.
DATA: lt_13_vditm LIKE STANDARD TABLE OF MC13VD0ITM WITH HEADER LINE.
IF DATASOURCETYPE = '2LIS_13_VDITM'.
l_func = '/BI0/QI2LIS_13_VDITM0001'.
ENDIF.
CALL FUNCTION 'TRFC_QOUT_PLAYBACK'
EXPORTING
IF_FNAME = l_func
TABLES
sdata = lt_arfcsdata
ATAB01 = lt_13_vditm.
* CALL FUNCTION 'RSC2_QOUT_PLAYBACK'
* EXPORTING
* IF_FNAME = l_func
* TABLES
* sdata = lt_arfcsdata
* ATAB01 = lt_12_VCITM.
*
三、Delta Queue数据传送BW系统:
当Delta Queue数据读取出来后如何传送到BW系统,目前采用两种途径来处理: