案例陈述中的变量封装

时间:2013-10-30 08:49:17

标签: sap abap

在修改现有程序的CASE语句时,我不得不添加第二个块,其中重复某些逻辑以设置NetWeaver门户设置。这是通过在局部变量中设置值,然后将该变量分配给Changing参数来完成的。我复制了代码并做了一个漂亮的打印,期望编译器抱怨未知变量。令我惊讶的是,这段代码实际上编译得很好:

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.

正如我在其他所有编程语言中看到的那样,第一个DATA:语句中的WHEN声明应该被封装,并且只能在该开关块中使用。 SAP是否忽略此封装以使该值在整个CASE语句中可用?这是在任何地方记录的吗?

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

3 个答案:

答案 0 :(得分:8)

简而言之,你无法做到这一点。您将在abap程序中具有以下范围来声明变量(从本地到全局):

  • 表单例程:FORM和ENDFORM之间的所有变量
  • 方法:METHOD和ENDMETHOD之间的所有变量
  • Class - CLASS和ENDCLASS之间的所有变量,但仅限于CLASS DEFINITION部分
  • 功能模块:FUNCTION和ENDFUNCTION之间的所有变量
  • 程序/全局 - 当前程序中不包含任何内容的任何内容都是全局的,包括PBO和PAI模块中的变量

能够在for循环中本地定义变量,或者是否真的很有用,但遗憾的是在ABAP中不可能。您最接近公开文档的是help.sap.com:Local Data in the Subroutine

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

答案 1 :(得分:3)

您假设CASE语句在ABAP中定义其自己的变量范围是完全错误的(并且对于许多其他编程语言也是错误的)。使用变量声明来丢弃代码是一个坏主意,因为这使得它非常难以阅读和维护,但这是可能的。 DATA语句 - 以及许多其他声明性语句 - 仅在编译时进行评估,并在运行时完全被忽略。您可以找到more information about the scopes in the online documentation

答案 2 :(得分:0)

现在可以使用最新版本的SAP Netweaver进行内联变量声明。以下是文档DATA - inline declaration的链接。这里还有一些guidelines这个新功能的好坏用法

以下是该网站的引用:

  

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

由于无法访问此类系统,个人还没有时间查看它。