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 层的多次访问,速度非常慢。
我遇到了错误
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 层的多次访问,速度非常慢。