Как мне смоделировать отчет «Выбрать, отобразить, сохранить в локальном файле» в ABAP OO? - PullRequest
1 голос
/ 25 сентября 2019

Отчет необходим для выбора основных данных на основе ввода на Экране выбора, сопоставления необходимых полей с новой структурой экспорта, преобразования в 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.

До сих пор я борюсь с тем, что использовать в качестве атрибутов, поскольку обычно рекомендуется избегать использования глобальных данных.В настоящее время я сохраняю все параметры и другие данные только для чтения, которые выбираются из базы данных в начале программы (это делается для того, чтобы избежать многократного выбора в циклах), а затем необходимы в отчете, а также в структуре экспорта.Если бы я хотел избежать этого, мне пришлось бы перетаскивать их все по стеку вызовов, что мне кажется еще более непрактичным, даже если он использует локальные, а не глобальные данные.

Для параметров и данных БД это выглядит как-то нормальнопоскольку атрибут только читается и не изменяется, но что касается структуры экспорта, у меня больше проблем, поскольку он заполняется постепенно.Тем не менее, перетаскивание его также кажется нецелесообразным, поскольку это приведет к увеличению числа сигнатур методов.

Как бы вы справились с этими аспектами?

Один последний вопрос: используя мой текущий подход, количество атрибутов может довольно быстро увеличиться, если на экране выбора будет много элементов или много таблиц базы данных.прочитайте заранее.Не могли бы вы сгруппировать их в структуры, чтобы уменьшить число и прояснить ситуацию?

1 Ответ

2 голосов
/ 25 сентября 2019

Создайте класс, который предоставляет открытые члены для хранения всех ваших параметров.

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"), а не процесс или ("bla_calculator"), вы можете уменьшить количество передаваемых параметров, передав конфигурацию конструкторам классов и позволив им сохранять их в каком-то приватном атрибуте.Для этого необходимо заново создавать экземпляры классов для каждого выполнения отчета.

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

Вы можете избежать полной передачи объекта через стек вызовов, применяя такие шаблоны, как singleton.

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 ?В разделе нацелено на несколько ИМПОРТИРУЮЩИХ параметров, в лучшем случае менее трех специально рекомендует: «Вы можете уменьшить количество параметров, объединив их в значимые множества со структурами и объектами».

...