我经常通过论坛、github等共享ABAP代码,这些代码通常用于任何基于ABAP的系统。不幸的是,我经常使用的一些对象(数据库表、类型等)只存在于我使用的解决方案中(例如,在ABAP系统上工作的SAP CRM)。
重要的是要了解SAP开发的几个解决方案独立于其他解决方案,但要安装在ABAP系统上,该系统包括ABAP语言本身和密切链接的外部对象,如ABAP字典中的对象。此类SAP解决方案包括SAP R/3、SAP CRM、SAP SRM、SAP SCM/APO、SAP BW、S/4HANA、BW/4HANA、SAP Solution Manager等。
例如,假设我想问一个关于加入ABAP的问题,我提供了以下例子(我在SAP CRM系统上开发的,但这个问题与s/4HANA无关):
REPORT.
DATA gt_partner TYPE TABLE OF crmd_order_index-partner_no.
SELECT DISTINCT a~partner_no
INTO TABLE gt_partner
FROM crmd_order_index AS a INNER JOIN crm_jest AS b
ON a~header = b~objnr
UP TO 10 ROWS.
cl_demo_output=>write( crmd_order_index ).
许多人有S/4HANA,而不是SAP CRM,因此代码不会在他们的系统上编译,因为数据库表crmd_order_index
只存在于SAP CRM中。可能这些人不会回答,或者他们无法验证他们的答案,所以我想我可以努力改进这个例子,使它在任何ABAP系统上都能工作。这当然是一个非常简单的例子,但想象一下你有几十行或几百行。
我知道一个解决方案是在我们自己的笔记本电脑上安装ABAP Developer Edition,因为它包含最小的ABAP配置,并在上面测试ABAP代码;简单的事情";。
有没有其他方法可以轻松快速地检查ABAP代码是否在任何基于ABAP的系统中编译?或者其他想法?
我还希望这个解决方案适用于像abapGit这样大的代码。
供参考:
- 在任何基于ABAP的系统中都可以使用的一个著名的ABAP工具是abapGit
- 问题不在于版本(例如,检查ABAP 7.52系统上生成的ABAP代码是否在ABAP 7.0系统上编译),因为我认为这是一个更复杂的问题
- 在堆栈溢出中,一个ABAP问题的代码在任何ABAP系统上都不起作用,这削弱了最小可复制示例的原理
共享一段ABAP示例代码的最干净的方法似乎是:
- 创建本地包,例如CCD_ 2
- 将所有示例代码和依赖项复制到中
- 把它推到一个新的,干净的https://www.github.com具有abapGit的存储库,以及
- 添加一个
README
,它提供了编写代码的ABAP版本
使用这些最佳实践:
-
将代码和依赖项减少到使示例工作所需的最小值。删除对与问题没有直接关系的其他开发对象的调用。尽可能限制自己使用ABAP平台上可用的函数和API。
-
如果存在构成问题一部分的依赖项,例如在"我如何使用CRM功能模块XYZ?"中,或者由于大小或版权(!)原因无法复制,请确定它们所属的SAP软件组件,并在
README
中将其列为依赖项。 -
通过执行来验证该示例是否编译和工作。这是不可靠的,因为它可能会意外地访问您忘记复制的未复制的依赖项,但它至少会给您一个想法。
ABAP在这里并不特别。在任何开发语言中,提供最少的工作示例总是一项努力。它需要将受影响的代码从不必要的依赖关系中分离出来,并用最小的工作存根替换所需的依赖关系。这就是为什么提出好问题是一项艰巨的工作,也是为什么StackOverflow欣赏有声誉的好问题的部分原因。
Sandra我认为这个问题没有一个好的、简单的答案。我们多年来一直饱受这个问题的困扰。我经常被ABAP语言的版本弄得焦头烂额。特别是SQL和ABAP单元测试。就连好的老木炭上周也烧了我们。是的,Char02
是s/4 Hana中不再支持的特定于行业的数据元素。你需要让每一个可能发布的sapabap都确保一切正常。有一个远程语法检查选项,一开始听起来不错。然而,它从7.02 SP14开始。所以这对7.0没有好处,而且你首先需要访问这些版本。谁能负担得起?为什么1 ABAP系统不能进行向下兼容的检查。:(对我来说,ABAPGit选择了一个最近但不是最新的abap版本作为"当前版本",这并不奇怪。我们必须支持7.0到7.5+的代码,因为我们的客户从S/4 hana到7.0都有一个代码库。我们还有一个带有SolMan/CRM和SAP网关以及ECC业务套件的通用代码库。为所有环境保持代码库的清洁说起来容易做起来难。
就例子而言,坚持严格的ABAP NW例子听起来很容易,但除非你限制自己的SFLIGHT或T002/T006这样的表,否则它比人们意识到的要难。
一个基本但并不完美的解决方案是在发布之前检查传输中所有对象的开发类。我们这样做已经有一段时间了。跟踪什么是有效的Basis对象,用于什么目的是HARD。我使用了7.2系统上不存在的基本对象,并且在导入时失败。然后,您可以在支票中添加TADIR日期。
在一天结束时,我只是导入最古老的(7.0)系统作为烟雾测试。
我会观察是否有人有灵丹妙药:)祝好运
由于版本向下兼容,因此您可以设置一个版本非常低的系统,并在此基础上开发代码。ABAP OO是在发布4.6C 时引入的
通常当我写一个例子时,为了在博客或网上发布,我会使用travel对象、表,如:sflight、spfli、scarr等,它们通常存在于大多数系统中,我不知道它们是否存在于C/4、解决方案管理器或其他一些解决方案中,但我认为这可能是最好的对象。
还有一件可能是个好主意的事情是使用经典ABAP,我所说的经典ABAP是指不使用只与ABAP>7.40,因为根据我的经验,SAP BASIS 7.31仍有系统。
使用经典报告可能也是一个好主意,除非你显然是在写OOP或新的ABAP7.40类句子。
你的问题并不像看上去那么简单。正如您所看到的,abap代码依赖于客户存储库,因此您需要了解每个系统,以使代码简单快速。对于选择,您必须知道所有类型的abap可能的选择。最好的方法是声明包含所有表的Types,这样您就可以在数据库中进行选择,而不必使用select distinct。如果你必须使用系统中不存在的函数、类或任何类型的对象,你可以创建它。有时创建不是最好的方法,所以你可以搜索并记住最古老的函数/calss/object。例如,您现在可以使用的函数conv_exit_alpha_input是一个执行相同操作的简单行。因此,如果你想实现一个示例abap代码,你必须尊重KISS规则,并尽可能多地声明readme或创建视图或表ect。