Un wrapper leggero attorno a CL_SALV_TABLE che semplifica la configurazione delle ALV grid nei programmi ABAP.
Riduce il codice ripetitivo esponendo metodi puliti per le operazioni di configurazione più comuni,
mantenendo allo stesso tempo l'accesso completo agli oggetti SAP SALV sottostanti per i casi avanzati.
- Panoramica
- Installazione
- Modalità di Visualizzazione
- Riferimento Metodi
- Ordine di Chiamata Tipico
- Programma di Esempio Completo
La classe risiede nell'Include CL_BUILD_SALV ed è definita come classe locale lcl_build_salv.
Mantiene un riferimento alla tabella interna e all'istanza di CL_SALV_TABLE (mo_alv),
e incapsula i passi di configurazione SALV più frequenti in metodi dedicati.
Sono supportate due modalità di visualizzazione:
- Full-screen — nessun container necessario, chiamare
build( )senza fornire un nome container - Container incorporato — fornire il nome di un elemento screen custom container nel costruttore
Copiare l'Include nel proprio programma e aggiungerlo al TOP Include o direttamente prima della logica principale. La classe viene istanziata passando un riferimento alla tabella interna da visualizzare.
DATA: lt_data TYPE TABLE OF my_structure.
DATA: lo_salv TYPE REF TO lcl_build_salv.
" Riempire lt_data qui...
lo_salv = NEW lcl_build_salv( ir_table = REF #( lt_data ) ).
lo_salv->build( ).
lo_salv->display( ).lo_salv = NEW lcl_build_salv( ir_table = REF #( lt_data ) ).lo_salv = NEW lcl_build_salv(
ir_table = REF #( lt_data )
iv_container_name = 'MY_CONTAINER' ). " Nome del custom control in Screen PainterNota: Alcuni metodi (
set_screen_status) sono disponibili solo in modalità full-screen. Chiamarli in modalità container sollevacx_sy_ref_is_initial.
Inizializza il wrapper. Deve essere chiamato per primo.
| Parametro | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ir_table |
REF TO data |
Sì | Riferimento alla tabella interna da visualizzare |
iv_container_name |
string |
No | Nome dell'elemento screen custom container. Omettere per la modalità full-screen |
Solleva: cx_sy_ref_is_initial se ir_table non è legato.
Crea l'istanza di CL_SALV_TABLE. Usa automaticamente la modalità container o full-screen
in base al fatto che iv_container_name sia stato fornito nel costruttore.
Deve essere chiamato prima di qualsiasi altro metodo che accede all'oggetto ALV.
Solleva: cx_sy_ref_is_initial, cx_salv_msg, cx_root
Visualizza la ALV sullo schermo. Deve essere chiamato dopo build( ).
Solleva: cx_sy_ref_is_initial se build( ) non è stato chiamato prima.
Aggiorna la visualizzazione ALV per riflettere le modifiche apportate alla tabella interna sottostante.
Deve essere chiamato dopo build( ).
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_refresh_mode |
salv_de_refresh |
if_salv_c_refresh=>full |
Profondità del refresh. Valori: none (0), soft (1 — solo celle visibili), full (2 — ridisegno completo) |
is_stable |
lvc_s_stbl |
— (opzionale) | Impostare row/col = abap_true per preservare la posizione di scroll dopo il refresh |
" Full refresh, posizione di scroll preservata
lo_salv->refresh(
is_stable = VALUE #( row = abap_true col = abap_true ) ).
" Soft refresh (più veloce), posizione di scroll preservata
lo_salv->refresh(
iv_refresh_mode = if_salv_c_refresh=>soft
is_stable = VALUE #( row = abap_true col = abap_true ) ).Solleva: cx_sy_ref_is_initial se build( ) non è stato chiamato prima.
Solo modalità full-screen. Solleva
cx_sy_ref_is_initialse chiamato in modalità container.
Imposta il PF-STATUS e l'insieme delle funzioni toolbar abilitate.
Per creare un PF-STATUS personalizzato: SE41 → copiare il programma SAPLSALV_METADATA_STATUS, status SALV_TABLE_STANDARD.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_pfstatus |
LIKE sy-pfkey |
— (obbligatorio) | Nome del PF-STATUS da attivare |
iv_set_functions |
salv_de_function |
cl_salv_table=>c_functions_all (default se omesso) |
Funzioni toolbar da abilitare. Valori possibili: cl_salv_table=>c_functions_all, c_functions_default, c_functions_none. Nota: c_functions_default (spazio) non è distinguibile da "non fornito" — passarlo esplicitamente se necessario |
Solleva: cx_sy_ref_is_initial
Imposta il comportamento di selezione delle righe della ALV grid.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_selection_mode |
salv_de_selection_mode |
if_salv_c_selection_mode=>single |
Modalità di selezione. Valori possibili: none, single, multiple, cell, row_column |
Solleva: cx_sy_ref_is_initial
Configura il salvataggio delle varianti di layout. La chiave layout (sy-repid) viene sempre impostata automaticamente.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_default |
abap_bool |
abap_true |
Contrassegna il layout come predefinito |
iv_save_restriction |
LIKE if_salv_c_layout=>restrict_none |
if_salv_c_layout=>restrict_none (default se omesso) |
Chi può salvare i layout. Valori: restrict_none, restrict_user_dependant, restrict_layout_only |
Per impostare un layout iniziale, usare
get_layout( )->set_initial_layout( )dopo aver chiamatoset_layout_settings( ).
Solleva: cx_sy_ref_is_initial
Configura il titolo della ALV, le righe alternate e l'adattamento della larghezza delle colonne.
Nota: Non usare
iv_fit_column = abap_trueinsieme aset_optimize_columns( )— sono in conflitto. Usare uno o l'altro.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_title |
lvc_title |
— (opzionale) | Titolo visualizzato sopra la ALV (max 70 caratteri, solo modalità full-screen) |
iv_striped |
abap_bool |
abap_true |
Abilita la colorazione alternata delle righe |
iv_fit_column |
abap_bool |
abap_true |
Adatta automaticamente la larghezza delle colonne alla dimensione della tabella |
Solleva: cx_sy_ref_is_initial
Abilita o disabilita tutte le funzioni della toolbar in una sola chiamata.
Per un controllo granulare sulle singole funzioni, usare invece get_functions( ).
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_enabled |
abap_bool |
abap_true |
abap_true = abilita tutto, abap_false = disabilita tutto |
Solleva: cx_sy_ref_is_initial
Restituisce l'oggetto CL_SALV_LAYOUT sottostante per il controllo completo del layout.
Usarlo per le impostazioni non coperte da set_layout_settings( ), come il caricamento di una variante specifica all'avvio.
Le modifiche hanno effetto immediato.
Restituisce: REF TO cl_salv_layout
Solleva: cx_sy_ref_is_initial
lo_salv->set_layout_settings( ).
lo_salv->get_layout( )->set_initial_layout( '/MY_VARIANT' ).Restituisce l'oggetto CL_SALV_FUNCTIONS sottostante per il controllo granulare della toolbar.
Le modifiche hanno effetto immediato — non è necessaria nessuna chiamata aggiuntiva.
Restituisce: REF TO cl_salv_functions
Solleva: cx_sy_ref_is_initial
lo_salv->get_functions( )->set_sort_asc( abap_false ).
lo_salv->get_functions( )->set_export( abap_true ).Ottimizza la larghezza di tutte le colonne in una sola chiamata.
Nota: Non combinare con
iv_fit_column = abap_trueinset_display_settings( ). Usare uno o l'altro. Per l'ottimizzazione per singola colonna, usareget_columns( )e chiamareset_optimized( )sulle singole colonne.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_optimize |
abap_bool |
abap_true |
abap_true = ottimizza tutte le colonne |
Solleva: cx_sy_ref_is_initial
Restituisce l'oggetto CL_SALV_COLUMNS_TABLE sottostante per il controllo completo per-colonna.
Le modifiche hanno effetto immediato.
Per accedere ai metodi specifici della tabella (colore, tipo cella, icona, ecc.), fare il cast della singola colonna
a CL_SALV_COLUMN_TABLE.
Restituisce: REF TO cl_salv_columns_table
Solleva: cx_sy_ref_is_initial
" Configurare una singola colonna
DATA(lo_columns) = lo_salv->get_columns( ).
DATA(lo_col) = CAST cl_salv_column_table( lo_columns->get_column( 'FIELDNAME' ) ).
lo_col->set_visible( abap_false ).
lo_col->set_long_text( |La mia etichetta| ).
" Abilitare una colonna checkbox
" NOTA: il campo deve già esistere nel tipo della tabella interna come TYPE c LENGTH 1 (o abap_bool).
" Esempio tipo: TYPES: BEGIN OF ty_riga, ... checkbox TYPE c LENGTH 1, ... END OF ty_riga.
DATA(lo_chk) = CAST cl_salv_column_table( lo_columns->get_column( 'CHECKBOX' ) ).
lo_chk->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).Restituisce l'oggetto CL_SALV_EVENTS_TABLE per registrare gli handler degli eventi tramite SET HANDLER.
Gli handler registrati sull'oggetto restituito sono attivi immediatamente.
Restituisce: REF TO cl_salv_events_table
Solleva: cx_sy_ref_is_initial
SET HANDLER lo_handler->on_double_click FOR lo_salv->get_events( ).
SET HANDLER lo_handler->on_link_click FOR lo_salv->get_events( ).Eventi comuni: double_click, link_click, before_salv_function, after_salv_function, added_function, top_of_page
Abilita o disabilita l'input su una singola colonna tramite l'extended grid API.
Deve essere chiamato dopo build( ).
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
iv_columnname |
lvc_fname |
— (obbligatorio) | Nome del campo della colonna da configurare |
iv_enabled |
abap_bool |
abap_true |
abap_true = celle diventano editabili, abap_false = sola lettura |
" Rende la colonna editabile
lo_salv->set_column_editable( iv_columnname = 'VALUT' ).
" La rimette in sola lettura
lo_salv->set_column_editable( iv_columnname = 'VALUT' iv_enabled = abap_false ).Solleva: cx_sy_ref_is_initial se build( ) non è stato chiamato prima, cx_salv_not_found se la colonna non esiste.
Restituisce la lista dei campi (componenti) della tabella interna ALV tramite introspezione RTTI. Utile per ciclare su tutte le colonne dinamicamente senza hardcodare i nomi dei campi.
Può essere chiamato in qualsiasi momento dopo il costruttore — non richiede build( ).
Restituisce: abap_compdescr_tab — tabella di descrittori di campo (nome, tipo, lunghezza, ecc.)
DATA(lo_columns) = lo_salv->get_columns( ).
LOOP AT lo_salv->get_alv_table_components( ) ASSIGNING FIELD-SYMBOL(<fs_field>).
DATA(lo_col) = CAST cl_salv_column_table( lo_columns->get_column( <fs_field>-name ) ).
lo_col->set_optimized( abap_true ).
ENDLOOP." 1. Istanziare
lo_salv = NEW lcl_build_salv( ir_table = REF #( lt_data ) ).
" 2. Build (obbligatorio prima di tutto il resto)
lo_salv->build( ).
" 3. Configurare (qualsiasi ordine, tutti opzionali)
lo_salv->set_screen_status( iv_pfstatus = 'ZMY_STATUS' ).
lo_salv->set_selection_mode( if_salv_c_selection_mode=>multiple ).
lo_salv->set_layout_settings( ).
lo_salv->set_display_settings( iv_title = 'Il mio report' ).
lo_salv->set_all_functions( ).
lo_salv->set_optimize_columns( ).
" 4. Registrare gli handler degli eventi (opzionale)
SET HANDLER lo_handler->on_double_click FOR lo_salv->get_events( ).
" 5. Visualizzare
lo_salv->display( ).Il seguente esempio dimostra tutte le funzionalità della classe in un singolo report ABAP full-screen.
*&---------------------------------------------------------------------*
*& Report Z_EXAMPLE_SALV_WRAPPER
*&---------------------------------------------------------------------*
REPORT z_example_salv_wrapper.
" Include della classe wrapper
INCLUDE cl_build_salv.
*----------------------------------------------------------------------*
* Tipi di dato
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_employee,
emp_id TYPE n LENGTH 6,
name TYPE char40,
dept TYPE char20,
salary TYPE p DECIMALS 2,
active TYPE abap_bool,
END OF ty_employee.
*----------------------------------------------------------------------*
* Dati globali
*----------------------------------------------------------------------*
DATA: gt_employees TYPE TABLE OF ty_employee,
go_salv TYPE REF TO lcl_build_salv.
*----------------------------------------------------------------------*
* Classe handler degli eventi
*----------------------------------------------------------------------*
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
on_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column,
on_before_function
FOR EVENT before_salv_function OF cl_salv_events
IMPORTING e_salv_function.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD on_double_click.
MESSAGE |Doppio click: riga { row }, colonna { column }| TYPE 'I'.
ENDMETHOD.
METHOD on_before_function.
" Intercettare le azioni della toolbar se necessario
CASE e_salv_function.
WHEN 'ZDELETE'.
" Logica personalizzata prima dell'eliminazione
ENDCASE.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*
* Initialization — caricamento dati demo
*----------------------------------------------------------------------*
INITIALIZATION.
gt_employees = VALUE #(
( emp_id = '000001' name = 'Mario Rossi' dept = 'IT' salary = '3500.00' active = abap_true )
( emp_id = '000002' name = 'Laura Bianchi' dept = 'Finance' salary = '4200.00' active = abap_true )
( emp_id = '000003' name = 'Carlo Verdi' dept = 'HR' salary = '2900.00' active = abap_false )
( emp_id = '000004' name = 'Anna Neri' dept = 'IT' salary = '3800.00' active = abap_true ) ).
*----------------------------------------------------------------------*
* Start of selection — costruzione e visualizzazione della ALV
*----------------------------------------------------------------------*
START-OF-SELECTION.
TRY.
"--- 1. Istanziare il wrapper (modalità full-screen, nessun container) ---
go_salv = NEW lcl_build_salv( ir_table = REF #( gt_employees ) ).
"--- 2. Costruire l'oggetto ALV ---
go_salv->build( ).
"--- 3. PF-STATUS (solo full-screen) ---
" Richiede un GUI status personalizzato 'ZEMP_STATUS' in questo programma.
" Copiare da SE41: programma SAPLSALV_METADATA_STATUS, status SALV_TABLE_STANDARD.
go_salv->set_screen_status(
iv_pfstatus = 'ZEMP_STATUS'
iv_set_functions = cl_salv_table=>c_functions_all ).
"--- 4. Modalità di selezione ---
go_salv->set_selection_mode( if_salv_c_selection_mode=>multiple ).
"--- 5. Impostazioni layout ---
go_salv->set_layout_settings(
iv_default = abap_true
iv_save_restriction = if_salv_c_layout=>restrict_user_dependant ).
"--- 6. Impostazioni di visualizzazione ---
go_salv->set_display_settings(
iv_title = 'Lista Dipendenti'
iv_striped = abap_true
iv_fit_column = abap_true ).
"--- 7. Funzioni toolbar ---
go_salv->set_all_functions( abap_true ).
" Per controllo granulare usa get_functions( ) — i metodi disponibili dipendono
" dalla release SAP (es. set_sort_asc, set_find, set_layout, set_graphics).
" Verificare in SE24 -> CL_SALV_FUNCTIONS per l'elenco esatto dei metodi.
"--- 8. Configurazione colonne ---
DATA(lo_columns) = go_salv->get_columns( ).
LOOP AT go_salv->get_alv_table_components( ) ASSIGNING FIELD-SYMBOL(<fs_field>).
TRY.
DATA(lo_col) = CAST cl_salv_column_table(
lo_columns->get_column( <fs_field>-name ) ).
CASE <fs_field>-name.
WHEN 'EMP_ID'.
lo_col->set_visible( abap_false ). " Nasconde la colonna
WHEN 'DEPT'.
lo_col->set_short_text( 'Rep.' ). " Rinomina le etichette
lo_col->set_medium_text( 'Reparto' ).
lo_col->set_long_text( 'Reparto' ).
WHEN 'SALARY'.
lo_col->set_color( VALUE lvc_s_colo( col = '5' int = '1' inv = '0' ) ). " Verde
ENDCASE.
lo_col->set_optimized( abap_true ). " Ottimizza larghezza per ogni colonna
CATCH cx_salv_not_found.
ENDTRY.
ENDLOOP.
"--- 9. Registrare gli handler degli eventi ---
SET HANDLER lcl_handler=>on_double_click FOR go_salv->get_events( ).
SET HANDLER lcl_handler=>on_before_function FOR go_salv->get_events( ).
"--- 10. Visualizzare ---
go_salv->display( ).
CATCH cx_salv_msg INTO DATA(lx_salv).
MESSAGE lx_salv->get_text( ) TYPE 'E'.
CATCH cx_sy_ref_is_initial INTO DATA(lx_ref).
MESSAGE 'Oggetto ALV non inizializzato.' TYPE 'E'.
CATCH cx_root INTO DATA(lx_root).
MESSAGE lx_root->get_text( ) TYPE 'E'.
ENDTRY.Variante container incorporato: per incorporare la ALV in uno screen, passare
iv_container_namenel costruttore e chiamarebuild( )e i metodi di configurazione nel moduloPBOdello screen. Non chiamareset_screen_status( )in modalità container.
" Nel modulo PBO:
go_salv = NEW lcl_build_salv(
ir_table = REF #( gt_employees )
iv_container_name = 'MY_CONTAINER' ).
go_salv->build( ).
go_salv->set_display_settings( iv_title = 'Dipendenti' ).
go_salv->set_all_functions( ).
go_salv->display( ).
" Dopo una modifica ai dati:
go_salv->refresh(
is_stable = VALUE #( row = abap_true col = abap_true ) ).