List Viewer - ALV con IDA (Integrated Data Access)
SAP List Viewer with Integrated Data Access è una ALV GRID con IDA, che consente una maggior fruibilità dei dati presenti in tabelle che contengono grandi quantità di dati da visualizzare sull'interfaccia utente. Anche i risultati di operazioni come l'ordinamento, il raggruppamento o il filtraggio vengono forniti con un tempo di risposta molto rapido. Utilizza il database in memoria, come SAP HANA. Non vi è alcuna modifica nell'interfaccia utente e nelle funzioni standard (anche servizi ALV). Le funzioni ALV sono adattate all'uso dei database in memoria. Il nuovo modello di programmazione generale (Coding Pushdown) è supportato in modo ottimale anche quando si utilizzano database in memoria.
Esempio 1: Visualizza i dettagli dell'ordine di vendita
REPORT zr_hanaida_01.
START-OF-SELECTION.
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
*Creare ALV Grid di tipo IDA
DATA(o_ida) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAK' ).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 2: Applicare filtri nell’estrazione
dei dati dalla tabella
REPORT zr_hanaida_02.
DATA:
lv_kunnr TYPE kunnr,
lv_erdat TYPE erdat,
lrg_vkorg TYPE RANGE OF vkorg.
PARAMETERS:
p_vkorg TYPE vkorg.
SELECT-OPTIONS:
s_erdat FOR lv_erdat,
s_kunnr FOR lv_kunnr.
START-OF-SELECTION.
FREE: lrg_vkorg[].
*Setto i filtri sui dati da estrarre
IF NOT p_vkorg IS INITIAL.
INSERT VALUE #( sign = 'I'
option = 'EQ'
low = p_vkorg
) INTO TABLE lrg_vkorg.
ENDIF.
DATA(o_sel) = NEW cl_salv_range_tab_collector( ).
o_sel->add_ranges_for_name( iv_name = 'VKORG' it_ranges = lrg_vkorg[] ).
o_sel->add_ranges_for_name( iv_name = 'ERDAT' it_ranges = s_erdat[] ).
o_sel->add_ranges_for_name( iv_name = 'KUNNR' it_ranges = s_kunnr[] ).
o_sel->get_collected_ranges( IMPORTING et_named_ranges = DATA(lt_named_ranges) ).
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
*Creare ALV Grid di tipo IDA
DATA(o_ida) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAK' ).
*Setto i filtri nell'ALV grid
o_ida->set_select_options( it_ranges = lt_named_ranges ).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 3: Impostazione del display
ALV
REPORT zr_hanaida_03.
DATA:
lt_field_names TYPE if_salv_gui_types_ida=>yts_field_name,
lt_sort_order TYPE if_salv_gui_types_ida=>yt_sort_rule.
START-OF-SELECTION.
FREE: lt_field_names[], lt_sort_order.
*Setto i soli campi voglio mostrare in output
lt_field_names = VALUE #(
( CONV string('ERDAT') )
( CONV string('KUNNR') )
( CONV string('NETWR') )
( CONV string('SPART') )
( CONV string('VBELN') )
( CONV string('VKORG') )
( CONV string('VTWEG') )
( CONV string('WAERK') )
).
*Indico per quali campi devono essere ordinati
INSERT VALUE #( field_name = 'KUNNR'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
INSERT VALUE #( field_name = 'VBELN'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
*Creare ALV Grid di tipo IDA
DATA(o_ida) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAK' ).
*Setto i campi da visualizzare nell'ALV grid
o_ida->field_catalog( )->set_available_fields( EXPORTING its_field_names = lt_field_names ).
*Setto i campi che devono essere ordinati nell'ALV grid
o_ida->default_layout( )->set_sort_order( EXPORTING it_sort_order = lt_sort_order ).
*Imposta il campo Riferimento valuta
o_ida->field_catalog( )->set_currency_reference_field(
EXPORTING iv_amount_field_name = 'NETWR'
iv_currency_field_name = 'WAERK'
).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 4: Gestione Eventi nel display
ALV
Le interazioni dell'utente sull'ALV possono essere
gestite implementando i metodi del gestore eventi:
· Doppio click
· Pulsante della
barra degli strumenti
REPORT zr_hanaida_04.
DATA:
lt_field_names TYPE if_salv_gui_types_ida=>yts_field_name,
lt_sort_order TYPE if_salv_gui_types_ida=>yt_sort_rule.
* Definizione e Implemetanzione della classe per gestire gli eventi
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,
handle_action FOR EVENT function_selected Of if_salv_gui_toolbar_ida.
DATA: o_ida TYPE REF TO if_salv_gui_table_ida.
ENDCLASS.
CLASS lcl_handle_action IMPLEMENTATION.
METHOD constructor.
o_ida = io_ida.
ENDMETHOD.
METHOD handle_dbclick.
DATA: ls_vbak TYPE vbak,
lrg_vbeln TYPE RANGE OF vbeln,
lt_named_ranges TYPE if_salv_service_types=>yt_named_ranges.
IF o_ida IS BOUND.
IF o_ida->selection( )->is_row_selected( ).
* Ottengo le righe selezionate
o_ida->selection( )->get_selected_row( IMPORTING es_row = ls_vbak ).
DATA(o_ida_item) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAP' ).
IF o_ida_item IS BOUND.
INSERT VALUE #( name = 'VBELN'
sign = 'I'
option = 'EQ'
low = ls_vbak-vbeln
) INTO TABLE lt_named_ranges.
o_ida_item->set_select_options( it_ranges = lt_named_ranges ).
o_ida_item->fullscreen( )->display( ).
ELSE.
MESSAGE 'Nessuna riga selezionata' TYPE 'I'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD handle_action.
DATA: ls_vbak TYPE vbak,
lrg_vbeln TYPE RANGE OF vbeln,
lt_named_ranges TYPE if_salv_service_types=>yt_named_ranges.
IF o_ida IS BOUND.
IF o_ida->selection( )->is_row_selected( ).
* Ottengo le righe selezionate
o_ida->selection( )->get_selected_row( IMPORTING es_row = ls_vbak ).
DATA(o_ida_item) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAP' ).
IF o_ida_item IS BOUND.
INSERT VALUE #( name = 'VBELN'
sign = 'I'
option = 'EQ'
low = ls_vbak-vbeln
) INTO TABLE lt_named_ranges.
o_ida_item->set_select_options( it_ranges = lt_named_ranges ).
o_ida_item->fullscreen( )->display( ).
ELSE.
MESSAGE 'Nessuna riga selezionata' TYPE 'I'.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
FREE: lt_field_names[], lt_sort_order.
*Setto i soli campi voglio mostrare in output
lt_field_names = VALUE #(
( CONV string('ERDAT') )
( CONV string('KUNNR') )
( CONV string('NETWR') )
( CONV string('SPART') )
( CONV string('VBELN') )
( CONV string('VKORG') )
( CONV string('VTWEG') )
( CONV string('WAERK') )
).
*Indico per quali campi devono essere ordinati
INSERT VALUE #( field_name = 'KUNNR'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
INSERT VALUE #( field_name = 'VBELN'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
*Creare ALV Grid di tipo IDA
DATA(o_ida) = cl_salv_gui_table_ida=>create( iv_table_name = 'VBAK' ).
*Setto i campi da visualizzare nell'ALV grid
o_ida->field_catalog( )->set_available_fields( EXPORTING its_field_names = lt_field_names ).
*Setto i campi che devono essere ordinati nell'ALV grid
o_ida->default_layout( )->set_sort_order( EXPORTING it_sort_order = lt_sort_order ).
*Imposta il campo Riferimento valuta
o_ida->field_catalog( )->set_currency_reference_field(
EXPORTING iv_amount_field_name = 'NETWR'
iv_currency_field_name = 'WAERK'
).
*Abilitare l'evento Doppio Clic e impostare la modalità di selezione
*Istanziare la classe del gestore di eventi e il gestore di set
o_ida->display_options( )->enable_double_click( ).
o_ida->selection( )->set_selection_mode( EXPORTING iv_mode = 'SINGLE' ).
*Istanziare un gestore di eventi classe e un gestore di set
DATA(o_handler) = NEW lcl_handle_action( io_ida = O_ida ).
SET HANDLER o_handler->handle_dbclick FOR o_ida->display_options( ).
*Aggiungo pulsante alla barra degli strumenti e Imposto il metodo del gestore eventi
o_ida->toolbar( )->add_button( EXPORTING iv_fcode = 'DISP'
iv_text = 'Diplay'
).
SET HANDLER o_handler->handle_action FOR o_ida->toolbar( ).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 5: Campi Calcolati nel display
ALV
Possiamo anche visualizzare i campi calcolati oltre ai
campi della tabella del database standard utilizzando i campi di calcolo
REPORT zr_hanaida_05.
DATA:
lt_field_names TYPE if_salv_gui_types_ida=>yts_field_name,
lt_sort_order TYPE if_salv_gui_types_ida=>yt_sort_rule.
* Definizione e Implemetanzione della classe per gestire campi calcolati
CLASS lcl_cal_fields DEFINITION.
PUBLIC SECTION.
INTERFACES if_salv_ida_calc_field_handler.
TYPES:
BEGIN OF ty_custom_fields,
taxamount TYPE netwr,
netamount TYPE netwr,
END OF ty_custom_fields.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_cal_fields IMPLEMENTATION.
METHOD if_salv_ida_calc_field_handler~get_calc_field_structure.
ro_calc_field_structure ?= cl_abap_typedescr=>describe_by_name( 'TY_CUSTOM_FIELDS' ).
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~get_requested_fields.
rts_db_field_name = VALUE #( ( CONV string('NETWR') ) ). "Tax Amount
rts_db_field_name = VALUE #( ( CONV string('NETWR') ) ). "Net Amount
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~calculate_line.
DATA: ls_vbak TYPE vbak,
ls_cal_fields TYPE ty_custom_fields.
ls_vbak = is_data_base_line.
ls_cal_fields-taxamount = ls_vbak-netwr * '0.10'.
ls_cal_fields-netamount = ls_vbak-netwr * ls_cal_fields-taxamount.
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~end_page.
ENDMETHOD.
METHOD if_salv_ida_calc_field_handler~start_page.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
FREE: lt_field_names[], lt_sort_order.
*Setto i soli campi voglio mostrare in output
lt_field_names = VALUE #(
( CONV string('ERDAT') )
( CONV string('KUNNR') )
( CONV string('NETWR') )
( CONV string('SPART') )
( CONV string('VBELN') )
( CONV string('VKORG') )
( CONV string('VTWEG') )
( CONV string('WAERK') )
( CONV string('TAXAMOUNT') )
( CONV string('NETAMOUNT') )
).
*Indico per quali campi devono essere ordinati
INSERT VALUE #( field_name = 'KUNNR'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
INSERT VALUE #( field_name = 'VBELN'
descending = abap_true
is_grouped = abap_true
) INTO TABLE lt_sort_order.
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
*Creare ALV Grid di tipo IDA
DATA(o_ida) = cl_salv_gui_table_ida=>create(
iv_table_name = 'VBAK'
io_calc_field_handler = NEW lcl_cal_fields( ) ).
*Setto i campi da visualizzare nell'ALV grid
o_ida->field_catalog( )->set_available_fields( EXPORTING its_field_names = lt_field_names ).
*Setto i campi che devono essere ordinati nell'ALV grid
o_ida->default_layout( )->set_sort_order( EXPORTING it_sort_order = lt_sort_order ).
*Imposta il campo Riferimento valuta
o_ida->field_catalog( )->set_currency_reference_field(
EXPORTING iv_amount_field_name = 'NETWR'
iv_currency_field_name = 'WAERK'
).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 6: Lavorare con le viste CDS
Possiamo utilizzare CDS Views come fonte di dati per
visualizzare i dati utilizzando SALV IDA
Creiamo la seguente CDS (ZCDS_CUSTOMER):
@AbapCatalog.sqlViewName: 'ZV_CUSTOMER'
@AbapCatalog.compiler.compareFilter: true
@EndUserText.label: 'Customers'
define view ZCDS_CUSTOMER as select from kna1 {
key kunnr,
name1,
name2,
ort01,
land1
}
Creiamo il programma:
REPORT zr_hanaida_06.
START-OF-SELECTION.
*Controlla le capacità del database
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supported( iv_ddic_table_name = 'VBAK').
DATA(o_ida) = cl_salv_gui_table_ida=>create_for_cds_view(
iv_cds_view_name = 'ZCDS_CUSTOMER' ).
*Imposta il numero massimo di righe consigliato
IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
o_ida->set_maximum_number_of_rows( iv_number_of_rows = 2000 ).
ENDIF.
* Visualizza l'output
o_ida->fullscreen( )->display( ).
END-OF-SELECTION.
Esempio 7: Controllo Autorizzazioni
Il controllo dell'autorizzazione può essere applicato quando si lavora con SALV IDA. Dobbiamo utilizzare il metodo ADD_AUTHORIZATION_FOR_OBJECT dell'interfaccia IF_SALV_GUI_TABLE_IDA
*Controllo autorizzazione
o_ida->add_authorization_for_object( EXPORTING
iv_authorization_object = 'ZVKORG'
it_activities =
VALUE if_salv_gui_types_ida=>yt_activities( ( auth_field = 'ACTVT' value = '03' ) )
it_field_mapping =
VALUE if_salv_gui_types_ida=>yt_field_mapping( ( auth_field = 'ZVKORG' view_field = 'VKORG' )
1. SAP EWM (Extended Warehouse Management)
3. SAP VIM (Vendor Invoice Management)
>>> RECENSIONI DEI LIBRI su Amazon Kindle <<<
Ebook: SAP MM: https://www.amazon.it/dp/B0C3MKD9BR#customerReviews
Ebook: SAP MII: https://www.amazon.it/dp/B0C4392MY9#customerReviews
Ebook: SAP VIM: https://www.amazon.it/dp/B0C6FBK8QN#customerReviews
Nessun commento:
Posta un commento