Scrivere messaggi nel joblog con SQL

Quasi nascosta tra i molti utili strumenti messi a disposizione da IBM nella libreria SYSTOOLS, troviamo la procedura LPRINTF. Questa procedura fa una cosa molto semplice: scrive un messaggio nel job log del lavoro che la richiama; ha un solo parametro di tipo VARCHAR in cui passare la stringa di caratteri da mostrare nel log. Di fatto, LPRINTF interfaccia la API Qp0zLprintf, rendendola facilmente richiamabile anche con SQL.
A cosa può servire LPRINTF ? Ci sono varie situazioni in cui può essere utile scrivere nel joblog delle informazioni aggiuntive rispetto a quelle fornite dal sistema. Un esempio significativo è quello di programmi in cui le istruzioni SQL vengono costruite dinamicamente in un campo, inserendo anche delle variabili. Dopo aver composto l’istruzione, con LPRINTF si può caricare nel job log la stringa che la contiene, in modo da poter verificare cosa non va in caso di errore o di funzionamento non desiderato.
Per richiamare LPRINTF da un programma RPG è sufficiente eseguire questa istruzione SQL:

         Exec SQL
            CALL SYSTOOLS.LPRINTF(:message) ;

Vediamo un esempio di programma che compone dinamicamente una istruzione SQL che popola una tabella, usando anche delle variabili. Di seguito l’istruzione che imposta lo statement SQL:

sqlStmt = 'CREATE TABLE mduca1.Faq40013T AS (' +    
'SELECT CodCliente, RagioneSociale, NazCl, '   +    
'd.Articolo, Descrizione, SUM(OrdQty)         '  +  
'FROM AnCli00f '                             +      
'JOIN OrdDt00f d ON CodCliente = OrdCli '    +      
'JOIN AnaArt00f a ON a.Articolo = d.Articolo ' +    
'WHERE NazCl = ' + pNation +  ' '     +             
'GROUP BY CodCliente, RagioneSociale, NazCl, ' +    
'd.Articolo, Descrizione '                     +    
'ORDER BY CodCliente)'                         +    
' WITH DATA'                                        
;    

Il programma estrae dall’anagrafica tutti i clienti della nazione ricevuta come parametro, insieme ad altri dati da ordini di vendita e anagrafica articoli, e li scrive nella tabella FAQ40013T.
Lanciamo il programma e verifichiamo il risultato.

call faq40013 parm('IT') 

Il programma non ha creato la tabella… normalmente dovremmo attivare il debug, rilanciare il programma e vedere il contenuto della variabile sql per capire il problema… ma con LPRINTF, è sufficiente visualizzare il job log del lavoro per avere sott’occhio l’istruzione:

Ecco l’errore: è stata definita una colonna con la funzione scalare SUM, ma non gli è stato assegnato un nome. L’istruzione CREATE TABLE richiede che ogni colonna della tabella che si va a creare abbia la sua denominazione univoca.
Correggiamo, rilanciamo e vediamo se funziona:

C’è ancora qualche problema… vediamo quale.

Stavolta mancano gli apici intorno al codice della nazione… correggiamo ancora e vediamo se questa è la volta buona !

Ora è tutto OK ! Grazie alla possibilità di vedere direttamente nel joblog l’istruzione, abbiamo potuto risolvere i problemi molto più velocemente. Ovviamente questo è un esempio semplice, ma in presenza di istruzioni SQL molto più complesse, l’aiuto di LPRINTF si rivela più prezioso.
Naturalmente nulla vieta di sfruttare LPRINTF per scrivere nel joblog qualsiasi altra informazione si ritenesse utile per monitorare meglio le proprie applicazioni.

La procedura LPRINTF è disponibile nel prodotto DB2 for i dalle versioni 7.3 (level 16) e 7.4 (level 4)

Il source completo del programma è disponibile su GitHub: https://github.com/MD2706GIT/FAQ400/blob/master/FAQ40013.sqlrpgle

DOCUMENTAZIONE:
Procedura LPRINTF: https://www.ibm.com/support/pages/systoolslprintf-procedure

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

Recent Posts

VsCode Extension: Bob Cozzi’s RPG IV to RPG Free Conversion

L’estensione “RPG IV to Free Format Conversion” sviluppata da Bob Cozzi (Cozzi Research) è pensata per semplificare la conversione di…

5 mesi ago

IBM i & SQL Tips #010 – Localizzare programmi nella Call Stack con STACK_INFO

Ciao a tutti, oggi voglio segnalarvi un altro interessante contributo di Massimo Duca, parte della sua ormai nota serie IBM…

5 mesi ago

Display file DDS Edit per VsCode, nuova preview.

Incuriosito da alcuni messaggi di Cristian Larsen su Linkedin (New Release - Display File DDS Edit v.0.10.1) ho voluto scaricare…

6 mesi ago

Project Bob: il nuovo strumento AI di IBM per sviluppo COBOL su IBM Z e RPG su IBM i

Ciao a tutti,oggi voglio segnalarvi un annuncio che potrebbe segnare una svolta per lo sviluppo applicativo su ambienti IBM: Project…

6 mesi ago

IBM i & SQL Tips #6: chiamare API REST e analizzare le risposte JSON con SQL

Voglio segnalarvi un nuovo articolo molto interessante di Massimo Duca nella serie IBM i & SQL Tips. In questo sesto…

7 mesi ago

Come funziona il passaggio di parametri a un programma IBM i (RPG / Cobol)

Ciao a tutti, voglio segnalarvi un post molto utile di Marco Riva sul suo sito Markonetools, in cui spiega in…

7 mesi ago