Stampare senza dolore: guida alle code di stampa

Accedi per salvare

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.

Fonti

← Torna al blog

Commenti

Nessun commento ancora. Sii il primo a commentare!

Devi avere un account per commentare. Accedi · Registrati