有一个需求,接收PI传数据过来后,除整理数据保存到用户数据表外,在后期还需要把报文加工一下(要求报文内容与原接收报文一致,只是补加少量值),在发送到其它的系统。由于数据接收后已对数据加工到了用户表,已没有原报文内容(比如金额已累计),如从用户数据表中再取出数据整理加入发送出去,一是整理数据太麻烦,二是一些数据可能已丢失,并不能很好的还原接收到的报文。
所以考虑在接收到报文时,把接收到的报文(结构化数据)保存到内表中,然后在需要再次发送出去时,从内表中取出数据,并做必要的整理,然后再发送出去。
1.1.创建保存报文的内表,
可参考(复制)系统中的标准内表:INDX创建新的内表(比如我的ZSDT_XDATA),并加入自己必要的检索字段(比如业务数据的关键KEY值)。
2.2.把结构化对像结构存储到内表中
如下面的代码,主要使用 EXPORT TO DATABASE语句,把INPUT结构内容存入表透明表ZSDT_XDATA中,其中的01,表示表中的RELID字段的值,可用此值来区分不同的接口,
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关键字段值,也就业务中报文的主键值
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就行了。