SAPのプログラミング言語、ABAPのコード断片集をまとめています。久しぶりに触れると「あれ、あのABAPの書き方なんだっけな?」となることも多いと思いますので、辞書代わりにご活用下さい(。・ω・。)
[SAP] よく使うABAPコード断片集(逆引き辞書)
レポートプログラム特有
ReportProgram : イベント一覧
- TOP-OF-PAGE:ページ内最初の一行が出力される直前に実行される
- END-OF-PAGE:ページ内の最終行が出力された直後に実行される。自動改ページの場合は、明細数がページの最終以上にならなければ END-OF-PAGE イベントは呼び出されない
ReportProgram : 選択画面選択画面の同じ行に複数のパラメータを含める
SELECTION-SCREEN BEGIN OF LINE. [この中でPRAMETERS宣言] SELECTION-SCREEN END OF LINE.
注意:このオプションを使用すると、選択テキストは表示されない
https://help.sap.com/saphelp_nw70/helpdata/ja/9f/dba7e235c111d1829f0000e829fbfe/content.htm
構造定義
構造・テーブル型宣言 & 箱準備
まず構造を作成し、それをベースにテーブル構造を作成する。TYPESで準備したものはあくまで定義のため、実際にデータを格納するためには変数の箱を準備する必要があります(。・ω・。)
TYPES: * 外部コマンドの出力結果構造の定義 BEGIN OF g_typ_h_tbl_btcxpm, length TYPE btcxpm-length, "外部プログラム内のプロトコルメッセージ長 message TYPE btcxpm-message, "外部プログラムからのログメッセージ END OF g_typ_h_tbl_btcxpm, g_typ_tbl_btcxpm TYPE TABLE OF g_typ_h_tbl_btcxpm. DATA: * 外部コマンドの出力結果格納変数(箱準備) g_h_tbl_btcxpm TYPE g_typ_h_tbl_btcxpm, g_tbl_btcxpm TYPE g_typ_tbl_btcxpm. === * テーブルデータから1行ずつ読み込む際の記載方法。INTOの後に続くものは、同じ構造から出力したものでないとエラーになる LOOP AT g_tbl_btcxpm INTO g_typ_h_tbl_btcxpm ~~~ ENDLOOP. ※ちなみにデータ準備は、下記コードのみで宣言可能(テーブルを直接指定できる) DATA: g_tbl_btcxpm type table of BTCXPM.
動的構造定義(FIELD-SYMBOLS)
FIELD-SYMBOLSを利用すると、プログラム内で決定する構造等が動的に利用できるようになります(例えば、ユーザが入力した構造ベースでデータを作成する機能等)。実行時になるまでは構造化等のデータ型属性を持ちません。
* 内部テーブルのデータをテーブル型FSに格納する LOOP AT l_tbl_data ASSIGNING <fs_line>. IF <fs_line> IS ASSIGNED. APPEND <fs_line> TO <fs_tbl>. ENDIF. ENDLOOP.
例外とセットでメッセージを出力する(SE91で登録するメッセージ)
RAISE命令を実行すると、プログラムは強制終了される。RAISE命令を付与しない場合は、メッセージタイプによって処理が続行されるかどうかが決まる
MESSAGE e[メッセージ番号]([メッセージクラス]) WITH [メッセージ変数1の値] [メッセージ変数2の値] [メッセージ変数3の値] [メッセージ変数4の値] RAISING [例外名]. ※エラーメッセージとして表示すると、その状態で処理が終了してしまう (下面描画が中途半端になる) それを避けるためには、メッセージをステータスSで出力し、見た目をエラーにする MESSAGE s[メッセージ番号]([メッセージクラス]) DISPLAY LIKE 'E'
汎用モジュールから返却される結果をそのまま出力する際は、下記の通りシステムIDを利用する
IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.
内部テーブル
内部テーブルの先頭行にデータを追加
内部テーブルの先頭行にデータを追加する場合は、INSERT命令にINDEXを付与してデータを追加します。(APPENDでの追加はNG)
INSERT [追加対象の構造データ] INTO [内部テーブル] INDEX 1.
分岐・ループ処理
条件分岐
* CASE文(l_wk_samplecodeが1ならフラグを立てる) CASE l_wk_samplecode. WHEN '1'. MOVE 'X' TO l_wk_flg. WHEN '2'. MOVE '' TO l_wk_flg. ENDCASE.
SQLクエリ ABAPコード断片集
データ存在チェック
大量データを整形しながら探索し、結果0件であった場合、データの編集時間分オーバーヘッドが発生します。一旦データがあるかないかをチェックしておくことで、このオーバーヘッドを小さくできます(クエリ1回分実行のオーバーヘッドは追加される)
* 構造が登録されているかどうかをチェックする SELECT COUNT(*) FROM DD02L WHERE TABNAME = [構造ID] * 取得結果が0件の場合は処理を終了する IF sy-subrc <> 0. [0件の場合の処理] ENDIF.
1行抽出 SELECT SINGLE(キー項目全て指定できる場合)
データベーステーブルから単一レコードを選択する際に、SELECT SINGLEを活用できます。但し、複数のレコードから一意に識別する必要があるため、WHERE句にはデータベーステーブルの主キー項目を全て記述するという制約があります。1
SELECT SINGLE [項目ID] FROM [テーブルID] INTO [格納先] WHERE [キー項目を全て指定]
尚、主キー項目を全て記述できない場合は、UP TO 1 ROWを利用する。どの行が選ばれるかは担保されないことに要注意
内部テーブル
データ存在チェック
* 内部テーブルのデータ存在チェック IF wk_tbl_data[] IS INITIAL ※[]をつけないと正常にチェックできない可能性あり
文字列操作
文字列結合
* 文字列結合 CONCATENATE "文字列1" "文字列2" "文字列3" INTO l_wk_string SEPARATED BY space. ※各文字の間にスペースを入れる場合、SEPARATED BY spaceで挿入する * 文字列分割(sample.csvのファイル名・拡張子を取得) SPLIT 'sample.csv' AT '.' INTO l_wk_filename l_wk_fileextension.
文字列置換
* ピリオドを空白に変更する場合の例 REPLACE ALL OCCURRENCES OF '.' IN [置換対象の文字列] WITH ''. * 符号(,)や左側の空白を削除する場合の例 WRITE l_wk_timestamp TO [置換対象の文字列] NO-GROUPING LEFT-JUSTIFIED.
文字列分割
SPLIT [分割対象の文字列] AT [区切り文字] INTO [分割後のデータ格納場所1] [分割後のデータ格納場所2].
例外処理
Try-Catchで例外処理
「この後もし何か良くないことが起こったらエラー」を実現する、Try-Catch処理がABAPでも利用可能です!
ユーザ縛りで改修中の影響範囲を最小に
複数人に影響が出るようなプログラムを改修する際は、ユーザ縛りロジックを入れると皆々様にやさしいです(。・ω・。)特にExitやBAPI改修のときは、基本ユーザ縛りを入れることが多いと思ってます~
* ユーザ縛りでロジックを入れながら開発する IF SY-UNAME = [ユーザID]. <新規開発ロジック及び修正ロジック> ENDIF.
いかがでしたでしょうか?その他よく使うコード断片集ございましたら、コメント欄でご教示頂けると大変嬉しいです!
SAPモジュール別関連記事
SAPのモジュール別その他の記事もまとめてますので、是非お立ち寄りください(。・ω・。)
この記事へのコメントはありません。