如何在 ABAP OO 中对"Select, Map, Save to local file"报表进行建模?



报告需要根据选择屏幕输入选择主数据,将所需字段映射到新的导出结构中,转换为XML并保存到本地文件。

由于有多个报表对不同类型的主数据执行此操作,因此我首先创建了一个抽象类,在该类中,我放置了对所有报表有用的元素,并打算为每个从该类继承的报表创建一个类。

然后,我从报表中调用一个静态方法,该方法创建报表类的实例并启动该过程。

REPORT ztesten.
PARAMETERS p1 TYPE c.
PARAMETERS p2 TYPE c.
START-OF-SELECTION.
zcl_class=>main(
EXPORTING p1 = p1
p2 = p2 ). 
METHOD main.
DATA(lo_class) =
NEW zcl_tradenet_export_kostl(
p1 = p1
p2 = p2 ).
lo_class->start_process( ).
ENDMETHOD.

到目前为止,我一直在纠结于将什么用作属性,因为通常建议避免使用全局数据。目前,我存储了在程序开始时从数据库中选择的所有参数和其他只读数据(这样做是为了避免在循环中多次执行选择(,然后在整个报告以及导出结构中都需要。如果我想避免这种情况,我将不得不将它们拖到调用堆栈上,这对我来说似乎更不切实际,即使它使用本地数据而不是全局数据。

对于参数和数据库数据,这似乎在某种程度上是可以的,因为属性只是读取而不能更改,但至于导出结构,我有更多的担忧,因为它是逐步填充的。然而,拖拽它似乎也不切实际,因为它会使方法签名膨胀。

你会如何处理这些方面?

最后一个问题:使用我目前的方法,如果选择屏幕包含许多元素或事先读取了许多数据库表,则属性的数量可能会很快变大。你会把它们分组到结构中以保持数字下降并使事情更清晰吗?

创建一个提供公共成员来存储所有参数的类。

CLASS ztesten_config DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
DATA p1 TYPE c.
DATA p2 TYPE c.
ENDCLASS.
CLASS ztesten_config IMPLEMENTATION.
ENDCLASS.

实例化类并将参数存储在其中。

REPORT ztesten.
PARAMETERS p1 TYPE c.
PARAMETERS p2 TYPE c.
START-OF-SELECTION.
DATA(config) = NEW ztesten_config( ).
config->p1 = p1.
config->p2 = p2.
zcl_class=>main( config ). 

现在,可以通过调用堆栈传递该对象。这可能仍然很烦人,但不太烦人,因为它只是一个参数。它也是最干净的解决方案,因为它最大限度地减少了类的状态和耦合。

METHOD main.
DATA(lo_class) = NEW zcl_tradenet_export_kostl( ).
lo_class->start_process( config ).
ENDMETHOD.

如果你的对象表示进程es("bla_calculation"(,而不是进程or("bla_calculator"(,你可以通过将配置传递给类的构造函数并让它们保存在某个私有属性中来减少参数传递的次数。这要求您重新实例化每次执行报表的类。

METHOD main.
DATA(lo_class) = NEW zcl_tradenet_calculation( config ).
lo_class->start_process( ).
ENDMETHOD.

通过应用单一实例等模式,可以避免将对象完全传递到调用堆栈。

CLASS ztesten_config DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
DATA p1 TYPE c.
DATA p2 TYPE c.
CLASS-METHODS get_instance
RETURNING
VALUE(result) TYPE REF TO ztesten_config.
PRIVATE SECTION.
CLASS-DATA singleton TYPE REF TO ztesten_config.
ENDCLASS.
CLASS ztesten_config IMPLEMENTATION.
METHOD get_instance.
IF singleton IS NOT BOUND.
singleton = NEW #( ).
ENDIF.
result = singleton.
ENDMETHOD.
ENDCLASS.
METHOD somewhere_inside_tradenet_export_kostl.
DATA(config) = ztesten_config=>get_instance( ).
config->p1 [...]
ENDMETHOD.

所有这些模式都允许您提供测试数据而不是实际的报表输入,并在报表上下文之外使用类。

对于报表的结果,您可以遵循类似的设计,方法是生成一个对象,该对象逐个接收和存储结果数据。

构建参数始终是一个好主意:它不仅使方法签名更小,而且还添加了哪些参数属于一起以及如何组合的上下文。

您熟悉清洁ABAP吗?针对少量导入参数(最多少于三个(部分特别建议"您可以通过将它们组合成有意义的结构和对象集合来减少参数的数量。

相关内容

最新更新