I valori speciali per l'inizializzazione delle specifiche D

I valori speciali per l'inizializzazione
La maggior parte dei programmatori RPG hanno familiarità con la parola chiave INZ delle specifiche “D” per
fornire un valore iniziale ad una variabile. Forse non tutti sanno che esistono dei valori speciali che è
possibile specificare per la parola chiave INZ. In questo articolo vedremo quali sono questi valori e come
utilizzarli.
Di seguito un elenco dei valori speciali abbinabili a INZ:
Keyword Si applica a Release Descrizione
*SYS Campi data V3R7 Inizializza con la data corrente dall'orologio di sistema
*JOB Campi data V3R7 Inizializza con la data del lavoro
*USER Alfanumerici V4R4 Inizializza con il nome dell'utente corrente
*EXTDFT DS Esterne V4R4 Inizializza con i valori assunti dalle DDS / DDL
*LIKEDS DS Derivate V5R1 Copia i valori iniziali della DS originaria
*NULL Oggetti Java V5R1 Imposta il riferimento all'oggetto con valore nullo
Usare *SYS e *JOB per inizializzare le date

Storicamente, per impostare il valore di una data, si muovono i campi UDATE o *DATE in una variabile.
Questa azione imposta la variabile con la data del lavoro. Oppure, se occorre la data di sistema, si usa il
codice operativo TIME per ottenere data e ora, con un piccolo lavoro aggiuntivo.
Purtroppo, in molti casi viene usata in modo inappropriato la data del lavoro e non la data di sistema. Perché? Perché in effetti è molto più facile muovere *DATE o UDATE piuttosto che richiamare il codice operativo TIME.
Oggi fortunatamente è facile reperire la data dall'orologio di sistema: è sufficiente definire un campo di tipo
data ed inizializzarlo a *SYS:
D MyDate s D inz(*sys)
/free
dsply ('Current date is ' + %char(MyDate));
return;
/end-free

Naturalmente, occorre ricordarsi che la variabile viene impostata con la data di sistema solo quando essa
viene inizializzata. Per le variabili globali ciò avviene la prima volta che viene richiamato il modulo. Per le
variabili locali di una sottoprocedura, la data è reinizializzata ogni volta che viene eseguita la procedura, a
meno che le variabili siano state dichiarate statiche.
Se un programma esegue un ciclo che può durare fino al giorno successivo, può essere necessario aggiornare
la data di sistema durante il ciclo. Richiamando la funzione %date() senza parametri, si reperisce la data di
sistema.
Per esempio, il seguente ciclo visualizza la data corrente dall'orologio di sistema. Poiché nel loop si richiama
%date(), la data viene reperita nuovamente ogni volta, e se il programma resta in esecuzione oltre la
mezzanotte, la data cambierà.
D MyDate s D
/free
dow 1 = 1;
MyDate = %date();
dsply ('Current date is ' + %char(MyDate));
enddo;
return;
/end-free

Nella maggior parte dei casi, la scelta migliore per reperire la data corrente in un programma RPG è quella di
reperire la data di sistema. Se nessuno ha modificato la data di un lavoro con il comando CHGJOB (o altri
tool similari), la data del lavoro è quella in cui il lavoro è stato avviato. Se il lavoro rimane attivo oltre la
mezzanotte, la data del lavoro non corrisponde più alla data corrente. Sfortunatamente, troppi programmi
contengono ancora questo errore !
Se comunque si desidera utilizzare proprio la data del lavoro, è sufficiente specificare *JOB anziché *SYS, in
questo modo:
D MyDate s D inz(*JOB)
Reperire l'utente con *USER
La parola chiave *USER reperisce il profilo utente corrente e lo memorizza nella variabile. Per esempio:
D MyUserId s 10a inz(*USER)
Verificando il valore di MyUserId si scoprirà che è impostata con il profilo utente che sta eseguendo il lavoro.
L'uso di questa caratteristica è molto più facile rispetto alla codifica di una struttura dati di stato del
programma (PSDS) o, peggio, di richiamare un programma CL solo per reperire il nome del profilo.
Se si sta eseguendo un lavoro nel quale il profilo utente cambia, come quando si effettua uno scambio di
profili o si esegue il programma da un server di rete, *USER viene inizializzato con il profilo corrente nel
momento in cui va in esecuzione la parola chiave *INZ.
Le strutture dati esterne e *EXTDFT
L'RPG ha sempre avuto la possibilità di dichiarare una struttura dati con tracciato uguale a quello di un
record di un file. Me ora è anche possibile sfruttare questa caratteristica per impostare i valori di default dei
campi della struttura dati. Per esempio, si consideri il seguente file fisico:
A R EXTDFTF
A FIELD1 10A DFT('SCOTT')
A FIELD2 10A DFT('KLEMENT')
A FIELD3 5P 0 DFT(1)

Volendo creare una DS con gli stessi nomi dei campi del file, che assuma i valori iniziali dalla parola chiave
INZ delle DDS è possibile usare il seguente codice:
D MyDs e ds extname(EXTDFT)
D inz(*extdft)
In questo modo, i campi di MyDS includeranno automaticamente i valori di FIELD1, FIELD2 e FIELD3 dalle
DDS. Dal momento che è stata specificata la parola chiave INZ con *EXTDFT, i valori iniziali dei campi della
DS saranno rispettivamente “SCOTT”, “KLEMENT” e 1.
Clonare una struttura dati con *LIKEDS
La parola chiave *LIKEDS è molto simile alla *EXTDFT appena vista, salvo che essa opera su un'altra
struttura dati dello stesso programma invece che su una DS definita esternamente. Per esempio:
D DsOne ds qualified
D First 10a inz('Scott')
D Last 10a inz('Klement')
D Age 3p 0 inz(102)
D DsTwo ds likeds(DsOne)
D inz(*likeds)
/free
dsply DsTwo.First;
dsply DsTwo.Last;
dsply DsTwo.Age;

*inlr = *on;
/end-free

DsOne ha dei sottocampi che sono stati inizializzati all'avvio del programma. DsTwo è definita con LIKEDS,
il che significa che DsTwo ha gli stessi sottocampi di DsOne. INZ(*LIKEDS) informa il sistema di
inizializzare DsTwo con gli stessi valori iniziali che aveva DsOne.
Inizializzazione di oggetti Java con *NULL
Con la V5R1, l'RPG ha aggiunto la capacità di richiamare dei metodi di oggetti Java. Come parte di questo
supporto, IBM ha aggiunto un tipo dati “O” che si riferisce ad un oggetto Java. È possibile usare il valore
speciale *NULL per inizializzare il tipo dati “O” come di seguito:
D MyObject s O Class(*java:'java.lang.String')
D inz(*null)

Inz(*null) significa che questo campo di riferimento ad un oggetto non è stato ancora associato ad un oggetto
Java effettivo nella Java Virtual Machine (JVM).
Comunque, INZ(*NULL) è tutto sommato inutile, per le seguenti ragioni:
1)tutti gli oggetti Java vengono inizializzati a *NULL, anche senza specificare la parola chiave INZ;
2)*NULL è l'unico valore possibile per INZ relativamente ad un campo di riferimento ad un oggetto
Java.
Visto ciò, ci sono ben pochi motivi per dichiarare esplicitamente INZ(*NULL); basta codificare il riferimento
all'oggetto senza INZ, e il tutto funzionerà ugualmente.