Cerca nel blog

martedì 27 settembre 2022

List Viewer - ALV con IDA

 

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_supportediv_ddic_table_name 'VBAK').

*Creare ALV Grid di tipo IDA
  
DATA(o_ida) = cl_salv_gui_table_ida=>createiv_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.

  
FREElrg_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_nameiv_name 'VKORG' it_ranges lrg_vkorg[] ).
  o_sel
->add_ranges_for_nameiv_name 'ERDAT' it_ranges s_erdat[] ).
  o_sel
->add_ranges_for_nameiv_name 'KUNNR' it_ranges s_kunnr[] ).

  o_sel
->get_collected_rangesIMPORTING et_named_ranges DATA(lt_named_ranges) ).

*Controlla le capacità del database
  
CHECK cl_salv_gui_table_ida=>db_capabilities( )->is_table_supportediv_ddic_table_name 'VBAK').

*Creare ALV Grid di tipo IDA
  
DATA(o_ida) = cl_salv_gui_table_ida=>createiv_table_name 'VBAK' ).

*Setto i filtri nell'ALV grid
  o_ida
->set_select_optionsit_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.

  
FREElt_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_supportediv_ddic_table_name 'VBAK').

*Creare ALV Grid di tipo IDA
  
DATA(o_ida) = cl_salv_gui_table_ida=>createiv_table_name 'VBAK' ).

*Setto i campi da visualizzare nell'ALV grid
  o_ida
->field_catalog( )->set_available_fieldsEXPORTING its_field_names lt_field_names ).

*Setto i campi che devono essere ordinati nell'ALV grid
  o_ida
->default_layout( )->set_sort_orderEXPORTING 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.

    
DATAo_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.
    
DATAls_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_rowIMPORTING es_row ls_vbak ).
        
DATA(o_ida_item) = cl_salv_gui_table_ida=>createiv_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_optionsit_ranges lt_named_ranges ).
          o_ida_item
->fullscreen( )->display( ).
        
ELSE.
          
MESSAGE 'Nessuna riga selezionata' TYPE 'I'.
        
ENDIF.
      
ENDIF.
    
ENDIF.
  
ENDMETHOD.

  
METHOD  handle_action.
    
DATAls_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_rowIMPORTING es_row ls_vbak ).
        
DATA(o_ida_item) = cl_salv_gui_table_ida=>createiv_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_optionsit_ranges lt_named_ranges ).
          o_ida_item
->fullscreen( )->display( ).
        
ELSE.
          
MESSAGE 'Nessuna riga selezionata' TYPE 'I'.
        
ENDIF.
      
ENDIF.
    
ENDIF.

    
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

  
FREElt_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_supportediv_ddic_table_name 'VBAK').

*Creare ALV Grid di tipo IDA
  
DATA(o_ida) = cl_salv_gui_table_ida=>createiv_table_name 'VBAK' ).

*Setto i campi da visualizzare nell'ALV grid
  o_ida
->field_catalog( )->set_available_fieldsEXPORTING its_field_names lt_field_names ).

*Setto i campi che devono essere ordinati nell'ALV grid
  o_ida
->default_layout( )->set_sort_orderEXPORTING 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_modeEXPORTING iv_mode 'SINGLE' ).

*Istanziare un gestore di eventi classe e un gestore di set
  
DATA(o_handler) = NEW lcl_handle_actionio_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_buttonEXPORTING 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.
    
DATAls_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.

  
FREElt_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_supportediv_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_fieldsEXPORTING its_field_names lt_field_names ).

*Setto i campi che devono essere ordinati nell'ALV grid
  o_ida
->default_layout( )->set_sort_orderEXPORTING 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_supportediv_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_objectEXPORTING
                                        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' 




Nessun commento:

Posta un commento