我是ABAP的新手。我正在使用open sql尝试这个程序,当我执行程序时,第一列的数据总是丢失。我查了一下,语法似乎是正确的。我正在使用kna1表,查询也很简单。如果有人注意到这个问题,请帮助我。
DATA: WA_TAB_KNA1 TYPE KNA1,
IT_TAB_KNA1 TYPE TABLE OF KNA1,
V_KUNNR TYPE KUNNR.
SELECT-OPTIONS: P_KUNNR FOR V_KUNNR.
SELECT name1 kunnr name2
INTO TABLE IT_TAB_KNA1 FROM KNA1
WHERE KUNNR IN P_KUNNR.
LOOP AT IT_TAB_KNA1 INTO WA_TAB_KNA1.
WRITE:/ WA_TAB_KNA1-KUNNR,' ', WA_TAB_KNA1-NAME1.
ENDLOOP.
答案 0 :(得分:3)
这是一个经典之作 - 我想每个ABAP开发者都必须至少经历过一次。
您正在使用结构KNA1
的内部表,这意味着您的目标变量具有以下结构
ccckkkkkkkkkklllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...
以ccc
为客户,kkkkkkkkkk
为字段KUNNR
(10个字符),lll
为字段LAND1
(3个字符),然后为35 n
字段为NAME1
,字段N
为NAME2
,依此类推。
在SELECT
语句中,您告诉系统按顺序检索列NAME1
,KUNNR
和NAME2
- !将使用上面的命名法生成具有以下结构的结果集:
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
系统将尝试将数据压缩到目标结构中,而不是引发某种类型错误,主要是出于历史原因。因为第一个字段都是字符字段,所以它会成功。结果:内部表格的字段MANDT
包含NAME1
的前三个字符,字段KUNNR
包含源字段NAME1
的字符4-13,因此上。
幸运的是,解决方案很简单:使用INTO CORRESPONDING FIELDS OF TABLE
代替INTO TABLE
。这将导致系统在填充目标表时使用基于字段名的映射。正如tomdemuyt所提到的那样,也可以推出自己的目标结构 - 对于大型数据集,这是一个非常好的主意,因为否则会浪费大量内存。尽管如此,有时这不是一个选项,所以你真的必须知道这个错误 - 一看到它就认出它并知道该怎么做。