【ABAP】ALV – REUSE_ALV_GRID_DISPLAYのサンプルコード

<!-- wp:paragraph -->ABAP開発でよく出てくるものの一つにALV GRID形式のレポートがあります。SE16Nで表示される形式のレポートで、エクセルのセルみたいな感じで表示されます。

標準機能でALV出力用の共通部品が用意されており、単純なレポート表示なら作りこまなくても共通部品がそれなりのもの出してくれるので知っておいて損はありません。

今回はデータを表示するだけの単純なALVレポートの作り方を説明しているので、経験者にとっては物足りない内容かもしれません。ですが、ここの内容をベースに、ALVでできる様々な機能を今後見ていきたいと思っていますのでご了承ください。

それでは説明していきます。

## ALVレポート作成手順

### 表示レポートの構造作成（SE11）

まずは一覧画面に表示する項目を構造として定義します。

構造は作らなくてもできますが、表示名称や桁数などの属性情報を全部プログラムとして実装する必要があって無駄な工数がかかるので、ALVレポートに出力する項目は構造として定義することをおすすめします。

例として、BPマスタの一部項目を表示するレポートを作っていきます。

トライアル環境には会計やロジなどのトランザクションデータの登録機能は削除されているのですが、BPマスタは用意されていたので使ってみます。後々ALVからのコールトランザクションも試してみたいので。

サンプルなので項目数はパートナ、名称、登録者、の3項目だけに絞って作ります。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-12-1024x509.png)
### プログラムの実装（SE38）

#### フィールドカタログ作成

上で作った構造を標準の汎用モジュールに渡すことによって、ALVの各セルに表示する項目の桁数や名称、データ型などの各種属性情報を認識させてあげます。

```
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_structure_name       = 'YTEST0004'
  CHANGING
    ct_fieldcat            = it_fcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.
```

これだけです。プログラムIDと構造名を渡して、ct_fieldcatを返してもらうだけです。

上の構造定義のところで、構造を作らなくてもできると書きましたが、これはct_fieldcatにプログラム内で必要な情報を全部設定すればできるからです。

では、ct_fieldcatを手作りする場合はどれくらい大変なのでしょうか。ちょっと見てみましょう。

まず、表示位置と項目ID。3項目なら大したことないですが、50個、100個とかになると結構面倒です。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-13.png)こちらはラベル情報。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-14.png)こちらはデータエレメントやドメインに設定されている属性情報。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-15-1024x94.png)こちらはALVレポートの項目ラベルと表示長。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-16.png)これらをct_fieldcatに設定すれば、構造定義しなくてもALVレポートを作れますが、こんな面倒なことはおすすめしません。表示項目数に比例してステップ数も多くなり、プログラムの可読性が悪くなるので、無駄なバグを発生させかねませんね。

標準の汎用モジュールと構造を使うことで、何項目出力しようが10ステップくらいで実装できてしまいます。

#### ALVレポート出力

あとはレポートを出すだけです。とても簡単です。

```
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    it_fieldcat   = it_fcat
  TABLES
    t_outtab      = it_main     表示データ
  EXCEPTIONS
    program_error = 1
    OTHERS        = 2.
```

最低限のALVレポート出力はこれだけです。

## サンプルコード

上の説明では汎用モジュール部分を切り出していましたが、ここで全体のサンプルコードを載せます。

```
*&---------------------------------------------------------------------*
*& Report YTEST0004
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ytest0004.

DATA: it_main TYPE TABLE OF ytest0004.
DATA: it_fcat TYPE slis_t_fieldcat_alv.

SELECT * FROM but000 INTO CORRESPONDING FIELDS OF TABLE it_main.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_structure_name       = 'YTEST0004'
  CHANGING
    ct_fieldcat            = it_fcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    it_fieldcat   = it_fcat
  TABLES
    t_outtab      = it_main
  EXCEPTIONS
    program_error = 1
    OTHERS        = 2.
```

上記コードで表示されるALVレポートの画面はこんな感じです。

![](https://sapmemo.com/wp-content/uploads/2020/08/image-17.png)ALVを使ってる人からすると、

- 行選択ボタンがない
- 名称の表示幅が必要以上に長い
- ALVレイアウトの保存ボタンがない

など気になる点があるかと思います。

今回載せたサンプルコードの汎用モジュールには多数のパラメータを渡すことができるのですが、それらの中に行選択ボタンや表示幅の最適化、ALVレイアウトの保存ボタンを出すためのパラメータが用意されていますので、別の機会に載せていきます。

## まとめ

今回載せたサンプルコードは基本中の基本のみです。これをベースに今後いろいろな機能を紹介していくので是非参考にしてください。