目录
本案例为Soap2File的测试用例,数据从SAP侧输出到客户的FTP服务器上,需要将Soap的XML报文格式转换为.dat或其他文本格式(.txt/.csv等也适用),以下为完整配置步骤说明。
发送方:S4DCLNT120
接收方:PSAM_WMS
XML报文格式:
生成的文本格式:
PI端配置
-
ESR配置
1.创建Data Type
2.创建Message Type
3.创建Service Interfaces
4.创建Message Mappings
5.创建Operation Mappings -
ID配置
1.创建Configuration Scenario
2.创建发送方Communication Channel
3.配置接收方Communication Channel
XML转换为文本格式重点在下图,使用Module对报文内容进行格式转换。下面会对参数进行详细解释。
4.创建Integrated Configuration
SAP端配置
SAP端需要在事务代码SPROXY中创建对应的代理类,双击创建未创建的代理,激活后结束。
代码测试部分:
REPORT zprsap2ftp_test001.
DATA:
lv_error TYPE REF TO cx_ai_system_fault,
lv_error2 TYPE REF TO cx_ai_application_fault,
lv_text TYPE string,
lv_xi_message_id TYPE sxmsmguid,
lo_message_id_protocol TYPE REF TO if_wsprotocol_message_id.
DATA:
lc_test001 TYPE REF TO zprco_si_sap2ftp_test001_req,
ls_input TYPE zprmt_sap2ftp_test001,
lt_data TYPE zprdt_sap2ftp_test001_head_tab,
ls_data TYPE zprdt_sap2ftp_test001_head.
* lt_items TYPE zprdt_sap2ftp_test001_item_tab,
* ls_items TYPE zprdt_sap2ftp_test001_items.
*lt_items = VALUE #( ( itemno = '001' itemtxt = '明细文本1' werks = '1710' )
* ( itemno = '002' itemtxt = '明细文本2' werks = '1720' ) ).
lt_data = VALUE #( ( bukrs = '1000' butxt = `公司1` )
( bukrs = '1200' butxt = `公司2` )
( bukrs = '1300' butxt = `公司3` ) ).
ls_input-mt_sap2ftp_test001-head = lt_data.
IF lc_test001 IS INITIAL.
TRY.
CREATE OBJECT lc_test001.
CATCH cx_ai_system_fault INTO lv_error.
ENDTRY.
ENDIF.
TRY.
lo_message_id_protocol ?= lc_test001->get_protocol( if_wsprotocol=>message_id ).
CALL METHOD lc_test001->si_sap2ftp_test001_req
EXPORTING
output = ls_input.
lv_xi_message_id = lo_message_id_protocol->get_message_id( ).
COMMIT WORK.
CATCH cx_ai_system_fault INTO lv_error.
IF sy-subrc = 0.
CALL METHOD lv_error->if_message~get_text
RECEIVING
result = lv_text.
ENDIF.
CATCH cx_ai_application_fault INTO lv_error2.
IF sy-subrc = 0.
CALL METHOD lv_error2->if_message~get_text
RECEIVING
result = lv_text.
ENDIF.
ENDTRY.
IF lv_text IS INITIAL.
WRITE:/ 'Send success'.
ELSE.
WRITE: lv_text.
ENDIF.
StrictXml2PlainBean使用介绍部分:
你可以使用此模块将XML文档转换为文本格式,可以是固定长度的文本,或者是具有分隔符的文本格式,不支持深层结构的转换。
StrictXml2PlainBean使用方式
1.首先在接收方的Module页签下添加模块AF_Modules/StrictXml2PlainBean,类型选择Local Enterprise Bean,Module Key可以任意指定,与下面的列表对应。
2.在下方的Module Configuration列表中添加对应的参数和值,以下是参数介绍:
转换类型
recordTypes:可以为XML文档中每个记录集定义不同的转换类型
singleRecordType:为XML文档中所有记录集定义相同的转换类型,本例中使用该方式。
tips:只能选择一种转换类型,无论选择哪个参数,都会自动排除第二个参数。
下文中的<RecordType>即为转换类型具体的值,本例中维护的值为xmlHeadData,则<RecordType>在实际参数名称中需要替换为xmlHeadData,可参照上图。
转换为具有分隔符的文本列表
<RecordType>.fieldSeparator:指定字符之间的分隔符,'|',',','-' 等等,一些特殊的字符如下
TAB符:\t
回车符(CR):\r
换行符(LF):\n
任意字符:\x<code> <code>表示要显示的字符的十六进制字符代码
转换为具有固定长度的文本列表
<RecordType>.fieldLengths:指定一个以逗号分隔的字符串,表示文本生成的字段数量和长度。
例:BUKRS BUTXT WERKS转换为固定长度的文本,该参数值可以指定为 4,30,4
<RecordType>.fieldLengthExceeded:指定如何处理超过配置字段长度的字段,该参数允许的值为:
- error (default)
中断消息处理并报错 - cut
切掉多余的字符 - ignore
忽略字段长度限制
其他选项
<RecordType>.beginSeparator:开始分隔符,将字符串放在第一个字段前面
<RecordType>.endSeparator:结束分隔符,将字符串放在最后一个字段后面
contentType:输入转换后的有效负载的MIME类型,默认为text/plain
addHeaderLine:仅当转换类型为singleRecordType时,才定义此参数
- none (default) 不添加标题行
- formXML 根据XML节点的元素名添加标题行
- formConfiguration 根据配置的参数添加标题行,即自定义标题行
headerLine:仅当使用了 addHeaderLine=fromConfiguration 时才使用此参数
本例使用了该方法,值为:公司代码\t描述\r ,以Tab符分隔,回车符结束
fixedLineWidth:指定单行的最大长度n(以字符为单位),配合lineSeparator参数使用,将lineSeparator指定的分隔符每隔n个字符插入到文本中。
lineSeparator:仅当使用了fixedLineWidth参数时,才使用该参数,将该字符写入到fixedLineWidth指定的长度位置,默认为\r\n。
关于上面转换参数的解释示例,如果要转换的文档如下:
<root>
<RecordType1>
<column-name1>column-value</column-name1>
<column-name2>column-value</column-name2>
<column-name3>column-value</column-name3>
</RecordType1>
<RecordType2>
<data>column-value</data>
<data2>column-value</data2>
<data3>column-value</data3>
</RecordType2>
</root>
如果转换类型使用recordTypes,则可以指定recordTypes=RecordType1,RecordType2,然后你可以为每个记录集类型定义不同的转换规则。
如果转换类型使用singleRecordType,则两种记录集的转换方式相同。
以上。