Abap Case语句中的变量封装

Abap Case语句中的变量封装,abap,Abap,在修改现有程序的CASE语句时,我必须添加第二个块,其中重复一些逻辑来设置NetWeaver门户设置。这是通过在局部变量中设置值,然后将该变量指定给一个不断变化的参数来实现的。我把代码复制了一遍,打印得很漂亮,希望编译器会抱怨未知变量。然而,令我惊讶的是,这段代码实际上编译得很好: CASE i_actionid. WHEN 'DOMIGO'. DATA: ls_portal_actions TYPE powl_follow_up_sty. CLEA

在修改现有程序的CASE语句时,我必须添加第二个块,其中重复一些逻辑来设置NetWeaver门户设置。这是通过在局部变量中设置值,然后将该变量指定给一个不断变化的参数来实现的。我把代码复制了一遍,打印得很漂亮,希望编译器会抱怨未知变量。然而,令我惊讶的是,这段代码实际上编译得很好:

CASE i_actionid.
    WHEN 'DOMIGO'.
        DATA:   ls_portal_actions  TYPE powl_follow_up_sty.
        CLEAR ls_portal_actions.
        ls_portal_actions-bo_system = 'SAP_ECC_Common'.
        " [...]
        c_portal_actions = ls_portal_actions.
    WHEN 'EBELN'.
        ls_portal_actions-bo_system = 'SAP_ECC_Common'.
        " [...]
        C_PORTAL_ACTIONS = ls_portal_actions.
ENDCASE.
正如我在其他所有编程语言中看到的,第一个
WHEN
语句中的
DATA:
声明应该被封装,并且只能在开关块中使用。SAP是否会忽略此封装以使该值在整个CASE语句中可用?这有文件记录吗


请注意,这段代码编译得很好,双击第二个开关中的局部变量可以转到第一个开关中的数据声明。然而,由于我们的测试环境已关闭,我无法测试此代码是否正确执行。

您认为一个
CASE
语句在ABAP中定义了它自己的变量范围的假设是完全错误的(对于许多其他编程语言也是错误的)。在代码中乱扔变量声明是个坏主意,因为这会使读取和维护变得非常困难,但这是可能的。
DATA
语句以及许多其他声明性语句只在编译时进行计算,在运行时完全被忽略。你可以找到。

简而言之,你不能这样做。在abap程序中,您将拥有以下作用域,可以在其中声明变量(从本地到全局):

  • 表单例程:表单和ENDFORM之间的所有变量
  • 方法:方法和ENDMETHOD之间的所有变量
  • 类-类和ENDCLASS之间的所有变量,但仅在类定义部分中
  • 函数模块:函数和ENDFUNCTION之间的所有变量
  • 程序/全局-在当前程序中,不在上述任何一项中的任何内容都是全局的,包括PBO和PAI模块中的变量
能够在for循环或if中本地定义变量确实很有用,但不幸的是在ABAP中不可能。最接近此网站的公开文档位于help.sap.com:


至于编译过程,不要假设ABAP会优化掉任何不使用的变量,否则,使用代码检查器自己查找并删除它们。由于ABAP的工作方式是这样的,我个人在模块化单元开始时定义所有变量,而不是与其他代码内联,甚至修改了漂亮的打印机,将任何内联定义移动到当前范围的顶部。

最新版本的SAP现在可以进行内联变量声明Netweaver。这里是文档的链接。下面是这个新特性的一些好的和坏的用法

以下是本网站的报价:

带有声明运算符数据的声明表达式声明一个变量var,该变量用作当前写入程序位置的操作数。声明的变量在程序from DATA(var)中静态可见,并且在当前上下文中有效。无论语句是否实际执行,在编译程序时都会进行声明


我个人还没有时间检查它,因为无法访问此类系统。

您能详细介绍一下编译过程吗?据我所知,ABAP并不是真正编译的,而是针对激活的解释进行了优化。那么,编译器是否只是检查所使用的每个变量是否在代码的前面声明,以及执行静态类型强制?当您说在运行时忽略声明性语句时,这是否意味着不执行动态类型检查?如果您有关于此主题的任何参考资料,将不胜感激。我所拥有的TAW书籍似乎基本上是无用的,我在网上几乎找不到关于编译/解释过程的可靠信息。@Lilienthal:几乎没有可用的信息。ABAP被编译成一种字节码(出于历史原因称为“加载”),然后由内核中的虚拟机进行解释。此负载针对特定的机器类型进行了优化(与系统独立的Java字节码相反)。您不需要更多的信息,因为作为开发人员无法与负载交互。您修改了漂亮的打印机来移动数据声明?太棒了。不要假设您在任何地方共享了该代码、scn等?感谢您提供了这一有用的概述,遗憾的是培训和帮助材料中没有更好地记录这一点。假设你能公开发布,我会支持Bryain关于漂亮的打印修改的请求。不幸的是,这是在工作中做的,所以我不能自由分享,但这是非常直接的。我在功能模块“漂亮的打印机”的末尾添加了一个出口,在功能结束之前。如果在此处添加调用,则可以使用包含格式化源代码的表ntext[](只需选中l_indentation_error,如果“X”表示语法错误,则表示我没有进行格式化)。它还适用于新的Eclipse ABAP编辑器。新功能非常强大,我们必须支持客户使用多个版本4.7->最新版本,因此我们永远不能使用它们:(希望SAP偶尔能够进行一次后传)