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组件的实际功能以及它解决此问题的原因,可以进一步改进答案。是的,这取决于实际业务需求,我刚刚给出了示例