使用扩展程序检查时,我收到以下警告:
不要全局声明字段和字段符号(
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.
...
在我没有全局声明的情况下, main1
,main2
和main3
无法将任何数据传递给彼此。如果数据是从p_infile
中的上传文件main1
解析的,则无法在main2
或main3
中访问该数据。除了一起省略事件之外,有没有办法遵守警告但让数据通过事件传递?
答案 0 :(得分:6)
有各种各样的技术 - 除了在单独的控制器类中进行基本选择屏幕处理之外,我更喜欢编写几乎所有内容。报告只是按照该类调用其方法。除此之外 - 它只是一个警告,如果您知道自己在做什么,就可以忽略。编写一个没有任何全局变量的程序肯定是不切实际的 - 但是,在一个方法参数更合适的地方使用全局变量或属性之前,你应该至少考虑两次。
答案 1 :(得分:4)
正如@vwegert正确地说的那样,编写一个没有至少一些全局变量的ABAP程序几乎是不可能的(不幸的是,选择屏幕和事件强制执行)。
一种方法是使用控制器类,另一种方法是使用主子例程并根据需要调用其他子例程,并根据需要传递值。在很多情况下,我倾向于采用后一种方法,只是因为将子程序拆分为单独包含的逻辑分组更容易(对类进行这样做有时会有点难看)。这确实是一个方法问题,但关键是将全局变量降至最低 - 不幸的是,我遇到过的ABAP开发人员太少,关注这些问题。
更新
@Christian提醒我,从ABAP AS 7.02开始,子程序为considered obsolete:
由于以下原因,不应再在新程序中创建子程序:
与方法的参数界面相比,参数界面有明显的缺点,例如:
- 位置参数而非关键字参数
- 没有真正的输入参数通过引用传递
- 输入是可选的
- 没有可选参数
- 每个子例程都隐式属于其程序的公共接口。通常这是不可取的。
- 对于将容器程序分配给内部会话中的程序组,外部调用子例程至关重要。通常不能将此分配定义为静态。
这些都是有效点,我认为鉴于此,使用类进行模块化绝对是首选方法(从纯粹美学的角度来看,它们也更适合7.02及更高版本中的语法增强功能)