venerdì 2 dicembre 2016

ALV, inserire pulsante e selezionare righe

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