前回、書いた「ABAP: Loop AT 〜 [INTO | ASSIGN]」なのですが……
ごめんなさい、間違ってましたぁ
と、言う訳で修正したやつをUpします。
間違った奴は、自戒を込めて残しときます。
久々のSAPネタ。
忘れないうちに書いときます。
Loop AT [内部テーブル] INTO [構造体].
AT NEW [コンポーネント].
ENDAT.
ENDLOOP.
とした場合、 [コンポーネント]に書けるのは、[構造体]内の項目になります。
しかも、この書き方の場合、 [構造体]がこんな
ITEM001 TYPE C LENGTH 10
ITEM002 TYPE C LENGTH 10
ITEM003 TYPE C LENGTH 10
内容だとして、[コンポーネント]が ITEM001 だとすると、
AT NEW でブレイクすると AT NEW 〜 ENDAT 内で参照できるのは、ITEM001だけで
ITEM002以降については文字項目の場合 '*' が詰められて参照できません。
これが最初分からなくって、随分ハマりましたし、恐らくABAPでAT NEW とか「使いにくい」って感じてる人はこれが原因じゃないかと思います。
ところが。
LOOP AT 〜 にはもうひとつの記法が有るのはご存知だと思います。
そう!
LOOP AT [内部テーブル] ASSIGN <フィールドシンボル>.
この書き方の場合でも、
LOOP AT [内部テーブル] ASSIGN <フィールドシンボル>.2013/4/1記
AT NEW [コンポーネント].
ENDAT.
ENDLOOP.
先の”AT NEW [コンポーネント]”の記述で分かる通り、INTOでもASSIGNでも基本は同じ動作になります。従って、これ以降については、まるまる意味のない記述になります。
誤った原因は、”AT NEW” に続けて書くのが[コンポーネント]で有ることを失念したところ。
自分でテストPG書いた時に何を勘違いしたのか、
AT NEW <フィールドシンボル>-[コンポーネント].なんて書いちゃった。当然コンパイラからはエラーメッセージ出されます。
そもそも、書くべきは[コンポーネント]のみで、[構造体]等で修飾する必要も無いもの。
という訳で、これ以降については、「なんぞおかしなこと言っとる」って事で無視して下さい。
多くの方に見に来ていただいてるのに、ホントにすみません。
以後、気を付けます。
INTOの場合、指定した項目(先の例で言えばITEM001)以降の項目の参照ができませんでしたが、ASSIGNの場合、全ての項目の参照が出来ます。任意の複数項目を一つのキーとして使用することができる。
TYPES:
BEGIN OF TYP001, " 内部テーブル構造体1
ITEM001 TYPE C LENGTH 10,
ITEM002 TYPE C LENGTH 10,
ITEM003 TYPE C LENGTH 10,
ITEM004 TYPE C LENGTH 10,
END OF TYP001.
TYPES:
BEGIN OF TYP00A, " ブレイクキー構造体
ITEM001 TYPE C LENGTH 10,
ITEM002 TYPE C LENGTH 10,
END OF TYP00A.
TYPES:
BEGIN OF TYP002, " 内部テーブル構造体2
ITEM00A TYPE TYP00A, " ブレイクキー項目
ITEM003 TYPE C LENGTH 10,
ITEM004 TYPE C LENGTH 10,
END OF TYP002.
DATA:
TB001 TYPE STANDARD TABLE TYP001, " 内部テーブル1
TB002 TYPE STANDARD TABLE TYP002, " 内部テーブル2(キー構造有り)
KEY TYPE TYP00A. " キー退避項目
FIELD-SYMBOLS:
TYPE TYP002. " フィールドシンボル
* 既に TB001 にはデータが入っていてSORTまでされているとします
* ブレイクキー項目の有る内部テーブルにコピー
TB002[] = TB001[].
LOOP AT TB002 ASSIGN .
AT NEW .
IF -ITEM00A <> KEY.
*** ここにブレイク時の処理を記述(今回はWRITEします)
WRITE: /1(10) -ITEM00A-ITEM001,
13(10) -ITEM00A-ITEM002.
KEY = -ITEM00A. " KEY項目の更新(これをしないとブレイクしない)
ELSE.
NEW-LINE. " ブレイクしない場合、ただ改行だけ
ENDIF.
ENDAT.
WRITE: 26(10) -ITEM003, " 非キー項目はそのままWRITE
39(10) -ITEM004.
ENDLOOP.
では〜。
0 件のコメント:
コメントを投稿