#やること
統合データアクセス(IDA)を備えたALVで、SAPのテーブルデータを表示する。
CL_SALV_GUI_TABLE_IDAを使用。
参考:SAP List Viewer with Integrated Data Access (ALV with IDA)
テーブルデータではなく、CDS Viewのデータを出力する方法についてはこちら
統合データアクセス(IDA)を備えたALVでCDS Viewのデータを表示する(CL_SALV_GUI_TABLE_IDA)
#実行結果
※EKKOのデータを表示。ダブルクリックするとEKPOの画面に遷移する
#ソースコード
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( ).