Working Storage Section
In un programma Cobol la Working Storage Section è la sezione della Data Division dove sono descritte le aree dati, i campi e le strutture dei dati usati nel programma.
I livelli
Ogni campo può contenere altri sottocampi ed è associato a un livello numerico che in individua la sua posizione nella gerarchia della struttura.
Nota. Un campo è detto elementare se non è suddiviso in altri sottocampi.
Un esempio pratico
Nel seguente esempio ho creato un'area dati con il nome DATA-NASCITA.
Il campo DATA-NASCITA ha il livello superiore 01 ed è composto da diversi sottocampi.
I sottocampi GIORNO, MESE e ANNO sono associati al livello 05, più interno rispetto al precedente.
Nota. A destra di ciascun sottocampo ho indicato il tipo di dato ( 9 = numerico ) e la lunghezza in caratteri tra parentesi tramite la clausola PIC ( ossia PICTURE ). Ad esempio, scrivere PIC 9(4) significa che il campo è numerico ed è lungo 4 cifre.
Il livello 77
Il livello 77 è un livello speciale. E' riservato per indicare i campi elementari, ossia le aree dati non suddivise in sottocampi.
Tutti i livelli 77 vanno inseriti all'inizio della sezione prima degli altri.
Un esempio pratico
Nota. E' comunque possibile inserire i campi elementari anche con la numerazione 01. In questo caso, non è necessario elencarli all'inizio della sezione. Non è obbligatorio usare il livello77 per i campi elementari anche se è una pratica raccomandata perché rende più leggibile il codice.
Il livello 88
Il livello 88 è un altro livello speciale.
Mi permette di associare un nome condizionale a un campo elementare.
Un esempio pratico
Nel seguente programma creo un'area dati tramite il livello 88.
In questo modo, nella PROCEDURE DIVISION posso scrivere un'istruzione condizionale in questa forma contratta
IF UOMO ...
anziché scriverla in forma estesa
IF GENERE IS EQUAL TO 'M' ...
E così via.
Il livello 66
Il livello 66 è un altro livello speciale. E' un livello associato alla clausola RENAMES.
Quindi, preferisco spiegarlo nel paragrafo successivo.
Le clausole
Nella sezione Working Storage sono utilizzabili alcune clausole.
Le principali sono le seguenti:
La clausola RENAMES
Questa clausola mi permette di creare un nome alias che fa riferimento a un'area dati già esistente.
Per usarla bisogna utilizzare il livello 66.
Dove nuovonome è la nuova area dati mentre nome1 è il campo di origine.
Tramite l'opzione THRU posso anche raggruppare una sequenza di campi da nome1 a nome2 e assegnargli un unico nome di riferimento.
Esempio 1
Nell'area dati ho un campo chiamato DATA-NASCITA.
Per usarlo in una forma contratta creo un livello 66 con la clausola RENAMES.
Esempio 2
Voglio raggruppare soltanto i campi MESE e ANNO della data di nascita ( senza il giorno ).
Così facendo, nel programma posso usare il campo MMAA per visualizzare entrambi i valori ( mese e anno ).
Nota. La clausola RENAMES ha l'handicap di aumentare lo spazio di memoria del programma per gestire i riferimenti dell'area dati. Per questa ragione, spesso al suo posto è utilizzata la clausola REDEFINES.
La clausola REDEFINES
La clausola REDEFINES mi permette di usare un campo ( o un gruppo di campi ) in modo diverso dalla descrizione originaria.
Ad esempio, in formato alfanumerico anziché numerico.
Nella Working Storage la clausola REDEFINES va indicata subito dopo l'area dati di origine.
Inoltre le due aree dati devono avere la stessa lunghezza di caratteri.
Nota. Per fare in modo che le due aree dati abbiano la stessa lunghezza utilizzo la clausola FILLER. Crea un campo indefinito usato come riempitore. La clausola FILLER inserisce nella struttura dei dati delle stringhe composte da un numero di spazi in bianco pari alla sua lunghezza.
Esempio pratico
Voglio raggruppare il mese e l'anno della data di nascita e usarlo come un campo alfanumerico anziché numerico.
Immediatamente dopo l'area dati DATA-NASCITA, creo il campo ridefinito COMODO.
Nell'area dati ridefinita i campi mese e anno sono raggruppati e alfanumerici PIC X(4).
In questo modo posso usare gli stessi dati del campo di origine ma in formato diverso.
Nota. La clausola REDEFINES non occupa nuovo spazio di memoria. E' quindi un'alternativa utile alla clausola RENAMES.
La clausola PICTURE
La clausola PICTURE ( o PIC ) indica la tipologia e la lunghezza di un campo.
Spesso si usa nella forma contratta PIC.
Come funziona la clausola PIC?
Per indicare il tipo di dati si usano i seguenti simboli:
- 9 per i dati numerici
- X per i dati alfanumerici
- A per i caratteri
Tra parentesi tonde ( ) è indicata la lunghezza del campo in caratteri o cifre.
Esempio. Si può scrivere PIC XXXX oppure PIC X(4). In entrambi i casi si definisce un campo alfanumerico (X) di 4 caratteri. E' comunque preferibile abituarsi a usare la forma contratta PIC X(n) perché è più leggibile rispetto a quella estesa. Inoltre, il campo PIC può contenere al massimo 30 simboli. Quindi un campo lungo più di trenta caratteri può essere definito soltanto nella forma contratta. Ad esempio, PIC X(31).
Nella working storage clausola PIC è usata sia per definire le aree dati e sia per creare delle maschere di stampa.
Un esempio pratico
Nel seguente codice definisco i campi dell'area dati DATA-NASCITA.
In questo caso sono tutti campi numerici perché hanno il simbolo 9.
I primi due campi sono lunghi 2 caratteri mentre il terzo è lungo 4 caratteri.
Nota. La clausola PC non si usa per il campo composto, quello che racchiude tutti gli altri ( es. DATA-NASCITA ). E' il compilatore a sommare automaticamente la lunghezza dei sottocampi e assegnarla al campo composto.
Come dichiarare un campo numerico
Per definire un campo numerico nella Working Storage Section utilizzo la clausola PIC con il simbolo delle cifre (9).
Ogni simbolo 9 indica una posizione della cifra decimale.
Esempio
Per descrivere un campo lungo 4 cifre scrivo.
PIC ANNO 9(4)
Il numero può contenere i numeri da 0 a 9999.
Non può contenere caratteri.
Esempio 2
Per descrivere un campo lungo 4 cifre con 2 posizioni decimali scrivo:
PIC ALTEZZA 9(4)V9(2)
Il simbolo V indica la virgola ossia il punto decimale del numero.
Esempio 3
Per distinguere i numeri positivi e negativi devo aggiungere il simbolo S del segno algebrico prima del numero.
PIC TEMPERATURA S9(4)
Il campo dell'esempio precedente può registrare i valori numerici da -9999 a +9999.
Esempio 4
Per aggiungere automaticamente degli zeri prima, dopo oppure nel numero, utilizzo il simbolo P.
PIC PREZZO 9(4)P(3)
Nella precedente picture definisco un numero di 7 cifre, in cui le ultime 3 sono uguali a 000.
Come dichiarare un campo alfabetico
Per definire un campo alfabetico utilizzo il simbolo A nella clausola picture.
PIC A(n)
Dove n è il numero intero che indica la lunghezza del campo.
Un campo alfabetico può contenere soltanto le lettere dell'alfabeto, non i numeri e nemmeno i simboli della punteggiatura. Per includere anche questi ultimi devo creare un campo alfanumerico.
Esempio 1
Per scrivere un campo composto al massimo da 10 lettere scrivo:
PIC NOME A(10)
Esempio 2
Per inserire degli spazi bianchi ( blank ) nel campo alfabetico utilizzo il carattere speciale B.
PIC A(3)BA(3)
Nel precedente esempio definisco un campo alfabetico composto da sette caratteri AAABAAA, tre caratteri a sinistra separati da uno spazio centrale da altri tre caratteri a destra.
Come dichiarare un campo alfanumerico
Per dichiarare un campo alfanumerico utilizzo il simbolo X nella picture seguito dalla lunghezza di caratteri (n).
PIC X(n)
Un campo alfanumerico può contenere lettere, numeri, spazi bianchi e caratteri speciali.
Esempio
Per dichiarare un campo titolo di 30 caratteri alfanumerici scrivo
PIC TITOLO X(30)