缺少第一列的数据

时间:2012-08-29 04:08:15

标签: select loops sap abap

我是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.

1 个答案:

答案 0 :(得分:3)

这是一个经典之作 - 我想每个ABAP开发者都必须至少经历过一次。

您正在使用结构KNA1的内部表,这意味着您的目标变量具有以下结构

 ccckkkkkkkkkklllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...

ccc为客户,kkkkkkkkkk为字段KUNNR(10个字符),lll为字段LAND1(3个字符),然后为35 n字段为NAME1,字段NNAME2,依此类推。

SELECT语句中,您告诉系统按顺序检索列NAME1KUNNRNAME2 - 将使用上面的命名法生成具有以下结构的结果集:

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

系统将尝试将数据压缩到目标结构中,而不是引发某种类型错误,主要是出于历史原因。因为第一个字段都是字符字段,所以它会成功。结果:内部表格的字段MANDT包含NAME1的前三个字符,字段KUNNR包含源字段NAME1的字符4-13,因此上。

幸运的是,解决方案很简单:使用INTO CORRESPONDING FIELDS OF TABLE代替INTO TABLE。这将导致系统在填充目标表时使用基于字段名的映射。正如tomdemuyt所提到的那样,也可以推出自己的目标结构 - 对于大型数据集,这是一个非常好的主意,因为否则会浪费大量内存。尽管如此,有时这不是一个选项,所以你真的必须知道这个错误 - 一看到它就认出它并知道该怎么做。