我是ABAP的新手。我正在用opensql尝试这个程序,当我执行这个程序时,第一列的数据总是丢失。我查了一下,语法似乎是正确的。我使用的是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.
这是一个经典-我想每个ABAP开发人员都必须至少经历一次。
您使用的是结构为KNA1
的内部表,这意味着您的目标变量具有以下结构
ccckkkkkkkkkklllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...
其中ccc
是客户端,kkkkkkkkkk
是字段KUNNR
(10个字符),lll
是字段LAND1
(3个字符)、然后字段NAME1
是35个n
秒、字段NAME2
是35个N
秒,依此类推
在SELECT
语句中,您告诉系统按顺序检索列NAME1
、KUNNR
和NAME2
-这将产生一个具有以下结构的结果集,使用上面的命名法:
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
系统将尝试将数据压缩到目标结构中,而不是引发某种类型的错误——主要是由于历史原因。因为第一个字段都是字符字段,所以它会成功。结果:内部表的字段MANDT
包含NAME1
的前三个字符,字段KUNNR
包含源字段NAME1
的字符4-13,依此类推
幸运的是,解决方案很简单:使用INTO CORRESPONDING FIELDS OF TABLE
而不是INTO TABLE
。这将导致系统在填充目标表时使用基于字段名的映射。正如tomdemuyt所提到的,也可以滚动自己的目标结构——对于大型数据集,这是一个非常好的主意,因为否则会浪费大量内存。尽管如此,有时这不是一个选项,所以你真的必须知道这个错误-一看到它就立即识别它,并知道该怎么办。