Le librerie sono un livello solo e non contengono altre librerie. La domanda che segue è ovvia: come fa un programma a trovare un file se nessuno gli dice in quale libreria si trova?
La risposta è la lista librerie: un elenco ordinato di librerie che appartiene al job, non al programma. Quando si nomina un oggetto senza dire dove sta, il sistema lo cerca nelle librerie della lista, una dopo l'altra, e si ferma alla prima che lo contiene.
Questo è il posto della gerarchia che sembrava mancare. Ed è anche l'origine di quasi tutti i problemi che cominciano con "sul mio ambiente funziona".
Le quattro parti
La lista non è un elenco piatto: ha quattro sezioni, sempre in questo ordine.
- Parte di sistema. Comincia con QSYS e contiene le librerie del sistema operativo. È
la stessa per tutti i job e si governa con il valore di sistema
QSYSLIBL. - Librerie di prodotto. Fino a due, gestite dal sistema quando serve. Non si toccano.
- Libreria corrente. Una sola, ed è quella in cui finiscono gli oggetti creati senza
dire dove. Si imposta con
CHGCURLIBo dal profilo. - Parte utente. L'elenco vero e proprio, quello dove stanno le librerie
dell'applicativo. Il valore predefinito per i job nuovi è il valore di sistema
QUSRLIBL, ma quasi sempre viene sovrascritto dalla descrizione di job.
Vedere quella del proprio job:
DSPLIBL
E quella di un job qualsiasi, che è il comando che serve davvero quando si indaga: WRKJOB
sul job, opzione 2, e la lista è lì.
Da dove arriva
Ed è qui che stanno gli equivoci. Un job non eredita la lista librerie di chi lo ha
lanciato. La prende dalla propria descrizione di job, il *JOBD, e solo da lì.
Perciò:
- una sessione interattiva ha la lista che le dà la sua JOBD, spesso modificata a mano
durante la giornata con
ADDLIBLE; - un job sottomesso con
SBMJOBprende quella indicata nella JOBD del comando, che non è necessariamente quella della sessione da cui si sottomette; - un lavoro schedulato prende quella della JOBD della voce di schedulazione, che nessuno guarda mai finché non va storto qualcosa.
Avvertenza
questa è la causa numero uno del classico "funziona di giorno e di notte
no". Il programma è lo stesso, i dati sono gli stessi, l'errore parla di un oggetto non
trovato — CPF9801 — e sembra che manchi qualcosa. Non manca niente: la libreria c'è ma
non è nella lista del job notturno. La verifica si fa con DSPJOBD sulla descrizione
usata dal job, non sulla propria sessione.
Un modo per andare a colpo sicuro c'è, ed è dichiarare la lista nel comando che sottomette:
SBMJOB CMD(CALL PGM(PRODLIB/CHIUSURA)) +
JOB(CHIUSURA) +
JOBD(PRODLIB/JOBDBATCH) +
INLLIBL(PRODLIB DATILIB QGPL QTEMP)
Il rischio dell'ambiguità
Se due librerie della lista contengono un oggetto con lo stesso nome, vince la prima. Silenziosamente: nessun avviso, nessuna traccia nel job log, nessun modo di accorgersene se non chiedendoselo.
È il modo in cui nascono gli incidenti peggiori, perché il sintomo non è un errore ma un risultato sbagliato. Un file di collaudo lasciato in una libreria messa in cima alla lista "solo per una prova" fa girare la chiusura mensile sui dati di collaudo, e il programma non ha modo di saperlo.
Consiglio
la difesa che regge negli anni non è una lista librerie più corta ma la
qualificazione degli oggetti nei programmi — scrivere PRODLIB/ORDINI invece di
ORDINI dove la scelta non deve dipendere dall'ambiente. Costa un po' di flessibilità e
toglie di mezzo un'intera categoria di guasti. Nei punti in cui la flessibilità serve
davvero — perché lo stesso programma deve girare su collaudo e produzione — la lista
librerie è lo strumento giusto, ma allora la scelta va dichiarata e non subita.
Modificarla
Durante il job, per la sessione corrente:
ADDLIBLE LIB(PROVALIB) POSITION(*FIRST)
RMVLIBLE LIB(PROVALIB)
CHGCURLIB CURLIB(MIALIB)
In modo permanente, cambiando la descrizione di job da cui la prendono i lavori:
CHGJOBD JOBD(PRODLIB/JOBDBATCH) +
INLLIBL(PRODLIB DATILIB QGPL QTEMP)
Avvertenza
una JOBD è spesso condivisa da molti lavori. Toglierle una libreria li
rompe tutti insieme, e l'errore che ne esce parla di un oggetto mancante, cioè indica il
sintomo e non la causa. Prima di modificare una descrizione di job conviene sapere chi la
usa: WRKJOBSCDE per le schedulazioni, e la JOBD dei profili utente con
SELECT AUTHORIZATION_NAME, JOB_DESCRIPTION FROM QSYS2.USER_INFO.
Il limite
La parte utente ha un limite al numero di librerie, cresciuto nei rilasci fino a un valore oggi ampio. Non è un vincolo con cui ci si scontra nella pratica, e comunque una lista lunga è già un problema di per sé: allunga la ricerca di ogni oggetto e moltiplica le occasioni di ambiguità.
Commenti
Nessun commento ancora. Sii il primo a commentare!
Devi avere un account per commentare. Accedi · Registrati