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.

la Working Storage Section in un programma Cobol

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.

un esempio di area dati a livelli in Cobol

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

un esempio di utilizzo dei livelli 77 nella working storage section

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.

un esempio pratico di 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.

la sintassi della clausola RENAMES in Cobol

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.

la clausola RENAMES

Esempio 2

Voglio raggruppare soltanto i campi MESE e ANNO della data di nascita ( senza il giorno ).

un esempio pratico di utilizzo della clausola RENAMES THRU

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.

la sintassi della clausola REDEFINES in cobol

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.

un esempio della clausola REDEFINES

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.

la sintassi della clausola 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.

un esempio di area dati a livelli in Cobol

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)

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base

Libri di approfondimento

Il linguaggio Cobol