Abap 从类型为ANY的字段符号修改类型为ANY TABLE的表格

Abap 从类型为ANY的字段符号修改类型为ANY TABLE的表格,abap,Abap,我有一个类型为“any table”的通用表,我正试图通过以下方式修改其中的一些条目: LOOP AT ct_data INTO <fs_data>. ASSIGN COMPONENT 'KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>. IF <fs_feld_fu_key> IS ASSIGNED. IF <fs_feld_fu_key> = <fs

我有一个类型为“any table”的通用表,我正试图通过以下方式修改其中的一些条目:

  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_changed_field.
          MODIFY TABLE ct_data FROM <fs_data>.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
将ct_数据循环到。
将结构的组件“键”指定给。
如果已分配。
IF=-parent\u键。
将结构的组件“ZZ_已更改_字段”分配给。
如果已分配。
=-zz\u更改了\u字段。
从中修改表ct\U数据。
恩迪夫。
恩迪夫。
恩迪夫。
结束循环。
字段符号都具有“any”类型

这段代码中的所有内容都很好,但在这一行之后:

MODIFY TABLE ct_data FROM <fs_data>.
从修改表ct\U数据。
我得到SY_SUBRC=4,表不会被修改。有人有什么想法或建议吗?在这种情况下,我做错了什么

完整代码:

    DATA: rt_data TYPE REF TO data,
      ls_key  TYPE /bobf/s_frw_key,
      lt_key  TYPE /bobf/t_frw_key.
FIELD-SYMBOLS: <fs_data>         TYPE any,
               <fs_feld_fu_key>  TYPE any,
               <fs_feld_walzzyk> TYPE any.


CREATE DATA rt_data LIKE LINE OF ct_data.
ASSIGN rt_data->* TO <fs_data>.

IF <fs_data> IS ASSIGNED.
  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'fu_key' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      ls_key-key = <fs_feld_fu_key>.
      APPEND ls_key TO lt_key.
    ENDIF.
  ENDLOOP.
ENDIF.


/scmtms/cl_tor_helper_read=>get_tor_data(
  EXPORTING
    it_root_key          = lt_key
  IMPORTING
    et_mci_items         = DATA(lt_mci_items)
).


LOOP AT lt_mci_items ASSIGNING FIELD-SYMBOL(<fs_mci_items>).
  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'FU_KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_walzzyklus.
          MODIFY TABLE ct_data FROM <fs_data>.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDLOOP.
DATA:rt\u数据类型REF TO DATA,
ls_键类型/bobf/s_frw_键,
lt_键类型/bobf/t_frw_键。
字段符号:键入任意,
输入any,
键入任何。
创建数据rt_数据,如ct_数据行。
将rt_数据->*分配给。
如果已分配。
将ct_数据循环到。
将结构的组件“fu_key”分配给。
如果已分配。
ls_key-key=。
将ls\u键附加到lt\u键。
恩迪夫。
结束循环。
恩迪夫。
/scmtms/cl\U tor\U helper\U read=>获取tor\U数据(
出口
it\u root\u key=lt\u key
进口
et_mci_项目=数据(lt_mci_项目)
).
在lt_mci_项分配字段-SYMBOL()处循环。
将ct_数据循环到。
将结构的组件“FU_KEY”分配给。
如果已分配。
IF=-parent\u键。
将结构的组件“ZZ_已更改_字段”分配给。
如果已分配。
=-zz_walzzyklus。
从中修改表ct\U数据。
恩迪夫。
恩迪夫。
恩迪夫。
结束循环。
结束循环。
是指向
ct\U数据中的一行的指针。您正在尝试从表本身修改表。
sy subrc=4
简单地表示没有什么可更改的

正如Jozsefszikai在他的评论中指出的那样,您根本不需要
MODIFY表
。只需直接更改
中的值。

不指向
ct\U数据。它指向一个新的内存区域,您在一开始就创建了它。删除此项并内联声明字段符号以获取指向实际输出的指针:

DATA: rt_data TYPE REF TO data,
      ls_key  TYPE /bobf/s_frw_key,
      lt_key  TYPE /bobf/t_frw_key.
FIELD-SYMBOLS: <fs_feld_fu_key>  TYPE any,
               <fs_feld_walzzyk> TYPE any.


IF <fs_data> IS ASSIGNED.
  LOOP AT ct_data ASSIGNING FIELD-SYMBOL(<fs_data>).
    ASSIGN COMPONENT 'fu_key' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      ls_key-key = <fs_feld_fu_key>.
      APPEND ls_key TO lt_key.
    ENDIF.
  ENDLOOP.
ENDIF.


/scmtms/cl_tor_helper_read=>get_tor_data(
  EXPORTING
    it_root_key          = lt_key
  IMPORTING
    et_mci_items         = DATA(lt_mci_items)
).


LOOP AT lt_mci_items ASSIGNING FIELD-SYMBOL(<fs_mci_items>).
  LOOP AT ct_data ASSIGNING <fs_data>.
    ASSIGN COMPONENT 'FU_KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_walzzyklus.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDLOOP.
DATA:rt\u数据类型REF TO DATA,
ls_键类型/bobf/s_frw_键,
lt_键类型/bobf/t_frw_键。
字段符号:键入任意,
键入任何。
如果已分配。
在ct_数据赋值字段-SYMBOL()处循环。
将结构的组件“fu_key”分配给。
如果已分配。
ls_key-key=。
将ls\u键附加到lt\u键。
恩迪夫。
结束循环。
恩迪夫。
/scmtms/cl\U tor\U helper\U read=>获取tor\U数据(
出口
it\u root\u key=lt\u key
进口
et_mci_项目=数据(lt_mci_项目)
).
在lt_mci_项分配字段-SYMBOL()处循环。
在ct_数据分配处循环。
将结构的组件“FU_KEY”分配给。
如果已分配。
IF=-parent\u键。
将结构的组件“ZZ_已更改_字段”分配给。
如果已分配。
=-zz_walzzyklus。
恩迪夫。
恩迪夫。
恩迪夫。
结束循环。
结束循环。

我可能忽略了一些东西,但我不明白为什么需要修改表。。。不客气。您使用字段符号,这意味着内部表格CT_数据的“ZZ_CHANGE_field”字段将直接通过字段符号指定进行更改。你能不能删除modifytable行,看看在调试中会发生什么?这正是我首先做的。我还确信,在这种情况下,我不需要修改表,甚至可以使用正确的数据进行更新。ct_数据未得到更新。这就是我尝试修改表格的原因。@dyz如果删除“修改表格”一行,代码看起来是正确的。只需注意一件事:在
分配之后。。。对于
,如果同时分配了错误且之前分配了,则测试
是否分配
可能是错误的。只需检查您的完整代码(也许您还有更多行?)。如果是这种情况,那么用
If sy subrc=0替换
If IS ASSIGNED
@SandraRossi我刚刚按照您编写的方式调整了我的代码,还删除了修改表。没有任何错误,将正确更新中的字段。但CT_数据仍然没有变化。我真的不明白为什么…我忘了说这“可能是个错误”,因为如果分配失败,字段符号保持不变(因此,如果以前分配过,则保持分配)。感谢反馈,Florian。问题是它有一个“any”类型,所以我不能使用-ZZ_CHANGED_FIELD=-ZZ_CHANGED_FIELD我刚刚用我的代码的完整版本更新了我的问题,所以我在做什么更清楚。@florian因为是any类型,“simply change[…]-ZZ_CHANGED_FIELD”是不正确的;无论如何,这句话可以省略,因为你的评论“你不需要修改表”就足够了(或者说“行修改表没有用,因为行已经因为字段符号的改变而改变了”)。@SandraRossi。任何类型都是我的问题。否则就很容易实现代码的和平。我不明白的是为什么我的表格没有更新,即使所有的作业在调试中都很好。另一个答案解释了原因。哦,天哪,好的:)那个
循环。。。代码解析器/语法检查器应该警告INTO
,因为它99%的时间不正确(我们几乎总是使用:
LOOP…ASSIGNING