[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Il riordino e la fusione del contenuto dei file sono gestite normalmente attraverso funzionalità speciali del linguaggio COBOL. Si utilizzano in particolare file dichiarati con l'indicatore di livello SD nella sezione FILE SECTION, per svolgere la funzione di riordino o di fusione, mentre i file da ordinare o da fondere, assieme al risultato dell'ordinamento o della fusione, possono essere file normali organizzati secondo le esigenze del programma.
I file che prendono parte alle operazioni di riordino e di fusione, non devono essere aperti o chiusi durante tali operazioni.
Il riordino di un file, con l'istruzione SORT del COBOL, richiede in linea di massima il coinvolgimento di tre file: il file che formalmente serve come appoggio per svolgere la funzione di ordinamento, dichiarato nella sezione FILE SECTION con l'indicatore di livello SD; un file per i dati in ingresso da ordinare; un file per accogliere il risultato del procedimento di ordinamento.
/ / \ \ | | ASCENDING | | SORT file-name-1 < ON < ¯¯¯¯¯¯¯¯¯ > KEY { data-name-1 }... >... ¯¯¯¯ | | DESCENDING | | \ \ ¯¯¯¯¯¯¯¯¯¯ / / / .-- / \ --. \ | | | THROUGH | | | | INPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | | < ¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | > | `-- \ ¯¯¯¯ / --' | | | \ USING { file-name-2 }... / ¯¯¯¯¯ / .-- / \ --. \ | | | THROUGH | | | | OUTPUT PROCEDURE IS procedure-name-3 | < ¯¯¯¯¯¯¯ > procedure-name-4 | | < ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | > | `-- \ ¯¯¯¯ / --' | | | \ GIVING { file-name-3 }... / ¯¯¯¯¯¯ |
Il file che nello schema sintattico appare nominato come file-name-1, è quello che deve essere dichiarato nella sezione FILE SECTION con l'indicatore di livello SD. Dopo la parola ASCENDING si indica un elenco di chiavi di ordinamento crescenti; dopo la parola DESCENDING si indica un elenco di chiavi di ordinamento decrescenti. Le chiavi di ordinamento sono campi del record del file file-name-1 e la possibilità di indicare più chiavi serve a definire una gerarchia di ordinamento quando se ne crea la necessità. In pratica, la presenza di più chiavi fa sì che in presenza di chiavi doppie a un certo livello gerarchico, permetta di distinguere l'ordine dei record utilizzando anche le chiavi di livello inferiore.
Il file da ordinare può essere costituito dal nome che appare dopo la parola USING, oppure può essere generato da un gruppo di procedure del programma, specificate dopo le parole INPUT PROCEDURE. Il file indicato dopo la parola USING è un file dichiarato normalmente, con l'organizzazione e l'accesso desiderati.
Il file che risulta dall'ordinamento può essere costituito dal nome che appare dopo la parola GIVING, oppure può essere letto da un gruppo di procedure del programma, specificate dopo le parole OUTPUT PROCEDURE. Il file indicato dopo la parola GIVING è un file dichiarato normalmente, con l'organizzazione e l'accesso desiderati.
La gestione dei dati in ingresso o in uscita, attraverso delle procedure, viene descritto in altre sezioni; per il momento viene mostrato un esempio di ordinamento tipico, che coinvolge il file per il riordino, più due file per i dati (in ingresso e in uscita).
|
Nell'esempio, il file usato per ottenere il riordino è sort.tmp
; il file da ordinare è input.seq
(organizzato in modo sequenziale); il file ordinato che si ottiene è output.seq
(anche questo organizzato in modo sequenziale). Come chiave di ordinamento si prendono in considerazione i primi cinque byte del record.
Lo schema sintattico consentirebbe l'indicazione di più file da ordinare e di più file ordinati da generare. Nel primo caso, i dati dei vari file vengono raccolti assieme e considerati parte di un file unico da ordinare; i file ordinati da generare, invece, rappresentano copie dello stesso risultato ordinato.
La fusione di due o più file, con l'istruzione MERGE del COBOL, richiede la presenza di due o più file ordinati nello stesso modo, che si vogliono mettere insieme in un solo file ordinato. Per compiere questa funzione, si aggiunge un file ulteriore, dichiarato nella sezione FILE SECTION con l'indicatore di livello SD.
/ / \ \ | | ASCENDING | | MERGE file-name-1 < ON < ¯¯¯¯¯¯¯¯¯ > KEY { data-name-1 }... >... ¯¯¯¯¯ | | DESCENDING | | \ \ ¯¯¯¯¯¯¯¯¯¯ / / USING file-name-2 { file-name-3 }... ¯¯¯¯¯ / .-- / \ --. \ | | | THROUGH | | | | OUTPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | | < ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | > | `-- \ ¯¯¯¯ / --' | | | \ GIVING { file-name-4 }... / ¯¯¯¯¯¯ |
La prima parte dello schema sintattico va interpretata nello stesso modo di quello per il riordino; dove file-name-1 è il file che deve essere dichiarato nella sezione FILE SECTION con l'indicatore di livello SD e le variabili indicate dopo le parole ASCENDING o DESCENDING sono le chiavi di ordinamento previste nei file in ingresso.
Successivamente si può osservare nello schema sintattico che sono previsti soltanto file in ingresso, dopo la parola USING, tenendo in considerazione il fatto che devono essere almeno due. Questi file devono risultare già ordinati secondo le chiavi previste, altrimenti il risultato della fusione non è prevedibile.
Il risultato della fusione può essere costituito dal nome che appare dopo la parola GIVING, oppure può essere letto da un gruppo di procedure del programma, specificate dopo le parole OUTPUT PROCEDURE. Il file indicato dopo la parola GIVING è un file dichiarato normalmente, con l'organizzazione e l'accesso desiderati.
La gestione dei dati in uscita, attraverso delle procedure, viene descritto in altre sezioni; per il momento viene mostrato un esempio di fusione tipico, si hanno i file input-1.seq
e input-2.seq
ordinati, si vuole ottenere il file output.seq
con la somma dei record, mantenendo l'ordinamento:
|
Lo schema sintattico consentirebbe l'indicazione di più file ordinati da generare: se viene indicato più di un file per raccogliere il risultato della fusione, questi ottengono lo stesso contenuto; i file in sé possono essere differenti, se possiedono una diversa organizzazione.
Nelle istruzioni SORT e MERGE, a seconda dei casi, esiste la possibilità di specificare un gruppo di procedure con le forme seguenti:
.-- / \ --. | | THROUGH | | INPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | ¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | `-- \ ¯¯¯¯ / --' |
.-- / \ --. | | THROUGH | | OUTPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | `-- \ ¯¯¯¯ / --' |
Queste procedure sono da intendere come un intervallo di sezioni o di paragrafi della divisione PROCEDURE DIVISION, da procedure-name-1 a procedure-name-2. Questa porzione di sezione o di paragrafi deve però rispettare delle condizioni: deve servire esclusivamente per lo scopo del riordino o della fusione; non può contenere chiamate a procedure esterne; non può essere usata nel programma per fini differenti.
In generale, se si intendono usare delle procedure per generare dati da ordinare, leggere i dati ordinati o fusi, conviene gestire la divisione PROCEDURE DIVISION in sezioni. L'esempio seguente mostra proprio una sezione che potrebbe essere usata per leggere il risultato di un file ordinato o fuso:
|
Nell'esempio si vede anche l'uso del famigerato GO TO, allo scopo di uscire dalla sezione dopo l'esecuzione del ciclo di chiamate al paragrafo MOSTRA-RECORD, dal momento che l'istruzione EXIT, secondo lo standard, deve trovarsi da sola in un paragrafo.
Quando si usano le istruzioni SORT o MERGE, invece di generare un file ordinato o fuso, è possibile leggere il risultato dell'ordinamento o della fusione, specificando la chiamata di un intervallo di procedure (paragrafi o sezioni):
.-- / \ --. | | THROUGH | | OUTPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | `-- \ ¯¯¯¯ / --' |
Nell'ambito dell'intervallo di procedure chiamato, occorre usare l'istruzione RETURN per leggere questi dati dal file di riordino o di fusione:
RETURN file-name-1 [NEXT] RECORD [ INTO identifier ] ¯¯¯¯¯¯ ¯¯¯¯ ¯¯¯¯ AT END { imperative-statement }... ¯¯¯ |
L'istruzione RETURN funziona a tutti gli effetti come l'istruzione READ di un file sequenziale, dove il file indicato è precisamente quello che appare nell'istruzione SORT o MERGE chiamante, con la stessa metavariabile.
|
L'esempio riguarda la visualizzazione di un file ordinato, senza generare il file stesso, ma si applica tale e quale al caso della fusione.
Limitatamente al caso del riordino, con l'istruzione SORT, è possibile acquisire i record da riordinare attraverso una procedura:
.-- / \ --. | | THROUGH | | INPUT PROCEDURE IS procedure-name-1 | < ¯¯¯¯¯¯¯ > procedure-name-2 | ¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯ | | THRU | | `-- \ ¯¯¯¯ / --' |
Nell'ambito dell'intervallo di procedure chiamato, occorre usare l'istruzione RELEASE per passare formalmente un record. L'istruzione RELEASE si utilizza e si comporta come l'istruzione WRITE per i file sequenziali:
WRITE record-name [ FROM identifier-1 ] ¯¯¯¯¯ ¯¯¯¯ |
Il record è il nome della variabile strutturata corrispondente del file che esegue in pratica l'ordinamento, ovvero quello che nello schema sintattico dell'istruzione SORT appare come file-name-1.
|
L'esempio è completo, in quanto anche il risultato del riordino viene gestito tramite una procedura. Nella fase di inserimento dati, si può osservare che un inserimento nullo (pari all'inserimento di tutti spazi), implica la conclusione di quella fase.
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 riordino_e_fusione.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]