簡體   English   中英

在ABAP中使用動態結構字段

[英]Use dynamic structure field in ABAP

我有一個變量,它應該確定我在進一步編譯中使用的結構的哪個字段。 因此,假設我的變量名為貨幣,並且可以具有值“K”、“T”和“H”。 檢查它是哪個值后,我想使用相應的結構字段,例如 mystructure-fieldk、mystructure-fieldt、mystructure-fieldi。

至於現在,我只是使用 IF..THEN 來檢查我的變量貨幣的值,然后只使用結構的相應字段,但因此我必須重復我的循環編碼 3 次,這很丑陋。

    LOOP AT itab ASSIGNING <fs>.

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

    ENDLOOP.

有沒有辦法可以將循環與動態字段一起使用? 如:IF 貨幣 = 'K'。 DATA(mydynamicfield) = fieldk。 萬一。 然后在循環中使用 mydynamicfield:

    LOOP AT itab ASSIGNING <fs>.

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

    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_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.

注意:編寫代碼是為了提供有關如何進一步處理此問題的想法。 正如 Sandra 指出的那樣,這可能會導致編譯問題,請根據需要進行更正。 我嘗試回答僅發布移動設備的問題。 我目前無權訪問編譯器/系統。

對組件的靜態引用有更好的性能:

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.

我用數據創建了工作示例。 我相信,這肯定會對你有所幫助。 計算動態字段值並在最后顯示結果。

  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 ).

您可以嘗試使用以下代碼:

TYPES: BEGIN OF ts_basic_line,
     matnr TYPE mara-matnr,
     lifnr TYPE lfa1-lifnr,
   END OF ts_basic_line,
   ty_basic_line TYPE TABLE OF ts_basic_line.

DATA: lt_basic_data TYPE ty_basic_line,
      lo_structure  TYPE REF TO cl_abap_structdescr,
      lt_components TYPE abap_component_tab.

lt_basic_data = VALUE #( ( matnr = '111' lifnr = '333' ) ). " data for test
READ TABLE lt_basic_data ASSIGNING FIELD-SYMBOL(<fs_line>) INDEX 1.
IF sy-subrc EQ 0.
  lo_structure ?= cl_abap_typedescr=>describe_by_data( <fs_line> ).
  lt_components = lo_structure->get_components( ).

  LOOP AT lt_components ASSIGNING FIELD-SYMBOL(<fs_strucutre_fields>).
    LOOP AT lt_basic_data ASSIGNING FIELD-SYMBOL(<fs_data>).
      ASSIGN COMPONENT <fs_strucutre_fields>-name OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_value>).
      IF sy-subrc EQ 0.
        " here your code, e.x. data conversion
        <fs_value> = |{ <fs_value> ALPHA = IN }|.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDIF.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM