在ABAP报告中本地化全局可变量

时间:2015-07-21 16:23:46

标签: global-variables sap abap

使用扩展程序检查时,我收到以下警告:

  

不要全局声明字段和字段符号(variable name)。

这是在选择屏幕之前声明全局数据。显而易见的解决方案是它们应该在子例程中本地声明。

如果我决定这样做,数据现在将超出其他子程序的范围,所以我最终会创建一些来自C或Java的main()函数的效果。这听起来是个好主意 - 但是,诸如INITIALIZATION之类的事件不允许在子例程中,这意味着它会强制缩小范围。

观察下面的示例程序:

REPORT Z_EXAMPLE.
SELECTION-SCREEN BEGIN OF BLOCK upload WITH FRAME TITLE text-H01.
  PARAMETERS: p_infile TYPE rlgrap-filename LOWER CASE OBLIGATORY.
SELECTION-SCREEN END OF BLOCK upload.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.
  PERFORM main1 CHANGING p_infile.
INITIALIZATION.
  PERFORM main2.
TOP-OF-PAGE.
  PERFORM main3.
...
在我没有全局声明的情况下,

main1main2main3无法将任何数据传递给彼此。如果数据是从p_infile中的上传文件main1解析的,则无法在main2main3中访问该数据。除了一起省略事件之外,有没有办法遵守警告但让数据通过事件传递?

2 个答案:

答案 0 :(得分:6)

有各种各样的技术 - 除了在单独的控制器类中进行基本选择屏幕处理之外,我更喜欢编写几乎所有内容。报告只是按照该类调用其方法。除此之外 - 它只是一个警告,如果您知道自己在做什么,就可以忽略。编写一个没有任何全局变量的程序肯定是不切实际的 - 但是,在一个方法参数更合适的地方使用全局变量或属性之前,你应该至少考虑两次。

答案 1 :(得分:4)

正如@vwegert正确地说的那样,编写一个没有至少一些全局变量的ABAP程序几乎是不可能的(不幸的是,选择屏幕和事件强制执行)。

一种方法是使用控制器类,另一种方法是使用主子例程并根据需要调用其他子例程,并根据需要传递值。在很多情况下,我倾向于采用后一种方法,只是因为将子程序拆分为单独包含的逻辑分组更容易(对类进行这样做有时会有点难看)。这确实是一个方法问题,但关键是将全局变量降至最低 - 不幸的是,我遇到过的ABAP开发人员太少,关注这些问题。

更新

@Christian提醒我,从ABAP AS 7.02开始,子程序为considered obsolete

  

由于以下原因,不应再在新程序中创建子程序:

     
      
  • 与方法的参数界面相比,参数界面有明显的缺点,例如:

         
        
    • 位置参数而非关键字参数
    •   
    • 没有真正的输入参数通过引用传递
    •   
    • 输入是可选的
    •   
    • 没有可选参数
    •   
  •   
  • 每个子例程都隐式属于其程序的公共接口。通常这是不可取的。
  •   
  • 对于将容器程序分配给内部会话中的程序组,外部调用子例程至关重要。通常不能将此分配定义为静态。
  •   

这些都是有效点,我认为鉴于此,使用类进行模块化绝对是首选方法(从纯粹美学的角度来看,它们也更适合7.02及更高版本中的语法增强功能)