需求背景:
SAP需要将采购订单信息通过PI发送到SFTP服务器上,生成文件,一般对日项目上文件内容通常都是按照指定的字节数拆分的,而不是字符数,类似下面的格式。
问题点:
如果是使用FTP适配器,则可以使用FCC进行转换,而且FTP适配器的FCC是支持按照字节数进行拆分的,但SFTP适配器所支持的FCC参数比较少,其中就不支持按照字节数进行拆分,同时也不支持字符超长自动截取等参数设置,所以只能使用UDF进行解决。
官方文档:
Converting XML in the Receiver File/FTP Adapter to Text Formathttps://help.sap.com/docs/SAP_NETWEAVER_750/5cf7d2de571a45cc81f91261668b7361/44686e687f2a6d12e10000000a1553f6.html?locale=en-US我的其他的一些相关总结:
SAP ABAP端实现解析具有深层结构的文件内容(类似SAP PO中的FCC功能)https://blog.csdn.net/DeveloperMrMeng/article/details/133316299?spm=1001.2014.3001.5501SAP PI/PO File2Soap 发送方使用Content Conversion将文本格式转换为XML格式https://blog.csdn.net/DeveloperMrMeng/article/details/130868786?spm=1001.2014.3001.5501SAP PI/PO Soap2File 接收方使用StrictXml2PlainBean将XML转换为文本格式https://blog.csdn.net/DeveloperMrMeng/article/details/130856851?spm=1001.2014.3001.5501
实现过程:
IR中的配置:
在Message Mapping中的Function页签,创建自定义方法:
源码如下,核心方法就是通过字符串对应的字符范围来判定是全角字符还是半角字符:
//Fill the byte length with the return lengthImportString = ImportString.format("%-" + TotalLength + "s", ImportString);//Return StringString retStr = "";//String lengthint length = ImportString.length();//Get String Array Listchar[] arr = ImportString.toCharArray();//Initial Lengthint length_character = 0;//Check the number of bytes per characterfor(int i = 0;i<length;i++) {//'\u0020'~'\u007E' and '\uFF61'~'\uFF9F' is Half corner characterif((arr[i]>='\u0020' && arr[i]<='\u007E') || (arr[i]>='\uFF61' && arr[i]<='\uFF9F')) {length_character = length_character + 1;}else {length_character = length_character + 2;}//If the cumulative length same with Return length, returnedif(length_character == TotalLength) {retStr = retStr + String.valueOf(arr[i]);break;}else {//If the cumulative length is greater than the return length, one byte is still needed eg:5 > 4if(length_character > TotalLength) {retStr = retStr + " ";break;}else {retStr = retStr + String.valueOf(arr[i]);}}} return retStr;
然后为每一个字段做mapping映射,通过一个常量字符串指定字节长度,经过ConvertString方法后,即可得到处理后的字符串,超过长度的截取掉,不足的则以空格补充长度,经过映射之后,在ID中再进行简单的配置即可完成。
ID中的配置:
因为IR中通过UDF将每个字段已经转换为正确的长度,所以此处直接按照字段进行拆分即可达到效果。
以上。