在修改现有程序的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语句中可用?这记录在哪里?
请注意,此代码编译得很好,双击第二个开关中的局部变量将我带到第一个中的数据声明.但是,由于我们的测试环境已关闭,我无法测试此代码是否正确执行.
总之,你不能这样做.您将在abap程序中具有以下范围来声明变量(从本地到全局):
能够在for循环中本地定义变量或者是否真的很有用,但遗憾的是在ABAP中不可能.最接近公开文档的是help.sap.com:子程序中的本地数据
至于编译过程,不要假设ABAP会优化你不使用它的任何变量,使用代码检查器自己查找和删除它们.由于ABAP按照它的方式工作,我个人在模块化单元的开头定义所有变量,而不是与其他代码一起内联,并且甚至修改漂亮的打印机以将任何内联定义移动到当前范围的顶部.