Abap 循环到具有动态字段名的循环中

Abap 循环到具有动态字段名的循环中,abap,Abap,问题是:我有两个这样的表: DATA: lt_hrp9229 TYPE TABLE OF HRP9229. DATA: ev_descript_data TYPE string. SELECT * FROM dd03l INTO TABLE @DATA(lt_otype_fields) WHERE tabname = 'HRP9229'. LOOP AT lt_hrp9229 ASSIGNING FIELD-SYMBOL(<fs_9229>). LOOP AT l

问题是:我有两个这样的表:

DATA: lt_hrp9229 TYPE TABLE OF HRP9229.
DATA: ev_descript_data TYPE string.

SELECT *
  FROM dd03l
  INTO TABLE @DATA(lt_otype_fields)
  WHERE tabname = 'HRP9229'.

LOOP AT lt_hrp9229 ASSIGNING FIELD-SYMBOL(<fs_9229>).
  LOOP AT lt_otype_fields ASSIGNING FIELD-SYMBOL(<fs_fields>).
    ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_9229> TO FIELD-SYMBOL(<field_description>).
    CHECK sy-subrc = 0.
   IF <field_description> = 'OBJID'.
    ev_descript_data = ev_descript_data && ','  && <fs_fields>-rollname. " pull your FIELD_DESC here instead 
   ENDIF.
 ENDLOOP.
ENDLOOP.
表1:包含许多列和行的HR表

表2: 包含我需要从表1中读取的列列表的表

在表1中,我需要循环所有行,检查表2中的所有字段,如果字段中有X,我需要打印表2中的字段描述

我尝试使用嵌套的循环表1和每个循环迭代循环表2,并检查行的所有字段,我不能在表上使用变量-我需要中的循环变量

我的代码:

LOOP AT lt_hrp9229  INTO ls_hrp9229 
  LOOP AT lt_otype_fields INTO ls_otype_fields .
   IF ls_hrp9229-ls_otype_fields-FIELD_NAME = 'X'.
    ev_descript_data = ev_descript_data && ','  &&  ls_otype_fields-Field_description.
   ENDIF.
 ENDLOOP.
ENDLOOP.
我在这一排有问题:

IF ls_hrp9229-ls_otype_fields-FIELD_NAME = 'X'
我无法使用循环中的动态字段名


谢谢。

请使用以下内容:

DATA: lt_hrp9229 TYPE TABLE OF HRP9229.
DATA: ev_descript_data TYPE string.

SELECT *
  FROM dd03l
  INTO TABLE @DATA(lt_otype_fields)
  WHERE tabname = 'HRP9229'.

LOOP AT lt_hrp9229 ASSIGNING FIELD-SYMBOL(<fs_9229>).
  LOOP AT lt_otype_fields ASSIGNING FIELD-SYMBOL(<fs_fields>).
    ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_9229> TO FIELD-SYMBOL(<field_description>).
    CHECK sy-subrc = 0.
   IF <field_description> = 'OBJID'.
    ev_descript_data = ev_descript_data && ','  && <fs_fields>-rollname. " pull your FIELD_DESC here instead 
   ENDIF.
 ENDLOOP.
ENDLOOP.

使用类似以下内容:

DATA: lt_hrp9229 TYPE TABLE OF HRP9229.
DATA: ev_descript_data TYPE string.

SELECT *
  FROM dd03l
  INTO TABLE @DATA(lt_otype_fields)
  WHERE tabname = 'HRP9229'.

LOOP AT lt_hrp9229 ASSIGNING FIELD-SYMBOL(<fs_9229>).
  LOOP AT lt_otype_fields ASSIGNING FIELD-SYMBOL(<fs_fields>).
    ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_9229> TO FIELD-SYMBOL(<field_description>).
    CHECK sy-subrc = 0.
   IF <field_description> = 'OBJID'.
    ev_descript_data = ev_descript_data && ','  && <fs_fields>-rollname. " pull your FIELD_DESC here instead 
   ENDIF.
 ENDLOOP.
ENDLOOP.

您可以使用以下代码:

FIELD-SYMBOLS <l_flag> TYPE FLAG.

ASSIGN COMPONENT ls_otype_fields-field_name OF STRUCTURE ls_hrp9229 TO <l_flag>.
IF SY-SUBRC = 0 AND <l_flag> = abap_true.
  ...
ENDIF.

您可以使用以下代码:

FIELD-SYMBOLS <l_flag> TYPE FLAG.

ASSIGN COMPONENT ls_otype_fields-field_name OF STRUCTURE ls_hrp9229 TO <l_flag>.
IF SY-SUBRC = 0 AND <l_flag> = abap_true.
  ...
ENDIF.

我通过使用字段符号解决了这个问题

 LOOP AT lt_hrp9229 INTO ls_hrp9229.
      lv_index = sy-tabix.
      LOOP AT lt_s_fields INTO ls_s_fields.
        ASSIGN COMPONENT ls_s_fields-field_name OF STRUCTURE ls_hrp9229
        TO FIELD-SYMBOL(<ls_s_fields_value>).

        IF <ls_s_fields_value> = 'X'.
          ev_descript_data = ev_descript_data && ' , '  && ls_s_fields-field_desc  .
        ENDIF.
      ENDLOOP.
      ls_et_hrp9229-descript_data = ev_descript_data.
      MODIFY et_hrp9229 INDEX lv_index FROM ls_et_hrp9229 TRANSPORTING descript_data .
      CLEAR ev_descript_data.
    ENDLOOP.

我通过使用字段符号解决了这个问题

 LOOP AT lt_hrp9229 INTO ls_hrp9229.
      lv_index = sy-tabix.
      LOOP AT lt_s_fields INTO ls_s_fields.
        ASSIGN COMPONENT ls_s_fields-field_name OF STRUCTURE ls_hrp9229
        TO FIELD-SYMBOL(<ls_s_fields_value>).

        IF <ls_s_fields_value> = 'X'.
          ev_descript_data = ev_descript_data && ' , '  && ls_s_fields-field_desc  .
        ENDIF.
      ENDLOOP.
      ls_et_hrp9229-descript_data = ev_descript_data.
      MODIFY et_hrp9229 INDEX lv_index FROM ls_et_hrp9229 TRANSPORTING descript_data .
      CLEAR ev_descript_data.
    ENDLOOP.

这似乎是正确的,但如果这个答案能指出这里发生了什么以及它解决问题的原因,那就更好了。有关ASSIGN COMPONENT的详细描述可以在ABAP文档中找到,我只是想给你一个提示,找到相关的关键字。如果你要在代码的多个部分使用这种方法,我建议创建一个助手方法或表单,以获取动态结构的值。这将使您的代码更干净。这似乎是正确的,但如果能指出此处发生的情况以及解决问题的原因,这个答案会更好。有关ASSIGN COMPONENT的详细说明,请参阅ABAP文档,我只是想给你一个提示来找到相关的关键字。如果你要在你的代码的多个部分使用这种方法,我建议你创建一个助手方法或表单,来获取动态结构的值。这将使您的代码更干净。这里使用ASSIGN组件的方法似乎正确,但我认为后面的第二行应该是IF='X'。不知道你是从哪里弄来的。答案可以通过解释ASSIGN COMPONENT的实际功能以及它解决此问题的原因来进一步改进。是的,这取决于实际的业务需求,我刚刚给出了示例。在这里使用ASSIGN COMPONENT的方法似乎是正确的,但我认为后面的第二行应该是IF='X'。不知道你是从哪里弄来的。通过解释ASSIGN组件的实际功能以及它解决此问题的原因,可以进一步改进答案。是的,这取决于实际业务需求,我刚刚给出了示例