云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

阿里云_服务器托管合同_便宜的

小七 141 0

你好,社区!

我最近的一项任务是在MM中开发几个入站IDoc接口。如果简单地说,当来自外部SAP系统的IDoc到达我客户的SAP时,相应的接口应该处理它,从而创建或更改采购申请。几乎在每一个开发中,都发现了一些有趣的问题/挑战,而且显然已经解决了。但是一个鬼鬼祟祟的虫子占用了我几个小时的工作时间,大数据调研报告,所以我决定在我的第一篇博文中与你们分享我的经验,亲爱的读者们。希望不是最后一次?

在我的开发中,idoc以基本类型PREQCR102(用于PR创建)或PREQCHANGE02(用于现有PR和POs的更改)的格式到达。这些标准的sapidoc基本类型的特点是非常方便处理请购单文档,因为它们的段结构与BAPI"BAPI\u PR\u CREATE"和"BAPI\u PR\u CHANGE"相对应。这一优势使得这样的idoc很容易(至少在理论上)被处理。在理想的情况下,您所需要的只是遍历IDoc非空段,将它们的内容附加到适当的内部表中,并将它们发送给BAPI。然而,实际上,您很可能希望对输入数据进行一些验证,全国大数据中心,并使用一些常量值对其进行扩充等,但在输入数据格式方面,使用这些IDoc类型非常方便。

关于BAPI的几句话:上面提到的两个BAPI–"BAPI\u PR\u CREATE"和"BAPI\u PR\u CHANGE"–以及许多其他BAPI都包含所谓的"X"结构/表。例如,PR header数据结构PRHEADER的"X"结构称为PRHEADERX。带有PR item data PRITEM的表与PRITEMX一起使用;account的表PRACCOUNT–带有PRACCOUNTX,依此类推。这些"X"结构/表的目的是显式定义希望BAPI考虑的"普通"表中的哪些参数。因此,如果用一组值填充"普通"表,则必须将值"X"(abap\u true)赋给相应"X"表中具有相同名称的所有字段。如果没有做到这一点,BAPI将忽略"正常"值,这些值在"X"结构/表中没有标记为"X"的"对应项"。

好的,这是理论,现在是我在代码中发现错误的时候了。在本文中,我将使用一个基本类型为PREQCR102(或PREQCHANGE02,它们具有相同的段结构)的虚拟IDoc,将重点放在项目段上,因为来自该段的数据在PR bapi中是必需的。

如果您至少熟悉入站IDoc接口的开发,您应该知道,每个段中的数据都存储在IDoc的输入表IDoc\u data的字段"sdata"中。这个长字符字段基本上是一个容器,我们需要拆分它的部分并将其分配给段结构的适当字段。为了简单起见,让我们使用单个项目段:

现在是时候"展开"数据本身并填充适当的结构。这至少可以通过两种方式实现:

您只需将"sdata"字段的内容复制到适当的结构。因为在这些特定的IDoc基本类型中,所有的段结构都只有字符字段,所以这种方法可以完成它的工作,并且不会导致任何Unicode编译器错误;或者您可以使用SAP标准cl\u abap\u container\u实用程序的read\u container\c static方法选择一种更正确的方法

在本演示中,无论哪种方法都有效,因此这里都是:

不管采用哪种方法,我们现在都应该将项目数据放在ls\u itemmp\u idoc结构中。酷!现在是用这些数据填充BAPI ready结构的时候了。如前所述,对于上面提到的IDoc基本类型,IDoc的段数据与BAPI的数据具有相同的字段集,但有一个很大的区别。IDoc的段结构只包含字符字段,而BAPI的结构和表的组件有其专用的字典类型:

这意味着,如果您试图无意识地将IDoc值推送到BAPI结构,您很可能会遇到以下编译器错误:

要克服此限制,您可能需要使用相应的(或老式的MOVE-CORRESPONDING)操作符:

乍一看,这可以解决我们所有的问题:因为两个结构都有相同的字段名,所以CORRESPONDING将负责映射。就在这一刻,一只狡猾的小虫子出现了。但是在展示它之前,让我们看看如果你认为相应的就足够了会发生什么。一旦我们的BAPI就绪结构充满了数据,我们就需要填充"X"结构。在本例中–PRITEMX。当然,您不希望通过对"normal"结构的每个组件进行硬编码循环,检查它是否包含任何值,最后用"X"结构中的"X"填充相应的字段来实现这一点。最明显和最正确的方法是获得"正常"结构字段的列表,通过动态地将其值赋给字段符号来循环这些字段,对"X"结构执行相同的操作,最后填充"X"结构。让我们这样做:

好的,现在我们应该在ls\u itemx中为所有在ls\u itemimp\u bapi中有任何值的组件设置"X"值。很明显吧?等等,联网,那是什么?在ls\u itemmp\u bapi中,在应该为空的字段旁边是否也看到了"X"?

你们中的一些人已经发现了根本原因。但对于那些没有详细说明的人来说。在ABAP中,预定义的基本类型D和T(分别表示日期和时间)具有初始值,分别为"00000000"和"000000",但不像类型C那样具有空值。事实上,ABAP运行时环境不会将空的日期时间字段视为具有初始值的字段,因此,大数据分享,"X"结构将相应地填充。但是为什么这些字段在结构ls\u itemmp\u bapi中没有默认呢?好吧,它们在结构声明的时候是默认的,但是后来在相应的操作中它们被填充为空的(但不是默认的)值!

如何避免这种情况?我应用了与normal-to-X结构映射相同的解决方案。我用下面的代码替换了相应的操作符: