Статически ссылаться на компоненты динамической внутренней таблицы (только 1 компонент меняется) - PullRequest
0 голосов
/ 02 апреля 2019

Я создаю структуру типов с тремя компонентами, один из которых - тип ref для данных.Затем я создал таблицу типов этой структуры.

Проблема в том, как мне добавить данные в эту таблицу?

Это для нового отчета, который я пишу, чтобы ускорить мой ежедневный прием.В ней я всегда должен читать таблицу, в которой есть три компонента, и я всегда знаю два из них.

В ней всегда будет три компонента, но только один из них будет обнаружен во время обработки.

Таким образом, в настоящее время я использую всю таблицу типа ref to data.Затем во время обработки я выясняю тип этой структуры, которая мне нужна, и создаю свою таблицу в соответствии с ней.

Проблема здесь заключается в том, что при этом, хотя я знаю два компонента, весьitab будет динамическим, поэтому я должен использовать его в методах, экспортирующих / импортирующих тип ref в данные, что неудобно.

Приведенный ниже метод всегда возвращает табличный тип ref для данных, который является полностью динамическим (типссылка на данные), но структура таблицы всегда будет выглядеть следующим образом:

  • компонент 1 -> тип pc261.
  • компонент 2 -> тип pay99_international.
  • compoment 3 -> ну, это всегда загадка хе-хе
methods get_payroll
   importing it_rgdir        type hrpy_tt_rgdir
   returning value(rt_value) type ref to data.

method get_payroll.
   field-symbols: <lt_payroll> type standard table.
   create data rt_value type standard table of (mv_py_struct_type).
   assign rt_value->* to <lt_payroll>.
   ...
endmethod.

Мое намерение состояло в том, чтобы получить возвращаемое значение с другим типом, известным типом, с которым я могу использовать два известных компонентаболее просто.

У меня была идея создать тип с только неизвестным полем в качестве ссылки на данные, чем иметь его таблицу.

Таким образом, я мог бы использовать его внутри методов без необходимости работать так "динамично", что, хотя и прекрасно работает, довольно сложно понять только при чтении кода.

types begin of gty_s_generic_payroll.
   types evp   type pc261.
   types inter type pay99_international.
   types nat   type ref to data.
   types end of gty_s_generic_payroll.

types gty_t_generic_payroll type table of gty_s_generic_payroll.

Проблема в том, как мне использовать itab типа gty_t_generic_payroll, как объявлено выше?

Мне нужно как-то создать компонент 3, но я понятия не имею, как это сделать ...

В конце у меня есть общий символ поля, то есть таблица типов, в которой есть два известных компонента + третий, который был обнаружен во время обработки.

Так как я могу передать содержимое этого символа поля в тип таблицы gty_t_generic_payroll?

data lt_payroll            type ref to data.
field-symbols <lt_payroll> type any table.
lt_payroll = mo_payroll->get_payroll( lt_rgdir ). "this will return type ref to data
assign lt_payroll->* to <lt_payroll>. 

сейчас <lt_payroll> имеет все необходимые мне значения, но это динамическая таблица,Я не могу использовать, например, <lt_payroll>[1]-inter, хотя я знаю, что он существует.

Поэтому я должен каким-то образом передать все содержимое другой переменной типа gty_t_generic_payroll, чтобы я мог хотя бы использоватькомпоненты inter и evp без необходимости продолжать динамическую работу, что довольно трудно

Тем не менее, у меня полностью динамическая таблица работает нормально, мне просто нужно было передать ее другому типу типа gty_t_generic_payroll.Понятия не имею, как поступить.

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Вопрос и ответы могут показаться запутанными для будущих посетителей (каков фактический вопрос?), Поэтому вот мои два цента.

Краткое содержание вопроса:

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

    (1), поэтому вы не можете адаптировать его.

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

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

Ответ:

  • Не лучше такlution
1 голос
/ 03 апреля 2019

Учитывая вашу целевую структуру и таблицу следующим образом:

TYPES:
  BEGIN OF payroll_row_type,
    known_first_component  TYPE something_we_know,
    known_second_component TYPE something_else_we_know,
    discovered_component   TYPE REF TO data,
  END OF payroll_row_type.

TYPES payroll_table_type TYPE STANDARD TABLE OF payroll_row WITH EMPTY KEY.

Если у вас есть другая таблица, тип которой во время выполнения:

TYPES:
  BEGIN OF discovered_row_type,
    known_first_component  TYPE something_we_know,
    known_second_component TYPE something_else_we_know,
    known_third_component  TYPE some_data_type,
  END OF discovered_row_type.

TYPES discovered_table_type TYPE STANDARD TABLE OF discovered_row WITH EMPTY KEY.

Вы можете переместить одну на другуюс

DATA source TYPE discovered_table_type.
DATA target TYPE payroll_table_type.
DATA resolved_component TYPE REF TO DATA.

DATA(descriptor) = 
  cl_abap_elemdescr=>describe_by_data( source_row-known_third_component ).

LOOP AT source INTO DATA(source_row).

  DATA(target_row) =
    VALUE payroll_row_type(
      known_first_component  = source_row-known_first_component
      known_second_component = source_row-known_second_component ).

  CREATE DATA target_row-discovered_component TYPE descriptor.
  ASSIGN source_row-known_third_component TO FIELD-SYMBOL(<source_component>).
  ASSIGN target_row-discovered_component TO FIELD-SYMBOL(<target_component>).
  <target_component> = <source_component>.

  INSERT target_row INTO TABLE target.

ENDLOOP.
0 голосов
/ 03 апреля 2019

Похоже, я смог передать значения из полностью универсальной таблицы (тип ref to data) в другую таблицу, которая является 1/3 универсальной (тип gty_t_generic_payroll):

  methods get_payroll
    importing it_rgdir        type hrpy_tt_rgdir
    returning value(rt_value) type gty_t_generic_payroll.

  method get_payroll.

    data lt_payroll     type gty_t_generic_payroll.
    data lt_payroll_aux type ref to data.

    field-symbols: <lt_payroll_aux> type standard table.

    create data lt_payroll_aux type standard table of (mv_py_struct_type).

    assign lt_payroll_aux->* to <lt_payroll_aux> .

    call function ' '.

    call function ' '
      exporting
             = mv_relid
             = mv_pernr
             = xsdbool( gs_parm-use_natio <> abap_true )
      tables
             = it_rgdir
             = <lt_payroll_aux> "table with the values I need
      exceptions
             = 0.

    if sy-subrc <> 0.
      return.
    endif.

    loop at <lt_payroll_aux> assigning field-symbol(<ls_payroll_aux>).

      assign component 1 of structure <ls_payroll_aux> to field-symbol(<evp>).
      assign component 2 of structure <ls_payroll_aux> to field-symbol(<inter>).
      assign component 3 of structure <ls_payroll_aux> to field-symbol(<nat>).

      data(ls_value) = value gty_s_generic_payroll(
        evp   = <evp>
        inter = <inter>
      ).

      get reference of <nat> into ls_value-nat.

      append ls_value to rt_value. "returning table, with values I need and 
                                   "now with 2/3 known types

    endloop.

  endmethod.

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

  • для заполнения не очень динамической таблицы
  • чтобы сделать фактический процесс отчета (по крайней мере, он становится лучше, LOL)

Это единственный способ, потому что я не могу просто использовать insert lines of dynamic_itab to not_so_dynamic_itab, поскольку третий компонент является справочным.

...