[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 580.   Riordino e fusione

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.

580.1   Riordino

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.

Nell'ordinamento di un file, la presenza di record con tutte le chiavi previste doppie, ha l'unico inconveniente di non poter stabilire quale sequenza effettiva ottengono tali record dopo l'ordinamento.

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).

Listato 580.2. Programma elementare che dimostra il funzionamento di SORT.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.   TEST-SORT.
000300 AUTHOR.       DANIELE GIACOMINI.
000400 DATE-WRITTEN. 2005-02-25.
000500*
000600 ENVIRONMENT DIVISION.
000700*
000800 INPUT-OUTPUT SECTION.
000900*
001000 FILE-CONTROL.
001100*
001200     SELECT FILE-DA-ORDINARE     ASSIGN TO "input.seq".
001300     SELECT FILE-ORDINATO        ASSIGN TO "output.seq".
001400     SELECT FILE-PER-IL-RIORDINO ASSIGN TO "sort.tmp".
001500*
001600 DATA DIVISION.
001700*
001800 FILE SECTION.
001900*
002000 FD  FILE-DA-ORDINARE.
002100 01  RECORD-DA-ORDINARE           PIC X(10).
002200*
002300 FD  FILE-ORDINATO.
002400 01  RECORD-ORDINATO              PIC X(10).
002500*
002600 SD  FILE-PER-IL-RIORDINO.
002700*
002800 01  RECORD-PER-IL-RIORDINO.
002900     02  CHIAVE-ORDINAMENTO       PIC X(5).
003000     02  FILLER                   PIC X(5).
003100*
003200 PROCEDURE DIVISION.
003300*------------------------- LIVELLO 0 -----------------------------
003400 MAIN.
003500     SORT FILE-PER-IL-RIORDINO,
003600          ON ASCENDING KEY CHIAVE-ORDINAMENTO,
003700          USING FILE-DA-ORDINARE,
003800          GIVING FILE-ORDINATO.
003900*
004000     STOP RUN.
004100*

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.

580.2   Fusione

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:

Listato 580.4. Programma elementare che dimostra il funzionamento di MERGE.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.   TEST-MERGE.
000300 AUTHOR.       DANIELE GIACOMINI.
000400 DATE-WRITTEN. 2005-03-18.
000500*
000600 ENVIRONMENT DIVISION.
000700*
000800 INPUT-OUTPUT SECTION.
000900*
001000 FILE-CONTROL.
001100*
001200     SELECT FILE-INPUT-1         ASSIGN TO "input-1.seq".
001300     SELECT FILE-INPUT-2         ASSIGN TO "input-2.seq".
001400     SELECT FILE-OUTPUT          ASSIGN TO "output.seq".
<strong>001500     SELECT FILE-PER-LA-FUSIONE  ASSIGN TO "merge.tmp".</strong>
001600*
001700 DATA DIVISION.
001800*
001900 FILE SECTION.
002000*
002100 FD  FILE-INPUT-1
002200 01  RECORD-1                     PIC X(10).
002300*
002400 FD  FILE-INPUT-2
002500 01  RECORD-2                     PIC X(10).
002600*
002700 FD  FILE-OUTPUT
002800 01  RECORD-OUTPUT                PIC X(10).
002900*
<strong>003000 SD  FILE-PER-LA-FUSIONE.</strong>
003100*
<strong>003200 01  RECORD-PER-LA-FUSIONE.</strong>
<strong>003300     02  CHIAVE-ORDINAMENTO       PIC X(5).</strong>
<strong>003400     02  FILLER                   PIC X(5).</strong>
003500*
003600 PROCEDURE DIVISION.
003700*------------------------- LIVELLO 0 -----------------------------
003800 MAIN.
<strong>003900     MERGE FILE-PER-LA-FUSIONE</strong>
<strong>004000           ON ASCENDING KEY CHIAVE-ORDINAMENTO,</strong>
<strong>004100           USING FILE-INPUT-1,</strong>
<strong>004200                 FILE-INPUT-2,</strong>
<strong>004300           GIVING FILE-OUTPUT.</strong>
004400*
004500     STOP RUN.
004600*

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.

580.3   Gestire i dati in ingresso o in uscita attraverso delle procedure

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:

Listato 580.7. Esempio di sezione da usare come procedura di uscita di SORT o MERGE.

004100 MOSTRA-FILE-ORDINATO SECTION.
004200 INIZIO.
004300     PERFORM MOSTRA-RECORD UNTIL EOF = 1.
004400     GO TO FINE.
004500 MOSTRA-RECORD.
004600     RETURN FILE-PER-IL-RIORDINO RECORD
004700           AT END MOVE 1 TO EOF,
004800                  DISPLAY "FINE DEL FILE ORDINATO".
004900     IF EOF = 0
005000     THEN
005100         DISPLAY RECORD-PER-IL-RIORDINO.
005200 FINE.
005300     EXIT.

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.

580.4   Lettura del risultato dell'ordinamento o della fusione attraverso una procedura

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.

Listato 580.10. Esempio di lettura del risultato di un ordinamento attraverso una procedura.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.   TEST-SORT-4.
000300 AUTHOR.       DANIELE GIACOMINI.
000400 DATE-WRITTEN. 2005-03-18.
000500*
000600 ENVIRONMENT DIVISION.
000700*
000800 INPUT-OUTPUT SECTION.
000900*
001000 FILE-CONTROL.
001100*
001200     SELECT FILE-DA-ORDINARE     ASSIGN TO "input.seq".
001300     SELECT FILE-PER-IL-RIORDINO ASSIGN TO "sort.tmp".
001400*
001500 DATA DIVISION.
001600*
001700 FILE SECTION.
001800*
001900 FD  FILE-DA-ORDINARE.
002000 01  RECORD-DA-ORDINARE           PIC X(10).
002100*
002200 SD  FILE-PER-IL-RIORDINO.
002300*
002400 01  RECORD-PER-IL-RIORDINO.
002500     02  CHIAVE-ORDINAMENTO       PIC X(5).
002600     02  FILLER                   PIC X(5).
002700
002800 WORKING-STORAGE SECTION.
002900 77  EOF                          PIC 9 VALUE 0.
003000*
003100 PROCEDURE DIVISION.
003200*------------------------- LIVELLO 0 -----------------------------
003300 MAIN SECTION.
003400 INIZIO.
003500     SORT FILE-PER-IL-RIORDINO,
003600          ON ASCENDING KEY CHIAVE-ORDINAMENTO,
003700          USING FILE-DA-ORDINARE,
003800          OUTPUT PROCEDURE IS MOSTRA-FILE-ORDINATO.
003900*
004000     STOP RUN.
004100*
004200*--------------------- SORT-MERGE PROCEDURE ----------------------
004300 MOSTRA-FILE-ORDINATO SECTION.
004400 INIZIO.
004500     PERFORM MOSTRA-RECORD UNTIL EOF = 1.
004600     GO TO FINE.
004700 MOSTRA-RECORD.
004800     RETURN FILE-PER-IL-RIORDINO RECORD
004900           AT END MOVE 1 TO EOF,
005000                  DISPLAY "FINE DEL FILE ORDINATO".
005100     IF EOF = 0
005200     THEN
005300         DISPLAY RECORD-PER-IL-RIORDINO.
005400 FINE.
005500     EXIT.
005600*

L'esempio riguarda la visualizzazione di un file ordinato, senza generare il file stesso, ma si applica tale e quale al caso della fusione.

580.5   Acquisizione dei dati per il riordino da una procedura

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.

Listato 580.13. Esempio di acquisizione di record da ordinare attraverso l'inserimento diretto.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID.   TEST-SORT-3.
000300 AUTHOR.       DANIELE GIACOMINI.
000400 DATE-WRITTEN. 2005-03-18.
000500*
000600 ENVIRONMENT DIVISION.
000700*
000800 INPUT-OUTPUT SECTION.
000900*
001000 FILE-CONTROL.
001100*
001200     SELECT FILE-PER-IL-RIORDINO ASSIGN TO "sort.tmp".
001300*
001400 DATA DIVISION.
001500*
001600 FILE SECTION.
001700*
001800 SD  FILE-PER-IL-RIORDINO.
001900*
002000 01  RECORD-PER-IL-RIORDINO.
002100     02  CHIAVE-ORDINAMENTO       PIC X(5).
002200     02  FILLER                   PIC X(5).
002300
002400 WORKING-STORAGE SECTION.
002500 77  EOJ                          PIC 9 VALUE 0.
002600 77  EOF                          PIC 9 VALUE 0.
002700 77  DATI-INSERITI                PIC X(10).
002800*
002900 PROCEDURE DIVISION.
003000*------------------------- LIVELLO 0 -----------------------------
003100 MAIN SECTION.
003200 INIZIO.
003300     SORT FILE-PER-IL-RIORDINO,
003400          ON ASCENDING KEY CHIAVE-ORDINAMENTO,
003500          INPUT PROCEDURE IS INSERIMENTO-DATI,
003600          OUTPUT PROCEDURE IS MOSTRA-FILE-ORDINATO.
003700*
003800     STOP RUN.
003900*
004000*--------------------- SORT-MERGE PROCEDURE ----------------------
004100 MOSTRA-FILE-ORDINATO SECTION.
004200 INIZIO.
004300     PERFORM MOSTRA-RECORD UNTIL EOF = 1.
004400     GO TO FINE.
004500 MOSTRA-RECORD.
004600     RETURN FILE-PER-IL-RIORDINO RECORD
004700           AT END MOVE 1 TO EOF,
004800                  DISPLAY "FINE DEL FILE ORDINATO".
004900     IF EOF = 0
005000     THEN
005100         DISPLAY RECORD-PER-IL-RIORDINO.
005200 FINE.
005300     EXIT.
005400*-----------------------------------------------------------------
005500 INSERIMENTO-DATI SECTION.
005600 INIZIO.
005700     PERFORM INSERISCI-RECORD UNTIL EOJ = 1.
005800     GO TO FINE.
005900 INSERISCI-RECORD.
006000     DISPLAY "INSERISCI UN RECORD DA 10 CARATTERI:".
006100     ACCEPT DATI-INSERITI.
006200     IF DATI-INSERITI = SPACES
006300     THEN
006400         MOVE 1 TO EOJ;
006500     ELSE
006600         MOVE DATI-INSERITI TO RECORD-PER-IL-RIORDINO,
006700         RELEASE RECORD-PER-IL-RIORDINO.
006800 FINE.
006900     EXIT.
007000*

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 2007.02 --- Copyright © 2000-2007 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] [indice analitico]

Valid ISO-HTML!

CSS validator!