ラベル ALV の投稿を表示しています。 すべての投稿を表示
ラベル ALV の投稿を表示しています。 すべての投稿を表示

【ABAP】ALV –セルに色をつける方法(サンプルあり)

 

一定金額以上のセルに色をつけてほしい、など特定のセルを目立たせるというのはたまにある話です。決まったやり方があるのですが、ALV表示の汎用モジュールを見てても答えに行き着かないと思いますので、今回取り扱うことにします。

サンプルコードは下記投稿をベースに更新していきます。


表示用の構造に色情報の項目追加

最初が一番のポイントになります。

これまで、ユーザコマンド処理の追加、行選択ボタン、ステータスアイコンの表示など、ALVで使える手法を紹介してきましたが、それらはいずれもALV出力の汎用モジュールに定義されたパラメータを渡すことで対応できました。

しかし、色情報については汎用モジュールのパラメータには持っていません。表示データ側でコントロールします。

表示データの構造に色情報項目を追加していきます。

TYPES:
  BEGIN OF t_main.
    INCLUDE TYPE sbook.
  TYPES:
    box     TYPE checkbox,
    coltab  TYPE lvc_t_scol,
  END   OF t_main.

「LVC_T_SCOL」型を参照した項目を追加します。項目名はここでは「COLTAB」としました。

実体はテーブルデータ型です。

項目が3つありますが、「COLOR」については更に構造「LVC_S_COLO」型になっています。

項目「COLOR」の中に更に3項目あります。

これで項目追加は終わりです。続けてプログラムの実装方法を見ていきます。

実装方法(サンプルコード)

  wa_layout-coltab_fieldname  = 'COLTAB'.

  DATA: lw_coltab TYPE lvc_s_scol.
  LOOP AT it_main ASSIGNING FIELD-SYMBOL(<fs_main>).
    lw_coltab-fname       = 'FORCURAM'.   "色を設定する項目ID
    lw_coltab-color-col   = '7'.          "色の種類
    APPEND lw_coltab TO <fs_main>-coltab.
  ENDLOOP.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat              = it_fcat
      is_layout                = wa_layout
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_GUI_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      it_excluding             = it_extab
    TABLES
      t_outtab                 = it_main
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

ここで重要なのは次の2点です。

  1. レイアウトパラメータに表示データに追加した色情報の項目名を渡す
  2. 表示データに色情報を渡す

1点目については、レイアウトパラメータの項目「COLTAB_FIELDNAME」に色情報の項目名を渡せば良いです。これを設定することで、表示データの色情報がどの項目名で管理されるのかを汎用モジュールが認識できるようになります。

2点目では、どの項目に何色を表示するのかを定義します。

上のサンプルコードで表示される画面がこちらです。金額(Amount)1項目ををオレンジ色にしてみましたが、COLTABに色をつけたい項目IDと色情報を追加すれば複数項目の色付けも可能です。

色の設定値「7」はオレンジ色を表すのですが、他にどんな色があるのでしょうか。続けてみていきましょう。

ALVで使える色の一覧

サンプルコードでは構造「LVC_S_COLO」型の項目「COLOR」に「7(オレンジ色)」を設定しましたが、全部で8色の設定が可能です。

ちなみに標準プログラム「SHOWCOLO」でも見ることができます。SE38から実行できます。

コード
0システム背景色
1青色
2灰色
3黄色
4青灰色
5緑色
6赤色
7オレンジ色

この8色に濃淡をつけることで色を分けられるので、合計16色をセルに設定することが可能です。16色のイメージは次の画面を見てください。

1-8行目が淡い色、9-16行目が濃い色です。9行目だけ文字の色が青っぽくなりますが、これはセルの背景色だけではなく文字色も含めて強調表示しているからで標準仕様となります。

色の濃淡は構造「LVC_S_COLO」型の項目「INT」で制御します。SE11を見ればわかりますが、「INTENSIFIED」の略です。

「INT」への設定値は2種類しかありません。

0強調表示なし(淡い色)
1強調表示あり(濃い色)

まとめ

  • 色情報は表示データ側で制御する
  • 使える色は8色×濃淡2種類の合計16色

ALVのセルへの色付けは、表示データ側の構造に色情報を持たせるという他のALV機能にはない設定が必要なので、サンプルがないと調べるのが大変な機能要件です。セルへの色付けで困っている方のお役に立てれば幸いです。

【ABAP】メッセージタイプによる挙動の違い(サンプルあり)

 

アドオン開発で意外と盲点になるのがメッセージ出力の部分です。

ABAPでの基本的な機能の一つなので何が盲点なのかと疑問に思う方もいるかと思いますが、エラーメッセージを出力するときの挙動が作る人によって違うことがよくあります。

設計者が「エラーメッセージを出力する」と設計書に書いて、開発者が字面通りに実装しても、設計者が思い描いている挙動と異なる場合があるのです。

それでは何故そんなことが起きるのか、メッセージについて詳しくみていきましょう。

SAPで出力できるメッセージの種類

ABAPヘルプに記載がありますが、まとめると以下の6種類あります。

メッセージタイプテキスト挙動
S正常メッセージ処理続行
I情報メッセージ処理続行
W警告メッセージ中断or続行を実行時に選択
Eエラーメッセージ中断
A強制終了メッセージプログラム終了
X実行時エラーショートダンプ

タイプAとX以外の4つはプロジェクトでよく使われますが、

レポートプログラムでメッセージを出力する場合、実装するイベントによって挙動が変わる場合があるので、設計者・開発者が共通の認識を持つことが重要です。

具体的な挙動は次で見ていきます。

警告メッセージ、エラーメッセージを出力する場合の注意点

警告メッセージ、エラーメッセージを出力したい場合、実装位置がイベント「AT SELECTION-SCREEN」であるか「START-OF-SELECTION」であるかで挙動が大きく変わるので注意が必要です。

警告メッセージ(タイプW)

AT SELECTION-SCREEN内(画面左側)で警告メッセージを出力する場合は、仕様通り警告メッセージとして選択画面上に表示されますが、

START-OF-SELECTION内(画面右側)で警告メッセージを出力すると、警告のメッセージタイプを指定してもエラーメッセージとして表示されます。しかも選択画面を抜けてしまっているので、メッセージが出た画面でENTERキーを押下すると、メニューの画面まで戻ってしまいます。

エラーメッセージ(タイプE)

AT SELECTION-SCREEN内(画面左側)でエラーメッセージを出力する場合は、選択画面上にエラーメッセージが表示されますが、

START-OF-SELECTION内(画面右側)でエラーメッセージを出力すると、警告メッセージの場合と同様に選択画面を抜けてエラーメッセージが出力されてしまいます。

選択画面を抜けてエラーメッセージが出力されるケースを実際のプロジェクトで案外よく見かけますが、操作性が悪くなるので避けるべきです。

一般的に、AT SELECTION-SCREENは選択画面項目のチェック処理、START-OF-SELECTIONはデータ抽出以降の主処理を実装するイベントとして使用されますが、主処理以降でエラーメッセージを出力したい場合はどうすればいいのでしょうか。

実装方法を見ていきましょう。

DISPLAY LIKEオプションを効果的に使う

メッセージを出力する命令文はそのままMESSAGEですが、そのオプションに「DISPLAY LIKE ~ 」というものがあります。

英語の直訳通りの意味ですが、「メッセージタイプを~のように見せる」というもので、STAR-OF-SELECTION内でエラーメッセージを出力する場合はこのやり方が一般的です。

こんな感じで使います。

  MESSAGE 'test message' TYPE 'S' DISPLAY LIKE 'E'.
  LEAVE LIST-PROCESSING.

ポイントは2つ。

  • TYPE指定するメッセージタイプはS(正常)でDISPLAY LIKEオプションで表示したいメッセージタイプを指定すること
  • LEAVE LIST-PROCESSINGで処理を終了すること

まとめ

  • START-OF-SELECTION内での警告メッセージ、エラーメッセージ出力は避けるべき
  • 代わりにDISPLAY LIKEオプションで警告やエラーのように見せること

メッセージ出力時の挙動については、あまり意識されない部分のため、作る人によって挙動が変わってしまうことがよくあります。

しかし、ユーザから見ると挙動に統一感がないのは好ましくありません。結合テストなどの後工程に入ってから挙動を統一するために修正をする可能性もあります。

設計時からメッセージ出力時の挙動を意識しておくことで、後ろの工程での手戻りをなくすことにも繋がりますので、設計者はもちろん開発者も意識するのが良いと思います。


【ABAP】拡張 – 暗黙拡張(Implicit Enhancement)の実装方法(サンプルあり)

 現在参画中のプロジェクトでちょっと試してみたいことがあるので、今回は暗黙拡張を取り扱ってみます。

暗黙拡張(Implicit Enhancement)とは、BADIの一種で、特定のルールの基にプログラム中に拡張ロジックを追加できるものです。標準、アドオン関係なく追加できます。

これだとモディフィケーションじゃないの?と思う人もいるかもしれません。私もほぼモディフィケーションのようなものだと思っています。

そのため、プロジェクトでは禁止にされることが多く、目にする機会は少ないかもしれません。私の場合は1社だけガッツリ使われている会社を経験したことがありますが、最初は暗黙拡張の存在を知らずに入ったので非常に苦労した覚えがあります。

それでは前置きが長くなりましたが、暗黙拡張を見ていきましょう。

モディフィケーションと暗黙拡張の違い

モディフィケーション暗黙拡張
標準プログラムの拡張可能可能
オブジェクトキー必要不要
ロジック追加位置任意の場所文頭、文末など特定箇所のみ
移送依頼必須任意($TMP可)
SAPサポート不可不可

ざっくりとまとめてみました。

暗黙拡張は厳密に言えば、プログラムに直接拡張ロジックを書き込むのではありません。拡張する位置をプログラム中で指定して、拡張ロジック自体は別オブジェクトとして作成します。

移送依頼不要でローカルパッケージを使用できるのはそのためです。

続いて、実装方法を見ていきます。

暗黙拡張の実装方法

対象機能

標準プログラム「DEMO_DYNPRO_MODULE」に対して暗黙拡張を入れてみます。

実装手順

SE38でプログラム照会し、拡張ボタン押下

渦巻アイコンが拡張ボタンです。GUIのバージョンやテーマによってアイコンが変わることもあるので、ツールチップ(アイコン上にカーソルを置くと表示される情報)を見て確認してください。テーマがBelizeだと渦巻アイコンではなかったと思います。

拡張可能箇所の表示

メニューバー⇒編集⇒拡張操作⇒暗黙的拡張オプションを表示

拡張位置を決めて登録ボタン押下

form文の先頭と最後、そしてform文の外(プログラム全体の最後)が拡張可能(エディタの左側が「⇒」)として表示されます。

今回はform文の最後に拡張ロジックを入れます。

拡張オブジェクト登録

「コード」を選択

拡張オブジェクトのIDとテキストを入力してENTER押下

今回は移送しないのでローカルオブジェクトとして登録します。

拡張有効化

指定した箇所が白抜きになります。ここにコードを書いて拡張有効化ボタン押下で有効化されます。

今回実装したコードがこちらです。標準プログラムの変数をクリアしてみました。

有効化後は拡張オブジェクトIDの右側(ソースコードの54行目)が「active version」に変わります。

プログラム属性を見てみると、最終変更者は「SAP」で変更日が拡張実行日に変わってますね。

ちなみに、実行ユーザIDは「DEVELOPER」ですが、変更者は一律で「SAP」になるようですね。

暗黙拡張の更新・削除

ソースコードの変更・削除については、登録時と同様にSE38から可能です。

しかし、拡張オブジェクト自体は専用のトランザクションから実行しなければいけません。

SE19を実行

上のブロックの「New BAdI」を選択し、拡張オブジェクトを指定します。

変更ボタンなら変更、ごみ箱ボタンなら削除になります。

(変更の場合)行選択して「Source」ボタン押下

「Source」ボタンを押下するとエディタが表れて拡張部分のみ出てきます。

ベースになるプログラムの変数が一切見えないので、ソースコードに手を加えるならSE38からの方が楽ですね。

(削除の場合)確認画面で続行ボタン押下

削除後にSE38で拡張箇所を見ると、拡張オブジェクトがなくなっていることがわかります。

削除後のプログラム属性を見ると、変更日は元には戻らず、拡張の削除を実行した日に更新されるようです。

まとめ

暗黙拡張は拡張機能の一種であるとは言え、SAPのサポートは受けられないので、シンプルな処理にするなど、使用する際は慎重に判断してくださいね。