凡尘clsoho™的博客

E-mail & MSN: clsoho@hotmail.com
QQ1超级群: <101817641已满> QQ2群:<110722895已满>
QQ3超级群:<23765855>QQ4超级群:<85338969>

技术贴,转自:http://www.sap.cm/thread-351-1-1.html

前段时间由于特殊情况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的值;

更详细内容可以参考:


二、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 s = 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资料>
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 /BI0/C_0006 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系统,目前采用两种途径来处理:
1.R3程序拋砖FlatFile到FTP, BW系统从FTP读取数据;
2.通过中间程序VB来连接R3系统和BW系统,从R3系统读取数据然后写入BW系统中;

posted on 2012-10-23 10:53  凡尘clsoho  阅读(2519)  评论(0编辑  收藏  举报