Recentemente ho incontrato, di nuovo, il problema di aggiungere un pulsante ad un report ALV e di dover gestire la selezione delle righe per eseguire dei comandi particolari. (per la precisione uno spostamento della data scadenza effetti costruito tramite una call transaction della FB09, ma questo è un altro argomento).
Tutte cose che ho già fatto, su cui esiste una tonnellata di materiale on-line, ma che ogni volta mi ritrovo a dover cercare, riguardare e praticamente costruire daccapo.
Vediamo quindi come, in pochi passaggi, è possibile aggiungere un pulsante e gestire la selezione delle righe in una tabella ALV.
Nota bene: l'esempio è riferito ad un programma ALV standard, mentre con la programmazione ad oggetti l'aggiunta di un pulsante può essere fatta da un METHOD di "handle toolbar", ma anche qui andiamo "fuori seminato".
Esempio: leggere i dati dalla tabella dei voli (SBOOK), aggiungere il pulsante, gestire la selezione righe.
Per aggiungere il pulsante ho creato uno STATUS specifico per il programma.
Nome report di esempio: Z_31
ho evidenziato in
VERDE le parti che riguardano il pulsante
AZZURRO la gestione della selezione righe
*&---------------------------------------------------------------------*
*& Report prova Z_31: gestione ALV con pulsante e selezione righe
*&---------------------------------------------------------------------*
REPORT z_31.
*----------------------------------------------------------------------*
* Variabili globali
*----------------------------------------------------------------------*
DATA: t_fieldcat TYPE slis_t_fieldcat_alv,
i_layout TYPE slis_layout_alv,
l_repid TYPE sy-repid,
x_fieldcat TYPE slis_fieldcat_alv.
* Tabella di output.
DATA: BEGIN OF tb_out OCCURS 0,
sel TYPE xfeld, "Selezione riga
carrid LIKE sbook-carrid,
connid LIKE sbook-connid,
END OF tb_out.
*----------------------------------------------------------------------*
* Inizio programma
*----------------------------------------------------------------------*
START-OF-SELECTION.
*--selezione dati
SELECT * FROM sbook INTO CORRESPONDING FIELDS OF TABLE tb_out.
l_repid = sy-repid.
* Creazione catalogo da campi tabella interna
* Attenzione: usare lettere maiuscole per I_INTERNAL_TABNAME!!!
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = l_repid
i_buffer_active = ''
i_internal_tabname = 'TB_OUT'
i_inclname = l_repid
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = t_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'Errore creazione catalogo' TYPE 'S'.
LEAVE TO SCREEN 0.
ENDIF.
PERFORM f1000_layout_init CHANGING i_layout.
*--Call FM display ALLV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = l_repid
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = t_fieldcat
is_layout = i_layout
i_callback_pf_status_set = 'SUB_PF_STATUS'
TABLES
t_outtab = tb_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE 'Errore output ALV.' TYPE 'E'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form sub_pf_status
*&---------------------------------------------------------------------*
* Form per impostare lo STATUS
*----------------------------------------------------------------------*
FORM sub_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD'.
ENDFORM. "sub_pf_status
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* Form di gestione comandi ALV
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
IF r_ucomm EQ '&PULSANTE'.
LOOP AT tb_out WHERE SEL = 'X'.
* scrivere qui codice da eseguire per righe selezionate
ENDLOOP.
ENDIF.
ENDFORM. "User_command
*&---------------------------------------------------------------------*
*& Form F1000_LAYOUT_INIT
*&---------------------------------------------------------------------*
* Impostare layout
*----------------------------------------------------------------------*
FORM f1000_layout_init USING i_layout TYPE slis_layout_alv.
CLEAR i_layout.
i_layout-colwidth_optimize = 'X'.
i_layout-detail_popup = 'X'.
i_layout-box_fieldname = 'SEL'. "Nome campo per selezione
* i_layout-edit = 'X'. "Tutta ALV editabile?
i_layout-zebra = 'X'.
endform. " F1000_LAYOUT_INIT
Lo status ZSTANDARD può essere creato ex novo con un doppio click da sorgente oppure, è più pratico anche se con diversi passaggi, si può genere per copia da uno status già esistente.
Vediamo i passaggi per la copia, transazione SE90
Sistem Info Repository
Libreria programmi
Sottooggetti per programmi
Stato GUI inserire nome programma SAPLKKBL ed eseguire
selezionare lo stato STANDARD e copiare
inserire nome programma di destinazione e nome stato
cambiamo i testi in tedesco che si porta dietro la copia
cancelliamo i pulsanti che non ci interessano
e andiamo a inserire un nuovo pulsante:
testo statico
impostiamo nome, scegliamo icona e altri testi.
attribuiamo anche un tasto funzione
salviamo e attiviamo
questo è il layout con il nuovo pulsante e la possibilità di selezionare le righe:
la tabella di output si presenta così con le righe selezionate:
Nessun commento:
Posta un commento