[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
La divisione DATA DIVISION costituisce la terza parte, la più complessa, di un programma COBOL e ha lo scopo di descrivere tutti i dati (variabili e costanti) utilizzati nel programma. Si distinguono in particolare: i record dei file a cui si vuole accedere, altre variabili e valori costanti creati o utilizzati dal programma.
La divisione si articola normalmente in tre sezioni: FILE SECTION, per tutte le informazioni riguardanti i file dichiarati nella divisione ENVIRONMENT DIVISION, soprattutto per quanto riguarda la struttura del record; WORKING-STORAGE SECTION per tutte le variabili (che possono essere sia scalari, sia strutturate, ma in questo secondo caso vengono chiamate ugualmente record, anche se non sono associate direttamente ad alcun file) e le costanti necessarie per l'elaborazione; LINKAGE SECTION, per la dichiarazione dei dati condivisi con altri programmi.
In questo manuale la descrizione della sezione LINKAGE SECTION viene omessa del tutto; pertanto, lo schema sintattico seguente non la riporta:
DATA-DIVISION. ¯¯¯¯¯¯¯¯¯¯¯¯¯ .-- | | FILE SECTION. | ¯¯¯¯¯¯¯¯¯¯¯¯ `-- .-- --. --. | file-description-entry record-description-entry... | | | |... | | sort-merge-description-entry record-description-entry... | | `-- --' --' .-- | | WORKING-STORAGE SECTION. | ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ `-- .-- --. --. | 77-level-description-entry | | | |... | | record-description-entry | | `-- --' --' |
Sulla base della terminologia usata nello schema sintattico, si può intuire il fatto che per il linguaggio COBOL, il termine record ha un significato particolare: si tratta di una variabile strutturata, che pertanto può essere scomposta in campi, in modo più o meno articolato. In questo senso, il contenuto della sezione WORKING-STORAGE SECTION viene suddiviso in due tipi di dichiarazioni: variabili scalari non suddivisibili (la metavariabile 77-level-description-entry) e variabili strutturate, ovvero record. Naturalmente, una variabile strutturata (dichiarata come record) può essere gestita e usata tranquillamente come se fosse uno scalare puro e semplice, ma questo fatto ha eventualmente delle ripercussioni nell'efficienza del programma che si ottiene dalla compilazione.
La sezione FILE SECTION ha lo scopo di definire le caratteristiche fisiche dei file e la struttura dei record. Tradizionalmente sarebbe in questa sezione che si specifica il nome o il percorso dei file in base al sistema operativo in cui si deve utilizzare il programma, salvo il caso in cui il compilatore voglia questa indicazione direttamente nella divisione ENVIRONMENT DIVISION, precisamente nell'istruzione SELECT della sezione FILE CONTROL.
La descrizione di un file nella sezione FILE SECTION inizia con l'indicatore di livello FD o SD, a seconda che si tratti di un file «normale» o di un file da usare per le operazioni di riordino e fusione. Si osservi che queste due istruzioni iniziano nell'area A del modulo di programmazione, continuando poi nell'area B, ma è importante sottolineare che già il nome del file, evidenziato nello schema sintattico con il nome file-name, deve iniziare nell'area B:
/ \ | FD file-name | < ¯¯ > | SD file-name | \ ¯¯ / .-- --. | entry-item |... . `-- --' |
Dopo ogni indicatore di livello FD o SD deve apparire la dichiarazione della variabile strutturata che rappresenta il record del file; tale dichiarazione inizia con il livello 01.
I file comuni, ovvero quelli che non sono stati dichiarati esplicitamente per eseguire delle operazioni di riordino o di fusione, si descrivono nella sezione FILE SECTION con l'indicatore di livello FD (File description), che in pratica è un'istruzione singola. Si ricordi che il nome del file che segue la parola chiave FD deve iniziare nell'area B del modulo di programmazione:
FD file-name ¯¯ .-- / \ --. | | RECORDS | | | BLOCK CONTAINS [integer-1 TO] integer-2 < ¯¯¯¯¯¯¯ > | | ¯¯¯¯¯ ¯¯ | CHARACTERS | | `-- \ / --' [ RECORD CONTAINS [integer-3 TO] integer-4 CHARACTERS ] ¯¯¯¯¯¯ ¯¯ .-- / \ / \ --. | | RECORD IS | | OMITTED | | | LABEL < ¯¯¯¯¯¯ > < ¯¯¯¯¯¯¯ > | | ¯¯¯¯¯ | RECORDS ARE | | STANDARD | | `-- \ ¯¯¯¯¯¯¯ / \ ¯¯¯¯¯¯¯¯ / --' .-- / / \ \ --. | | | data-name-1 | | | | VALUE OF < label-info-1 IS < > >... | | ¯¯¯¯¯ | | literal-1 | | | `-- \ \ / / --' .-- / \ --. | | RECORD IS | | | DATA < ¯¯¯¯¯¯ > data-name-2 [data-name-3]... | | ¯¯¯¯ | RECORDS ARE | | `-- \ ¯¯¯¯¯¯¯ / --' [ CODE-SET IS alphabet-name ]. ¯¯¯¯¯¯¯¯ |
Si osservi che, a seconda del compilatore e del sistema operativo per il quale il programma viene compilato, diverse dichiarazioni inserite nell'indicatore di livello FD potrebbero essere ignorate in pratica. |
I file da usare specificatamente per il riordino o la fusione, si descrivono nella sezione FILE SECTION con l'indicatore di livello SD (Sort description), che in pratica è un'istruzione singola. Si ricordi che il nome del file che segue la parola chiave SD deve iniziare nell'area B:
SD file-name ¯¯ [ RECORD CONTAINS [integer-3 TO] integer-4 CHARACTERS ] ¯¯¯¯¯¯ ¯¯ .-- / / \ \ --. | | | data-name-1 | | | | VALUE OF < label-info-1 IS < > >... | | ¯¯¯¯¯ | | literal-1 | | | `-- \ \ / / --' .-- / \ --. | | RECORD IS | | | DATA < ¯¯¯¯¯¯ > data-name-2 [data-name-3]... | . | ¯¯¯¯ | RECORDS ARE | | `-- \ ¯¯¯¯¯¯¯ / --' |
All'interno dell'indicatore di livello FD è possibile dichiarare la dimensione di un blocco fisico per l'accesso ai record del file a cui si sta facendo riferimento.
In generale, si può contare sul fatto che il sistema operativo sia in grado di gestire in modo trasparente il problema dei blocchi fisici dei dati, rispetto ai record «logici» utilizzati dai programmi; tuttavia, ci possono essere contesti in cui il programma che si genera deve provvedere da solo ad accedere all'unità di memorizzazione, pertanto in questi casi conviene dichiarare nel programma la dimensione del blocco di dati da usare per la comunicazione con l'unità stessa. Storicamente la definizione del blocco consente di gestire meglio l'utilizzo di un'unità a nastro; in altre situazioni, come per esempio con un lettore o perforatore di schede, il blocco può contenere un solo record.
/ \ | RECORDS | BLOCK CONTAINS [integer-1 TO] integer-2 < ¯¯¯¯¯¯¯ > ¯¯¯¯¯ ¯¯ | CHARACTERS | \ / |
Omettendo questa dichiarazione, si intende lasciare al compilatore o al sistema operativo il compito di determinare un valore predefinito valido.
L'unità di misura del blocco dipende dalla parola usata, o non usata, alla fine della dichiarazione: la parola chiave RECORDS indica che i valori numerici si riferiscono a quantità di record, mentre diversamente si intendono dei «caratteri». Generalmente è da considerare che per caratteri si intendano byte.
Se viene indicato un valore solo (integer-2), si intende che il blocco possa avere soltanto quella dimensione, altrimenti, si intende dire al compilatore che c'è la possibilità di usare blocchi che hanno una dimensione minima (integer-1) e una massima (integer-2).
La dichiarazione DATA RECORD, che riguarda sia l'indicatore di livello FD, sia SD, è obsoleta e generalmente viene ignorata dai compilatori. Il suo scopo è quello di dichiarare il nome di una o più variabili strutturate che descrivono il record del file. Questa dichiarazione è obsoleta soprattutto perché il record viene comunque indicato successivamente attraverso la dichiarazione di una variabile strutturata apposita.
/ \ | RECORD IS | DATA < ¯¯¯¯¯¯ > data-name-2 [data-name-3]... ¯¯¯¯ | RECORDS ARE | \ ¯¯¯¯¯¯¯ / |
I nomi da inserire al posto delle metavariabili data-name dello schema sintattico devono corrispondere a nomi di record (variabili strutturate) descritti con il numero di livello 01. La presenza di più di uno di questi nomi nella dichiarazione DATA implica che i record del file possono avere una struttura e una dimensione differente.
A seconda del tipo di unità di memorizzazione dei dati, ci può essere la necessità di aggiungere ai record delle informazioni per poterne poi gestire l'accesso. Il linguaggio COBOL prevede la possibilità di dover gestire direttamente questo meccanismo di etichettatura dei record, ma generalmente i sistemi operativi attuali dovrebbero rendere questo meccanismo trasparente, togliendo al programma COBOL l'onere di doversene occupare.
La dichiarazione LABEL RECORD servirebbe per stabilire se siano da gestire le «etichette» dei record, oppure se questa funzione non debba essere considerata dal programma. Attualmente, tale dichiarazione è obsoleta e generalmente i compilatori si limitano a ignorarla:
/ \ / \ | RECORD IS | | OMITTED | LABEL < ¯¯¯¯¯¯ > < ¯¯¯¯¯¯¯ > ¯¯¯¯¯ | RECORDS ARE | | STANDARD | \ ¯¯¯¯¯¯¯ / \ ¯¯¯¯¯¯¯¯ / |
Dovendo o volendo inserire questa dichiarazione, in caso di dubbio la forma LABEL RECORD IS STANDARD dovrebbe essere quella più adatta, anche se non è più compito del programma occuparsi delle etichette. Di per sé, l'omissione di questa dichiarazione comporta, per il compilatore che dovesse volerla, proprio l'utilizzo della forma standard.
La dichiarazione RECORD CONTAINS, che riguarda sia l'indicatore di livello FD, sia SD, permette di specificare la dimensione del record:
RECORD CONTAINS [integer-3 TO] integer-4 CHARACTERS ¯¯¯¯¯¯ ¯¯ |
Come si può intuire, se si indica un valore solo, si intende che il record abbia una dimensione fissa, altrimenti si prevede un intervallo di valori: da un minimo a un massimo.
Generalmente, i compilatori si limitano a ignorare questa dichiarazione, perché le informazioni che porta sono già incluse nella variabile strutturata che descrive il record stesso, pertanto è sufficiente associare più variabili strutturate nella dichiarazione DATA RECORD.
La dichiarazione CODE-SET riguarda i file a organizzazione sequenziale e serve a specificare l'insieme di caratteri con cui tale file è codificato. Tradizionalmente, questa istruzione è servita per gestire dati in formato EBCDIC, in contrapposizione al codice ASCII, o viceversa.
CODE-SET IS alphabet-name ¯¯¯¯¯¯¯¯ |
Al posto della metavariabile alphabet-name va inserita una parola che definisce l'insieme di caratteri del file, secondo le aspettative del compilatore utilizzato.
La dichiarazione VALUE OF consente, in un certo senso, di assegnare dei valori a delle voci legate alle caratteristiche del file. La cosa più importante che si potrebbe fare è di specificare il file da utilizzare secondo ciò che richiede il sistema operativo. Per esempio, se si tratta di un file su disco e il sistema operativo richiede di indicare anche i dischi per nome, il compilatore dovrebbe prevedere qui una voce appropriata.
/ / \ \ | | data-name-1 | | VALUE OF < label-info-1 IS < > >... ¯¯¯¯¯ | | literal-1 | | \ \ / / |
Le voci che si possono dichiarare qui possono essere di ogni tipo, con la possibilità di abbinare un valore costante (una stringa alfanumerica), oppure una variabile il cui contenuto viene poi modificato in fase elaborativa.
L'estratto seguente di un programma COBOL, scritto per il compilatore TinyCOBOL, mostra l'uso della voce FILE-ID per dichiarare il nome del file da utilizzare:
|
Dopo ogni indicatore di livello (FD o SD) si deve descrivere il record attraverso una variabile strutturata, che si dichiara con quelli che sono noti come livelli. I livelli sono in pratica delle dichiarazioni che costituiscono ognuna delle istruzioni singole, ma in tal caso, a differenza delle istruzioni comuni, iniziano con un numero: il numero di livello.
Il livello 01 è obbligatorio e dichiara il nome della variabile strutturata che descrive il record nella sua interezza; qualunque numero superiore serve a descrivere una porzione inferiore del record, con la possibilità di scomposizioni successive. I numeri di livello che possono essere usati per questo scopo sono limitati all'intervallo da 01 a 49, tenendo conto che, a parte l'obbligo di iniziare da 01, i livelli inferiori possono utilizzare incrementi superiori all'unità. Si osservi l'esempio seguente che contiene un estratto dalla sezione FILE SECTION:
|
Il file individuato dal nome SALES-FILE si compone di record a cui si può fare riferimento con la variabile strutturata SALES-RECORD. Il record si suddivide in sette campi con caratteristiche diverse. Il record nella sua interezza corrisponde al livello 01, evidenziato dalla sigla 01 che si trova nell'area A del modulo di programmazione. Come si vede nel livello 01 dell'esempio, la variabile strutturata che rappresenta tutto il record viene solo nominata, senza altre indicazioni, perché la sua dimensione si determina dalla somma dei campi che contiene.
I numeri di livello, mano a mano che si annidano in sottolivelli successivi, devono crescere: non è importante se il numero cresce di una o di più unità. Tradizionalmente, i livelli vengono incrementati con un passo maggiore di uno, per facilitare la modifica del sorgente quando dovesse presentarsi l'esigenza di ristrutturare i livelli. |
Per comprendere meglio il senso della descrizione del record attraverso il sistema dei livelli, conviene dare un'occhiata allo schema successivo:
|
Quello che appare nello schema vuole rappresentare il record di un file da usare per memorizzare carichi e scarichi di un magazzino. Si può osservare inizialmente un campo per numerare le registrazioni (ogni registrazione occupa un record), successivamente, appare la data dell'operazione suddivisa in tre parti (anno, mese e giorno), quindi viene indicato il carico, suddividendo la quantità caricata e il costo unitario di carico, quindi lo scarico, anche questo diviso in quantità scaricata e valore unitario di scarico, infine appare un campo descrittivo dell'operazione. Un record di questo tipo potrebbe essere descritto utilizzando i livelli nel modo seguente:
|
Come si può comprendere dall'esempio e come già accennato in precedenza, per le porzioni di record che non si scompongono ulteriormente, si devono specificare le dimensioni, sommando le quali si ottiene la dimensione dei vari raggruppamenti e infine del record complessivo. La sintassi per rappresentare i livelli si potrebbe semplificare in questa fase nel modo seguente, dove però non si usa la notazione standard del linguaggio COBOL:
nn nome-campo [PIC[TURE] [IS] modello_della_variabile [opzioni]]. |
Ciò che non è stato descritto fino a questo punto è la parte di dichiarazione successiva al nome del campo, che inizia con la parola chiave PICTURE, spesso abbreviata soltanto con PIC. Ciò che appare qui serve a definire il modello della variabile, ovvero la sua dimensione e le sue caratteristiche.
Il modello di definizione della variabile è una stringa che va composta seguendo regole precise. Con questo modello si specifica se la variabile è di tipo numerico o alfanumerico, la sua dimensione, la presenza eventuale di una virgola (ovviamente per i valori numerici), il segno ed eventualmente una maschera di trasformazione. Dopo il modello di definizione della variabile possono apparire delle opzioni, in forma di dichiarazioni ulteriori, che servono a precisare la modalità con cui la variabile deve essere rappresentata internamente alla memoria centrale.
Il modo in cui si dichiara il modello di definizione della variabile è descritto nel capitolo 469, mentre per una visione complessiva del modo in cui si dichiara una variable, si deve consultare il capitolo 466; tuttavia, in questa fase si può cominciare ugualmente a interpretare l'esempio mostrato in precedenza, osservando in particolare i campi seguenti:
il campo MM-NUMERO-REGISTRAZIONE può contenere un numero intero senza segno di cinque cifre: da zero a 99 999;
il campo MM-CARICO-QUANTITA può contenere un numero senza segno con otto cifre per la parte intera e tre cifre per la parte decimale;
il campo MM-COSTO-UNITARIO può contenere un numero senza segno con sei cifre per la parte intera e due cifre per la parte decimale;
il campo MM-DESCRIZIONE può contenere caratteri alfanumerici di qualunque tipo (nell'ambito di una rappresentazione in byte), per una dimensione di 200 caratteri.
Nell'esempio del magazzino si può notare che tutti i nomi usati per individuare le varie componenti del record sono unici, ma oltre a questo è stata usata l'accortezza di mettere un prefisso (MM-) per distinguerli rispetto a campi di altri file che potrebbero avere una struttura del record simile. Tuttavia, non è strettamente necessario che tali nomi siano univoci per tutto il programma, perché è prevista la possibilità di qualificarli in modo gerarchico. La qualificazione è descritta nella sezione 468.3.
Esiste anche la possibilità di ridefinire la struttura di un record, assegnando un nome alternativo a un certo livello che si vuole descrivere diversamente. Si osservi l'esempio seguente:
|
Nell'esempio si vede un record denominato MIO-RECORD, che inizialmente è composto dal campo CAMPO-A fatto per contenere 20 caratteri. Questo campo viene ridefinito nella riga successiva con il nome RIDEFINITO-A, che si articola in sottocampi, con i quali si vuole descrivere in modo alternativo la variabile CAMPO-A. In base al contesto si intende che i primi otto caratteri possano essere interpretati come le cifre numeriche di una data (anno, mese e giorno), individuando il resto come una descrizione non meglio qualificabile.
Generalmente, la ridefinizione di un campo che non è suddiviso è di scarsa utilità, mentre è più interessante quando si applica a campi che hanno già una suddivisione, che però si vuole gestire anche in modo differente:
|
In questo caso, il campo A è composto complessivamente da 20 caratteri, a cui si accede con i campi B e C per i primi 10 e gli ultimi 10 rispettivamente. La ridefinizione successiva, consente di accedere a una porzione centrale, a cavallo dei campi B e C, con il campo F.
La sezione WORKING-STORAGE SECTION serve a dichiarare le variabili, strutturate o scalari, utilizzate dal programma, che non si riferiscono direttamente alla descrizione dei record dei file:
WORKING-STORAGE SECTION. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ .-- --. | 77-level-description-entry | | |... | record-description-entry | `-- --' |
A differenza della sezione FILE SECTION, oltre alla dichiarazione di variabili strutturate, è possibile dichiarare delle variabili scalari (non suddivisibili), utilizzando il livello speciale numero 77.
|
Il livello 77 viene dichiarato mettendo il numero relativo nella colonna dell'area A del modulo di programmazione, così come si fa per il livello 01; nello stesso modo, il nome della variabile scalare si scrive nell'area B. L'esempio che appare sopra dovrebbe essere sufficiente a comprendere l'uso della sezione WORKING-STORAGE SECTION, tenendo conto che vale quanto descritto a proposito delle variabili strutturate che descrivono i record nella sezione FILE SECTION, compresa la ridefinizione.
Oltre ai livelli che servono a descrivere le variabili strutturate (da 01 a 49) e le variabili scalari (77), sono previsti due livelli speciali: 66 e 88. Questi livelli speciali servono a definire dei raggruppamenti di variabili appartenenti alla stessa struttura o a definire dei «nomi di condizione».
La descrizione di questi ulteriori livelli speciali viene fatta nel capitolo 468.
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome divisione_171_data_division_187.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]