3

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

1 回答 1

4

这是一个经典——我想每个 ABAP 开发人员都必须至少体验一次。

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

 ccckkkkkkkkkklllnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN...

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

在您的SELECT声明中,您告诉系统检索列NAME1KUNNR并且NAME2-按该顺序!这将产生一个具有以下结构的结果集,使用上面的命名法:

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

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

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

于 2012-08-29T06:46:27.663 回答