如何在 ABAP OO 中为 "Select, Map, Save to local file" 报告建模?
How can I model a "Select, Map, Save to local file" report in ABAP OO?
报告需要select基于选择屏幕输入的主数据,将所需字段映射到新的导出结构,转换为XML并保存到本地文件。
由于有多个报告针对不同类型的主数据执行此操作,因此我首先创建了一个摘要 class,在其中放置了对所有报告有用的元素,并打算创建一个 class对于每个继承自 class.
的报告
然后我从创建报告实例的报告中调用一个静态方法 class 并启动进程。
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.
到目前为止,我一直在为使用什么作为属性而苦苦挣扎,因为通常建议避免使用全局数据。目前,我存储所有参数和其他只读数据,这些数据是在程序开始时从数据库中 selected 的(这样做是为了避免在循环中多次执行 selects),然后在整个过程中需要报告以及出口结构。如果我想避免这种情况,我将不得不将它们拖到调用堆栈中,这对我来说似乎更加不切实际,即使它使用本地数据而不是全局数据。
对于参数和数据库数据,这似乎没问题,因为属性只被读取而没有改变,但至于导出结构,我有更多的担忧,因为它是逐步填充的。然而,拖动它似乎也不切实际,因为它会使方法签名膨胀。
你会如何处理这些方面?
最后一个问题:使用我目前的方法,如果 selection 屏幕有很多元素或预先读取了很多数据库表,属性的数量会很快变大。你会把它们按结构分组以减少数量并使事情更清楚吗?
创建一个 class 提供 public 成员来存储您的所有参数。
CLASS ztesten_config DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
DATA p1 TYPE c.
DATA p2 TYPE c.
ENDCLASS.
CLASS ztesten_config IMPLEMENTATION.
ENDCLASS.
实例化 class 并将您的参数存储在其中。
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 ).
您现在可以通过调用堆栈传递该对象。这可能仍然很烦人,但不会那么烦人,因为它只是一个参数。它也是最干净的解决方案,因为它最大限度地减少了 classes 的状态和耦合。
METHOD main.
DATA(lo_class) = NEW zcl_tradenet_export_kostl( ).
lo_class->start_process( config ).
ENDMETHOD.
如果您的对象代表进程es ("bla_calculation"),而不是进程或 ("bla_calculator"),您可以通过将配置传递给 classes 的构造函数并让它们保存在一些私有属性中来减少参数传递的数量。这需要您为每次重新执行报告实例化 classes。
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.
所有这些模式都允许您提供测试数据而不是真实的报告输入,并在报告上下文之外使用您的 classes。
对于报表的结果,可以按照类似的设计,生成一个对象,逐条接收和存储结果数据。
结构化参数始终是一个好主意:它不仅使方法签名更小,而且还添加了哪些参数属于一起以及如何属于一起的上下文。
你熟悉吗Clean ABAP? The section Aim for few IMPORTING parameters, at best less than three特别推荐"You can reduce the number of parameters by combining them into meaningful sets with structures and objects."
报告需要select基于选择屏幕输入的主数据,将所需字段映射到新的导出结构,转换为XML并保存到本地文件。
由于有多个报告针对不同类型的主数据执行此操作,因此我首先创建了一个摘要 class,在其中放置了对所有报告有用的元素,并打算创建一个 class对于每个继承自 class.
的报告然后我从创建报告实例的报告中调用一个静态方法 class 并启动进程。
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.
到目前为止,我一直在为使用什么作为属性而苦苦挣扎,因为通常建议避免使用全局数据。目前,我存储所有参数和其他只读数据,这些数据是在程序开始时从数据库中 selected 的(这样做是为了避免在循环中多次执行 selects),然后在整个过程中需要报告以及出口结构。如果我想避免这种情况,我将不得不将它们拖到调用堆栈中,这对我来说似乎更加不切实际,即使它使用本地数据而不是全局数据。
对于参数和数据库数据,这似乎没问题,因为属性只被读取而没有改变,但至于导出结构,我有更多的担忧,因为它是逐步填充的。然而,拖动它似乎也不切实际,因为它会使方法签名膨胀。
你会如何处理这些方面?
最后一个问题:使用我目前的方法,如果 selection 屏幕有很多元素或预先读取了很多数据库表,属性的数量会很快变大。你会把它们按结构分组以减少数量并使事情更清楚吗?
创建一个 class 提供 public 成员来存储您的所有参数。
CLASS ztesten_config DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION.
DATA p1 TYPE c.
DATA p2 TYPE c.
ENDCLASS.
CLASS ztesten_config IMPLEMENTATION.
ENDCLASS.
实例化 class 并将您的参数存储在其中。
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 ).
您现在可以通过调用堆栈传递该对象。这可能仍然很烦人,但不会那么烦人,因为它只是一个参数。它也是最干净的解决方案,因为它最大限度地减少了 classes 的状态和耦合。
METHOD main.
DATA(lo_class) = NEW zcl_tradenet_export_kostl( ).
lo_class->start_process( config ).
ENDMETHOD.
如果您的对象代表进程es ("bla_calculation"),而不是进程或 ("bla_calculator"),您可以通过将配置传递给 classes 的构造函数并让它们保存在一些私有属性中来减少参数传递的数量。这需要您为每次重新执行报告实例化 classes。
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.
所有这些模式都允许您提供测试数据而不是真实的报告输入,并在报告上下文之外使用您的 classes。
对于报表的结果,可以按照类似的设计,生成一个对象,逐条接收和存储结果数据。
结构化参数始终是一个好主意:它不仅使方法签名更小,而且还添加了哪些参数属于一起以及如何属于一起的上下文。
你熟悉吗Clean ABAP? The section Aim for few IMPORTING parameters, at best less than three特别推荐"You can reduce the number of parameters by combining them into meaningful sets with structures and objects."