3

私はABAPの初心者です。このプログラムをオープン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文字)であり、フィールドの場合は35秒n、フィールドの場合は35秒というように続きます。NAME1NNAME2

ステートメントでは、列をSELECT取得するようにシステムに指示し、NAME1-この順序で!これにより、上記の命名法を使用して、次の構造を持つ結果セットが生成されます。KUNNRNAME2

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

ある種の型エラーを発生させる代わりに、システムは、主に歴史的な理由で、データをターゲット構造に絞り込もうとします。最初のフィールドはすべて文字フィールドであるため、成功します。結果:MANDT内部テーブルのフィールドには、の最初の3文字が含まれNAME1、フィールドKUNNRにはソースフィールドの文字4〜13が含まNAME1れます。

幸い、解決策は簡単です。INTO CORRESPONDING FIELDS OF TABLEの代わりに使用してINTO TABLEください。これにより、システムはターゲットテーブルに入力するときにフィールド名ベースのマッピングを使用します。tomdemuytが述べたように、独自のターゲット構造をロールすることも可能です。大規模なデータセットの場合、それ以外の場合は大量のメモリを浪費するため、これは非常に良いアイデアです。それでも、これがオプションではない場合があるため、このエラーを実際に知る必要があります。エラーが表示されたらすぐに認識し、何をすべきかを知ってください。

于 2012-08-29T06:46:27.663 に答える