【问题标题】:How to loop at a dynamic internal table?如何在动态内部表中循环?
【发布时间】:2019-06-08 10:53:46
【问题描述】:

我正在 ZXMBCU10 上进行增强植入,它在执行路径下的几个级别的自定义程序中调用。 ZXMBCU10内部我想访问父程序中的a表,方法如下;

  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.

我遇到的问题是如何读取&lt;fs&gt; 字段符号中的数据。

我尝试了 LOOP 和 READ TABLE,但得到以下结果;

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

循环;

内部表“&lt;FS&gt;”没有标题行 - 添加“INTO”之一 wa”、“分配”、“引用到”、“不传输字段”。 必填。

阅读表格;

您不能对具有以下条件的表使用显式或隐式索引操作 类型“哈希表”或“任何表”。 “&lt;FS&gt;”的类型为“ANY TABLE”。 之前可能未指定“TABLE”添加 “&lt;FS&gt;”。

【问题讨论】:

  • 根据您的描述,不可能收到您为LOOP AT 显示的消息。您能否提供一个可编译的代码,以便您的问题可以重现。谢谢你。 (PS:READ TABLE收到的消息与你的描述相符)
  • 我同意@SandraRossi。没有足够的信息来得出解决方案。
  • @SandraRossi 和 Umar Abdullah 我已经更新了这个问题。希望现在更清楚了。
  • @isuru 谢谢。我的意思只是将您的 LOOP AT 代码复制/粘贴到help others reproduce the problem。很抱歉说“可编译”,因为它与您的情况无关,所以请帮助我们重现语法错误。
  • @SandraRossi 添加了其余代码。我已经编写了 Read 表和循环,只是为了抛出语法错误。非常感谢您的持续关注:)

标签: abap


【解决方案1】:

循环播放

关于LOOP AT 的错误(内部表“&lt;FS&gt;”没有标题行 - 需要添加“INTO wa”、“ASSIGNING”、“REFERENCE INTO”、“TRANSPORTING NO FIELDS”之一),是你没有指明LOOP AT 的“结果”部分,即分配、引用到...(如消息中所述)。

对于字段符号,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”的表使用显式或隐式索引操作。“&lt;FS&gt;”的类型为“ANY TABLE”。它是可能在“&lt;FS&gt;”之前没有指定“TABLE”添加)是您使用了READ TABLE ... INDEX ...,其索引意味着它只能与类别为SORTEDSTANDARD的内部表一起使用.

由于 ANY TABLE 和 READ TABLE INDEX 的组合,下一个代码无效,因为 &lt;FS&gt; 最终可能是一个 散列 内部表(谁知道),然后 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 &lt;fs&gt; 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是首选。

【讨论】:

  • 使用这两种方法我可以引用 G_TAB 中的行,但现在问题在于访问它。当我在两种访问方法(循环和读取)中使用 -colName 调用表中的列时,出现语法错误;字段“-MBLNR”未知。它既不在指定的表之一中,也不由“DATA”语句定义。 “数据”声明。该文件确实存在。 imgur.com/a/2hekdJY
  • @Isuru 添加:将结构 的组件“MBLNR”分配给 FIELD-SYMBOL()。
  • @isuru 实际上问题的标题说明了一切,但您的问题仅集中在主题的第一部分。您能否扩展问题以关注主要问题(实际上是全球性的)?我认为在没有附带问题的细节的情况下解释整个逻辑是值得的。此外,我假设内部表 G_TAB 的类型是在 ZPROGRAM 中静态定义的,因此您可以将其类型设为全局(通过接口池类型或 DDIC 类型),并且您可以基于此类型定义字段符号。
【解决方案2】:

将字段符号类型更改为

any table.

代替:

any.

【讨论】:

  • 我意识到它解决了 LOOP AT 的问题,但不能解决 READ TABLE 的问题,因为它是通过INDEX 访问的。因此,如果两个语句在同一个过程中使用,则应使用FIELD-SYMBOLS &lt;FS&gt; TYPE INDEX TABLE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2021-03-06
  • 2022-12-20
  • 2013-02-27
相关资源
最近更新 更多