解析Delta Queue数据解析方法

前段时间由于特殊情况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系统,目前采用两种途径来处理:

  1. R3程序抛砖FlatFile到FTP, BW系统从FTP读取数据;
  2. 通过中间程序VB调用RFC来连接R3系统和BW系统,从R3系统读取数据然后写入BW系统中;

你可能感兴趣的:(BW)