Documente Academic
Documente Profesional
Documente Cultură
SuportCOBOL PDF
SuportCOBOL PDF
Page 1 of 92
Cuprins
1. Introducere în COBOL.................................................................................................. 5
· Ce este limbajul Cobol? ...................................................................................................5
· Avantaje Cobol versus alte limbaje de manipulare date......................................................6
· Caracteristicile generale ale limbajului Cobol ...................................................................7
2. Structura generala a programelor COBOL ........................................................................ 7
· Setul de caractere............................................................................................................7
· Operatori relationali .........................................................................................................8
· Structuri ierarhice............................................................................................................9
· Formate de scriere cod Cobol.........................................................................................10
· Diviziunile unui program Cobol.......................................................................................11
3. Declararea datelor în COBOL ..................................................................................... 14
· Categorii principale de date............................................................................................14
· Clauza VALUE ............................................................................................................................. 14
· Clauza OCCURS.......................................................................................................................... 14
· Clauza REDEFINES ..................................................................................................................... 15
· clauza RENAMES ........................................................................................................................ 15
· Numerele de nivel......................................................................................................................... 15
· Tipuri de variabile ..........................................................................................................16
· Alfabetice..................................................................................................................................... 16
· Alfanumerice................................................................................................................................ 16
· Numerice..................................................................................................................................... 16
· Clauza NEXT pentru constante utilizator .................................................................................... 16
Daca avem o descriere de forma urmatoare:........................................................................................ 16
· [USAGE IS DISPLAY] .............................................................................................................. 17
· [USAGE IS] COMPUTATIONAL ................................................................................................ 17
· [USAGE IS] INDEX .................................................................................................................. 18
· [USAGE] IS POINTER ............................................................................................................. 18
· [USAGE] IS PROCEDURE POINTER........................................................................................ 19
· Tipuri de date definite de utilizator, clauza TYPEDEF .................................................................. 19
· Formate de editare numerice ..........................................................................................20
· Literali...........................................................................................................................21
· Constante figurative.......................................................................................................22
4. Fisiere secventiale ..................................................................................................... 22
· Declararea fisierelor.......................................................................................................22
· Fraza SELECT pentru fisiere secventiale .........................................................................22
· Forma generala rubrica FD (File Description), cu principalele clauze: ...............................23
· Instructiuni utilizare fisiere .............................................................................................24
· Instructiunea OPEN ...................................................................................................................... 24
· Instructiunea READ secvential ....................................................................................................... 24
· Instructiunea WRITE secvential ..................................................................................................... 25
Page 2 of 92
· Instructiunea CLOSE fisier ............................................................................................................ 26
· Fisiere secventiale in format fix si variabil .......................................................................26
· Exmplu de declarare a uni fisier secvential cu format fix de inregistrare ...........................26
· Declarative ....................................................................................................................27
· Declarare FILE-STATUS .................................................................................................29
· Fisiere de listare ............................................................................................................30
5. Editorul de rapoarte Cobol............................................................................................. 31
· Generalitati....................................................................................................................31
· Structura generala a unui raport .....................................................................................31
· Declararea raportului in sectiunea FILE SECTION ............................................................32
· Declararea raportului in sectiunea REPORT.....................................................................32
· Descrierea grupelor de editare........................................................................................33
· Instructiuni executabile specifice editorului de rapoarte...................................................34
· Instructiunea USE pentru report .....................................................................................35
· Registrii speciali report : LINE-COUNTER si PAGE-COUNTER ..........................................35
6. Fisiere selective........................................................................................................... 35
· Caracteristici generale ...................................................................................................35
· Clauza select .................................................................................................................35
· Moduri de acces ............................................................................................................36
· READ secvential pe fisier selectiv pentru acces dinamic : ................................................36
· READ pentru acces direct ..............................................................................................36
· Instructiunea START ......................................................................................................37
· Instructiunea REWRITE ..................................................................................................37
· instructiunea WRITE cu INVALID KEY – adaugare directa.................................................38
· instructiunea DELETE cu INVALID KEY – stergere directa ...............................................38
7. Fisiere indexate.......................................................................................................... 38
· Caracteristici generale ...................................................................................................38
· Fraza select pentru declararea unui fisier indexat ............................................................39
· Instructiunea READ secvential pentru acces DYNAMIC....................................................39
· Instructiunile READ, WRITE, REWRITE, START si DELETE in acces direct ........................39
· SPLYT KEY - setare cheie fisier indexat.........................................................................39
8. Sortare cobol ............................................................................................................. 40
· Necesitatea sortului cobol ..............................................................................................40
· Forma generala a instructiunii SORT...............................................................................41
· Exemplu sortare simpla :................................................................................................41
Page 3 of 92
· INPUT-PROCEDURE ......................................................................................................42
· Instructiunea RELEASE de scriere in sort........................................................................42
· OUTPUT-PROCEDURE ...................................................................................................42
· Instructiunea RETURN de citire din sort ..........................................................................42
9. Interclasare fisiere ..................................................................................................... 43
· Consideratii generale .....................................................................................................43
· Instructiunea MERGE.....................................................................................................43
10. Subprograme, apelare, parametrii .......................................................................... 43
· Consideratii generale .....................................................................................................44
· Forma generala instructiune CALL subprogram: .............................................................44
· Exemplu apelare subprogram din programul principal : ...................................................45
· Clauza IS INITIAL ......................................................................................................45
· Instructiunea CANCEL ...................................................................................................45
· Instructiunea EXIT PROGRAM .................................................................................46
· Instructiunea GOBACK ..................................................................................................46
· Clauza IS COMMON...................................................................................................46
· Exemplu apelare programme incluse ..............................................................................46
· Clauza IS GLOBAL .....................................................................................................47
· Clauza IS EXTERNAL ................................................................................................47
· Puncte de intrare intr-un subprogram - Entry points ........................................................47
· Instructiunea ENTRY .................................................................................................................... 48
· Necesitatea utilizarii subprogramelor..............................................................................49
11. Functii intrinseci – Built-in functions...................................................................... 50
· Tipuri de functii in Cobol ................................................................................................50
· Forma generala de apelare a unei functii Cobol...............................................................50
· Tabelul tuturor functiilor Cobol.......................................................................................50
12. PROCEDURE DIVISION, comenzi principale.......................................................... 53
· Instructiuni grupate pe categorii .....................................................................................53
· Instructiuni aritmetice ....................................................................................................56
· Instructiunea de adunare ADD ....................................................................................................... 56
· Instructiunea de scadere SUBTRACT............................................................................................. 58
· Instructiunea de inmultire MULTIPLAY ........................................................................................... 59
· Instructiunea de impartie DIVIDE................................................................................................... 60
· Instructiunea COMPUTE ............................................................................................................... 62
· Instructiuni de intrare-iesire , INPUT-OUTPUT..................................................................62
· Instructiunea DISPLAY................................................................................................................. 62
· Instructiunea ACCEPT ................................................................................................................. 63
· Instructiuni activate la compilare - Compiler-directing Statements ..................................64
Page 4 of 92
· Instructiunea COPY ...................................................................................................................... 64
· Manipulari de date - Data Movement................................................................................65
· Instructiunea MOVE...................................................................................................................... 65
· Instructiunea SET ......................................................................................................................... 66
· Instructiunea INSPECT ................................................................................................................. 67
· Instructiunea STRING .................................................................................................................. 69
· Instructiunea UNSTRING ............................................................................................................. 70
· Instructiunea INITIALIZE ............................................................................................................... 72
· Instructiuni conditionale.................................................................................................73
· Instructiunea IF ............................................................................................................................ 73
· Instructiunea EVALUATE .............................................................................................................. 73
· Instructiunea PERFORM ............................................................................................................... 76
· Instructiunea SORT – pentru matrici............................................................................................... 78
· Instructiunea SEARCH.................................................................................................................. 79
· SEARCH-ul secvential ............................................................................................................. 79
· SEARCH-ul ALL, sau BINAR .................................................................................................... 81
· Instructiuni fara effect - Null Operation............................................................................83
· Instructiune EXIT .......................................................................................................................... 83
· Instructiunea CONTINUE .............................................................................................................. 84
· Testarea conditiei de clasa .............................................................................................84
· IS [NOT] NUMERIC, ALFABETIC................................................................................................... 84
· Instructiuni pentru legatura cu alte programe NON-Cobol ................................................85
· Instructiunea EXECUTE ........................................................................................................... 85
13. Conectare din COBOL la o baza de date................................................................. 86
· Instructiuni conectare ....................................................................................................86
· Variabila de conectare SQLCA la o baza de date .............................................................87
· Directiva compilare ordine Sql si testare instructiuni Sql.................................................88
· Definire, deschidere,citire, inchidere cursor Sql in Cobol .................................................89
· Gestionarea indicilor pe baza de date..............................................................................90
· Tratarea erorilor in lucrul cu o baza de date.....................................................................90
• Comenzi de baza in Cobol-Microfocus ............................................................................91
14. Registri speciali – Special registers ....................................................................... 91
1. Introducere în COBOL
COBOL este un limbaj de programare de nivel înalt dezvoltat pentru prima oară de
către Comitetul CODASYL (Conference on Data Systems Languages), în 1960. De
atunci, responsabilitatea pentru dezvoltarea de noi standarde COBOL a fost
asumată de către American National Standards Institute (ANSI). Trei standarde
ANSI pentru COBOL au fost produse: în 1968, 1974 şi 1985.
Page 5 of 92
Ulterior la mijlocul anilor ’90 a aparut si versiunea de Cobol mai complexa OO-Cobol,
orientata pe obiecte.Compatibilitatea cu vechile versiuni de cobol a fost insa
mentinuta.
Page 6 of 92
· Caracteristicile generale ale limbajului Cobol
Cobolul este un limbaj simplu fara functii si tipuri de date definite de utilizator, dar
suplu in acelasi timp , in sensul ca reuseste sa raspunda oricaror cerinte de structuri
de date de business si algoritmi de calcul oricat de complicati.
Initial Cobolul a fost gandit ca un limbaj care sa fie inteles si de neprogramatori.
Astfel o serie intreaga de instructiuni folosesc sintaxa limbajului vorbit din Engleza,
cum ar fi ADD, SUBSTRACT, DIVIDE, MULTIPLAY, PERFORM, MOVE etc..
Ca o alternativa stiintifica la operatiile de calcul aritmetic de mai sus (primele 4)
exista si instructiunea COMPUTE Variabila = Expresie aritmetica
Una din principalele caracteristici ale limbajului este portabilitatea acestuia.
Astfel au fost dezvoltate compilatoare de cobol pentru o gama foarte larga de masini
si sisteme de operare ca Windouws, Unix, AS/400, DOS, OS2, VSE,VMS etc..
Mentenabilitatea programului se face intr-un mod facil, deoarece toate referirile
externe la drivere, fisiere , simbol monetar sau punct zecimal , vor fi clar definite in
diviziunea de mediu (ENVIRONMENT DIVISION).
Astfel cand un program Cobol este portat pe o alta platforma hard, sau alta regiune
geografica, cu alte simboluri monetare etc.., programatorul stie datorita structurii bine
definite a Cobolului ca nu trebuie sa modifice programul decat in diviziunea mai sus
amintita, si astfel orice portare se face rapid si eficient.
De asemenea partea de procedura a unui program poate fi foarte bine structurata
prin apeluri succesive de paragrafe sau sectiuni, astfel incat scheletul unui program
de cateva mii de linii sa incapa in primele 100-200 de linii, astfel incat imaginea de
ansamblu a algoritmului programului sa poata fi observata foarte usor si la fel de
usor sa se poata interveni in cazul unor modificari sau erori de program.
· Setul de caractere
0 to 9 Digits
A to Z Uppercase letters
a to z Lowercase letters
Space
+ Plus sign
- Minus sign or hyphen
• 0 la 9 Numerele
• A la Z Litere mari
• a la z Litere mici
Page 7 of 92
• Spatiu
• + Semnul plus
• - Semnul minus sau liniuta de unire
• * Asterisc
• / Slash
• = Semnul egal
• $ Semnul Dollar
• . Punctul ~ Punctul zecimal
• , Virgula sau punctul zecimal
• ; Punct si virgula
• " Ghilimele
• ’ Apostrof
• ( Paranteza stanga
• ) Paranteza dreapta
• > Simbolul “mai mare decat”
• < Simbolul “mai mic decat”
· Operatori relationali
Intre variabilele numerice , sau variabila numerica cu literal numeric, sau chiar pentru
variabile\si literali alfanumerici, sau de tip index se pot face o serie intreaga de
comparatii, detaliate in tabelul de mai jos, in care apare atat expresia matematica
cunoscuta <,=,> etc..,cat si fraza cobol care poate fi folosita la astfel de comparatii.
De asemenea avem echivalenta intre urmatoarele fraze cobol :
Mai jos avem tabelul cu toti operatorii relaionali, atat in forma matematica cat si fraza
cobol corespunzatoare :
Page 8 of 92
· Structuri ierarhice
Page 9 of 92
Orice program Cobol este conceput ca o structura ierarhica formata din urmatoarele
elemente :
Diviziuni
Sectiuni
Paragrafe
Fraze
Instructiuni
Diviziunile contin sectiuni, sectiunile contin paragraphe formate din una sau mai
multe fraze, care la randul lor sant formate din una sau mai multe instructiuni.
Fiecare din primele trei structuri ierarhice sant niste blocuri de cod care incep cu
numele structurii urmat de cuvantul cheie DIVISION respectiv SECTION (pentru
primele doua) si doar numele pentru paragraph.
Sfarsitul oricareia din cele trei structuri ierarhice este marcat de numele structurii
urmatoare de acelasi nivel.
Frazele sant instructiuni cumplexe formate din inlantuirea mai multor instructiuni
elementare si care la sfarsit pot contine punctul de sfarsit de propozitie (asemanator
cu regula din limba vorbita).Practic in loc de punct este mult mai eficient si lipsit de
riscuri sa se foloseasca cuvantul cheie END-nume-instructiune-complexa(dupa care
poate urma si punctul in situatia obligatorie de mai jos), care este mult mai lizibil si
fara alte riscuri de erori de programare.
Punctul este insa absolut necesar inaintea oricareia din primele trei structuri de
program precum si la sfarsitul oricarei instructiuni de descriere de date.
Page 10 of 92
Formatul FREE, aparut mai recent, incepe din coloana 1 (care corespunde coloanei
7 din formatul fix, doar ca aici nu mai avem ‘-‘ pentru continuare de literar), si fara sa
mai existe Zona A sau Zona B.
Ca structura, un program Cobol este impartit in patru mari diviziuni fixe, dar nu si
obligatorii toate, fiecare din ele furnizand diverse informatii :
[IDENTIFICATION DIVISION.]
IDENTIFICATION DIVISION.
PROGRAM-ID. CFM615.
AUTHOR. CVA-KEPLER.
DATE-WRITTEN. MAI 2004.
Tot la nivelul acestei prime diviziuni, mai pot aparea rubrica SECURITY sau
REMARKS, urmate de specificatii corespunzatoare, dar pe care programul le ia tot
ca pe comentarii.
Numele programului, care urmeaza dupa PROGRAM-ID., este nu doar cu titlu de
comentariu, ci va fi folosit efectiv de catre LINK-erul de suprograme Cobol, la apelul
unei instructiuni CALL, care realizeaza apelul de subprogram.
[ENVIRONMENT DIVISION. ]
Dupa cum sugereaza si numele ei, este diviziunea in care este descris mediul de
lucru al programului, fisierele accesate de program, cu numele lor si tipul fiecarui
fisier.Avem de-a face aici cu doua mari sectiuni :
[CONFIGURATION SECTION.]
[SOURCE-COMPUTER. nume.]
[OBJECT-COMPUTER. nume.]
[SPECIALS-NAMES. Nume-1,..nume-n.] (Simbol monetar, punct
zecimal,etc)
Page 11 of 92
[INPUTOUTPU SECTION.]
[FILE-CONTROL. Intrari file-control.] - Fisiere intrare sau iesire
[I-O-CONTROL.intrari input-output.] - Puncte de reluare, zone de
memorie partajabile etc..
De remarcat la asignarea numelor pentru fisierele de lucru, aceste nume pot fi chiar
cele reale cu sau fara calea catre fisierul de pe device, sau pot fi numele unor
variabile in care s-au incarcat in prealabil aceste nume reale.
[DATA DIVISION.]
Este diviziunea in care sant descrise toate varibilele de lucru din program, precum si
structurile de fisiere cu descrierea campurilor aferente.
In functie de versiunea de cobol folosita pot aparea in aceasta deviziune sectiuni mai
multe sau mai putine.Vom enumera cateva din cele mai des utilizate
corespunzatoare versiunii de cobol ANS85 :
PROCEDURE DIVISION.
Page 12 of 92
ramuri, caz in care dupa STOP RUN mai exista si alte paragraphe sau sectiuni de
program.
PROCEDURE DIVISION.
DISPLAY ' Hello world'
Hello world
Identification Division.
PROGRAM-ID. Nnume program.
AUTHOR. Ionescu A.
Environment Division.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT AX-FICHIER ASSIGN UT-S-AX.
SELECT FPARAM ASSIGN TO PARAMDAT
ORGANIZATION line SEQUENTIAL
FILE STATUS FILE-STAT-P.
Data Division.
FILE SECTION.
FD AX-FICHIER .
01 REC-AX PIC X(66).
FD FPARAM RECORD 6 RECORDING F.
01 ENR-PARAM.
05 PROC-FICHIER PIC 999.
05 PROC-CMR PIC 999.
WORKING-STORAGE SECTION.
01 FILE-STAT-P PIC XX.
88 OK-TRAIT-P VALUE '00'.
88 FIN-FPARAM VALUE '10'.
Procedure Division.
Deschidere fisiere, cursoare, prelucrari date, afisari etc..
STOP RUN.->optional, dar e bun ca evidentiaza sf programului
Page 13 of 92
3. Declararea datelor în COBOL
Ex : 01 rand-imprimanata.
05 cod-produs PIC 9(5).
05 denumire-produs PIC X(25) OCCURS 5.
05 val-manopera PIC Z(3)9.99 VALUE ZERO.
· Clauza VALUE
VALUE IS literal
· Clauza OCCURS
care apare mai sus defineste un vector cu 5 pozitii, fiecare pozitie avand
lungimea de 25. Are urmatoarea forma generala :
Page 14 of 92
· Clauza REDEFINES
Deci obligatoriu cele doua zone trebuie sa aiba aceeasi lungime, pentru ca de fapt
este o singura zona de memorie dar cu doua structuri diferite.
· clauza RENAMES
· Numerele de nivel
Page 15 of 92
logica.
· Tipuri de variabile
· Alfabetice
Ex : PIC A(7) descrie un sir alphabetic cu lungimea de 7 litere
· Alfanumerice
Ex : pic 9(7)
Pic 9(3)V99 unde V semnifica pozitia punctului zecimal
Page 16 of 92
Se observa ca x2 redefineste de fapt doar primul octet al lui x1, iar valoarea
constantei next-offset va puncta catre valoarea celui de aldoilea octet al lui x1 si nu
catre primul octet al lui x3.
De asemenea pot aparea confuzii la definirile cu occurs:
Unde offset-a puncteaza catre valoarea primului element “elem” in timp ce offset-b
puncteaza catre valoarea celui de al doilea element “elem” si nu catre primul octet
din afer-tabl.
· [USAGE IS DISPLAY]
Este clauza implicita la tipul numeric si semnifica faptul ca fiecare cifra a valorii
variabilei este in format zecimal despachetat, adica corespunzator formatului intern
de reprezentare a masinii respective (ASCII, EBCDIC, BCD- Binary Code Decimal
pentru COMP-3 etc).
Din pacate aceasta clauza implicita pentru formatul numeric este nerecomandata
pentru ca de regula cu datele de tip numeric se efectueaza calcule aritmetice, care
presupun mai intai trecerea din acest format in formatul binar de reprezentare a
numerelor, efectuarea calculelor si apoi reconvertirea rezultatului in formatul initial.
Datele in format zecimal despachetat (sau DISPLAY) ocupa :
1 cifra 1 octet
S-ul din fata lui 9 specifica faptul ca numarul respectiv poate avea si semn.
Page 17 of 92
Datele in format binar (sau COMP), ocupa memorie astfel :
77 nr-intrari comp-1.
01 valoare comp-2.
Eeste un tip aparte de variabila numerica, fara clauza PICTURE, este folosit la
indexarea vectorilor, pentru a face posibila utilizarea instructiunii SEARCH, de
cautare intr-un vector si este gestionat automat de cobol.
Variabilele de tip index pot fi setate doar cu instructiunea SET, atribuire de valori sau
incrementari (Up, Down).
O variabila index nu poate fi afisata cu DISPLAY, sau mutate cu MOVE intr-o alta
variabila. Se poate atribui valoarea aferenta unei variabile index unei alte variable tot
cu instructiune SET.
· [USAGE] IS POINTER
Page 18 of 92
Reprezinta adresa unei variabile descrisa in LINKAGE-SECTION si incepand cu
Microfocus Cobol oriunde in DATA DIVISION.
Ea poate fi referita doar prin instructiunea SET, sau fraza USING de la instructiunea
CALL sau PROCEDURE DIVISION a unui subprogram, pentru variabilele transmise
de la program catre subprogram prin clauza BY REFERENCE (sau implicit prin
absenta vre-unei clauze).
Reprezinta adresa unui subprogram care poate contine puncte de intrare multiple,
asa numitele ENTRY POINTS, pe care se va intra in functie de valorile actuale ale
parametrilor de apel ai subprogramului.
Valoarea unei astfel de variabile se modifica numai cu ajutorul instructiunii SET, prin
care se specifica de fapt punctul de intrare in subprogram
Ex:
program-id. controller.
working-storage section.
01 next-option pic x.
linkage section.
01 current-proc usage procedure-pointer.
procedure division using current-proc.
perform until current-proc = NULL
call current-proc returning next-option
* Note program-id must be called before any entry point
evaluate next-option
when "a" set current-proc to entry "sub1"
when other set current-proc to NULL
end-evaluate
end-perform
exit program.
end-program controller
unde instructiunea:
Page 19 of 92
In Cobol, ca si in multe alte limbje, putem defini tipuri particulare de date ca in
exemplul de mai jos cu ajutorul clauzei TYPEDEF :
prin care am definit astfel noile tipuri de date struct-1 si USHORT, pe care le
putem folosi apoi in descrierea unor alte variabile astfel:
Page 20 of 92
Ex : 01 valoare pic 9(3).99.
Va face ca valoarea 12345 sa apara 123.45 dar numai daca campul val-d
care alimenteaza campul valoare are descrierea :
01 val-d pic 9(3)V99 [COMP].
Adica ideea este ca formatul de iesire se centreaza pe punctul zecimal din
formatul de iesire, ex : 9(5) cu valoarea 12345 si cu format de iesire 9(3).99
va rezluta valoarea trunchiata 345.00
· Literali
Page 21 of 92
Ex literali numerici : 123 sau 123.45 sau -1234
· Constante figurative
Sant niste literali speciali cu valori precise si care spre deosebire de literalii obisnuiti
in momentul in care sant atribuiti unei variabile incarca variabila respectiva cu acea
constanta figurativa pe toata lungimea variabilei.
Astfel in Cobol exista urmatoarele constante figurative :
4. Fisiere secventiale
· Declararea fisierelor
Orice fisier extern folosit intr-un program Cobol, trebuie declarat mai intai in
paragraphul FILE-CONTROL din sectiunea INPU-OUTPUT SECTION din cadrul
diviziunii ENVIRONMENT DIVISION, prin:
Page 22 of 92
LINE – specifica faptul ca dupa fiecare inregistrare din fisier exista un carriage-return
urmat de un line-feed character, lucru specific fisierelor de tip text obtinute din
editoarele obisnuite.
Page 23 of 92
mai ales in cazul fisierelor cu structura variabila, legate de limitele intre care se afla
lungimea inregistrarii.
Data-name-7 , Data-name-8,...reprezinta structurile de date pe tipuri de inregistrari,
aferente fisierului din clauza FD, care trebuie sa apra imediat dupa clauza FD.
[info] – specifica o clauza optionala, iar daca clauza respectiva este incadrata si intr-
un chenar, atunci inseamna ca ea este obligatorie pentru varianta de Cobol-74, dar
incepand de la varianta specificata in cerculetul oval de langa patrat, ea a devenit
optionala.
Formate generale asemanatoare exista pentru SD sau RD
Am vazut in exemplele de mai sus ca prima operatiune executata asupra unui fisier
este cea de schidere cu forma generala :
· Instructiunea OPEN
INPUT – specifica faptul ca fisierul este deschis in citire si este permisa doar citirea
inregistrarilor inlantuite una cate una in acces secvential.
Daca fisierul nu exista pe support va generata o eroare .
OUTPUT – fisierul este deschis in iesire , drept care este permisa doar scrierea in
acesta. Daca fisierul nu exista pe support el va fi creat automat.
I-O - fisierul este deschis in mod input-output si deci sant premise atat citirea cat si
scrierea, precum si stergerea DELETE sau rescrierea REWRITE.
Acest mod de deschidere este permis numai pentru fisierele selective sau indexate.
A doua operatiune executata asupra unui fisier este cea de citire secventiala cu
forma :
· Instructiunea READ secvential
Page 24 of 92
In loc de END-READ putem avea ‘.’ (punctul) , dar este de preferat aceasta
instructiune terminala, ca de altfel pentru oricare alta instructiune, pentru ca este
mult mai lizibila si face mai mica posibilitatea de a gresi la scrierea programului.
Cand scriem ntr-un fisier secvential utilizam instructiunea write cu urmatorul format :
Page 25 of 92
Intr-un fisier secvential sant posibile inserari stergeri sau modificari doar prin
recrearea acestuia intr-un nou fisier care sa contina astfel ultimele modificari.
Ultima instructiune care se executa asupra unui fisier este cea de inchidere :
Page 26 of 92
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FisStudenti
ASSIGN TO “STUDENTI.DAT”
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS FILE-STAT-P.
DATA DIVISION.
FILE SECTION.
FD FisStudenti.
01 Rec.
02 StudentId PIC 9(7).
02 NumeStudent.
03 PreNume PIC X(8).
03 Initiala PIC XX.
03 Nume PIC X(8).
WORKING-STORAGE SECTION.
01 FILE-STAT-P PIC XX.
88 OK-TRAIT-P VALUE '00'.
88 FIN-FPARAM VALUE '10'.
· Declarative
Este zona de procedura , prima in cazul in care exista in program, in care sant
tratate erorile asupra fisierelor, sau sant specificate operatiuni specifice de efectuat
inaintea unui grup report.
Zona incepe cu cuvantul cheie DECLARATIVES, contine una sau mai multe sectiuni
specifica fiecarei clause USE si se incheie cu END- DECLARATIVES.
In cazul tratarii erorilor la operatiile cu fisiere, fiecarui fisier ii va corspunde cate o
sectiune si o clauza USE cu urmatoarea forma generala:
Aceasta forma este specifica tratarii erorilor la operatiile pe fisiere, dar am vazut la
generarea automata a rapoartelor ca mai exista o forma specifica pentru USE si
anume:
Caz in care se pot introduce diverse calcule prealabile listarii unui grup.
Page 27 of 92
In prima forma generala de USE, faptul ca folosim ERROR sau EXCEPTION , este
acelasi lucru.
GLOBAL – extinde actiunea clauzei USE si asupra subprogramelor apelate de
programul principal.
Mai jos avem un exemplu concret de scriere declarative :
WORKING-STORAGE SECTION.
01 FILE-STATUS PIC XX.
88 RecordDoesNotExist VALUE ‘11’.
88 RecordAlreadyExist VALUE ‘22’.
88 FileNotOpen value ‘33’.
01 FILE-STATUS-1 PIC XX.
88 RecordDoesNotExist-1 VALUE ‘01’.
88 RecordAlreadyExist-1 VALUE ‘02’.
88 FileNotOpen-1 value ‘03’.
PROCEDURE DIVISION.
DECLARATIVES.
FileError SECTION.
USE AFTER ERROR PROCEDURE ON RelativeFile.
CheckFileStatus.
EVALUATE TRUE
WHEN RecordDoesNotExist DISPLAY "Record does not exist"
WHEN RecordAlreadyExists DISPLAY "Record already exists"
WHEN FileNotOpen OPEN I-O RelativeFile
WHEN OTHER DISPLAY ‘Eroare asupra fisierului ‘ RelativeFile
END-EVALUATE.
FileError-1 SECTION.
USE AFTER ERROR PROCEDURE ON SecvFile-1.
CheckFileStatus-1.
EVALUATE TRUE
WHEN RecordDoesNotExist-1 DISPLAY "Record does not exist"
WHEN RecordAlreadyExists-1 DISPLAY "Record already exists"
WHEN FileNotOpen-1 OPEN I-O SecvFile
END-EVALUATE.
END-DECLARATIVES.
Main SECTION.
INCEPUT.
OPEN INPUT SecvFile-1, RelativeFile
- - - - - -
- - - - - -
CLOSE SecvFile-1, RelativeFile
STOP RUN.
Page 28 of 92
In cazul in care exista sectiune de declarative aferente erorilor de fisiere, clauza
INVALID KEY pentru acces direct , poate fi omisa, erorile fiind tratate automat in
sectiunea de declarative.
Problema este ca la tratarea erorilor asupra unui fisier trebuie prinse toate codurile
de eroare pe operatiunile cu fisiere, adica o lista foarte lunga si in plus dependenta
de masina pe care se ruleaza.
Astfel portabilitatea programului de pe o masina pe alta ar fi practic compromisa si
greu de realizat, fiind de preferat o tratare a erorilor asupra unui fisier prin verificarea
FILE-STATUS-ului aferent daca este dierit de zero, in care caz inseamna ca s-a
produs o eroare la lucrul cu fisierul respectiv.
Se vor afisa in acest caz de eroare un mesaj corespunzator operatiri particulare
efectuate asupra fisierului, precum si valoarea FILE-STATUS-ului pentru acest caz
de eroare.
· Declarare FILE-STATUS
Exemplu:
SELECT FIS-STOC ASSIGN TO F-STOC
Page 29 of 92
Acesta fiind selectul asociat fisierului FIS-STOC, inainte de orice operatie (OPEN,
READ, WRITE, …,CLOSE) asupra fisierului FIS-STOC, va trebui sa incarcam
variabila:
77 w-den-fis pic x(30).
urmat de STOP RUN sau EXIT PROGRAM daca santem pe ramura de erori
blocante, si cu specificatiile de mai sus pentru W-STATUS.
In cazul in care dintr-o eroare de programare specificam un cod de eroare blocant la
ramura de erori neblocante (fara RUN sau EXIT PROGRAM), programul nu se va
opri si va incerca sa execute instructiunea imdeiat urmatoare celei care a generat
eroarea “blocanta”.
De aceea in functie de platforma pe care lucram trebuie precizate explicit toate
codurile de eroare neblocante (fiind mai putine si mai lesne de precizat), ramura pe
care vom avea doar afisarea FILE-STATUS-ului si a denumirii fisierului implicat, iar
pe cealalta ramura vor intra automat toate erorile blocante, pentru care de
asemenea vom afisa FILE-STATUS-ul si denumirea fisierului implicat, dar in acelasi
timp se va realiza si oprirea executiei programului prin una din instructiunile implicite
STOP RUN sau EXIT PROGRAM , dupa cum santem intr-un program principal sau
subprogram.
Exista si exceptii cand un cod blocant de FILE-STATUS poate fi tratat pe ramura de
erori neblocante, caz in care trebuie precizata si actiunea reparatorie care sa
anuleze respectiva eroare blocanta.
· Fisiere de listare
Page 30 of 92
ASSIGN TO var-fis-student si in cast caz var-fis-student este o variabila de
program de tip alphanumeric in care va fi incarcata denumirea reala a fisierului de pe
disc, fie cu o instructiune ACCEPT fie in alt mod (camp dintr-un fisier etc..).
La un fisier pe imprimanta unde implicit am mai multe tipuri de randuri (cu structuri
diferite), acestea vor fi descrise in WORKING-STORAGE SECTION si vor fi mutate
pe rand intr-un rand de imprimanta cu lungimea maxima si abia dupa aceea va fi
scris randul in fisierul de imprimanta.
Astfel forma generala de scriere a unui rand la imprimanta este :
· Generalitati
Vom desemna prin notiunea de raport o situatie finala care se afiseaza la imprimanta
sau se inregistreaza pe suport magnetic in vederea imprimarii ulterioare.
Intrarile raportului sunt in general date provenite din fisiere de intrare sau din baza
de date.
Partea semnificativa a unui raport consta din randurile de detaiu. Pentru realizarea
mai multor grade de total, se stabilesc caracteristici de grupare (caracteristici de
control): un camp din articol care poate lua valori comune mai multor inregistrari.
Articolele cu aceeasi valoare pe caracteristicile de grupare formeaza o asa numita
grupa de control.
Page 31 of 92
- REPORT FOOTING: contine informatii care se afiseaza o singura data, la sfarsitul
raportului (totaluri generale, informatii de incheiere...)
Dupa ce fisierul de iesire (raport) va fi declarat cu o fraza SELECT, fiind asignat unui
fisier de pe disc sau direct la imprimanta, in FILE SECTION. apare o descriere de
tipul:
FD nume-fisier
[RECORD CONTAINS intreg-1 CHARACTERS]
[DATA RECORD IS nume-data-1]
[REPORT IS nume-data-2]
Ex: FD rap
REPORT IS lista.
Page 32 of 92
RD nume-raport
[CONTROL IS nume-data-1 / CONTROLS ARE nume-data-1, nume-data-2, ...]
[PAGE][LIMIT IS intreg-1 LINE/LINES]
[HEADING intreg-2]
[FIRST DETAIL intreg-3]
[LAST DETAIL intreg-4]
[FOOTING intreg-5]
Descrierea fiecarei grupe de editare se face individual, prin intermediul unei rubrici
speciale de descriere la nivelul 01 care urmeaza imediat rubricii RD, astfel:
Formatul 1:
01 nume-data-1
[LINE NUMBER IS intreg-1
PLUS intreg-2
NEXT PAGE]
[TYPE IS REPORT HEADING/PAGE HEADING/CONTROL HEADING/
DETAIL/
REPORT FOOTING/PAGE FOOTING/CONTROL FOOTING]
Formatul 2:
numar-nivel nume-data
[LINE NUMBER IS intreg-1/PLUS intreg-2.
Formatul 3:
numar-nivel nume-data
[PIC sablon]
[LINE NUMBER IS intreg-1/PLUS intreg-2]
[COLUMN NUMBER IS intreg-3]
Page 33 of 92
[SOURCE IS identificator-1]
[VALUE IS literal-1]
[SUM identificator-2 [UPON nume-data-0
RESET ON nume-data-1
FINAL]]
LINE: indica pozitia relativa sau absoluta la care va fi tiparita linia la nivelul paginii.
COLUMN: utlizata numai pentru campurile elementare, pentru a stabili coloana de
la care se incepe afisarea campului.
SOURCE: numai in cazul campurilor elementare, pentru a stabili zonele de memorie
din care se preiau datele.
SUM: numai la nivelul campurilor elementare dintr-un grup CONTROL FOOTING.
Se precizeaza campul (numeric) dupa care se realizeaza sumarea.
UPON permite totalizarea mai multor campuri, apartinand unor grupe DETAIL
diferite.
RESET permite aducerea la 0 a variabilei de sumare atunci cand are loc
schimbarea caracteristicii de grupare desemnate de nume-data-1.
Page 34 of 92
sectiunea DECLARATIVES).De exemplu putem suprima imprimarea grupurilor de
control cu mai mult de 3 linii.
In cazul in care inaintea unui anumit grup de listare e nevoie de anumite operatiuni
particulare care nu sant executate de report, acestea pot fi specificate in sectiunea
de declarative unde instructiunea USE are urmatoarea forma :
iar operatiile specifice necesare, vor fi scrise in sectiunea aferenta clauzei USE.
Descrierea detaliata a sectiunii de declarative am vazut-o in urma cu cateva capitole
in alineatul DECLARATIVE.
Primul contorizeaza numarul de linie in cadrul paginii, iar al doilea numarul de pagina
in cadrul raportului. Ei sant actualizati automat in cadrul reportului si pot fi folositi in
orice moment in vederea afisarii in diverse grupuri ale reportului, ca sursa de date.
Obs: amandoi registrii pot fi modificati prin instructiuni cobol in cadrul procedurii.
6. Fisiere selective
· Caracteristici generale
· Clauza select
Page 35 of 92
OPTIONAL – specifica faptul ca fisierul trebuie sa existe fizic pe driver-ul specificat,
altfel este generata o eroare.
RelKey – este cheia relativa, care poate fi un camp din working sau din fisier
SEQUENTIAL – accesul este secvential
RANDOM – accesul este permis numai direct
DYNAMIC – acces atat direct cat si secvential
· Moduri de acces
Page 36 of 92
Daca nu este gasita cheia , se va executa instructiunea de dupa INVALID KEY.
· Instructiunea START
Se poate folosi numai daca accesul este RANDOM sau DYNAMIC si ea practic
potitioneaza pointerul de citire inaintea inregistrarii aferente cheii respective si are
urmatorul format :
· Instructiunea REWRITE
Practic pe INVALID KEY e un pic cam greu de iesit, pentru ca de regula trebuie mai
intai sa aduc inregistrarea in bufferul de modificare, printr-o citire directa sau
secventiala, operez modificarile de campuri necesare, dupa care execut REWRITE.
Se poate iesi pe INVALID KEY doar printr-o eroare de programare prin modificarea
campului numeric de cheie relativa si incercarea de a executa REWRITE.
Page 37 of 92
Pentru a adauga o inregistrare intr-un fisier selectiv , dupa ce incarcam cheia
selectiva cu valoarea aferenta, putem lansa :
Pe INVALID KEY se poate iesi daca cheia respectiva exista deja in fisier.
Pentru a putea face modificari intr-un fisier selectiv, acesta trebuie sa fie descis I-O.
In acest caz putem realiza si stergerea unei inregistrari, dupa ce in prealabil am
incarcat cheia relativa cu valoarea corespunzatoare inregistrarii care urmeaza a fi
stearsa :
Pe INVALID KEY se iese atunci cand nu este gasita cheia incarcata in prealabil,
implicit prin valoarea cheii aflata in buffer la momentul stergerii, sau explicit prin
incarcarea concreta a unei valori in cheia relativa.
7. Fisiere indexate
· Caracteristici generale
Au fost practic cel mai mult folosite in practica, deoarece permit folosirea de chei
alfanumerice si nu doar una singura ca la fisierele selective.
Pentru fiecare cheie in parte este creat automat pe suportul de date un index, pe
baza caruia se poate face accesul la date pe cheia respectiva.
Exista un singur fisier .idx, care va contine toate tabelele de index asociate cheilor
definite.
Prima cheie trebuie sa fie unica si se numeste cheie primara, ea facand parte
obligatoriu din corpul inregistrarii, in contrast cu tipul selectiv, unde putea sa nu faca
parte din inregistrare, restul cheilor (de la 1-254) pot sa nu fie unice.
Page 38 of 92
La fel ca orice fisier, in paragraful FILE-CONTROL vom intalni:
Clauza ALTERNATE RECORD KEY IS – specifica cheia sau cheile alternative, care
pot avea sau nu dubluri.
Daca accesul este dynamic, este posibila citirea secventiala a fisierului indexat dupa
una din cheile sale, numita si cheie de referinta.
Cheia implicita este cea primara, iar daca dorim sa stabilim o alta cheie de referinta ,
executam o instructiune START sau READ direct, dupa care putem executa:
Daca accesul este secvential, forma de citire este aceeasi cu cea de la fisiere
secventiale si evident putem parcurge fisierul doar in ordinea cheii primare.
Dupa cum vedem citirea secventiala in acces dynamic seamana perfect cu cea de la
fisierele selective.
Toate cele cinci instructiuni in acces direct, presupun mai inatai incarcarea cheii
de referinta cu valoarea cheii pe care dorim s-o accesam, urmata apoi de executia
instructiunii, formatul fiind acelasi ca la fisierele selective.
Page 39 of 92
Daca un program contine o descriere de inregistrare de forma:
In felul acesta putem defini chei complexe pe fisiere indexate fara a fi nevoiti sa
construim efectiv structurile de campuri din inregistrare, ci doar simpla lor
enumerare ca mai sus si asocierea cu cheia de inregistrare.
8. Sortare cobol
Pe diferite platforme hardware si sisteme de operare pot exista diverse utilitare cobol
pentru sortare,interclasare, transformare fisier din secvential in indexat etc..
Problema este ca aceste utilitare nu sant portabile de pe o platforma pe alta, fapt
care ar ridica ceva problema la migrarea unei aplicatii.
Folosind insa sortul sau interclasarea Cobol problemele portarii de pe un sistem pe
altul dispar, chiar daca scierea in Cobol a unui program de sortare sau interclasare
(MERGE), este ceva mai laborioasa.
Intr-un program de sortare vom avea un fisier de intrare in sortare, care va avea o
rubrica FD corespunzatoare, un fisier de lucru (sortare) la care va corespunde
rubrica SD, si un fisier de iesire normal tot cu rubrica FD.
Este bine ca fisierul de iesire sa fie asignat la un fisier diferit de cel de intrare, pentru
ca in cazul intreruperii programului, fisierul de intrare se poate distruge, nemaifiind
posibila reluarea programului.
Page 40 of 92
· Forma generala a instructiunii SORT
Page 41 of 92
De remarcat in program ca deschiderea fisierului de intrare, de iesire si cel
intermediar se face in mod automat, ca si citirea din cel de intrare sau intermediar de
sortare, ca si scrierea in cel intermediar de sortare si cel de iesire.
Exista cazuri in care dorim sa prelucram doar o parte din datele fisierului de intrare,
adica sa facem o selectie pe intrare, sau oricare alta operatie inaintea sortarii
propriuzise.
In acest caz vom folosi sortul cu procedura de intrare :
· INPUT-PROCEDURE
Mai mult, daca dorim sa prelucram si datele rezultate din sort inainte ca ele sa fie
scrise in fisierul de iesire, atunci vom putea utiliza :
· OUTPUT-PROCEDURE
Page 42 of 92
Se observa asemanarea perfecta cu instructiunea READ secvential dintr-un fisier
secvential, cu deosebirea ca READ a fost inlocuit cu RETURN.
De remarcat ca dintr-o forma de sort cu GIVING, n-am putea scrie direct intr-un fisier
indexat sau selective, lucru perfect posibil in cazul folosirii OUTPUT-PROCEDURE.
9. Interclasare fisiere
· Consideratii generale
In practica curenta apare de multe ori necesitatea unirii mai multor fisiere mici in unul
singur mai mare. Lucrul ar fi relativ simplu daca am adauga fisierele unul la sfarsitul
celuilalt, dar de regula acestea pot fi intr-o anumita ordine, care se doreste a fi
pastrata in fisierul final.
Ca sa realizam acest lucru intr-un program cobol obisnuit, ar fi destul de laborios,
trebuie deschise toate fisierele, citit cate o inregistrare din fiecare fisier, comparate
cheile, apoi cheia cea mai mica se scrie in iesire si tot asa…in final inchise fisierele.
Instructiunea MERGE realizeaza acest lucru automat :
· Instructiunea MERGE
Page 43 of 92
· Consideratii generale
Subprogramele cobol, pot fi separate sau incluse in codul unui program principal
Cobol si reprezinta o unitate separata de cod, care de regula indeplineste o functie
bine definita din algoritm, contribuind la modularizarea unui program mare dar si la
eficientizarea lui.
De regula (dar nu obligatoriu) catre un subprogram pot fi transmisi unul sau mai multi
parametri caz in care acesti parametrii vor aparea descrisi in sectiunea LINKAGE-
SECTION, in cadrul suprogramului si in WORKING-SECTION (adica normal), in
programul principal.
Cand sant transmisi parametrii PROCEDURE DIVISION din subprogram va fi urmata
de USING PAR1 PAR2…PARn, exact in ordinea in care apar in instructiunea CALL
din programul principal si care are urmatoarea:
Page 44 of 92
Fara vre-o specificare anume din cele 3 de mai sus se considera in mod implicit
optiunea de trasnmitere BY REFERENCE, care va transmite automat adresele
variabilelor catre subprograme si la revenirea in programul apelant se vor cunoaste
noile valori ale parametrilor afectati de subprogram.
· Clauza IS INITIAL
· Instructiunea CANCEL
CANCEL nume_subprogram
Page 45 of 92
· Instructiunea EXIT PROGRAM
· Instructiunea GOBACK
Are forma:
· Clauza IS COMMON
IDENTIFICATION DIVISION.
PROGRAM-ID. Program-principal.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SharedItem PIC X(50) IS GLOBAL.
PROCEDURE DIVISION.
Begin.
CALL "InsertData"
MOVE "Programul princ utilizeaza zona comuna"
TO SharedItem
CALL "DisplayData"
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. InsertData.
PROCEDURE DIVISION.
Page 46 of 92
Begin.
MOVE "Subprog-1 are acces la zona comuna "
TO SharedItem
CALL "DisplayData"
EXIT PROGRAM.
END PROGRAM InsertData.
IDENTIFICATION DIVISION.
PROGRAM-ID. DisplayData IS COMMON PROGRAM.
PROCEDURE DIVISION.
Begin.
DISPLAY SharedItem.
EXIT PROGRAM
END PROGRAM DisplayData.
END PROGRAM MainProgram.
· Clauza IS GLOBAL
O vedem ca apare in programul principal din exemplul de mai sus, si are drept scop
definirea unei zone de memorie SharedItem (in cazul de fata) vizibila in oricare din
cele doua subprograme.
Aceasta zona comuna de mai sus,din programul principal, poate fi vazuta doar de
subprogramele continute(incluse) in programul principal.
In cazul in care ne dorim o zona de memorie care sa fie vizibila din orice subprogram
vom folosi urmatoarea clauza :
· Clauza IS EXTERNAL
Deci cele trei linii care descriu variabila comuna SharedRec, trebuie sa se gaseasca
atat in programul principal cat si in oricare din subprogramele care doresc acces la
aceasta variabila.
Page 47 of 92
· Instructiunea ENTRY
Exemplu :
Avem mai jos programul principal startup.cob care apeleaza
subprogramul controller.cob furnizandu-i ca parametru de tip procedure-pointer,
variabila start-point, initializata cu numele subprogramului « menu « :
* Calling program:
program-id. startup.
working-storage section.
01 start-point usage procedure-pointer.
procedure division.
set start-point to entry "menu"
call "controller" using start-point
display "End of run"
stop run.
entry "illegal"
* Recursive calls invalid without local-storage section.
stop run.
end program startup.
program-id. controller.
working-storage section.
01 next-option pic x.
Page 48 of 92
linkage section.
01 current-proc usage procedure-pointer.
procedure division using current-proc.
perform until current-proc = NULL
call current-proc returning next-option
* Note program-id must be called before any entry point
evaluate next-option
when "a" set current-proc to entry "sub1"
when other set current-proc to NULL
end-evaluate
end-perform
exit program.
end-program controller
prin intermediul caruia este apelat subprogramul propriuzis care are puncte de
intrare multiple, adicas meniu.cob :
program-id. menu.
working-storage section.
01 exit-option pic x.
procedure division.
display "In menu"
move "a" to exit-option
exit program returning exit-option.
* Note that the maximum size of returned value is 4 bytes
entry "sub1"
display "In sub1"
exit program returning 1.
Utilizarea subprogramelor trebuie sa fie bine justificata, de multe ori rolul unui
subprogram putand fi luat cu usurinta de o sectiune sau paragraph Cobol.
Page 49 of 92
Dar in clipa in care respectiva secventa de cod se preteaza la un parametru sau mai
multi, atunci e clara necesitatea utilizarii unui subprogram.
Chiar daca subprogramul nu contine parametrii de appel, dar algoritmul respectiv
este util in mai multe programme, atunci iarasi este cat se poate de elegant si
eficient sa utilizam un subprogram, care sa fie apelate din toate celelalte programme
care necesita functia realizata de subprogram.
De asemenea cand avem un program foarte mare cu mai multe ramuri
independente, care pot fi dezvoltate separat de catre alti programatori, atunci iarasi
putem apela cu brio la subprograme, care pot sa fie si testate separat de cel care le-
a scris, astfel incat la testarea finala, a programului principal impreuna cu toate
subprogramele aferente, sa ramana putine probleme de ajustat.
date functions
numeric functions
string functions.
FUNCTION FunctionName(Parameters)
Page 50 of 92
Page 51 of 92
Page 52 of 92
12. PROCEDURE DIVISION, comenzi principale
Categorie Verb
Arithmetic ADD
COMPUTE
DIVIDE
INSPECT (TALLYING)
MULTIPLY
SUBTRACT
Page 53 of 92
MULTIPLY (SIZE ERROR)
READ (END or INVALID KEY)
RETURN (END)
REWRITE (INVALID KEY)
SEARCH
START (INVALID KEY)
STRING (OVERFLOW)
UNSTRING (OVERFLOW)
WRITE (INVALID KEY or END-OF-PAGE)
EVALUATE
Data Movement
Ending
EXIT PROGRAM
GOBACK
STOP
Input-Output
ACCEPT ( identifier )
CLOSE
COMMIT
DELETE
DISABLE
DISPLAY
ENABLE
OPEN
Page 54 of 92
READ
RECEIVE
REWRITE
ROLLBACK
SEND
START
UNLOCK
WRITE
EXHIBIT
Inter-Program
CALL
CANCEL
CHAIN
ENTRY
EXEC
Null Operation
EXIT
CONTINUE
Ordering
MERGE
RELEASE
RETURN
SORT
Procedure Branching
CALL
EXIT PERFORM ¤ EXIT PARAGRAPH ¤ EXIT SECTION
GO TO
NEXT SENTENCE
PERFORM
Page 55 of 92
Compiler-directing Statements
COPY
END-ACCEPT
END-ADD
END-CALL
END-DELETE
END-DISPLAY
END-DIVIDE
END-EVALUATE
END-IF
END-INVOKE
END-MULTIPLY
END-PERFORM
END-READ
END-RECEIVE
END-RETURN
END-REWRITE
END-SEARCH
END-START
END-STRING
END-SUBTRACT
END-UNSTRING
END-WRITE
In cele ce urmeaza ne vom ocupa de cateva dintre cele mai uzuale din fiecare
categorie.
· Instructiuni aritmetice
Cuprind transpunerea algoritmica a celor patru operatii in format literar, asemanator
cu vorbirea curenta, plus instructiunea COMPUTE care le inglobeaza pe toate cele 4
si care se poate spune ca are o forma informatica.
Este instructiunea de adunare a doi sau mai multi operanzi numerici si are
urmatoarea forma generala:
Page 56 of 92
In prima forma valoarea din identifier-1 se aduna la valoarea din identifier-2 iar
Rezultatul se depune in identifier-2.
In a doua forma valoarea din identifier-1 se aduna cu valoarea din identifier-2 iar
rezultatul se depune in identifier-3 inlocuind vechea valoare a acestuia din urma.
Inainte de TO putem avea oricati identificatori.
Page 57 of 92
La formatul-3, identifier-1 si identifier-2 sant date de grup, actiunea lui ADD consta
in adunarea subcampurilor din identifier-1 cu subcampurile cu acelasi nume din
indentifier-2, iar rezultatul se depune in acestea din urma.
Ex : 01 a1.
05 b1 pic 9(5).
05 c1 pic 9(7).
01 d1.
05 b1 pic 9(5).
05 c1 pic 9(7).
ADD a1 TO d1 corr va aduna pe b1 din a1 la b1 din d1 cu rezultat in acesta din
urma si pe c1 din a1 la c1 din d1 cu rezultat in c1 din d1.
Realizeaza operatiunea aritmetica de scadere a unuia sau mai multor operanzi dintr-
un alt operand si la fel ca ADD are tot trei forme cu specificatii practic identice :
Page 58 of 92
Clauza ROUNDED specifica faptul ca se face rotunjire la numarul de zecimale al
operandului in care se depune rezultatul, valabil si pentru ADD.
Page 59 of 92
A doua forma este :
Page 60 of 92
Imparte identifier-2 la identifier-1 si rezultatul il depune cu sau fara rotunjire in
identifier-3.
Page 61 of 92
Imparte identifier-2 la identifier-1 si rezultatul il depune cu sau fara rotunjire in
identifier-3, iar restul impartirii il depune in identifier-4.
· Instructiunea COMPUTE
· Instructiunea DISPLAY
Page 62 of 92
Afiseaza pe suportul standard de iesire orice tip de date, si are forma :
· Instructiunea ACCEPT
Cu ajutorul ei se pot intercepta date de la tastatura, sau din mediul de lucru (in
combinatie cu instructiunea DISPLAY ) , se pot receptiona data si ora de la sistem
etc..Instructiunea are doua formate :
01 Day0fWeek PIC 9.
Page 63 of 92
* DAY-OF-WEEK unde 1=luni, 2=marti..etc
· Instructiunea COPY
Este o instructiune aparte, ea putand sa apara atat in zona de descriere de date, cat
si in zona de procedura.
Ea realizeaza inserarea unor linii de program , care se gasesc intr-un fisier separate
cu extensia CPY, cu eventuale modificari realizate in timpul compilarii programului.
Formatul general este :
Pseudo-textele aflate intre doua egaluri se folosesc atunci cand dorim sa inlocuim
doar o anumita parte dintr-un identificator, literal sau cuvant din fisierul initial (.CPY)
care se insereaza in program.
SUPRESS – suprima afisarea in codul compilat a continutului fisierului apelat cu
COPY.
Page 64 of 92
copy Payroll
replacing ==(TAG)== by ==Payroll==.
Copy-file Code:
01 (TAG).
05 (TAG)-Week pic s99.
05 (TAG)-Gross-Pay pic s9(5)v99.
05 (TAG)-Hours pic s9(3)
occurs 1 to 52 times
depending on (TAG)-Week of (TAG).
01 Payroll.
05 Payroll-Week pic s99.
05 Payroll-Gross-Pay pic s9(5)v99.
05 Payroll-Hours pic s9(3)
occurs 1 to 52 times
depending on Payroll-Week of
Payroll.
In exemplul de mai sus in loc de paranteze putem avea :: adica :text1: numai ca
· Instructiunea MOVE
Este principala instructiune pentru transferulu valorii dintr-o variabila in cealalta si are
forma generala :
Page 65 of 92
trimis Alfabetic Alfanumeric Numeric Numeric DBCS
editat / intreg / editat
alfanumeric numeric
Alfabetic Yes Yes No No No
Alfanumeric Yes Yes Yes Yes No
Alfanumeric editat Yes Yes No No No
Numeric intreg No Yes Yes Yes No
Numeric No No Yes Yes No
Numeric editat No Yes Yes Yes No
DBCS No No No No Yes
· Instructiunea SET
Format-1 :
Seteaza unul sau mai multe nume de conditie (nivel 88) pe TRUE, adica pe
valoarea din clauza VALUE atasata fiecaruia dintre ele.
Format-2 :
Format-3:
Seteaza valoarea unui index (asociat unui vector) la una din cele trei valori de
dupa TO
Format-4:
Page 66 of 92
Modifica valoarea uni index de vector in sus UP sau un jos DOWN cu valoarea
din identifier-7 sau integer-3
· Instructiunea INSPECT
Exemplu:
INSPECT FullName TALLYING UnstrPtr FOR LEADING SPACES.
Page 67 of 92
Aceasta forma inlocuieste sirul SourceStr$i cu sirul ReplaceChar$il inainte
sau dupa delimitatorul Delim$il
Exemplu:
INSPECT StringData REPLACING FIRST "R" BY "G"
AFTER INITIAL "B" BEFORE INITIAL "S".
Page 68 of 92
Forma-4 Inspect CONVERTING
Are la baza doua liste de conversie, care trebuie sa fie egale ca numar de caractere,
pntru ca transformarea caracterelor se face 1 la 1.Forma generala este:
Exemplu :
INSPECT StringData CONVERTING "xut" TO "ABC".
· Instructiunea STRING
Page 69 of 92
Source$il - poate fi atat un literal cat si o constanta figurativa, mai putin ALL
Delim$il - poate fi orice caracter alphanumeric si specifica faptul unirea sirurilor sursa
se face pana la intalnirea acestui character, dupa care se trece la sirul urmator
SIZE – specifica faptul unirea sirurilor sursa se face pe toata lungimea lor
Exemplu :
MOVE 7 TO NewPtr
STRING Field1 DELIMITED BY "this"
Field3 DELIMITED BY SPACE
"George" DELIMITED BY SIZE
INTO Field2 WITH POINTER NewPtr
ON OVERFLOW DISPLAY "String Error"
NOT ON OVERFLOW DISPLAY "No Error"
END-STRING.
· Instructiunea UNSTRING
Page 70 of 92
Cu urmatoarele semnificatii pentru clauzele de mai sus :
SourceSTr$i – sirul initial ce urmeaza sa fie spart in subsiruri mai mici
ALL – face ca delimitatorii succesivi sa fie tratati ca unul singur
Delim$il - este delimitatorul (orice caracter din sirul initial) pe baza caruia se face
spargerea sirului
DestStr - variabilele destinatare ( ca de regula sant mai multe)
HoldDelim$i – stabileste carcteul pana la care are loc copierea intr-un string
destinatie particular
CharCounter#i - este variabila in care se contorizeaza numarul de carctere pentru
un string particular
Pointer#i - stabileste pozitia in sirul sursa de la care va incepe copierea caracterelor
Exemplu:
DATA DIVISION.
FILE SECTION.
FD CommaDelimitedFile.
01 CommaDelimitedRec PIC X(205).
88 EndOfFile VALUE HIGH-VALUES.
FD CustomerFile.
01 CustomerRec.
02 CustName PIC X(40).
02 AddrLinesUsed PIC 9.
02 CustAddress.
03 AddrLine PIC X(25) OCCURS 1 TO 6
DEPENDING ON AddrLinesUsed.
02 CustBalance PIC 9(5)V99.
WORKING-STORAGE SECTION.
01 TempAddress PIC X(150).
01 TempBalance PIC X(7).
Page 71 of 92
01 AdjustedBalance REDEFINES TempBalance PIC 9(5)V99.
PROCEDURE DIVISION.
Begin.
OPEN INPUT CommaDelimitedFile
OPEN OUTPUT CustomerFile
READ CommaDelimitedFile
AT END SET EndOfFile TO TRUE
END-READ
· Instructiunea INITIALIZE
Este o instructiune foarte puternica pentru ca face cea mai buna initializare de date.
Astfel daca avem un camp compus din campuri diferite ca format (numerice, alfa
etc..) si facem initializarea la nivelul campului de nivel 01 , toate subcampurile vor fi
initializate dupa natura descrierii lor, cele numerice cu zero, alfanumericele cu spatiu
etc.
Forma generala este :
Page 72 of 92
· Instructiuni conditionale
· Instructiunea IF
De remarcat ca IF-ul se poate inchide foarte usor cu un simplu punct ‘.’, in loc de
END-IF, drept care folosirea punctelor intre IF…END-IF este complet interzisa,
ca si in cazul altor instructiuni cu ramuri multiple si instructiune terminala END-
instr.
· Instructiunea EVALUATE
Page 73 of 92
WHEN OTHER
Pe instructiunea imperativa de pe WHEN OTHER se va ajunge daca nici una din
conditiile de dupa WHEN nu a fost indeplinita. Daca clauza WHEN OTHER nu exista
si nici una din conditii nu a fost indeplinita, atunci instructiunea EVALUATE se
termina fara a fi produs vre-un efect.
Forma generala a instructiunii EVALUATE este urmatoarea:
Page 74 of 92
Exemplu:
Page 75 of 92
Cap-Cil Varsta Vechime-auto Accidente Valoare-RCA
WHEN 1 THRU 1200 ALSO 18 THRU 25 ALSO 1 THRU 5 ALSO ‘N’ MOVE
300 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO 18 THRU 25 ALSO 1 THRU 5 ALSO ‘D’ MOVE
350 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO 18 THRU 25 ALSO 5 THRU 10 ALSO ‘N’ MOVE
280 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO 18 THRU 25 ALSO 5 THRU 10 ALSO ‘D’ MOVE
330 TO Valoare-RCA
END-EVALUATE
· Instructiunea PERFORM
Determina executarea unui anumit paragraf, in mod repetitiv sau nu, caz in care
vorbim de un asa zis PERFORM OUT-LINE, sau a unui grup de linii de cod cuprinse
intre PERFORM si END- PERFORM, cand spunem ca santem in cazul unui
PERFORM IN-LINE.
Exista patru forme de perform si anume:
Page 76 of 92
procedure-name-2, o singura data, iar la sfarsit eventuala executie a instructiunii
imperative-statement-1, si astfel executia se termina.
Al doilea format seamana cu primul doar ca executia are loc de un numar de ori egal
cu valoarea variabilei numerice intregi identifier-1 sau direct a intregului integer-1
Page 77 of 92
De remarcat ca toate cele patru forme pot fi atat IN-LINE cat si OUT-LINE, adica pot
contine doar instructiuni simple sau respectiv paragrafe sau sectiuni.
working-storage section.
01 group-item.
05 tabl occurs 10 times
ascending elem-item2
descending elem-item1.
10 elem-item1 pic x.
10 elem-item2 pic x.
procedure division.
sort tabl.
La sfarsitul instructiunii sort, cele 10 elemente ‘tabl’ ale matricii group-item vor fi
sortate in ordine crescatoare dupa elem-item2, si descrescatoare dupa elem-item1
Page 78 of 92
· Instructiunea SEARCH
Este folosita la cautarea unei valori intr-un vector de date, vector descris in
WORKING si care in prealabil au fost umplute cu diverse valori din fisiere sau
rezultate din anumite calcule.
Lucrul cu astfel de masive de memorie este insa limitat de memoria calculatorului,
spre deosebire de fisierele externe sau bazele de date care sant limitate doar de
dimensiunea mediului extern de stocare, mult mai mare decat memoria interna a
unui computer.
In esenta discutam de masive de memorie de cateva mii, sau cel mult zeci de mii de
elemente in functie de memoria interna a calculatorului.
Exista doua formate de cautare, primul folosit pe vectori neordonati, adica fara o
sortare anume a elementelor, iar al doilea format functioneaza pe vectori ordonati
dupa o anume cheie, dupa care se face de altfel si cautarea.
Pentru ambele formate este nevoie de un index special, si anume o variabila de tip
index specifica pentru instructiunea SEARCH, pentru parcurgerea vectorului.
Vectorul poate fi parcurs si fara acest index special, de exemplu cu instructiunea
PERFORM cu o variabila index numeric obisnuita, dar nu cu instructiunea SEARCH,
care este optimizata pe cautarea pe aceasta variabila specifica de tip USAGE IS
INDEX.
Forma generala a clauzei OCCURS asociata vectorului ce face obiectul unei
instructiuni SEARCH este :
· SEARCH-ul secvential
Page 79 of 92
are formatul de mai sus, cu urmatoarele specificatii :
VARYING – nu este necesar daca se foloseste variabila declarata index ci doar in
cazul in care am declarat un identifier-2 ca valoare in oglinda a indexului asociat
vectorului, pentru ca acest identifier-2 are avantajul ca-l putem afisa etc.
Index-ul se poate recupera la momentul gasirii valorii cautate in vector, in vederea
afisarii, prin instructiunea :
Exemplu:
77 CPTR-TROUVE PIC 999 VALUE 0.
01 W2-CLI PIC S9(11) COMP OCCURS 250.
01 J PIC 999 COMP.
01 CLI-I PIC Z(8)9.
01 TABLE1.
05 TAB-CLI-1 OCCURS 1000
INDEXED BY I.
10 W1-CLI PIC S9(11) COMP-3.
10 W1-NOM PIC X(20).
10 W1-PRENOM PIC X(12).
In acest exemplu SEARCH-ul se executa pentru fiecare din cei 250 de W2-CLI
Acestea sant cazurile care se preteaza cu adevarat la utilizarea SEARCH-ului, un
mare numar de cautari (250) pe un vector cu multe elemente (1000 in acest caz).
Daca era vorba doar de o cautare sau cateva chiar, puteam parcurge tabela de o
mie de elemente si cu un simplu perform pe un indice numeric obisnuit, diferenta de
timp fata de utilizarea SEARCHU-lui fiind aproape imperceptibila.
Dar cand e vorba de sute sau chiar mii de cautari atunci diferenta de timp devine
notabila si astfel se impune utilizarea instructiunii SEARCH.
Page 80 of 92
PERFORM AFTER VARYING J FROM 1 BY 1 UNTIL J = 250
Obligatoriu==>SET I TO 1 (Sau alta valoare de care santem siguri)
SEARCH TAB-CLI-1
WHEN W1-CLI(I) = W2-CLI(J)
ADD 1 TO CPTR-TROUVE
MOVE W1-CLI(I) TO CLI-I
DISPLAY CLI-I ‘Gasita !’
END-SEARCH
END-PERFORM
DISPLAY ‘Total gasite: ‘ CPTR-TROUVE
Este cea mai sigura forma de folosit (nu presupune sortarea prealabila
a matricii).
Page 81 of 92
Aceasta a doua forma de serch, foloseste un algoritm special, de injumatatire a
intervalului, si anume face media dintre prima si ultima valoare din vector si o
compara cu valoarea pe care o cautam in vector. Daca valoarea cautata este mai
mica, se repeta procedura pe prima jumatate a vectoruli, altfel pe cea de adoua si tot
asa pana se gaseste valoarea cautata. De aici vine si numele de BINAR, pentru ca
tot timpul face media capetelor intervalului pe care se lucreaza, selectand jumatatea
corespunzatoare.
Exemplul de mai sus adaptat pentru SEARCH-ul BINAR va deveni :
Exemplu:
77 CPTR-TROUVE PIC 999 VALUE 0.
01 W2-CLI PIC S9(11) COMP OCCURS 250.
01 J PIC 999 COMP.
01 CLI-I PIC Z(8)9.
01 TABLE1.
05 TAB-CLI-1 OCCURS 100
ASCENDING KEY W1-CLI
INDEXED BY I.
10 W1-CLI PIC S(11) COMP-3.
10 W1-NOM PIC X(20).
10 W1-PRENOM PIC X(12).
Page 82 of 92
DISPLAY'CLIENT GASIT IN TABELA-1 :' W2-CLI(J)
MOVE W1-CLI(I) TO CLI-I
DISPLAY CLI-I ‘Gasita !’
END-SEARCH
END-PERFORM
DISPLAY ‘Total gasite: ‘ CPTR-TROUVE
Trebuie ca matricea sa fie sortata si ea (DIN START) dupa W1-CLI, simpla prezenta
a clauzei KEY IS nefiind suficienta, altfel rezultatul este imprevizibil.
Se obseva ca in acest caz nu mai e nevoie de setarea initiala a indexului ‘I’ pe 1 sau
alta valoare, ca la SEARCH-ul secvential.
De altfel la SEARCH-ul secvential indexul poate fi setat si pe o valoare mai mare
decat 1, daca santem siguri ca valoarea cautata se va gasi incepand de la acel
indice in sus, si astfel evitam cautarea inutila in primele n valori ale vectorului.
Ambele tipuri de SEARCH, functioneaza doar pe o singura dimensiune, iar cazul in
care de exemplu avem o matrice, liniile (sau coloanele - in functie de cum e sortata
matricea) le vom parcurge cu un perform obisnuit dupa indicele care nu este index
pentru SEARCH, iar SEARCHU-ul va face sa varieze indicele de coloane, cautand
deci doar de-a lungul unei linii valoarea cautata.
Exercitiu: comparati cele doua moduri de cautare si observati care din ele este mai
rapid.
· Instructiune EXIT
Apare de regula in paragrafele de sfarsit ale unei instructiuni perform, caz in care
este unica instructiune din acel paragraph, care paragraph nu face decat sa
marcheze sfarsitul unui pragraf de inceput cu nume asemanator.
Ex:
A-1. MOVE A TO B
- - - - --
F-A1. EXIT.
Page 83 of 92
Executa iesirea fortata dintr-un perform si trece controlul la instructiunea imediat
urmatoare dupa perform.
· Instructiunea CONTINUE
Page 84 of 92
O gasim legata in instructiuni de selectie IF, EVALUATE in secventele de validare de
date .Are urmatoarea forma generala:
· Instructiunea EXECUTE
General Format
Page 85 of 92
END-EXEC
· Instructiuni conectare
EXEC SQL
CONNECT TO ‘NumeBazaDeDate' USER ‘User.Password' using ‘DSN-
Conectare’
END-EXEC
$set sql(dbman=odbc) directiva de compilare pentru baze de date ($ in col 7), prima
instructiune din program, inainte de id-division.
Page 86 of 92
· Variabila de conectare SQLCA la o baza de date
Page 87 of 92
10 SQLWARN2 PIC X.
10 SQLWARN3 PIC X.
10 SQLWARN4 PIC X.
10 SQLWARN5 PIC X.
10 SQLWARN6 PIC X.
10 SQLWARN7 PIC X.
05 SQLEXT.
10 SQLWARN8 PIC X.
10 SQLWARN9 PIC X.
10 SQLWARNA PIC X.
10 SQLSTATE PIC X(5).
EXEC SQL
SELECT, INSERT, UPDATE…..(forma completa a instructiunii DB2 , Oracle
etc..)
END-EXEC
EVALUATE SQLCODE
WHEN 0
DISPLAY ’INSTRUCTIUNE SQL EXECUTATA OK’
alte instructiuni (incementare contori , actualizari etc..)
WHEN 100 -pt citire cusor
DISPLAY ‘SFARSIT CURSOR’
alte instructiuni (incementare contori , actualizari etc..)
WHEN OTHER
DISPLAY ‘ORDIN SQL in eroare’
EXEC SQL ROLLBACK END-EXEC (de exemplu – dar nu obligatoriu)
END-EVALUATE
EXEC SQL
INCLUDE SQLCA
END-EXEC
Page 88 of 92
· Definire, deschidere,citire, inchidere cursor Sql in Cobol
WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 H-NIR PIC S9(9) COMP.
01 H-OC PIC S9(4) COMP .
01 H-NO-CMR……
EXEC SQL END DECLARE SECTION END-EXEC.
- - - - - - - - -- -
PROCEDURE DIVISION.
DECL-OPEN-CUR.
EXEC SQL DECLARE CUR_GRP_CAISSEV CURSOR FOR
SELECT
NO_CMR
,nvl(OC,' ')
,NIR
FROM W01_CQPMAJ_GPRO
WHERE NO_CMR = 123
ORDER BY NIR
END-EXEC.
EXEC SQL
OPEN CUR_GRP_CAISSEV
END-EXEC.
LECTURE-CURSEUR.
EXEC SQL FETCH CUR_GRP_CAISSEV INTO
:H-NO-CMR,
:H-OC,
:H-NIR
END-EXEC.
INCHIDERE-CURSOR.
EXEC SQL
CLOSE CUR_GRP_CAISSEV
END-EXEC
Evident LECTURE-CURSEUR este un paragraf executat in interiorul unei bucle,
pentru ca la o citire din cursor este accesata o singura inregistrare din acesta.
Page 89 of 92
Dupa fiecare fraza EXEC SQL…..END-EXEC urmeaza secventa de control a
codului SQL aferent instructiunii din interiorul EXEC SQL.....END-EXEC, mai
putin pentru BEGIN DECLARE SECTION si END DECLARE SECTION :
EVALUATE SQLCODE
WHEN 0….WHEN 100….WHEN OTHER….
END-EVALUATE
Descrisa mai sus.
In cazul in care intr-un program Cobol efectuam diverse modificari, stergeri sau
adaugari de inregistrari in diverse abele ale bazei de date relationale, trebuie ca
indicii in care contorizam aceste operatii si dorim sa-i afisam la sfarsit de
program, sa aiba ficare cate un alt indice de salvare.
Toti indicii de salvare vor avea deci aceeasi dimensiune cu indicii initiali, si ei vor
fi incarcati cu valorile din indicii initiali imediat ce s-a executat o instructiune
COMMIT pe baza de date.
In cazul executarii unei instructiuni ROLLBACK pe baza de date, atunci indicii
initiali vor fi si ei restaurati cu valorile din indicii de salvare, care au fost incarcati
la ultimul COMMIT.
Page 90 of 92
De regula erorile care apar la operatiunile pe tabelele bazei nu sant erori
blocante, dupa cum operatia de conectare la baza de date va genera o eroare
blocanta in cazul insuccesului operatiunii.
In orice program cobol sant accesibile niste registri standard cu nume bine definite si
care fie furnizeza diverse informatii despre ora sistemului de operare, sau bunul
mers al programului sau pot indeplini chir rolul unei functii.
Printre cei mai importanti amintim:
RETURN-CODE - PIC S9(4) COMP - este o zona de memorie care primeste zero
la sfarsitul programului , daca acesta se termina cu bine, sau alta valoare in caz de
eroare.
El poate fi modificat si de catre programator pe diverse ramuri de eroare si este
vizibil si din afara programului, intr-un program apelant sau un script.
Page 91 of 92
TIME-OF DAY PIC 9(6) - reprezinta ora curenta a sistemului (24h) in forma
hhmmss. Este accesibil la nivelul instructiunii MOVE .
WHEN-COMPILED PIC X(20) - Contine data si ora cand programul a fost trimis
sistemului Cobol (deci compilat) sub forma MM/DD/YYhh.mm.ss si este accesibil tot
prin instructiunea MOVE.
Page 92 of 92