はじめに
ABAPやっててASSIGN COMPONENT 〜 OFASSIGN COMPONENT〜の使い方に関する記事が少なかったので、備忘録的に残します。
ABAPerの方は是非お役立てください。
文法の意味
ASSIGN COMPONENT com OF STRUCTURE st TO <fs>.
構造名「st」内の指定したコンポーネント名「com」にフィールドシンボル<fs>を割り当てることができます。
*構造名:profile
DATA:BEGI OF profile,
name TYPE C VALUE 'TARO', "太郎"
age TYPE I VALUE 10, "10才"
END OF profile.
*コンポーネント指定
DATA co TYPE C VALUE "age".
*フィールドシンボルを定義
FIELD-SYNBOLS:<fs> TYPE ANY.
ASSIGN COMPONENT co OF STRUCTURE profile TO <fs>.
WRITE <fs>.
出力結果:10才
上記のようなソースコードの場合、
ASSIGN COMPONENT co OF STRUCTURE profile TO <fs>.は以下の処理をしています。
- name,ageというコンポーネントを持つ構造「profile」から、「co」でageを指定する
- 指定されたageにフィールドシンボル<fs>を割り当てる
- <fs>を出力すると、ageのVALUE値「10」が出力される
応用①
構造内のすべてをフィールドシンボルに割り当てたいときは以下のようにします。
*構造名:profile
DATA:BEGI OF profile,
name TYPE C VALUE 'TARO', "太郎"
age TYPE I VALUE 10, "10才"
END OF profile.
*フィールドシンボルを定義
FIELD-SYNBOLS:<fs> TYPE ANY.
DO 2 TIMES
ASSIGN COMPONENT sy-index OF STRUCTURE profile TO <fs>.
WRITE <fs>.
ENDDO.
出力結果:太郎 10才
構造内のコンポーネントの数だけ処理を行い、fsにコンポーネントを1つ1つ割り当て出力しています。
応用②
コンポーネントの箇所はシステム項目「sy-index」を使用することで処理数回分、構造内のコンポーネントを指定することができます。
応用①は処理回数を2と定めていますが、以下のように汎用的に対応することもできます。
*構造名:profile
DATA:BEGI OF profile,
name TYPE C VALUE 'TARO', "太郎"
age TYPE I VALUE 10, "10才"
END OF profile.
*フィールドシンボルを定義
FIELD-SYNBOLS:<fs> TYPE ANY.
*最大処理回数100と定めておく
DO 100 TIMES
ASSIGN COMPONENT sy-index OF STRUCTURE profile TO <fs>.
*正しく処理できたかチェック
IF y-subrc EQ 0.
WRITE <fs>.
ELSE
EXIT
ENDIF
ENDDO.
とりあえず最大処理回数を決めて置き、ASSIGN COMPONENT sy-index OF STRUCTURE profile TO <fs>.がエラーしたとき、つまり構造内のコンポーネントをすべて割り当てもう割り当てするコンポーネントがないときにEXITし、DO 100 TIMESから抜ける、
なんて方法があります。
以上。