Link veloci:
Tutti i programmi mandati in batch dal Webdevono sottostare a quese regole
I programmi batch si suddividono in 2 categorie:
Elaborazioni
Stampe
Le stampe a loro volta si suddividono in 2 tipi:
Stampe in Crystal Report
Stampe RDML (vecchia maniera con PRINT)
Tutti i programmi batch DEVONO essere funzioni appartenenti a processi SAA/CUA pertanto:
- se possiamo richiamare una vecchia funzione ed il processo è SAA/CUA: OK (WAM fa SUBMIT a vecchia function)
- se possiamo richiamare una vecchia funzione ma il processo è ACT/BAR: occorre dividere logicamente la vecchia funzione tra parte interattiva per la richiesta dei parametri (che resta nella funzione originale del processo Action Bar) e elaborazione batch (in una nuova funzione in processo SaaCua BT_nnnnn (vedi sotto). Per fare ciò seguire queste indicazioni di massima:
creare una nuova funzione in un nuovo processo BT_nnnnnn (vedi paragrafo seguente) SOLO per la parte batch (copiare la funzione originale ActionBar e da questa copia togliere la parte contenuta all'interno di IF *JOBMODE = 'I', fino all'ELSE)
modificare il programma originale ActionBar, aggiornando il nome di processo e funzione mandati in SUBMIT con i riferimenti dei nomi relativi alla nuova procedura SaaCua e togliendo tutto quanto sta dopo l'ELSE relativo a IF *JOBMODE = 'I'
verificare se nella nuova funzione BTxxxxx ci sono CALL e/o SUBMIT a funzioni che appartendono a procesi Action Bar: se sì questo provoca errori poi in esecuzione su AS400, quindi valutare la fattibilità di trasformare la CALL a eventuale SUBROUTINE interna, o in alternativa spostare la vecchia funzione di elaborazione richiamata dal processo originale Action Bar ad uno SAA/CUA
- se dobbiamo riscrivere la funzione (RDML/X per utilizzo di Reusable-Part o per utilizzo di Crystal Report): creare una nuova funzione in processo BT_nnnnn
I nuovi processi devono essere creati seguendo queste regole:
Nome Processo: BT_nnnnn dove nnnnn (5 caratteri al massimo) è la seconda parte del processo collegato (Es: CO_CLI ===> BT_CLI)
Descrizione Processo: Il nome del processo collegato (Es: CO_CLI)
In caso di programmi riutilizzati, che inglobano anche l'interfaccia grafica, va riscritta solo l'interfaccia tramite una WAM.
* NOTA *
Nel caso si debba copiare una funzione, APPENA copiata, lanciare il form LANSA EDUTCPYTF per copiare eventuali testi fissi.
STRUTTURA DEL PROGRAMMA
La WAM di interfaccia per la richiesta di parametri deve essere creata utilizzando la template EDVFLWSTP
Questi campi devono essere sempre passati per mandare in submit il programma:
£R_IDCDAZ := £DMWAMHND.up_DatiSessione.up_Azienda
£R_IDDAZ := £DMWAMHND.up_DatiSessione.up_DescrAzienda
£R_IDCDEP := £DMWAMHND.up_DatiSessione.up_Deposito
£R_IDDDEP := £DMWAMHND.up_DatiSessione.up_DescrDeposito
£R_IDMLDEP := £DMWAMHND.up_DatiSessione.up_MultiDeposito
£R_USRJOBQ := *EDUSRJOBQ oppure *EDUSRJOBQPR
La submit va formattata in questa maniera:
SUBMIT PROCESS(<Processo>) FUNCTION(<Funzione>) EXCHANGE(<Campi: tra cui quelli sopra>) JOBD(*USRPRF) JOBQ(£R_USRJOBQ) OUTQ(*CURRENT)
In modo da poter gestire correttamente la coda lavori (sia su AS/400) che su PC
*** IMPORTANTE ***
Per ogni Utente possono essere assegnate 2 code lavori: una per i lavori normali ed una per lavori prioritari.
La definizione di Coda Prioritaria è un attributo della coda ed il programma controlla che le code vengano
imputate correttamente: code "normali" su "Coda Lavori" code "prioritarie" su "Coda prioritaria"
La variabile di sistema *EDUSRJOBQ restituisce quella normale,
La variabile di sistema *EDUSRJOBQPR restituisce quella prioritaria.
La scelta su quale coda mandare in submit un programma è a discrezione del programmatore
MA dovete comunque attenervi a queste regole:
Nella coda prioritaria devono essere esegute le stampe "veloci" ovvero:
- Stampa delle etichette colli
- Stampa delle etichette in genere
- Stampa della modulistica:
- Bolle
- Fatture
- Buoni
Tutto il resto (Cartellini compresi) DEVE RIMANERE NELLA CODA DI DEFAULT
Programmi che generano stampe
In generale
Utilizzare la weblet "ed_emissione" per richiedere la destinazione di stampa (File PDF, Excel, Stampante + scelta della stampante)
Questa weblet viene formattata tramite il metodo £DMWAMHND.up_Emissione.um_FormattaFP <parametri>
Spiegazione dei parametri:
Spiegazione dei metodi:
um_GetEmissione: restituisce F/E/S/M in base alla scelta dei radio-button
um_IsPDFChecked: TRUE se il checkbox "File PDF" è selezionato. Vale per scelta multipla.
um_IsXLSChecked: TRUE se il checkbox "Formato XLS" è selezionato. Vale per scelta multipla.
um_IsSTPChecked: TRUE se il checkbox "Stampante" è selezionato. Vale per scelta multipla.
um_GetNumCopie: Ritorna il numero di Copie selezionato
um_GetIDPrinter: Ritorna l'ID Stampante selezionata.
Per passare in submit i valori utilizzare i seguenti campi
£CRPEDEST := £DMWAMHND.up_Emissione.um_GetEmissione
£CRPECOPIE := £DMWAMHND.up_Emissione.um_GetNumCopie
£CRPEIDST := £DMWAMHND.up_Emissione.um_GetIDPrinter
Questi devono essere aggiunti all'EXCHANGE della SUBMIT
Stampe vecchia maniera
Una volta mandata in submit la funzione di stampa (secondo le regole sopracitate) mandare in coda la funzione EDWEB05 (per la trasformazione in PDF dello spool)
con il seguente costrutto:
IF (*CPUTYPE = "AS400")
£R_CDUTEN := £ThisHandler.avLoggedOnUser
£R_IFSPATH := £DMWAMHND.up_UserPathHandler.um_GetUserSpool( £R_CDUTEN ) + *pathdelim
SUBMIT PROCESS(ED_WEB) FUNCTION(EDWEB05) EXCHANGE(£R_CDUTEN £R_IFSPATH) JOBD(*USRPRF) JOBQ(£R_USRJOBQ) OUTQ(*CURRENT)
ENDIF
Stampe in Crystal Reports
Nel caso di scelta multipla di elaborazione, vi ricordo che il motore di stampa cancella i file una volta elaborata, quindi ricordatevi di riscaricare le liste ogni volta che vi servono.
Esempio:
....
<Elaborazione che carica le liste>
....
if (emissione_su_File)
£PathDati := £vi_UserPath.um_GetUserTmpUnique( *USER )
<scarico liste in £PATHDATI>
£Report.um_GeneraReport pEmissione(F) ....
endif
if (emissione_su_Excel)
£PathDati := £vi_UserPath.um_GetUserTmpUnique( *USER )
<scarico liste in £PATHDATI>
£Report.um_GeneraReport pEmissione(E) ....
endif
if (emissione_su_Stampante)
£PathDati := £vi_UserPath.um_GetUserTmpUnique( *USER )
<scarico liste in £PATHDATI>
£Report.um_GeneraReport pEmissione(S) pIDStampate(£CRPEIDST) pCopie(£CRPECOPIE) ....
endif
Flusso logico delle stampe
- Preparazione delle Working-List
- Generazione dei file DBF
- Richiamo del Motore Crystal Report
Programmazione in DModa
Oggetti utilizzati: ED_UTIL5/EDCRYLS
Inserire la seguente GROUP_BY:
GROUP_BY NAME(£GRPCRY) FIELDS(£CRPENOME £CRPEDEST £CRPENSTP £CRPEDRIV £CRPEPORT £CRPECOPIE £CRPEFASC £CRPEFILE £CRPETIT £CRPEDITTA £CRPEFUNC £CRPEROOT £CRPEDBPTH)
Salvare le working-list tramite la BIF UD_TRANSFORM_LIST
!!! PRIMA DI TUTTO ASSEGNARE AL CAMPO £CRPEDBPTH LA VARIABILE MULTILINGUA *TEMP_DIR
SCARICARE OGNI DBF FORMATTANDO IL PERCORSO IN QUESTA MANIERA:
USE BUILTIN(TCONCAT) WITH_ARGS(£CRPEDBPTH '<Nome File.DBF>') TO_GET(£PGTMPFILE)
USE BUILTIN(UD_TRANSFORM_LIST) WITH_ARGS(<Lista> £PGTMPFILE '3') TO_GET(£RETCODA)
Inizializzare i campi per richiamare il report:
£CRPENOME := <Nome del Report>
£CRPEDEST := <Destinazione> (V=Video S=Stampa F=File PDF E=File Excel H=Pagina HTML) *
£CRPENSTP := <Stampante Windows>
£CRPECOPIE := <Numero Copie> (Default 1)
£CRPEFASC := <Fascicola Copie> (TRUE / FALSE) (Default TRUE)
£CRPEFILE := <Nome del File da generare> **
£CRPETIT := <Titolo del Report> (Imposta il campo speciale "Titolo Report")
£CRPEDITTA := £R_IDDAZ ***
£CRPEFUNC := *COMPONENT / *FUNCTION ***
£CRPEROOT := <Root Immagini> (per DMODA deve essere *blank) ****
Richiamare il programma di stampa
EXCHANGE FIELDS(£GRPCRY)
CALL PROCESS(*DIRECT) FUNCTION(EDCRYLS) EXIT_USED(*NEXT) MENU_USED(*NEXT)
* Se l'emissione è "S" ma in DModa è imposta la stampa su File il motore genera un PDF con il nome del Report + data + ora
** Se passato viene utilizzato anche per dare il nome al file se stampa su File
*** Non sono obbligatori ma per DModa bisogna sempre passarli
**** VALE SOLO PER SHOPS: NON PASSARE MAI A *BLANK ==> STRINGA '*NONE' per non settare
==> STRINGA con il percorso, per mpostare la Root
Programmazione Web
Nella videata XSL prevedere sempre la richiesta del tipo output: File, Stampante, Excel + il bottone CONFERMA, oltre agli eventuali parametri per l'estrazione dati.
La stampa deve sempre essere lanciata in BATCH passando, oltre ad eventuali campi anche questi:
£R_IDCDAZ := £DMWAMHND.up_DatiSessione.up_Azienda
£R_IDDAZ := £DMWAMHND.up_DatiSessione.up_DescrAzienda
£R_IDCDEP := £DMWAMHND.up_DatiSessione.up_Deposito
£R_IDDDEP := £DMWAMHND.up_DatiSessione.up_DescrDeposito
£R_IDMLDEP := £DMWAMHND.up_DatiSessione.up_MultiDeposito
£R_USRJOBQ := *EDUSRJOBQ oppure *EDUSRJOBQPR
SUBMIT PROCESS(<Processo>) FUNCTION(<Funzione>) EXCHANGE(<Campi: tra cui quelli sopra>) JOBD(*USRPRF) JOBQ(£R_USRJOBQ) OUTQ(*CURRENT)
Inoltre la WAM di stampa NON si deve chiudere in automatico e deve lasciare i parametri inizializzati dopo la conferma dell'elaborazione.
Il programma di stampa deve essere cosi strutturato:
Lato WEB le cartelle dove memorizzare i dati vengono creare al momento della stampa tramite un metodo da richiamare.
E' importante che utilizziate il metodo UNA SOLA VOLTA per ogni stampa, per tanto utilizzare un campo di appoggio esempio
DEFINE FIELD(£PATHDATI) REFFLD(£R_STR256)
lo stesso vale per il nome del file da generare (se stampa su file)
DEFINE FIELD(£FILENAME) REFFLD(£R_GIFILE)
Instanziare i seguenti oggetti nella Funzione
DEFINE_COM CLASS(£EDRPTENG) NAME(£vi_Report)
DEFINE_COM CLASS(£EDOBJ002) NAME(£vi_Progressivo)
DEFINE_COM CLASS(£EDOBJ005) NAME(£vi_UserPath)
Creare i nomi
£PathDati := £vi_UserPath.um_GetUserTmpUnique( *USER )
£FileName := £vi_Progressivo.um_GeneraID
Scaricare le liste
USE BUILTIN(UD_TRANSFORM_LIST) WITH_ARGS(<Lista> (£PathDati + *pathdelim + "<Nome del File>.DBF") '3' 'N') TO_GET(£RETCODA)
Assegnare i valori standard
£CRPETIT := <Titolo del Report> (Se gestito) - Può essere: *FUNCTION_DESC / *COMPONENT_DESC / variabile multilingua
£CRPEDITTA := £R_IDDAZ
£CRPEFUNC := *FUNCTION / *COMPONENT
£CRPEDEST := <Emissione> (F=File PDF S=Stampa E=File Excel)
Richiamare la generazione della Stampa
£vi_Report.um_GeneraReport
P_NOMEREPORT(<Nome del Report senza Estensione>)
P_EMISSIONE(£CRPEDEST)
P_PATHREPORT(£vi_UserPath.um_GetRootRpt)
P_PATHDATI(£PathDati)
P_NOMEFILE(£FileName)
P_PATHFILE(£vi_UserPath.um_getuserspool( *USER ))
P_COPIE(<Numero Copie>)
P_DESCRIZIONESTAMPA(<Descrizione da visualizzare nello Spool>)
P_STAMPANTE(£vi_Stampante)*
P_IDSTAMPANTE(£CRPEIDST)**
P_FUNCSTAMPA(£CRPEFUNC)
P_TITOLO(£CRPETIT)
P_DESCDITTA(£CRPEDITTA)
P_ESITO(£RETCODA) ***
* Questo è un oggetto EDOBJ003 opportunamente caricato con i dati della Stampante Scelta.
** E' l'ID Stampante del file EDTBST passato dalla weblet 'ed_emissione'. Se passato ha la precedenza sulla proprietà "P_STAMPANTE"
*** OK = Report Elaborato
E1 = Parametri mancanti NomeReport / PathReport / PathDati
E2 = Emissione su File ma non passato NomeFile / PathFile
E3 = Emissione non valida
E5 = Report non trovato
E7 = Errore durante l'apertura del Report
Codice della chiamata stampa
£vi_Report.um_GeneraReport P_NOMEREPORT(£CRPENOME) P_EMISSIONE(£CRPEDEST) P_PATHREPORT(£vi_UserPath.um_GetRootRpt) P_PATHDATI(£PathDati) P_NOMEFILE(£FileName) P_PATHFILE(£vi_UserPath.um_getuserspool( £PGUSERID )) P_COPIE(£CRPECOPIE) P_DESCRIZIONESTAMPA("") P_IDSTAMPANTE(£CRPEIDST) P_FUNCSTAMPA(£CRPEFUNC) P_TITOLO(£CRPETIT) P_DESCDITTA(£CRPEDITTA) P_ESITO(£RETCODA)
Come passare i dati al Crystal report per la Stampa Parametri strutturati
1) Definire, sia all'interno della WAM, che nella funzione di stampa, il seguente oggetto:
DEFINE_COM CLASS(£EDRP0009) NAME(£VI_LISTAPARAMETRI) REFERENCE(*DEFERRED)
2) Creare all'interno della WAM il seguente metodo da richiamare prima della submit alla funzione batch di stampa:
MTHROUTINE NAME(um_ListaParametri)
3) All'interno del metodo, inserire le seguenti istruzioni:
- Inizializzazione del campo £LSTPARNAM (definito nel repository), con il nome del file dove verrà salvata la lista dei parametri
£LSTPARNAM := £VI_USERPATH.um_GetUserTmp( £THISHANDLER.avLoggedonUser ) + *PATHDELIM + £DMWAMHND.up_IDUnivocoHandler.um_GeneraID
- Richiamo del metodo per l’inizializzazione della lista dei parametri (pulizia lista e salvataggio su file)
£VI_LISTAPARAMETRI.um_InizializzaLista P_NOMEFILE(£LSTPARNAM)
4) Iniziare la creazione della lista dei parametri, sempre all’interno del metodo um_ListaParametri. Questo avviene tramite l’uso dei seguenti metodi:
£VI_LISTAPARAMETRI.um_CampoSingolo
Crea una riga di testo con la label del campo ed il relativo valore. Esempio:
ARTICOLO.................: 1000
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_Label : passare la variabile multilingua o il campo da visualizzare come label. (Max. 25) (OBBLIGATORIO)
£p_Valore : passare il valore del campo. Per i campi numerici/data aggiungere .AsString. Passare le date nel formato YYYYMMDD. (Max. 20) (OBBLIGATORIO)
£p_Data : passare TRUE se il campo è da considerare come data. In questo modo il campo verrà formattato nel formato DD/MM/YYYY (FACOLTATIVO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
£VI_LISTAPARAMETRI.um_CampiRange
Crea una riga di testo per la visualizzazione di due campi range con le relative label. Esempio:
DA ARTICOLO..............: 1000 A ARTICOLO...............: 2000
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_Label1 : passare la variabile multilingua o il campo da visualizzare come label del campo DA. (Max. 25) (OBBLIGATORIO)
£p_Label2 : passare la variabile multilingua o il campo da visualizzare come label del campo A. (Max. 25) (OBBLIGATORIO)
£p_Valore1 : passare il valore del campo DA. Per i campi numerici/data aggiungere .AsString. Passare le date nel formato YYYYMMDD. (Max. 20) (OBBLIGATORIO)
£p_Valore2 : passare il valore del campo A. Per i campi numerici/data aggiungere .AsString. Passare le date nel formato YYYYMMDD. (Max. 20) (OBBLIGATORIO)
£p_Date : passare TRUE se i campi è sono da considerare come date. In questo modo i campi verranno formattati nel formato DD/MM/YYYY (FACOLTATIVO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
£VI_LISTAPARAMETRI.um_CheckBox
Crea una riga di testo per la visualizzazione di un check-box. Esempio:
INCLUDI ARTICOLI ANNULLATI........................: SI
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_FastPartObj : passare l’oggetto £FASTPART (OBBLIGATORIO)
£p_NomeFastPart : passare il nome il nome della fast part (OBBLIGATORIO)
£p_LunghezzaLabel : impostare lo spazio da assegnare alla label del check-box. Valori possibili 25/50. Default: 25 (FACOLTATIVO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
£VI_LISTAPARAMETRI.um_SelezioniMultiple
Crea una riga di testo per la visualizzazione di un radio button o di un combo-box. Esempio:
ARTICOLI ANNULLATI................................: INCLUSI
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_FastPartObj : passare l’oggetto £FASTPART (OBBLIGATORIO)
£p_NomeFastPart : passare il nome il nome della fast part (OBBLIGATORIO)
£p_LunghezzaLabel : impostare lo spazio da assegnare alla label del radio button/combo-box. Valori possibili 25/50. Default: 25 (FACOLTATIVO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
£VI_LISTAPARAMETRI.um_RigaTestoLibero
Crea una riga di testo impostatabile manualmente.
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_Testo : passare il testo da visualizzare (OBBLIGATORIO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
£VI_LISTAPARAMETRI.um_RigaVuota
Crea una riga di testo vuota.
Parametri ricevuti dal metodo:
£p_NomeFile : passare il campo £LSTPARNAM (OBBLIGATORIO)
£p_Condizione : passare la condizione per la quale la riga dovrà essere visualizzata o meno (ovvero aggiunta alla lista) (FACOLTATIVO)
5) Una volta terminata la creazione della lista aggiungere il campo £LSTPARNAM ai campi da passare alla funzione batch.
6) All’interno della funzione batch, al momento della creazione dei DBF, aggiungere la seguente istruzione con il nome del DBF da creare:
£VI_LISTAPARAMETRI.um_CreaDBF P_NOMEFILE(£LSTPARNAM) P_NOMEDBF((£PATHDATI + *PATHDELIM + "XXXXXXX.DBF"))
Se questo metodo va chiamato più volte (ad esempio, perché l'emissione è in più formati), aggiungere il parametro p_CancellaFile(FALSE)
7) Una volta creati tutti i DBF, aprire il report
_LAYOUT_ORIZZONTALE_CON_PARAMETRI.rpt / _LAYOUT_VERTICALE_CON_PARAMETRI.rpt
8) Aprire il sottoreport PARAMETRI e dal menu selezionare:
Database --> Imposta percorso origine dati
Origine Dati Corrente --> selezionare il database ‘ PARAMETRI ’
Sostituisci con --> selezionare il proprio database di parametri
9) Cliccare su Aggiorna per allineare il report al database e salvare il report con il nome della funzione da cui verrà richiamato.
Verificate di avere le seguenti impostazioni in Crystal Report XI
File -> Opzioni
Create nel vostro PC una stampante con il nome "Stampante Reports" che si basi sul driver "MS Publisher Color Printer".
Ed impostatela all'interno del report.
Sono state create 3 template che si trovano in V:\Template Reports
_LAYOUT_ORIZZONTALE.rpt
_LAYOUT_VERTICALE.rpt
_LAYOUT_VUOTO.rpt
PS: Per Dmoda retail la template da uilizzare è VUOTO_DMRETAIL.rpt
Prima di iniziare la creazione del Report copiate uno dei layout nella cartella V:\X_WIN95\X_LANSA\Source e rinominatelo,
una volta aperto cliccate su "File" -> "Informazioni di riepilogo" e cancellate il titolo.
Per il disegno del report attenersi a queste linee guida:
I parametri di Stampa (se presenti) vanno nella sezione "Intestazione Report" creando un sotto-report e impostando nella sezione "Nuova pagina dopo"
Il font da utilizzare per i dati non in colonna è "Arial"
Il font da utilizzare per i dati in colonna è "Lucida Console" 8
Il font da utilizzare per le intestazioni delle colonne è "Lucida Console" 8 Bold con il bordo inferiore
Le intestazioni delle colonne e dei dati devono avere la stessa larghezza
Le dimensioni dei font possono variare in base alle esigenze di spazio
I dati Alfanumerici incolonnati devono essere allineati a sinistra (intestazioni comprese)
I dati Numerici incolonnati devono essere allineati a destra (intestazioni comprese)
Le linee ed i riquadri devono avere lo spessore di 0,5 pt
*** IMPORTANTE *** : Come da richieste di alcuni clienti, si è deciso di non alternare righe bianche e grigie. E' possibile alternare il dettaglio con righe bianche e righe grigie, impostando il colore di sfondo tramite questa formula:
if ((RecordNumber mod 2) = 0) then
rgb(214,214,214)
else
crWhite
Per permetter la generazione di un foglio Excel seguire la seguente procedura:
Creare un report vuoto tramite "Creazione guidata Report standard"
Selezionare il DBF
selezionare tutti i campi tramite il tasto >>
saltare la scelta dei gruppi / ordinamento / selezione
Selezionare "Nessun Modello"
Salvare il report con NOMEFUNZIONE.XLS.RPT