*********************************************************************************
Appunti di COBOL, versione 2003.04.07
Author: Marco Segato <segatom(at)yahoo(dot)it> aka Mach <tumin17(at)yahoo(dot)it>
Website: http://www.marcosegato.tk/
*********************************************************************************


FOGLIO DI PROGRAMMAZIONE

Cobol ha un foglio di programmazione che lavora su 80 caratteri per riga: +-----------+----------------------------------------------------------------------------------------+ | N.COLONNA | DESCRIZIONE | +-----------+----------------------------------------------------------------------------------------+ | 1-6 | Colonne libere: solitamente si scrivono commenti di verifica o dell'autore | +-----------+----------------------------------------------------------------------------------------+ | 7 | Colonna dove si inizia un commento con un asterisco | | | NB: non posso affiancare un commento a un'istruzione, ma deve essere su una riga unica | +-----------+----------------------------------------------------------------------------------------+ | 8-11 | Margine A: contiene definizioni di variabili e labels (nomi delle sub-routines) | +-----------+----------------------------------------------------------------------------------------+ | 12-72 | Istruzioni Cobol che terminano con un punto | +-----------+----------------------------------------------------------------------------------------+ | 73-80 | Contengono le numerazioni automatiche di riga, ma non sono necessarie | +-----------+----------------------------------------------------------------------------------------+

SCHELETRO PRINCIPALE

111 123456789012 IDENTIFICATION DIVISION. } obbligatorio PROGRAM-ID. NOMEPROGRAMMA. } obbligatorio; nome programma max 8 caratteri AUTHOR. NOMEAUTORE. } facoltativo DATE-WRITTEN. MIADATA. } facoltativo ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. } specifica che i decimali sono identificati dalla virgola, dato che il punto e' gia' utilizzato nella sintassi di sistema INPUT-OUTPUT SECTION. FILE-CONTROL. } definizione dei files che usero' DATA DIVISION. FILE SECTION. } definisco tracciati/caratteristiche FILES che ho dichiarato prima *------------------------------------------------------------------------------------------------------* WORKING-STORAGE SECTION. } definisco tutte le VARIABILI di comodo; nome variabile max 32 caratteri *------------------------------------------------------------------------------------------------------* *------------------------------------------------------------------------------------------------------* LINKAGE SECTION. } definisco le VARIABILI ricevute da chiamate a programmi esterni *------------------------------------------------------------------------------------------------------* *------------------------------------------------------------------------------------------------------* PROCEDURE DIVISION. *------------------------------------------------------------------------------------------------------* istruzione1. istruzione2. istruzione3. STOP RUN. } dopo lo STOP RUN sviluppo tutte le procedure/funzioni qui dichiarate

CARATTERISTICHE DELLE SEZIONI PRINCIPALI

  • FILE-CONTROL.
  • Contiene la lista di definizione dei files che usero': 111 123456789012 FILE-CONTROL. SELECT nomelogicofile ASSIGN TO "nomefileconpercorso" ORGANIZATION IS SEQUENTIAL } file sequenziale con record a lunghezza fissa FILE STATUS IS ELENCO-ST. } variabile valorizzata ad ogni read che andro' a gestire per gli EOF FILE-CONTROL. SELECT nomelogicofile ASSIGN TO "nomefileconpercorso" ORGANIZATION IS LINE-SEQUENTIAL. } file sequenziale con record a lunghezza variabile FILE-CONTROL. SELECT nomelogicofile ASSIGN TO "nomefileconpercorso" ORGANIZATION IS INDEXED. } file a indice (VSAM)
  • FILE SECTION.
  • Contiene la lista di definizione dei tracciati/caratteristiche dei FILES che ho dichiarato prima: 111 123456789012 FILE SECTION. FD nomelogicoarchivio1 } devo dichiarare una FD (File Division) per ogni SELECT fatta DATA RECORD IS nomerecord LABEL RECORD IS STANDARD. 01 nomerecord PIC X(80). } livello della variabile del mio record, stringa lunga 80 FILE SECTION. FD nomelogicoarchivio2 DATA RECORD IS nomerecord LABEL RECORD IS STANDARD. 01 nomerecord. } dimensione diventa la somma delle variabili di cui e' composta 05 variabile1 PIC X(12). NB: sottolivelli compresi tra 02 e 48 05 variabile2 PIC X(01). NB2: livello 77 non prevede sottolivelli 05 variabile3 PIC X(67). 05 variabile4. 10 var1 PIC X(15). 10 var2 PIC X(12).
  • WORKING-STORAGE SECTION.
  • Contiene la lista di definizione di tutte le VARIABILI di comodo: PIC X == variabile alfanumerica PIC A == variabile solo alfabetica PIC 9 == variabile numerica } dimensione max dei PIC 9 e' 18, decimali inclusi 111 123456789012 01 variabile1 PIC X(02). } la formula "01 variabile1 PIC XX." e' equivalente 01 variabile2 PIC X(02) VALUE SPACE. } inizializzo a 'space' la variabile 01 variabile3 PIC 9(05). 01 variabile4 PIC 9(05) VALUE ZERO. } inizializzo a zero la variabile 01 variabile5 PIC A(02).
  • PROCEDURE DIVISION.
  • 111 123456789012 PROCEDURE DIVISION. PERFORM nomeprocedura1 THRU nomelabelfineprocedura1. PERFORM nomeprocedura2 THRU nomelabelfineprocedura2. STOP RUN.

    INIZIALIZZAZIONE E MODIFICA DELLE VARIABILI

    Le variabili vengono modificate nella PROCEDURE DIVISION secondo questo schema: MOVE valore TO nomecostante. 111 123456789012 MOVE SPACE TO ELENCO-NOME. } assegno a ELENCO-NOME tutti spazi MOVE 'P:\CARTELLA\ELENCO.TXT' TO ELENCO-NOME. } assegno a ELENCO-NOME il file fisico ELENCO.TXT MOVE 1 TO MIONUMERO. } assegno a MIONUMERO (di tipo PIC 9) la costante 1 NB: quando assegno un tipo di variabile ad un altro, "comanda" il tipo della variabile di destinazione per tutto quanto riguarda il formato e le proprieta'. Quando variabile di arrivo e' alfanumerica, la sua valorizzazione parte sempre dal primo byte a sinistra: 01 PIPPO PIC X(05) VALUE 'ABCDE'. 01 PLUTO PIC X(08). MOVE PIPPO TO PLUTO. } ottengo ABCDE### 01 PIPPO PIC X(05) VALUE 'ABCDE'. 01 PLUTO PIC X(08) VALUE '12345678'. MOVE PIPPO TO PLUTO. } ottengo ABCDE### perche' la MOVE e' distruttiva 01 PLUTO PIC X(08) VALUE 'ABCDEFGH'. 01 PIPPO PIC X(05). MOVE PLUTO TO PIPPO. } ottengo ABCDE Quando variabile di arrivo e' numerica, la sua valorizzazione parte sempre dal primo byte a destra: 01 PIPPO PIC X(05) VALUE '12345'. 01 PLUTO PIC 9(05) VALUE 67890. MOVE PIPPO TO PLUTO. } ottengo 12345 valorizzandolo a partire dalla dx della variabile di partenza MOVE PLUTO TO PIPPO. } ottengo 67890 valorizzandolo a partire dalla sx della variabile di partenza Esempi con variabili numeriche: 01 PIPPO PIC 9(05)V9(02) VALUE 0. 01 PLUTO PIC 9(05) VALUE 100. MOVE PLUTO TO PIPPO. } ottengo 00100,00 01 PIPPO PIC 9(05)V9(02) VALUE 350,25. 01 PLUTO PIC 9(05) VALUE 100. MOVE PLUTO TO PIPPO. } ottengo 00100,00 perche' la MOVE e' distruttiva MOVE PIPPO TO PLUTO. } ottengo 00350 perche' prendo la parte intera di PIPPO e la valorizzo a partire da dx
  • INCREMENTO DELLE VARIABILI NUMERICHE
  • ADD 1 TO IND. } IND=IND+1 ADD 1 TO IND GIVING IND2. } IND2=IND+1 oppure COMPUTE IND = IND + 1. COMPUTE IND2 = IND + 1.
  • DECREMENTO DELLE VARIABILI NUMERICHE
  • SUBTRACT 1 FROM IND. oppure COMPUTE IND = IND - 1.
  • MOLTIPLICAZIONE
  • MULTIPLY IND BY 2. oppure COMPUTE IND = IND * 2.
  • DIVISIONE
  • DIVIDE 2 INTO IND. DIVIDE 2 INTO IND GIVING REMINDER IND3. } metto il resto della divisione intera in IND3 oppure COMPUTE IND = IND / 2. } es: 3/2=1
  • VARIABILI NUMERICHE CON DECIMALI
  • Virgola virtuale: PIC 9(15)V9(3) } e' sempre una variabile lunga 18, ma noi sappiamo che gli ultimi 3 numeri sono decimali Virgola reale: PIC 9(14),9(3) } in questo caso la virgola occupa uno spazio nel record, quindi la dimensione massima del numero scende a 17 NB: variabili di tipo PIC 9 sono sempre variabili in valore assoluto. Se voglio il segno devo usare il tipo PIC S9(dimensione), dove il segno non occupa alcun spazio.
  • STAMPA DELLE VARIABILI NUMERICHE
  • 01 VARIABILE1 PIC 9(18). MOVE 100 TO VARIABILE1. } otterro' in stampa 000000000000000100 01 VARIABILE1 PIC Z(18). MOVE 100 TO VARIABILE1. } otterro' in stampa 100. Posso solo valorizzarla e portarla in stampa, ma non posso eseguire alcun tipo di operazione aritmetica
  • VARIABILI COMPOSTE (NUMERO+STRINGA)
  • 01 SCADENZA. 05 GG PIC 9(02). 05 FILLER PIC X VALUE "/". } non viene trattato come variabile 05 MM PIC 9(02). 05 FILLER PIC X VALUE "/". 05 AAAA PIC 9(04).

    TEST

    111 123456789012 IF variabile operatore_logico variabile THEN istruzione1 ELSE istruzione2 END-IF
  • OPERATORI LOGICI
  • EQUAL uguale NOT EQUAL diverso LESS minore NOT LESS non minore GREATER maggiore NOT GREATER non maggiore LESS EQUAL minore uguale GREATER EQUAL maggiore uguale AND "et..et" OR "vel" NOT negazione

    CICLI

    111 123456789012 PERFORM labeliniziofunzione THRU labelfinefunzione } COBOL UNTIL condizione. PERFORM UNTIL condizione } COBOL2 END-PERFORM.

    OPERAZIONI I/O SU FILES

    111 123456789012 OPEN INPUT nomelogicofile. } solo operazioni di lettura CLOSE nomelogicofile. } chiusura file READ nomelogicofile. } valorizzo la variabile dichiarata come FD nella FILE SECTION READ nomelogicofile INTO nomevariabile. } valorizzo la variabile dichiarata come FD nella FILE SECTION e la passo alla variabile strutturata in WORKING-STORAGE SECTION al livello 01 OPEN OUTPUT nomelogicofile. } solo operazioni di scrittura WRITE nomerecord. WRITE nomerecord FROM nomecapostruttura01. } scrivo record da variabile di livello 01 definita in WORKING-STORAGE SECTION OPEN I-O nomelogicofile. } operazioni di aggiornamento (rewrite) READ nomelogicofile. ..[istruzioni di cambio-valori tramite una MOVE].. REWRITE nomerecord.

    VETTORI

    Dichiarazione di un vettore: livello nomevettore PIC tipo(dimensione) OCCURS dimensione_max 111 123456789012 01 VETTORE PIC X(02) OCCURS 12. } esempio del vettore dei mesi dell'anno 01 IND PIC 9(02). MOVE 1 TO IND. IF VET(IND) = 31 ..[istruzioni]..