*********************************************************************************
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]..