Su IBM i nessun programma stampa davvero: produce uno spool, cioè un file di stampa che finisce in una coda. Poi uno scrittore prende gli spool dalla coda e li manda alla stampante. Tre pezzi in fila — spool, coda, scrittore — e la diagnosi di "non stampa" consiste nel capire su quale dei tre ci si è fermati.
I due minuti di diagnosi
Primo: lo spool esiste?
WRKSPLF
Se non compare niente, il programma non ha prodotto nulla: il problema è nell'applicazione, non nella stampa. Se invece lo spool c'è, si guarda la colonna dello stato:
- RDY — pronto, aspetta lo scrittore.
- HLD — trattenuto, non uscirà finché qualcuno non lo rilascia.
- SAV — già stampato e conservato.
- WTR — lo scrittore lo sta elaborando adesso.
Secondo: in quale coda è finito? La colonna della coda spesso rivela subito il problema: lo spool è in una coda diversa da quella che si sta guardando, tipicamente quella predefinita del profilo utente invece di quella dell'applicazione.
Terzo: lo scrittore è attivo?
WRKWTR WTR(*ALL)
Se lo scrittore della coda non compare, gli spool resteranno in RDY per sempre. Si avvia con:
STRPRTWTR DEV(STAMPA01) OUTQ(MIALIB/OUTQFATT)
Nell'esperienza pratica, "non stampa" è nell'ordine: scrittore fermo, spool in HLD, spool nella coda sbagliata. In quest'ordine di frequenza.
Da dove decide, uno spool, dove andare
È il punto che genera più confusione, perché i livelli sono diversi e vince il più vicino al programma:
- Il file di stampa (
*PRTF) usato dal programma, con la coda indicata al momento della creazione. - La descrizione del job (
JOBD), che vale per tutti gli spool prodotti da quel job. - Il profilo utente, che vale quando nessuno degli altri ha detto niente.
- Un
OVRPRTFeseguito prima della stampa, che ha la precedenza su tutto.
Quando uno spool "va sempre nel posto sbagliato", la risposta sta quasi sempre nel livello 3: il programma non specifica niente, e ognuno riceve la coda del proprio profilo.
Per dirigere una stampa senza toccare il programma:
OVRPRTF FILE(FATTURE) OUTQ(MIALIB/OUTQFATT) HOLD(*NO)
CALL PGM(MIALIB/STAMPFATT)
DLTOVR FILE(FATTURE)
Il DLTOVR non va dimenticato: un override resta attivo per il resto del job, e la stampa successiva finirebbe anch'essa lì.
Riordinare gli spool in coda
Ogni spool ha una priorità da 1 a 9, dove 1 esce per primo. Una stampa urgente dietro un tabulato da tremila pagine si sposta senza fermare nulla:
CHGSPLFA FILE(FATTURE) JOB(123456/UTENTE/STAMPFATT)
SPLNBR(3) OUTPTY(1)
Per spostare uno spool in un'altra coda si usa lo stesso comando indicando OUTQ.
Riservare la carta prestampata
Il FORMTYPE serve a impedire che una stampa su modulo prestampato esca su carta bianca:
STRPRTWTR DEV(STAMPA01) OUTQ(MIALIB/OUTQFATT)
FORMTYPE(FATTURE) MSG(*INQMSG)
Con MSG(*INQMSG) lo scrittore, quando incontra uno spool con un tipo di modulo diverso, si ferma e chiede all'operatore di cambiare la carta invece di stampare e basta.
Dallo spool al PDF
È la richiesta più frequente degli ultimi anni. Le strade principali:
Trasformazione integrata. Le release recenti includono funzioni di conversione degli spool in PDF, con la possibilità di consegnarli in una cartella dell'IFS o via posta. Le opzioni disponibili dipendono dalla versione e dai prodotti installati, quindi conviene verificare cosa c'è sulla propria macchina prima di cercare soluzioni esterne.
Copiare lo spool in un file e poi elaborarlo:
CPYSPLF FILE(FATTURE) TOFILE(MIALIB/TESTOFATT)
JOB(123456/UTENTE/STAMPFATT) SPLNBR(3)
MBROPT(*REPLACE)
Da lì il contenuto è testo normale, leggibile da un programma o da uno script.
ACS, per il caso singolo: la voce Printer Output mostra gli spool dal PC e permette di salvarli in PDF senza passare dal 5250. È la via più rapida quando serve una copia una tantum da mandare per posta.
Le code non si svuotano da sole
Uno spool resta finché qualcuno non lo cancella, e in molte installazioni ce ne sono decine di migliaia da anni. Occupano spazio e rallentano l'apertura delle code stesse.
Vale la pena controllare periodicamente la situazione:
SELECT OUTPUT_QUEUE_LIBRARY_NAME, OUTPUT_QUEUE_NAME,
NUMBER_OF_FILES
FROM QSYS2.OUTPUT_QUEUE_INFO
WHERE NUMBER_OF_FILES > 1000
ORDER BY NUMBER_OF_FILES DESC;
Prima di cancellare, però, va posta una domanda che sembra ovvia e non lo è: quegli spool sono l'unica copia di qualcosa? In diverse aziende le fatture stampate esistono solo lì. Se è così, la pulizia va preceduta da un'estrazione, non fatta al posto suo.
Su quali versioni funziona
WRKSPLF, WRKOUTQ, WRKWTR, STRPRTWTR, CHGSPLFA, CPYSPLF, OVRPRTF,
DLTOVR — comandi storici, presenti su tutte le release in uso.
QSYS2.OUTPUT_QUEUE_INFO — la lettura in SQL dello stato delle code è una IBM i
Service: dipende quindi dalla release e dal livello del gruppo PTF del database, ed è stata
ampliata su 7.4 e 7.5. Esiste anche QSYS2.OUTPUT_QUEUE_ENTRIES, che restituisce una riga
per ogni singolo spool.
Se sulla tua macchina queste viste non ci sono, lo stesso conteggio si ottiene così:
WRKOUTQ OUTQ(*ALL) OUTPUT(*PRINT)
oppure, per averlo in un file interrogabile, con DSPOBJD sugli oggetti *OUTQ. È più
scomodo, ma funziona ovunque.
La conversione degli spool in PDF è il punto in cui le release differiscono di più.
Le possibilità dipendono dalla versione e dai prodotti installati — Transform Services è
un prodotto a parte, e le funzioni integrate sono state ampliate nel tempo. Prima che
esistesse qualcosa di integrato, la conversione si faceva con prodotti di terze parti
oppure copiando lo spool in un file di testo con CPYSPLF e generando il PDF fuori dal
sistema. Vale la pena verificare cosa c'è già installato prima di cercare soluzioni
esterne: spesso c'è più di quanto si pensi.
Commenti
Nessun commento ancora. Sii il primo a commentare!
Devi avere un account per commentare. Accedi · Registrati