今天有一个需求,接收PI传数据过来后,除整理数据保存到用户数据表外,在后期还需要把报文加工一下(要求报文内容与原接收报文一致,只是补加少量值),在发送到其它的系统。由于数据接收后已对数据加工到了用户表,已没有原报文内容(比如金额已累计),如从用户数据表中再取出数据整理加入发送出去,一是整理数据太麻烦,二是一些数据可能已丢失,并不能很好的还原接收到的报文。
所以考虑在接收到报文时,把接收到的报文(结构化数据)保存到内表中,然后在需要再次发送出去时,从内表中取出数据,并做必要的整理,然后再发送出去。
1.1.创建保存报文的内表,
可参考(复制)系统中的标准内表:INDX创建新的内表(比如我的ZSDT_XDATA),并加入自己必要的检索字段(比如业务数据的关键KEY值)。
2.2.把结构化对像结构存储到内表中
如下面的代码,主要使用 EXPORT TO DATABASE语句,把INPUT结构内容存入表透明表ZSDT_XDATA中,其中的01,表示表中的RELID字段的值,可用此值来区分不同的接口,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
FUNCTION ZSD_0242_SAVE_DATA. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(INPUT) TYPE ZPI_MT_SD242_RESP OPTIONAL *" VALUE(I_SRTFD) TYPE ZINDX_SRTFD OPTIONAL *"---------------------------------------------------------------------- DATA: L_SRTFD TYPE ZINDX_SRTFD. DATA: LS_XDATA TYPE ZSDT_XDATA. CHECK INPUT IS NOT INITIAL. L_SRTFD = I_SRTFD."KEY IF L_SRTFD IS INITIAL. L_SRTFD = INPUT-MT_SD242_RESP-HEADER-MESSAGE_ID. ENDIF. LS_XDATA-AEDAT = SY-DATUM. LS_XDATA-USERA = SY-UNAME. LS_XDATA-ZKEY1 = INPUT-MT_SD242_RESP-I_GOODS_ITEM-ZXMLI. LS_XDATA-ZKEY2 = INPUT-MT_SD242_RESP-I_GOODS_ITEM-ZXMLD. LS_XDATA-ZKEY3 = INPUT-MT_SD242_RESP-I_GOODS_ITEM-CCODE. LS_XDATA-ZKEY4 = INPUT-MT_SD242_RESP-I_GOODS_ITEM-PCODE. EXPORT DATA = INPUT TO DATABASE ZSDT_XDATA(01)"01表示0242接口报文 FROM LS_XDATA ID L_SRTFD. COMMIT WORK. ENDFUNCTION. |
3.3.从内表中读到数据到结构化的结构中。
其中I_SRTFD为表ZSDT_XDATA中的SRTFD关键字段值,也就业务中报文的主键值
1 2 3 4 |
DATA: LS_INPUT TYPE ZPI_MT_SD242_RESP. "242接口传入数据。 IMPORT DATA = LS_INPUT FROM DATABASE ZSDT_XDATA(01) ID I_SRTFD. CHECK SY-SUBRC = 0. |
通过这种方式,就能把内表(多级内容嵌套),或者是结构(结构中可能还包含内表)保存到内表中,并且还保存的数据的结构化,也就是保存了结构化的数据,同时也相当于保存了报文的XML文件了,
此功能也可以用作长文件的的保存,比如,可以把EXEC,WORD等长文件文件导入文本内表中,然后把此内表附值给一个结构的字段,保存此结构到ZSDT_XDATA就行了。