读取内部表 – 字段符号尚未分配

huangapple go评论87阅读模式
英文:

Read internal table - field symbol has not been assigned yet

问题

我已编写了这段小代码,它基于另一个内部表格it_alv_to_check中的值来更新it_alv中的数据。

在执行ELSE语句块中的代码时,我遇到了以下错误:

字段符号尚未被分配

但我最初使用READ TABLE语句动态分配了它。

如何确保即使sy-subrc <> 0,字段符号也会被分配?


 FIELD-SYMBOLS: <to_check> LIKE LINE OF it_alv.

   LOOP AT it_alv ASSIGNING FIELD-SYMBOL(<fs_alv_2>).
      READ TABLE it_alv_to_check ASSIGNING <to_check>  WITH KEY belnr = <fs_alv_2>-belnr.
      IF sy-subrc = 0.
        <fs_alv_2>-statement_year = <to_check>-statement_year.
        <fs_alv_2>-laufi = <to_check>-laufi.
        <fs_alv_2>-user_field_1 = <to_check>-user_field_1.
        <fs_alv_2>-stceg = <to_check>-stceg.
        <fs_alv_2>-name1 = <to_check>-name1.
        <fs_alv_2>-monat_from = <to_check>-monat_from.
      ELSE.
        <fs_alv_2>-statement_year = <to_check>-statement_year.
        <fs_alv_2>-laufi = <to_check>-laufi.
        <fs_alv_2>-user_field_1 = <to_check>-user_field_1.
        <fs_alv_2>-stceg = <to_check>-stceg.
        <fs_alv_2>-name1 = <to_check>-name1.
        <fs_alv_2>-monat_from = <to_check>-monat_from.
        <fs_alv_2>-color = VALUE #( ( color-col = 6
                        color-int = 0
                        color-inv = 1
                        )
                         ).
      ENDIF.
    ENDLOOP.

英文:

I have wrote this small piece of code which updates the data in it_alv based on values in another internal table it_alv_to_check.

At some point while executing the code in the ELSE statement block, I got the error:
> field symbol has not been assigned yet

But I had it at first assigned dynamically using READ TABLE statement.

How to make sure that even if sy-subrc &lt;&gt; 0, the field symbol will be assigned?


 FIELD-SYMBOLS: &lt;to_check&gt; LIKE LINE OF it_alv.

   LOOP AT it_alv ASSIGNING FIELD-SYMBOL(&lt;fs_alv_2&gt;).
      READ TABLE it_alv_to_check ASSIGNING &lt;to_check&gt;  WITH KEY belnr = &lt;fs_alv_2&gt;-belnr.
      IF sy-subrc = 0.
        &lt;fs_alv_2&gt;-statement_year = &lt;to_check&gt;-statement_year.
        &lt;fs_alv_2&gt;-laufi = &lt;to_check&gt;-laufi.
        &lt;fs_alv_2&gt;-user_field_1 = &lt;to_check&gt;-user_field_1.
        &lt;fs_alv_2&gt;-stceg = &lt;to_check&gt;-stceg.
        &lt;fs_alv_2&gt;-name1 = &lt;to_check&gt;-name1.
        &lt;fs_alv_2&gt;-monat_from = &lt;to_check&gt;-monat_from.
      ELSE.
        &lt;fs_alv_2&gt;-statement_year = &lt;to_check&gt;-statement_year.
        &lt;fs_alv_2&gt;-laufi = &lt;to_check&gt;-laufi.
        &lt;fs_alv_2&gt;-user_field_1 = &lt;to_check&gt;-user_field_1.
        &lt;fs_alv_2&gt;-stceg = &lt;to_check&gt;-stceg.
        &lt;fs_alv_2&gt;-name1 = &lt;to_check&gt;-name1.
        &lt;fs_alv_2&gt;-monat_from = &lt;to_check&gt;-monat_from.
        &lt;fs_alv_2&gt;-color = VALUE #( ( color-col = 6
                        color-int = 0
                        color-inv = 1
                        )
                         ).
      ENDIF.
    ENDLOOP.

答案1

得分: 2

在这种情况下,您不能将字段符号分配给它。您使用READ TABLE语句读取内部表,并在找到具有给定键的条目(即sy-subrc = 0)的情况下,找到的表行被分配给字段符号,字段符号指向内存中的表行。

否则,如果没有找到表行,您就没有条目可供分配给字段符号,字段符号保持不变或处于初始状态。在这种情况下,您不能依赖它被分配(它可以被分配但指向错误的条目)或假设分配本身(因为它以前没有被分配)。

了解更多:READ TABLE,result ... ASSIGNING

根据您想要实现的目标,您可以在else分支中分配一些默认值或实施一些其他逻辑来处理这种情况。

英文:

You cannot have your field-symbol assigned in this scenario. You read an internal table using READ TABLE statement and in case the entry was found with the given key (i.e. sy-subrc = 0), the found table row is assigned to a field symbol and the field symbol points to the table row in the memory.

Otherwise, if no table row is found, you have no entry to assign field-symbol to, and the field symbol remains unchanged or initial. In this case you cannot rely on it being assigned (it can be assigned but point to the wrong entry) or assume the assignment itself (remains initial because it was not previously assigned).

More about it: READ TABLE, result ... ASSIGNING

Depending on what you want to achieve you can assign some default values in the else branch or implement some other logic to handle this scenario.

答案2

得分: 0

你的代码似乎在做以下操作:

  1. 如果在 it_alv_to_check 中找到对应的行,将该行的值覆盖到 it_alv 中的各个值。
  2. 如果在 it_alv_to_check 中找不到对应的行,仍然将那些值(来自不存在的行!)写入 it_alv 中,并将颜色设置为固定值。

第二点的第一部分显然是不可能的。你不能对不存在的数据做任何操作。从基本逻辑层面来说,这是没有意义的。

所以,你首先需要进行一些概念性的工作。当 it_alv_to_check 不包含与 belnr 相关的行时,你究竟希望发生什么情况?保留它们原样吗?用固定的占位数据填充它们吗?还是用来自不同行的值填充,如果是的话,是哪一行的值?

回答这个问题(可能需要得到提出这个要求的人的帮助),你实际问题的答案可能会自然而然地出现。如果没有,可以随时提出一个新问题,描述你希望发生什么以及你需要知道什么才能实现这一目标。

英文:

What your code appears to be doing is:

  1. If a corresponding row is found it_alv_to_check, take the values of that row to overwrite various values in it_alv.
  2. If no corresponding row is found in it_alv_to_check, then also take those values (from the row that does not exist!) and write them into it_alv. And also set the color to a fixed value.

The first part of the second point is obviously impossible. You can not do something with data which does not exist. This just does not make sense on a basic logical level.

So what you need to do here first is some conceptual work. What exactly do you expect to happen with the values statement_year, laufi, user_field_1, stceg, name1 and monat_from in the row of it_alv when it_alv_to_check does not contain a row for that belnr? Leave them as they are? Fill them with fixed placeholder data? Fill them with values from a different row, and if so which one?

Answer this question (probably with the help of the person who gave you this requirement) and the answer to your actual question will probably appear on its own. If not, feel free to ask a new question where you describe what exactly you want to happen and what you need to know in order to do that.

答案3

得分: -2

我已经将字段符号的声明更改为:

READ TABLE it_alv_to_check ASSIGNING FIELD SYMBOL(<to_check>) WITH KEY belnr = <fs_alv_2>-belnr.

现在它正常工作。

英文:

I've changed declaring of the field symbol to:

READ TABLE it_alv_to_check ASSIGNING FIELD SYMBOL(&lt;to_check&gt;)  WITH KEY belnr = &lt;fs_alv_2&gt;-belnr.

and now it works fine

huangapple
  • 本文由 发表于 2023年8月9日 17:05:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/76866183-2.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定