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)
Quando non stampa, l'ordine in cui controllare è: il documento non è mai stato prodotto, lo scrittore non è avviato, il documento è in un'altra coda.
Da dove decide, uno spool, dove andare
È il punto che genera più confusione. Un OVRPRTF eseguito prima della stampa vince su tutto. Altrimenti decide il file di stampa: se dice OUTQ(*JOB), lo spool va nella coda del job, che arriva dalla descrizione di job; se la descrizione di job dice *USRPRF, dal profilo utente; e il profilo, a sua volta, può dire *WRKSTN, cioè la coda della stazione di lavoro.
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: l'override resta attivo finché non finisce il programma che l'ha eseguito, o il suo gruppo di attivazione, e lanciato dalla riga comandi vale per tutta la sessione: 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 *INQMSG)
Con FORMTYPE(FATTURE) lo scrittore stampa solo gli spool con quel tipo di modulo. *INQMSG manda una domanda all'operatore quando lo spool chiede un modulo diverso da quello caricato nella stampante, così si cambia la carta prima di stampare.
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)
È 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