SELECT 的内联数据后出错:"does not contain a structure..."

Error after inline data of SELECT: "does not contain a structure..."

我遇到了错误

The dataobject "SYMBOL_DAT" does not contain a structure and therefore no component called "ATINN".

参见下面的代码,标记了错误行。

为什么它在第一个循环中有效而在第二个循环中无效?

*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(IT_MERKMALE) TYPE  ZEX_TECH_MERKMAL_TAB
*"  EXPORTING
*"     REFERENCE(ET_MERKMALE) TYPE  ZEX_TECH_MERKMAL_TAB
*"----------------------------------------------------------------------
DATA:
      LS_TECH_MERKMAL TYPE ZEX_TECH_MERKMAL.

SELECT SYMBOL_ID, INSTANCE
         FROM  V_IBINVALUES_F
         FOR ALL ENTRIES IN @IT_MERKMALE

         WHERE INSTANCE = @IT_MERKMALE-CUOBJ
         INTO @DATA(value_dat).

  SELECT ATINN
           FROM  IBSYMBOL
           WHERE SYMBOL_ID = @value_dat-SYMBOL_ID
           INTO @DATA(symbol_dat).

    CLEAR LS_TECH_MERKMAL.

    LS_TECH_MERKMAL-CUOBJ = value_dat-INSTANCE.
    LS_TECH_MERKMAL-ATINN = symbol_dat-ATINN.      "<===== error on this line
    APPEND LS_TECH_MERKMAL TO ET_MERKMALE.

  ENDSELECT.

ENDSELECT.

它会起作用,但您只选择了单个字段 atinn 进入 symbol_dat,因此它实际上不包含结构。

更改内部分配应该可以修复您的代码:

LS_TECH_MERKMAL-ATINN = symbol_dat. “ hold the -atinn

让我补充一点,从性能角度来看,执行 SELECT ... ENDSELECT 是不好的,因为它需要执行一系列数据库往返,而不是一次性检索所有记录。执行嵌套 SELECT ... ENDSELECT 更糟。

在第一个循环中,您 select 几个 table 字段。因此,内联数据声明生成一个包含两个字段(symbol_id 和实例)的结构。在第二个循环中,你 select 只有一个字段( atinn ),因此内联数据声明不会生成结构,而是直接将 selected 值复制到单个变量 symbol_dat。因此 symbol_dat 只是一个简单的变量,不能被视为结构。正如@Florian 在上面告诉您的那样,SELECT ... ENDSELECT 是一种糟糕的编码习惯(嵌套它们更糟)。由于对 DB 层的多次访问,速度非常慢。