lunedì 6 marzo 2017

Variante lancio report di default per utente.


Per facilitare l'immissione dei dati di lancio nei report o per riprendere sempre gli stessi valori ci sono in SAP vari strumenti.


Alcuni sono a livello di codice sorgente, pertanto di competenza dei programmatori, altri sono disponibili lato utente.


  • La definizione di valori di default: a livello di codice e che valgono sempre quando viene richiamato un report.
         PARAMETERS:  F_FILE LIKE RLGRAP-FILENAME DEFAULT 'C:\DATA\DATA.TXT'.
  • La compilazione dei valori nella sezione evento INITIALIZATION. Si tratta di una parte di codice che viene eseguita prima di mostrare la pagina iniziale all'utente, quindi si possono definire valori o popolare le SELECT-OPTIONS, esempio per la selezione di tipi di ordine di acquisto:
     SELECT-OPTIONS:    s_bsart  FOR  ekko-bsart.

     INITIALIZATION.

     s_bsart-sign   = 'I'.
     s_bsart-option = 'EQ'.

     s_bsart-low = 'NB'.  APPEND s_bsart.
     s_bsart-low = 'UB'.  APPEND s_bsart.
  • Varianti: SAP consente di salvare i parametri di lancio dei report in quelle che vengono chiamate varianti, l'utente può richiamare poi la variante e caricare nella pagina i parametri precedentemente salvati.

I primi 2 metodi sono a livello di codice ABAP e valgono per tutti gli utenti che lanciano il report, il terzo metodo è invece più flessibile, ma si deve sempre passare attraverso alcuni passaggi (aprire varianti, selezionare quella interessata, confermare) che possono risultare "noiosi".

Ho pensato quindi di personalizzare i report (chiaramente solo gli Z aggiungendo una riga di codice con una INCLUDE), in modo da poter gestire una variante con un nome particolare (che contiene il nome utente) e che viene automaticamente chiamata all'avvio del programma.

In questo modo ogni utente può salvarsi la sua variante personalizzata e, all'avvio del report, trovarsi già caricati i valori che lui desidera. Per esempio mi torna particolarmente utile in fase di test di un report, quando voglio lanciarlo sempre con la stessa selezione di dati iniziale.

La codifica che ho pensato è questa: la variante deve essere salvata con il nome V_<username>, il codice prevede inoltre, se non esiste la variante V_<username>, di provare a cercare la V_DEFAULT.

questo il codice sorgente da trattare poi come INCLUDE nel report:

*--------------------------------------------------------------------+
* Include    : Z_INIT                                                |
* Autore     : Fabio Giacobbe - 21/03/2013                           |
* Descrizione: Gestione lancio variante composta da V_+<username>, da|
*              includere nella INITIALIZATION.                       |
*--------------------------------------------------------------------+
DATA: wafg_repid   LIKE rsvar-report,
      wafg_variant LIKE rsvar-variant.

* Carico la variante solo all'avvio del programma.
if sy-slset IS INITIAL.
   wafg_repid = sy-repid.
   concatenate 'V_' sy-uname into wafg_variant.
   CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
       EXPORTING
          report               = wafg_repid
          variant              = wafg_variant
       EXCEPTIONS
          variant_not_existent = 01
          variant_obsolete     = 02.
* Se non esiste la variante provo a caricare V_DEFAULT.
   if sy-subrc <> 0.
      wafg_variant = 'V_DEFAULT'.
      CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
          EXPORTING
             report               = wafg_repid
             variant              = wafg_variant
          EXCEPTIONS
             variant_not_existent = 01
             variant_obsolete     = 02.
   endif.
endif.

Modifica da inserire nei report Z:

INITIALIZATION.
include z_init.

Nota:
  • ho usato la definizione delle variabili con un prefisso wafg_ per evitare eventuali errori di dichiarazione duplicata di variabili.
  • se il report prevede l'inizializzazione di alcuni campi questi devono essere posizionati prima della include, altrimenti vengono sovrascritti i parametri salvati nella variante. Esempio:

     INITIALIZATION.
     * Popolo la select-option della data con data finale=oggi.
     clear s_BUDAT.
     s_BUDAT-SIGN   = 'I'.
     s_BUDAT-OPTION = 'BT'.
     s_BUDAT-HIGH = sy-datum.
     append s_BUDAT.

     include z_init.


2 commenti:

  1. Mi sembra veramente interessante
    Sarà un piacere contattarla personalmente per avere altre delucidazioni
    Cordialmente
    Ivan Bianco

    RispondiElimina
    Risposte
    1. sempre a sua disposizione, caro sig. Bianco.
      ...mi sarei però aspettato un commento magari sui crostoli!

      a presto.

      Elimina