如何在动态内部表上循环

时间:2019-01-14 12:38:17

标签: sap abap

我正在ZXMBCU10上进行增强植入,该执行在自定义程序的执行路径中被调用。在ZXMBCU10内部,我要访问父程序中的表,该表可以通过以下方法进行;

  1. 声明父程序名称;

    DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.

  2. 通过字段符号分配获取值。

    FIELD-SYMBOLS: <fs> TYPE any.

    ASSIGN (ex_tbl_name) TO <fs>.

然后我检查分配是否成功(是真的)。​​

IF <fs> IS ASSIGNED.

Accessing parent table

我遇到的问题是如何读取<fs>字段符号中的数据。

我已经尝试了LOOP和READ TABLE,但是得到了以下内容;

Loop and Read table sample

在此处添加了“读取表和循环”,只是为了进行语法检查

LOOP;

内部表“ <FS>”没有标题行-其中之一是“ INTO” wa”,“分配”,“参考”,“运输无田地”。 必填。

阅读表;

您不能对具有以下内容的表使用显式或隐式索引操作 类型“哈希表”或“任何表”。 “ <FS>”的类型为“ ANY TABLE”。 可能之前未指定“ TABLE”添加项 “ <FS>”。

2 个答案:

答案 0 :(得分:2)

将字段符号类型更改为

any table.

代替:

any.

答案 1 :(得分:2)

LOOP AT

关于LOOP AT内部表“ <FS>”的错误没有标题行-附加项之一“ INTO wa”,“ ASSIGNING”,“ REFERENCE INTO”,“ TRANSPORTING NO字段),是因为您未指明LOOP AT的“结果”部分,即分配,引用到...(如消息中所述)。

对于字段符号,单独始终无效,并且如果它是变量而不是字段符号,则该字段已过时,因为这意味着使用标题行。

LOOP AT <fs>. " always invalid !

有效语法如下:必须将字段符号声明为内部表(至少包含单词TABLE,或引用“表类型”),内部表的任何类别均为支持LOOP AT(散列,排序,标准),因此您可以使用TYPE ANY TABLE

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE ANY TABLE.

ASSIGN (ex_tbl_name) TO <fs>.
LOOP AT <fs> ASSIGNING FIELD-SYMBOL(<line>).
ENDLOOP.

阅读表

关于READ TABLE的错误(您不能对类型为“ HASHED TABLE”或“ ANY TABLE”的表使用显式或隐式索引操作。“ <FS>”的类型为“ ANY TABLE “。可能未在” {<FS>之前指定” TABLE“附加项是因为您使用了READ TABLE ... INDEX ...,其INDEX表示只能与内部表一起使用,类别SORTEDSTANDARD

由于ANY TABLE和READ TABLE INDEX的组合,下一个代码无效,因为<FS>最终可能是一个散列的内部表(已知),因此READ TABLE INDEX将失败,因此出现编译器错误:

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE ANY TABLE. " <=== impossible with READ TABLE INDEX !

ASSIGN (ex_tbl_name) TO <fs>.
READ TABLE <fs> ASSIGNING FIELD-SYMBOL(<line>) INDEX 1. " <=== impossible with ANY TABLE !

解决方案:要使用READ TABLE <fs> INDEX ...,您可以将字段符号声明为SORTED,STANDARD或INDEX(后者是对应于SORTED和STANDARD的通用名称)。

此代码有效:

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE INDEX TABLE.

ASSIGN (ex_tbl_name) TO <fs>.
READ TABLE <fs> ASSIGNING FIELD-SYMBOL(<line>) INDEX 1.

当然,假定G_TAB是“索引”表,而不是哈希表!

PS:在您的代码中,您使用了INTO DATA(lv_fs),但是通常如果您有通用的内部表ASSIGNING是首选。