如何在ABAP OO中为“选择,映射,保存到本地文件”报告建模?

时间:2019-09-25 08:41:15

标签: sap abap

需要该报告基于“选择屏幕”输入选择主数据,将所需字段映射到新的导出结构,转换为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.

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

对于参数和DB数据来说,这似乎是可以的,因为只能读取而不更改属性,但是对于导出结构,由于它是逐渐填充的,因此我有更多的担忧。然而,拖延它似乎也不切实际,因为它会使方法签名膨胀。

您将如何处理这些方面?

最后一个问题:如果选择屏幕上包含许多元素或事先读取了许多数据库表,那么使用我目前的方法,属性的数量会很快增加。您是否将它们分组在结构中以减少数量并使内容更清楚?

1 个答案:

答案 0 :(得分:2)

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

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.

如果您的对象表示process es (“ bla_calculation”),而不是process 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.

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

对于报告的结果,您可以遵循类似的设计,通过生成一个对象来逐段接收和存储结果数据。

构造参数始终是一个好主意:不仅使方法签名更小,而且还增加了上下文,其中哪些参数属于同一类,以及如何组成。

您熟悉Clean ABAP吗? Aim for few IMPORTING parameters, at best less than three部分特别建议“您可以通过将参数组合为具有结构和对象的有意义的集合来减少参数的数量。”