案例陈述中的变量封装

Lil*_*hal 5 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.
Run Code Online (Sandbox Code Playgroud)

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

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

DW8*_*per 9

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

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

能够在for循环中本地定义变量或者是否真的很有用,但遗憾的是在ABAP中不可能.最接近公开文档的是help.sap.com:子程序中的本地数据

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

  • 不幸的是它在工作中所以我不能自由地分享它但是它非常直接我在ENDFUCTION之前在功能模块PRETTY_PRINTER的末尾添加了一个退出.如果你在这里添加一个调用你可以使用包含格式化源代码的表ntext [](只需检查l_indentation_wrong,如果'X'表示语法错误,在这种情况下我没有进行格式化).它还运行新的Eclipse ABAP编辑器 (3认同)