2015-07-21 107 views
2

当使用扩展程序检查,我得到以下警告:在ABAP本地化全球varables报告

不要声明领域和全球领域的符号(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不能就我所知的任何数据传递到彼此没有全局声明。如果从main1上传的文件p_infile解析数据,则无法在main2main3中访问该数据。除了一起忽略事件,是否有任何方法来遵守警告,但让数据通过事件传递?

回答

4

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

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

更新

@Christian提醒我说,ABAP的AS 7。02,子程序是considered obsolete

子程序不应该再在新程序中创建,原因如下:当与方法的参数接口相比

  • 参数接口有清晰的弱点,如:

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

这些都是正确的观点,我认为在光,使用类模块化绝对是首选的方法(和从一个纯粹的审美角度,他们也“配合”的语法增强更好在7.02及更高版本中)。

+0

谢谢。你对ABAP的关心太少了,你肯定是对的 - 但有人必须以身作则。我有一份Cengage Learning的ABAP编程介绍第三版的介绍,第294页的示例程序ZCHECK仅包含全局变量。你知道任何好的资源对于试图遵守编程标准的ABAPer有帮助吗? – gkubed

+2

我认为你正在使用扩展程序检查('SLIN')进入正确的轨道。如果您正在寻找需要阅读的内容,[官方ABAP编程指南](https://www.sap-press.com/official-abap-programming-guidelines_2093/)是一个很好的参考。 – mjturner

+2

@mjturner我在文档中看到子程序已经过时。 – Christian

6

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

+0

谢谢。由于这个我一直在使用ABAP对象。另外,感谢在7.50中实现IS INSTANCE OF! :) – gkubed