5

在修改现有程序的 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.

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

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

4

3 回答 3

9

简而言之,您不能这样做。在 abap 程序中,您将有以下范围来声明变量(从本地到全局):

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

能够在 for 循环或 if 中本地定义变量确实很有用,但不幸的是在 ABAP 中不可能。与此相关的公开文档最接近的是 help.sap.com:子例程中的本地数据

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

于 2013-10-30T15:59:30.350 回答
3

您假设CASE语句在 ABAP 中定义了自己的变量范围是完全错误的(对于许多其他编程语言也是错误的)。用变量声明乱扔代码是个坏主意,因为这使得它非常难以阅读和维护,但这是可能的。这些DATA语句 - 以及许多其他声明性语句 - 仅在编译时进行评估,并在运行时完全忽略。您可以在在线文档中找到有关范围的更多信息

于 2013-10-30T09:19:15.127 回答
0

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

这是该网站的报价:

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

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

于 2013-10-31T09:48:51.233 回答