【ABAP】統合データアクセス(IDA)を備えたALVでテーブルデータを表示する(CL_SALV_GUI_TABLE_IDA)

#やること
統合データアクセス(IDA)を備えたALVで、SAPのテーブルデータを表示する。
CL_SALV_GUI_TABLE_IDAを使用。

参考：[SAP List Viewer with Integrated Data Access (ALV with IDA)](https://blogs.sap.com/2018/07/16/sap-list-viewer-with-integrated-data-access-alv-with-ida/)

テーブルデータではなく、CDS Viewのデータを出力する方法についてはこちら
[統合データアクセス(IDA)を備えたALVでCDS Viewのデータを表示する(CL_SALV_GUI_TABLE_IDA)](https://qiita.com/mahko2/items/f8791ce7723055851bff)

#実行結果
※EKKOのデータを表示。ダブルクリックするとEKPOの画面に遷移する

###選択画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/75c59095-4719-52d7-7070-c22535839b16.png)

###ALV画面(EKKO)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/f5772aa1-6a21-a1cd-56b7-d2aee491db5d.png)

###ALV画面で明細行をダブルクリック後(EKPO出力)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22526/32a46f65-694f-f18c-ab73-cb4915d7dfe0.png)

#ソースコード
```ABAP:Y_TEST_CL_SALV_GUI_TABLE_IDA
*&---------------------------------------------------------------------*
*& Report Y_TEST_CL_SALV_GUI_TABLE_IDA
*&---------------------------------------------------------------------*
*& 購買発注ヘッダ(EKKO)のデータをALV画面で出力
*&---------------------------------------------------------------------*
REPORT y_test_cl_salv_gui_table_ida.

* 選択画面定義
DATA w_ebeln TYPE ekko-ebeln.

PARAMETERS p_lifnr TYPE ekko-lifnr.
SELECT-OPTIONS s_ebeln FOR w_ebeln.

*----------------------------------------------------------------------*
*       CLASS DEFINITION
*----------------------------------------------------------------------*
*----- メイン
CLASS lcl_main DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS run.
  PRIVATE SECTION.

ENDCLASS.

*----- ハンドルアクション
CLASS lcl_handle_action DEFINITION.
  PUBLIC SECTION.
    METHODS :
      constructor IMPORTING io_ida TYPE REF TO if_salv_gui_table_ida,
      handle_dbclick FOR EVENT double_click OF if_salv_gui_table_display_opt.
    DATA o_ida TYPE REF TO if_salv_gui_table_ida.

ENDCLASS.
*----------------------------------------------------------------------*
*       CLASS IMPLEMENTATION
*----------------------------------------------------------------------*
*----- メイン
CLASS lcl_main IMPLEMENTATION.
  METHOD run.

* DBチェック
    CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'EKKO').

* IDA作成
    DATA(o_ida) = cl_salv_gui_table_ida=>create( iv_table_name = 'EKKO' ). "テーブルID指定

* 最大行の設定
    IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
      o_ida->set_maximum_number_of_rows(  iv_number_of_rows = 20 ).  "20行だけ出力
    ENDIF.

* 抽出条件の設定
*   PARAMETERSの場合(値が設定されてる場合、RANGE型に格納し設定)
    DATA lr_lifnr TYPE RANGE OF ekko-lifnr.
    DATA(o_sel) = NEW cl_salv_range_tab_collector( ).
    IF p_lifnr IS NOT INITIAL.
      lr_lifnr = VALUE #(
        ( sign = 'I' option = 'EQ' low = p_lifnr )
      ).
      o_sel->add_ranges_for_name( iv_name = 'LIFNR' it_ranges = lr_lifnr[] ).
    ENDIF.
*   SELECT-OPTIONSの場合
    o_sel->add_ranges_for_name( iv_name = 'EBELN' it_ranges = s_ebeln[] ).

    o_sel->get_collected_ranges( IMPORTING et_named_ranges = DATA(lt_named_ranges) ).
    o_ida->set_select_options( it_ranges = lt_named_ranges ).

* 出力項目の設定
    DATA lt_field_names TYPE if_salv_gui_types_ida=>yts_field_name.
    lt_field_names = VALUE #(
        ( CONV string('LIFNR') )
        ( CONV string('EBELN') )
        ( CONV string('BSART') )
        ( CONV string('EKORG') )
        ( CONV string('EKGRP') )
      ).

    o_ida->field_catalog( )->set_available_fields( EXPORTING its_field_names = lt_field_names ).

* ソート
    DATA lt_sort_order TYPE if_salv_gui_types_ida=>yt_sort_rule.
    lt_sort_order = VALUE #(
      ( field_name = 'LIFNR' descending = abap_false is_grouped = abap_true )
      ( field_name = 'EBELN' descending = abap_true is_grouped = abap_false )
    ).

    o_ida->default_layout( )->set_sort_order( EXPORTING it_sort_order = lt_sort_order ).

* ダブルクリック有効
    o_ida->display_options( )->enable_double_click( ).
* selection Mode
    o_ida->selection( )->set_selection_mode( EXPORTING iv_mode = 'SINGLE' ).

* イベントハンドラー
    DATA(o_handler) = NEW lcl_handle_action( io_ida = o_ida ) .
    SET HANDLER o_handler->handle_dbclick FOR o_ida->display_options( ) .

* ALV出力
    o_ida->fullscreen( )->display( ).

  ENDMETHOD.
ENDCLASS.                    "lcl_main IMPLEMENTATION

*----- ハンドルアクション
* EKKOでダブルクリックされた行の購買伝票番号(EBELN)を条件に、EKPOを出力
CLASS lcl_handle_action IMPLEMENTATION.
  METHOD constructor .
    o_ida = io_ida.
  ENDMETHOD.
  METHOD handle_dbclick.

    DATA ls_ekko TYPE ekko.
    DATA it_named_ranges TYPE if_salv_service_types=>yt_named_ranges.
    IF o_ida IS BOUND.
      IF o_ida->selection( )->is_row_selected( ).
        " Get selected row

        o_ida->selection( )->get_selected_row( IMPORTING es_row = ls_ekko ).
        DATA(o_ida_item) = cl_salv_gui_table_ida=>create( iv_table_name = 'EKPO' ).
        IF o_ida_item IS BOUND.
          it_named_ranges = VALUE #(
                              ( name = 'EBELN'
                                sign = 'I'
                                option = 'EQ'
                                low = ls_ekko-ebeln )
                               ).
          o_ida_item->set_select_options( it_ranges = it_named_ranges ).
          o_ida_item->fullscreen( )->display( ) .
        ENDIF.

      ELSE.
        MESSAGE 'No row selected' TYPE ' I' .
      ENDIF.
    ENDIF.

  ENDMETHOD .

ENDCLASS.
*----------------------------------------------------------------------*
*       START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.

  lcl_main=>run( ).
```