Documente Academic
Documente Profesional
Documente Cultură
Page 1 of 92
Cuprins
1.
Introducere n COBOL.................................................................................................. 5
Setul de caractere............................................................................................................7
Structuri ierarhice............................................................................................................9
3.
Literali...........................................................................................................................21
Constante figurative.......................................................................................................22
4.
Declararea fisierelor.......................................................................................................22
Page 2 of 92
Declarative ....................................................................................................................27
Generalitati....................................................................................................................31
6. Fisiere selective........................................................................................................... 35
7.
Fisiere indexate.......................................................................................................... 38
8.
Page 3 of 92
INPUT-PROCEDURE ......................................................................................................42
OUTPUT-PROCEDURE ...................................................................................................42
9.
Instructiunea MERGE.....................................................................................................43
10.
Clauza IS COMMON...................................................................................................46
11.
12.
Instructiunea DISPLAY................................................................................................................. 62
Instructiunea ACCEPT ................................................................................................................. 63
Page 4 of 92
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
13.
14.
1. Introducere n COBOL
Ce este limbajul Cobol?
COBOL este un limbaj de programare de nivel nalt dezvoltat pentru prima oar de
ctre Comitetul CODASYL (Conference on Data Systems Languages), n 1960. De
atunci, responsabilitatea pentru dezvoltarea de noi standarde COBOL a fost
asumat de ctre American National Standards Institute (ANSI). Trei standarde
ANSI pentru COBOL au fost produse: n 1968, 1974 i 1985.
Page 5 of 92
Page 6 of 92
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
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.
Formate de scriere cod Cobol
Exista un format fix folosit de la inceputurile Cobolului si unul free disponibil in
Net_Expres.Vom explicita inatai formatul fix utilizat in majoritatea aplicatiilor.
Coloanele 1-6 sant rezervate pt numere de secventa sau comentarii de modificare
Coloana 7 este o coloana indicator astfel :
* semnifica o linie de comentariu
- semnifica o linie de continuare a unui literal
$ directiva de compilare
Coloanele 8-11 Aria A Se scriu diviziunile, sectiunile,paragraphele si numerele de
Nivel. Ele pot fiscrise si in zona urmatoare B, dar de
regula se gasesc in aceasta prima zona
Coloanele 12-72 Aria B In aceasta zona se scriu obligatoriu instructiunile
executabile
Coloanele 73-80
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.
Diviziunile unui program Cobol
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.]
Este diviziunea in care se specifica numele programului si autorul ,data
scrierii programului, a compilarii,sau dupa numele programului (in cazul
suprogramelor) se poate specifica IS COMMON, INITIAL sau EXTERNAL, al caror
inteles va fi explicat la capitolul suprograme.
Exemplu inceput de program :
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 :
[FILE-SECTION.] Contine rubricile FD (File Description) aferente structurii de
date a fisierelor accesate in program
[WORKING-STORAGESECTION.] - descrise toate varibilele de lucru din
program
[LINKAGE-SECTION] Contine variabilele transmise la apelul de subprograme
[REPORT-SECTION] Cuprinde descrierea randurilor unui raport, in cazul
generarii raportului cu instructiunea GENERATE
REPORT
PROCEDURE DIVISION.
Este diviziunea obligatorie in orice program, ea continand algoritmul efectiv al
programului , compus din toate instructiunile executabile, care realizeaza scopul
programului.
Ea poate contine sau nu sectiuni definite cu nume date de programator, in cadrul
sectiunilor aflandu-se sau nu paragraphele, la fel denumite de catre programator si
obligatoriu una sau mai multe instructiuni executabile.
De regula ultima instructiune din program este STOP RUN, dar aceasta poate fi
inlocuita si cu END-Nume-Program sau si aceasta din urma poate fi omisa,
programul oprindu-se automat dupa executarea ultimei instructiuni (situatie intalnita
insa mai rar in practica, pentru ca de regula programul poate fi oprit pe mai multe
Page 12 of 92
ramuri, caz in care dupa STOP RUN mai exista si alte paragraphe sau sectiuni de
program.
Exemplu de program minimal :
PROCEDURE DIVISION.
DISPLAY ' Hello world'
Executia acestui program va determina afisarea pe ecran a mesajului :
Hello world
Este bine insa ca orice program Cobol sa aiba ID DIVISION urmata de
Program-id. Nume-program.
fiindca fara acest Nume-program, programul de fata nu va putea fi legat (apelat)
de un alt program, daca va fi nevoie de acest lucru.
Mai jos apare un exemplu generic de program Cobol:
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
Clauza VALUE
Page 14 of 92
Clauza REDEFINES
redefineste o zona de memorie cu o anumita structura initiala, intr-o zona de
memorie, aceeiasi de fapt dar cu alta structura.
De exemplu zona de memorie rand-imprimanata descrisa mai sus o putem redefini
astfel :
01 rand-imp2 redefines rand-imprimanta pic x(13) occurs 10.
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
Practic apeleaza sub un alt nume o zona de memorie de la campul-1 la campul-n,
adica :
General Format
66 data-name-1 RENAMES data-name-2 THROUGH data-name-3
Numerele de nivel
Pot avea urmatoarele valori:
01-49 pentru variabile simple sau de grup
66
77
78
Page 15 of 92
logica.
88
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
[USAGE IS] COMPUTATIONAL
De aceea pentru formatul numeric se va folosi clauza COMPUTATIONAL, sau mai
pe scurt COMP , sau BINARY sau COMP-4(in versiunile mai noi de Cobol)
Exemplu :
S-ul din fata lui 9 specifica faptul ca numarul respectiv poate avea si semn.
Page 17 of 92
Page 18 of 92
Page 19 of 92
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
Page 21 of 92
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.
RECORD in acest caz fisierul se prezinta ca o insiruire continua de inregistrari, dar
faptul ca se cunoaste lungimea inregistrarii, permite separarea acestora.
In exemplul de mai jos fraza SELECT face asocierea
dintre numele din program al fisierului (FisStudenti) si numele de pe suportul
extern(STUDENTI.DAT), se specifica apoi organizarea (LINE SEQUENTIAL)si eventual
se asociaza si variabila de status de fisier (FILE-STAT-P), pe care o putem testa
dupa fiecare operatiune executata asupra fisierului (deschidere fisier, citire, scriere,
inchidere fisier), si astfel sa putem trata eventualele erori care se impun a fi tratate in
mod special.
Pentru acelasi fisier declarat in select , exista obligatoriu in DATA DIVISION / FILE
SECTION si o rubrica FD sau SD sau RD, dupa cum avem de a face cu un fisier de
date obisnuit, sau unul de sortare (SD), sau unul de listare dar care va fi generat cu
instructiunea GENERATE REPORT (pt RD).
Mai jos avem :
Forma generala rubrica FD (File Description), cu principalele clauze:
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 intrun 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
Instructiuni utilizare fisiere
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
Page 24 of 92
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 :
Instructiunea CLOSE fisier
CLOSE NumeFisier [NOREWIND]
NOREWIND specifica faptul ca la inchiderea fisierului pointerul de citire
ramane pozitionat la sfarsit. Acest lucru era necesar cand se faceau adaugari de
date in fisiere secventiale, acestea erau citite pana la sfarsit, apoi inchise cu
clauza NOREWIND, dupa care erau deschise cu aceeasi clauza ca fisiere de
iesire si astfel era sters sfarsitul de fisier si se puteau adauga date in continuare.
Astfel daca numarul de inregistrari din fisier este mare si al modificarilor de orice fel
este mic, operatiunea este mare consumatoare de timp, pentru ca trece prin toate
inregistrarile fisierului pe care le copie in noul fisier rezultat impreuna cu modificarile
respective.
Acest gen de modificari pe fisiere secventiale este eficient doar daca numarul de
modificari depaseste 50% din numarul de inregistrari ale fisierului initial.
In practica insa procentul modificarilor rar trece de 10% ceea ce pentru un fisier
secvential ar fi total ineficient.
Aceasta problema a modificarilor putine s-a rezolvat cu ajutorul fisierelor selective si
a celor indexate.
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
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).
cu denumirea fisierului astfel:
MOVE FIS-STOC TO w-den-fis
OPEN FIS-STOC - am pus aici de exemplu deschiderea fisierului
iar in DECLARATIVE va trebui sa avem un mesaj de genul:
DISPLAY Eroare tratare fisier : w-den-fis FILE-STATUS= W-STATUS
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
Daca e cazul unui program de listare, fisierul de iesire la imprimanta se va descrie in
mod asemanator doar ca asignarea se poate face fie direct catre portul de
imprimanta Lpt1 de exemplu, sau la un fisier pe disc (la fel ca pentru un fisier
normal) urmand ca apoi acesta sa fie listat la imprimanta.
De asemenea in loc de ASSIGN TO STUDENTI.DAT putem avea :
Page 30 of 92
ASSIGN TO var-fis-student
Page 31 of 92
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]
Clauza CONTROL defineste campurile utilizate drept caracteristici de grupare,
stabilind totodata si ierarhia acestora.
Valoarea acestor campuri este verificata de editorul de rapoarte automat pentrru a
detecta eventualele modificari in vederea declansarii mecanismului de afisare
specific.
Clauza PAGE LIMIT specifica numarul maxim de linii disponibile pe o pagina.
PAGE HEADING indica numarul liniei de la care incepe afisarea antetului de raport.
FIRST DETAIL indica numarul liniei de la care incepe editarea unui grup central de
tip DETAIL, CONTROL HEADING sau CONTROL FOOTING.
LAST DETAIL si FOOTING au semnificatii de aceeasi natura.
Descrierea grupelor de editare
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]]
Explicatii privind clauzele folosite:
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.
Instructiuni executabile specifice editorului de rapoarte
Pentru afisarea unui raport, in cadrul PROCEDURE DIVISION se utilizeaza:
INITIATE nume-raport (realizeaza operatiile de prelucrare initiale: deschiderea
fisierelor descrise in rubrici RD, initializarea registrelor LINE-COUNTER,
PAGE_COUNTER)
GENERATE nume-raport (realizeaza automat operatiile de mutare, totalizare in
variabile, control al caracteristicilor, afisarea grupelor de editare. Aceasta
instructiune actioneaza asupra registrelor, care sunt incrementate corespunzator. La
primul apel al unei instrctiuni GENERATE vor fi afisate automat grupele REPORT
HEADING, PAGE HEADING, eventual CONTROL HEADING)
TERMINATE nume-raport (incheie editarea automata a raportului. Determina
afisarea grupelor CONTROL FOOTING, REPORT FOOTING, inchiderea fisierelor
etc.)
SUPPRESS PRINTING efectueaza oprirea temporara a imprimarii raportului in
grupul de control unde apare in functie de conditiile impuse in program (de regula in
Page 34 of 92
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.
Registrii speciali report : LINE-COUNTER si PAGE-COUNTER
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
Aceste fisiere rezolva problemele de acces direct la inregistrari urmata de
modificarea sau stergerea acestora precum si inserarea directa de noi inregistrari.
Accesul la inregistrarile unui fisier selectiv se poate face atat secvential, prin
specificarea clauzei ACCESS MODE is DYNAMIC sau SEQUENTIAL, sau in mod direct
prin specificarea in clauza SELECT a tipului de acces RANDOM sau DYNAMIC.
Clauza select
Forma generala a clauzei SELECT pentru fisiere selective este :
Page 35 of 92
Page 36 of 92
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
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 :
instructiunea DELETE cu INVALID KEY stergere directa
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
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:
Instructiunea READ secvential pentru acces DYNAMIC
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.
Instructiunile READ, WRITE, REWRITE, START si DELETE in acces direct
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.
SPLYT KEY - setare cheie fisier indexat
Page 39 of 92
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
Necesitatea sortului 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
din ENVIRONMENT DIVISION, si care face referire la setul de caractere, altul decat
cel implicit, ca ASCII , EBCDIC, etc..
USING specifica fisierul de intrare in sortare
GIVING - specifica fisierul de iesire din sortare
Exemplu sortare simpla :
SORT WorkFile ON ASCENDING ProvCode
DESCENDING VendNumber
USING SalFile
GIVING SortedSalFile.
Page 41 of 92
Page 42 of 92
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 LINKAGESECTION, 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 PAR2PARn, exact in ordinea in care apar in instructiunea CALL
din programul principal si care are urmatoarea:
Forma generala instructiune CALL subprogram:
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.
Exemplu apelare subprogram din programul principal :
PROCEDURE DIVISION
CALL "DateValidate"
USING BY CONTENT TempDate
USING BY REFERENCE DateCheckResult
Clauza IS INITIAL
Page 45 of 92
Clauza IS COMMON
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.
Puncte de intrare intr-un subprogram - Entry points
Executia unui subprogram poate fi initiata si de la un anumit punct din procedura,
altul decat inceputul acesteia.
Acest punct de intrare in subprogram se defineste cu :
Page 47 of 92
Instructiunea ENTRY
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.
Si care in functie de valoarea parametrului returnat primeste urmatoarea intrare intrun punct sau altul de intrare in el.
Aici avem un singur ENTRY-POINT diferit de inceputul subprogramului si anume
sub1 .
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 lea scris, astfel incat la testarea finala, a programului principal impreuna cu toate
subprogramele aferente, sa ramana putine probleme de ajustat.
11. Functii intrinseci Built-in functions
Tipuri de functii in Cobol
In Cobol exista serie de functii interne limbajului, ca o compensare a faptului ca
utilizatorul nu-si poate defini propriile functii.
Acestea se impart in trei categorii :
date functions
numeric functions
string functions.
Forma generala de apelare a unei functii Cobol
FUNCTION FunctionName(Parameters)
Page 50 of 92
Page 51 of 92
Page 52 of 92
Page 53 of 92
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
Sfarsit instructiune principala
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.
Instructiunea de adunare ADD
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.
Instructiunea de scadere SUBTRACT
Realizeaza operatiunea aritmetica de scadere a unuia sau mai multor operanzi dintrun alt operand si la fel ca ADD are tot trei forme cu specificatii practic identice :
Page 58 of 92
Page 59 of 92
Page 60 of 92
Page 61 of 92
Page 62 of 92
PIC 9(6).
format YYMMDD
01 DayOfYear
PIC 9(5).
* DayOfYear este ziua din an in format YYDDD
01 Day0fWeek
PIC 9.
Page 63 of 92
01 CurrentTime
PIC 9(8).
* CurrentTime timpul in format HHMMSSss
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.
Exemplu inlocuire pseudo-text:
Acest text apare in fisierul cobol care apeleaza instructiunea COPY
Page 64 of 92
copy Payroll
replacing ==(TAG)== by ==Payroll==.
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
Manipulari de date - Data Movement
Instructiunea MOVE
Este principala instructiune pentru transferulu valorii dintr-o variabila in cealalta si are
forma generala :
MOVE Sursa TO Destinatie
Sursa poate fi o variabila sau un literal
Destinatie doar variabila
Atat sursa cat si destinatia pot fi date elementare sau de grup, iar in urma executarii
instructiunii, continutul din Destinatie este complet inlocuit cu Sursa, afara de cazul
cand cele doua date sant incompatibile ca tipuri de variabile si se produce o eroare.
Mai jos este tabela cu mutarile permise si nepermise intre diverse tipuri de variabile.
Tipul datelor de
Page 65 of 92
trimis
Alfabetic
Alfanumeric
Alfanumeric editat
Numeric intreg
Numeric
Numeric editat
DBCS
Alfabetic
Yes
Yes
Yes
No
No
No
No
Alfanumeric
editat /
alfanumeric
Yes
Yes
Yes
Yes
No
Yes
No
Numeric
intreg /
numeric
No
Yes
No
Yes
Yes
Yes
No
Numeric
editat
DBCS
No
Yes
No
Yes
Yes
Yes
No
No
No
No
No
No
No
Yes
Instructiunea SET
Format-1 :
SET condition-name-1,.., condition-name-n TO TRUE
Seteaza unul sau mai multe nume de conditie (nivel 88) pe TRUE, adica pe
valoarea din clauza VALUE atasata fiecaruia dintre ele.
Format-2 :
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
Cu ajutorul acestei instructiuni putem efectua diferite conversii sau contorizari de
caractere.In functie de scopul urmarit instructiunea are patru forme distincte:
Forma-1 Inspect TALLYING :
Page 67 of 92
Page 68 of 92
Exemplu :
INSPECT StringData CONVERTING "xut" TO "ABC".
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
WITH POINTER determina pozitia de start in variabila de iesire de la care incepe
inserarea sirurilor concatenate. Daca Pointer#i depaseste lungimea sirului destinatie
procesul de concatenare se opreste, la fel ca si la epuizarea sirurilor sursa sau
umplerea sirului destinatie.
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
Realizeaza spargerea unui sir in mai multe siruri pe baza de delimitatori.
Forma generala este :
Page 70 of 92
CustomerFile.
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
PROCEDURE DIVISION.
Begin.
OPEN INPUT CommaDelimitedFile
OPEN OUTPUT CustomerFile
READ CommaDelimitedFile
AT END SET EndOfFile TO TRUE
END-READ
PERFORM UNTIL EndOfFile
MOVE ZEROS TO AddrLinesUsed
UNSTRING CommaDelimitedRec DELIMITED BY ","
INTO CustName, TempAddress, TempBalance
UNSTRING TempAddress DELIMITED BY "/"
INTO AddrLine(1), AddrLine(2), AddrLine(3),
AddrLine(4), AddrLine(5), AddrLine(6)
TALLYING IN AddrLinesUsed
MOVE AdjustedBalance TO CustBalance
WRITE CustomerRec
READ CommaDelimitedFile
AT END SET EndOfFile TO TRUE
END-READ
END-PERFORM
CLOSE CommaDelimitedFile, CustomerFile
STOP RUN.
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
Evalueaza o conditie si daca aceasta e adevarata se executa statement-1, sau
se trece la instructiunea urmatoare(NEXT SENTENCE), altfel (ELSE) se executa
instructiunea statement-2 sau la fel se trece la instructiunea urmatoare :
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:
Sa presupunem ca intr-o agentie de asigurari se calculeaza valoarea politei RCA in
functie de capacitatea cilindrica a masinii, varsta proprietarului, vechimea ca sofer si
daca a avut sau nu accidente in anul anterior.
Sa presupunem ca avem un tabel ca mai jos care evidentiaza acest lucru:
Page 75 of 92
Cap-Cil
Varsta Vechime-auto
Accidente
<1200
<1200
<1200
<1200
18-25
18-25
18-25
18-25
N
D
N
D
<5 ani
<5 ani
5 -10 ani
5 -10 ani
Valoare-RCA
300
350
280
330
Accidente
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
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.
Instructiunea SORT pentru matrici
Daca avem o matrice de memorie, putem executa o sortare a elementelor
acesteia, dupa una sau mai multe chei, ca in exemplu de mai jos :
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 :
Page 79 of 92
Page 80 of 92
Page 81 of 92
Page 82 of 92
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
Page 84 of 92
Page 85 of 92
END-EXEC
Page 86 of 92
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).
Directiva compilare ordine Sql si testare instructiuni Sql
$set sql(dbman=odbc) - directiva compilare (prima instructiune din program)
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
SQLCODE nu se declara in WORKING fiind generata automat de definirea
variabilei SQLCA, tot in WORKING ,care se face sub forma:
EXEC SQL
INCLUDE SQLCA
END-EXEC
Page 88 of 92
Page 89 of 92
EVALUATE SQLCODE
WHEN 0.WHEN 100.WHEN OTHER.
END-EVALUATE
Descrisa mai sus.
Gestionarea indicilor pe baza de date
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.
Tratarea erorilor in lucrul cu o baza de date
La aparitia unei erori la operatiunile efectuate dintr-un program Cobol pe
elementele unei baze de date, imediat dupa afisarea erorrii in logul de executie,
lucru realizat de regula cu un program special de afisare a erorilor, se va efectua
obligatoriu un ROLLBACK la ultimul CHEK-POINT consistent al bazei cu ajutorul
instructiunii:
EXEC SQL ROLLBACK END-EXEC
Mai departe se va pune pe eroare E eventualul flag de control al erorilor pe
tabela in care s-a produs eroarea, se executa COMMIT pe baza, se inchid
cursoarele si se reia executia programului cu redeschiderea cursorului in curs de
tratare, cursor care va trebui sa contina pe clauza WHERE si filtrare dupa flagul
care a fost pus pe E, pentru a nu fi incluse in cursor din nou si randurile din
tabela care au fost puse pe eroare.
Page 90 of 92
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 .
CURRENT-DATE pic X(8) - reprezinta data sistemului in forma MM/DD/YY. 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.
LENGTH OF data-name-2 pic 9(9) - furnizeaza lungimea curenta in bytes de
stocare a unei date numerice data-name-2 sau a unei constante utilizator (de nivel
78)
ADDRESS OF data-name-1 USAGE IS POINTER - reprezinta adresa variabilei
data-name-1 care trebuia sa fie declarata in LINKAGE-SECTION dar asta numai
pana la varianta de Cobol Microfocus, de la el incolo putand fi declarata oriunde.
Page 92 of 92