【ABAP】ALV – ユーザコマンドの実装(サンプルあり)

ABAP

ALVレポートの開発でよく使うのがユーザコマンドの実装です。

セルをダブルクリックした場合の処理やボタン押下時の処理などがあります。

今回はセルのダブルクリックを例に説明します。

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

追加箇所を青字、さらに肝になる箇所を赤字で記載しました。

REPORT ytest0008.

TYPES:
  BEGIN OF t_main.
    INCLUDE TYPE ytest0008.
  TYPES:
    box TYPE checkbox,
  END   OF t_main.

DATA: it_main TYPE TABLE OF t_main.
DATA: it_fcat TYPE slis_t_fieldcat_alv.
DATA: wa_layout TYPE slis_layout_alv.

START-OF-SELECTION.

  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       = 'YTEST0008'
      i_bypassing_buffer     = abap_on
    CHANGING
      ct_fieldcat            = it_fcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  wa_layout-box_fieldname     = 'BOX'.
  wa_layout-colwidth_optimize = abap_on.
  wa_layout-zebra             = abap_on.

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

FORM user_command USING i_ucomm    TYPE sy-ucomm
                        i_selfield TYPE slis_selfield.
  CASE i_ucomm.
    WHEN '&IC1'.  "ダブルクリック
      READ TABLE it_main INTO DATA(lw_main) INDEX i_selfield-tabindex.
      IF sy-subrc <> 0.
        MESSAGE 'データ行を選択してください' TYPE 'S'.
        RETURN.
      ENDIF.
      ASSIGN COMPONENT i_selfield-fieldname OF STRUCTURE lw_main
                                            TO FIELD-SYMBOL(<fs_fnam>).
      CASE i_selfield-fieldname.
        WHEN 'PARTNER'.
          SET PARAMETER ID 'BPA' FIELD <fs_fnam>.
          CALL TRANSACTION 'BP'.
        WHEN 'CRUSR'.
          SET PARAMETER ID 'XUS' FIELD <fs_fnam>.
          CALL TRANSACTION 'SU01'.
        WHEN OTHERS.
          MESSAGE '画面遷移できません' TYPE 'S'.
          RETURN.
      ENDCASE.
  ENDCASE.

ENDFORM.

①汎用モジュールのパラメータ追加

「I_CALLBACK_PROGRAM」には呼出元のプログラムIDが必要なため、システム変数で自分自身のプログラムIDを指定しています。

「I_CALLBACK_USER_COMMAND」にはユーザコマンドを実装するサブルーチン名を指定します。

②ユーザコマンド実装用のサブルーチン追加

USINGパラメータは2つ決まったものがあります。1つ目は機能コード、2つ目は選択行や選択項目IDなどの情報を取得できます。

今回のサンプルコードでは、パートナを選択したらBPマスタへ、登録者を選択したらユーザマスタへ遷移する仕組みにしてみました。

3行目のパートナをダブルクリックすると、そのBPマスタの画面が表示されます。

1行目の登録者をダブルクリックすると、そのユーザマスタの画面が表示されます。

まとめ

今回のポイントは、「I_CALLBACK_USER_COMMAND」パラメータにサブルーチン名を指定する点です。こういうのは独学で辿り着くには時間がかかるので是非参考にしてもらって実装時間の短縮につながると幸いです。

コメント

タイトルとURLをコピーしました