Использовать поле динамической структуры в ABAP - PullRequest
0 голосов
/ 17 января 2019

У меня есть переменная, которая должна определять, какое поле структуры я использую в дальнейших компиляциях. Поэтому предположим, что моя переменная называется валютой и может иметь значения «K», «T» и «H». После проверки, какое это значение, я хочу использовать соответствующие поля структуры, например, mystructure-fieldk, mystructure-fieldt, mystructure-fieldi.

На данный момент я просто использую IF..THEN, чтобы проверить значение моей переменной валюты, а затем просто использую соответствующее поле структуры, но поэтому я должен повторить кодирование моего цикла 3 раза, что просто уродливо .

    LOOP AT itab ASSIGNING <fs>.

      mystructure-fieldk = mystructure-fieldk + <fs>-otherfieldk.

    ENDLOOP.

Есть ли способ, которым я могу использовать цикл с динамическим полем? Как в: ЕСЛИ валюта = «К». ДАННЫЕ (mydynamicfield) = fieldk. ENDIF. а затем используйте mydynamicfield в цикле:

    LOOP AT itab ASSIGNING <fs>.

      mystructure-mydynamicfield = mystructure-mydynamicfield + <fs>-otherfieldk.

    ENDLOOP.

Или что-нибудь еще? Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Улучшена производительность при статической привязке к компонентам:

TYPES: BEGIN OF ty_structure,
         fieldk TYPE i,
         fieldt TYPE i,
         fieldh TYPE i,
       END OF ty_structure.
DATA: itab        TYPE TABLE OF ty_structure,
      mystructure TYPE ty_structure,
      currency    TYPE c LENGTH 1.

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  CASE currency.
    WHEN 'K'. ADD <fs>-fieldk TO mystructure-fieldk.
    WHEN 'T'. ADD <fs>-fieldt TO mystructure-fieldt.
    WHEN 'H'. ADD <fs>-fieldh TO mystructure-fieldh.
  ENDCASE.
ENDLOOP.

Если вы хотите упростить код, вы можете использовать макрос (встроенный код):

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  DEFINE m_add.
    IF currency = 'K'.
      ADD <fs>-field&1 TO mystructure-field&1.
    ENDIF.
  END-OF-DEFINITION.
  m_add : K, T, H.
ENDLOOP.
0 голосов
/ 19 января 2019

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

  TYPES: BEGIN OF ty_itab,
         currency TYPE c,
         fieldk TYPE i,
         fieldt TYPE i,
         fieldh TYPE i,
       END OF ty_itab.
  TYPES: BEGIN OF ty_structure,
         fieldk TYPE i,
         fieldt TYPE i,
         fieldh TYPE i,
       END OF ty_structure.

DATA: itab   TYPE TABLE OF ty_itab,
      ls_structure TYPE ty_structure.

itab = VALUE #( ( currency = 'H' fieldk = 10 fieldt = 20 fieldh = 30 )
                ( currency = 'H' fieldk = 50 fieldt = 60 fieldh = 70 )
                ( currency = 'T' fieldk = 100 fieldt = 120 fieldh = 150 )
                ( currency = 'K' fieldk = 300 fieldt = 400 fieldh = 500 )  ).

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  CASE <fs>-currency.
    WHEN 'K'. ADD <fs>-fieldk TO ls_structure-fieldk.
    WHEN 'T'. ADD <fs>-fieldt TO ls_structure-fieldt.
    WHEN 'H'. ADD <fs>-fieldh TO ls_structure-fieldh.
  ENDCASE.
ENDLOOP.

cl_demo_output=>display( ls_structure ).
0 голосов
/ 17 января 2019

Используйте приведенный ниже фрагмент кода

LOOP AT ITAB ASSIGNING <fs-structure>.

*-- determination of field name logic goes here let's say you have 
*-- field name is in variable lv_field

    ASSIGN COMPONENT (lv_field) of STRUCTURE <fs-structure> to <fs-field>.
    IF <fs-field> IS ASSIGNED.
      <fs-field> = 'the value you want to assign'.
    ENDIF.

ENDLOOP.

Надеюсь, это прояснит.

Допустим, вы хотите вычислить на основе другого поля в той же структуре

LOOP AT ITAB ASSIGNING <fs-structure>.

*-- determination of field name logic goes here let's say you have 
*-- field name is in variable lv_field1 and other is lv_field2

    ASSIGN COMPONENT (lv_field1) of STRUCTURE <fs-structure> to <fs-field1>.

    ASSIGN COMPONENT (lv_field2) of STRUCTURE <fs-structure> to <fs-field2>.

    IF <fs-field1> IS ASSIGNED ANDV<fs-field2> IS ASSIGNED .
      <fs-field1> = <fs-field1> + <fs-field1>.
    ENDIF.

ENDLOOP.

Примечание: код написан, чтобы дать представление о том, как действовать дальше в этом выпуске. Как указала Сандра, это может привести к проблемам с компиляцией, пожалуйста, исправьте при необходимости. Я попытался ответить на вопрос только о выпуске мобильного устройства. У меня нет доступа к компилятору / системе в настоящее время.

...