Sunteți pe pagina 1din 92

Suport Curs de programare COBOL

Autor : Ioan Pogangeanu


Firma Kepler-Rominfo Bucuresti

Toate drepturile privind multiplicarea , fotocopierea , distribuirea sau publicarea unor


parti din acest curs, rezervate firmei Kepler-Rominfo Bucuresti, oricare din actiunile mai
sus amintite, fiind permise doar cu acordul scris al firmei.

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

13.

IS [NOT] NUMERIC, ALFABETIC................................................................................................... 84

Instructiuni pentru legatura cu alte programe NON-Cobol ................................................85

Instructiunea EXECUTE ........................................................................................................... 85

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

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.
Cuvntul COBOL este un acronim care vine de la COmmon Business Oriented
Language.Limbajul este conceput pentru dezvoltarea de aplicatii pentru gestionarea
afacerilor, avand la baza organizarea datelor in fisiere si mai nou in baze de date
relationale (Oracle, DB2, Informix etc).
Avantaje Cobol versus alte limbaje de manipulare date
Avantajul Cobolului fata de alte limbaje de programare de accesare a bazelor de
date, cum ar fi Java, PlSql, C++ etc.., consta in faptul ca din cobol am acces atat la
eventuale fisiere externe unei baze de date cat si la elementele bazei de date (in
urma executiei instructiunii CONNECT, care realizeaza conexiunea la baza de date)
si mai ales orientarea deosebita a Cobolului pentru lucrul cu structuri de date
complexe si tipuri de date cat mai variate, care sa corespunda cerintelor reale de
structuri si tipuri de date.
Un alt criteriu care a dus la mentinerea si dezvoltarea Cobolului ca principal limbaj in
manipularea de date, a fost faptul ca la inceputul anilor 90 cand deja se
implementasera cu succes bazele de date relationale, existau deja in intreaga lume
aplicatii pe fisiere scrise in Cobol care insumau deja Bilioane de linii de cod.
Cum gestionarea datelor in baze de date era net superioara gestinunii acestora cu
ajutorul fisierelor independente( indiferent de accesul la acestea din urma, secvential
sau direct), toate datele au migrat din fisiere independente in baze de date
relationale.
Concomitent a fost modificat si Cobolul pentru a putea accesa aceste baze de date,
si astfel restul prelucrarilor dintr-un program cobol, au ramas in picioare , mai putin
citirea si scrierea din vechile fisiere, care a fost inlocuita cu citirea si scrierea din si in
baza de date.
Astfel aplicatii intregi au putut fi modificate rapid si eficient, mentinandu-se codul
Cobol deja scris si testat de-a lungul a zeci de ani.
Practic solutia aleasa era oarecum si singura cu sorti de izbanda, deoarece sa rescrii
si sa si testezi chiar si in cativa ani codul scris si testat pe parcursul a catorva zeci de
ani era de fapt un lucru putin probabil.
In final alegerea s-a dovedit fericita si din alt punct de vedere, Cobolul dovedindu-si
eficienta si in generarea de instructiuni externe limbajului, gen instructiuni linie de
comanda ale sistemului de operare, permitand astfel lansarea de scripturi din
program care sa execute tot felul de operatii la nivel de sistem de operare, cum ar fi
transformarea fisierelor rezultate din program in fisiere in format PDF, trimiterea de
e-mailuri etc..

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.
2. Structura generala a programelor COBOL
Setul de caractere
La baza tutror instructiunilor si frazelor cobol sta urmatorul set 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

cu precizarea ca numele de variabile incep cu o litera si sa fie diferit de orice cuvant


rezervat cobol.
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.
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

tot ce este scris in aceasta zona este considerat


comentariu

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

3. Declararea datelor n COBOL


Categorii principale de date
Exsta trei mari categorii de date in Cobol si anume:
Variabile
Literali
Constante figurative
Fiecare din datele de mai sus va fi descris in sectiunea corspunzatoare, in functie de
rolul pe care-l indeplineste in cadrul procedurii programului.
Forma generala de descriere a unei date este :
Numar-nivel nume-data [Sablon-descrire] [Clauza].
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

Are forma generala :


VALUE IS literal
Cu ajutorul ei se atribue o valoare unei constante, sau se initializeaza o variabila din
WORKING, sau se atribuie o valoare unui nume de conditie (nivel 88).
Clauza OCCURS
care apare mai sus defineste un vector cu 5 pozitii, fiecare pozitie avand
lungimea de 25. Are urmatoarea forma generala :
OCCURS FROM Intreg-1 TO Intreg-2 DEPENDING ON Nume-Variabila
Unde Intreg-1 este dimensiunea minima a vectorului definit de OCCURS, Intreg-2
dimensiunea maxima, iar DEPENDING ON Nume-Variabila specifica dimensiunea
reala a tabloului la momentul executiei, in functie de numarul intreg continut in
Nume-Variabila.

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

pentru variabile care utilizeaza clauza RENAMES


Clauza renames este surclasata cu succes de adresarea mult mai
directa:
data1(3:5) - Selecteaza din pozitia 3 urmatorii 5 octeti din data1
sau
data1(3) Selecteaza din pozitia 3 toate caracterele ramase

77

numai pentru variabile simple


Ex : 77 valoare pic S9(7)V99 comp.

78

pentru constante definite de utilizator


Ex : 78 temp-max value 39. deci fara sablon de descriere
Ca valoare poate lua si un literal sau chiar o expresie aritmetica sau

Page 15 of 92

logica.
88

pentru variabile nume de conditie (care au valori predefinite)


Ex : 01 val-1 pic 9(3).
88 valoare-maxima value 777.
Aici valoare-maxima este nume de conditie asociat variabilei val-1, si in
loc sa testam IF VAL-1 = 777 se poate scrie doar IF valoare-maxima
De asemenea in loc de a muta direct valoarea maxima in val-1 cu
instructiunea MOVE 777 TO VAL-1 , putem scrie SET valoare-maxima
TO TRUE cu acelasi effect.
Un nume de conditie poate contine si mai multe valori separate prin
spatiu intre ele :
Ex : 01 val-1 pic 9(3).
88 valoare-maxima value 777 12 333 456.

Exercitiu : ce se intampla daca setam pe TRUE o astfel de valoare multipla ?


Tipuri de variabile
Variabilele pot fi de trei tipuri :
Alfabetice
Ex : PIC A(7) descrie un sir alphabetic cu lungimea de 7 litere
Alfanumerice
Ex : pic x(5) pe cele 5 pozitii pot aparea atat carcatere
alfabetice cat si numerice
Numerice
Ex : pic 9(7)
Pic 9(3)V99 unde V semnifica pozitia punctului zecimal
Deci caracterele folosite intr-un sablon PICcture sant:
A, X, 9,V, si S pentru semn
Clauza NEXT pentru constante utilizator
Daca avem o descriere de forma urmatoare:

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 :

77 NR-ORDINE PIC S9(5) COMP.

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 :


1-4 cifre 2 octeti
5-9 cifre 4 octeti
10-18 cifre 8 octeti
De remarcat ca semnul sau punctul zecimal nu ocupa spatiu suplimentar in nici un
format.
Putem avea COMP-1 sau COMP-2 pentru numere mari in virgula mobila in simpla
sau dubla precizie. De remarcat ca pentru aceste doua formate (spre deosebire de
toate celelalte) nu mai este necesar nici un sablon cu PIC, deoarece sistemul aloca
automat 4 bytes pentru comp-1 si 8 bytes pentru comp-2, ex :
77 nr-intrari comp-1.
01 valoare comp-2.
COMP-3 este formatul zecimal impachetat sau binary-coded-decimal (BCD), care
va ocupa ca lungime jumatate din partea intreaga a numarului de cifre plus 1, fiecare
cifra fiind memorata pe jumatate de octet.
Mai exista chiar si COMP-5 (pentru valori cu semn) si COMP-X(pentru valori fara
semn) care este formatul binar nativ al masinii respective, ideal ca viteza pentru
operatiile aritmetice, dar care din pacate nu poate fi folosit la descrierea datelor din
fisierele externe.
Masurarea exacta a dimensiunii campurilor este necesara in cazul in care dorim sa
redefinim o anumita zona de memorie, care poate contine initial campuri numerice
impachetate sau binare.
[USAGE IS] INDEX
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.
Ex: SET var-index to var-obisnuita unde var-obisnuita va fi numerica de lungimea
maxima a vectorului asociat variabilei index.
[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).
[USAGE] IS PROCEDURE POINTER
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:
set current-proc to entry "sub1"
asigneaza intrarea in procedura current-proc la punctul de intrare sub1, in functie
de valoarea parametrului next-option intors de subprogramul apelat.
Tipuri de date definite de utilizator, clauza TYPEDEF

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:

Care structura de date este echivalenta cu urmatoarea descriere:

Formate de editare numerice


Corespunzator acestor formate numerice de reprezentare interna, exista mai multe
formate de reprezentare externa (pe ecran sau la imprimanta).
- Insertia simpla, adica caracterele ,B 0 /
, are rol de separator de mii
Ex : 01 valoare pic 999,999,999
Adica numarul 123456789 va apare 123,456,789
B introduce un blank in pozitia respectiva
Ex : 01 val pic 999B99 adica numarul 12345 va apare 123 45
0 introduce cifra 0
Ex : 77 val pic 999099 adica numarul 12345 va apare 123045
/ introduce un / pe pozitia respectiva
Ex : 01 data-contract pic 99/99/9999.
Adica data 01032010 va fi afisata 01/03/2010
- Insertia speciala, contine doar punctul zecimal .

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
- Insertia fixa se face cu ajutorul caracterelor +,-,CR,DB si $
+ si - insereaza semnul minus inaintea sau la sfarsitul valorii dupa
cum a fost inserat in sablon
Ex : 01 valoare pic -9(3) va afisa valoarea -012 asa : -012
Si la fel pentru restul simbolurilor
Indiferent ca se foloseste + sau se va afisa doar pentru valorile
negative nu si + pentru cele pozitive
- Insertia dinamica se face cu ajutorul caracterelor +,-,si $
Spre deosebire de insertia fixa, unde se folosesc si aceste 3 caractere atat la
stanga cat si la dreapta sablonului de afisare, dar cu o singura aparitie, acum
aceste simboluri se vor insera numai din stanga incepand si pot fi unul sau
mai multe :
Ex : 01 val-1 pic ----9.99 va afisa valoarea -000123,45 ca -123.45
Acelazi sablon mai poate fis scris si astfel pic (4)9.99 sau +(4)9.99 cu
acelas efect.
$ se foloseste astfel val-1 pic $$$$9.99 care va afisa $123.45 pentru
valoarea de mai sus, deci e indicat pentru valori pozitive.
- Suprimare si inlocuire , se face cu ajutorul caracterelor Z si *
Z suprima zerourile de la stanga numarului (cele nesemnificative)
Ex : 01 val-1 pic ZZZ,ZZZ9.99 afiseaza valoarea 0012345,67
ca 12,345.67
Sablonul se poate scrie si z(3),zz9.99 cu acelasi efect
* inlocuieste zerourile nesemnificative cu *
Ex : 01 val-1 pic ***,***9.99 va afisa val de mai su ca : **12,345.67
Evident ca se pot face combinatii de caractere de editare in functie de forma
rezultatului care se doreste a se afisa.
Literali
Literalii reprezinta o valoare statica numerica sau alphanumerica, care poate fi
referita numai direct prin valoarea ei si nu printr-un nume.

Page 21 of 92

Ex literali numerici : 123 sau 123.45 sau -1234


Ex literali alphanumerici : 123 sau +123$ sau abc123
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 :
SPACE sau SPACES incarca cu spatii variabila de atribuire
ZERO , ZEROS sau ZEROES incarca cu zerouri variabila de atribuire
HIGH-VALUE sau HIGH-VALUES incarca variabila de atribuire cu valoarea maxima
Posibila
LOW-VALUE sau LOW-VALUES incarca variabila de atribuire cu valoarea minima
Posibila
ALL urmat de un literal - incarca variabila de atribuire cu valoarea literalului pe
toata lungimea variabilei, practic transforma orice literal
intr-o constanta figurativa.
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:
Fraza SELECT pentru fisiere secventiale

FileName este numele variabilei din programul Cobol, asociata fisierului

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:

Se observa ca in afara de cuvantul cheie FD urmat de numele fisierului din


programul Cobol, restul clauzelor sant optionale, ele oferind insa informatii necesare,

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

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.
EXTEND este modul de deschidere a unui fisier in mod output, cu pozitionarea
pointerului de scriere dupa ultima inregistrare din fisier si permite astfel inserarea de
noi inregistrari la sfarsitul acestuia.
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 :
Instructiunea WRITE secvential

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.

Fisiere secventiale in format fix si variabil


Tot in rubrica FD se specifica modul de inregistrare F(fix-implicit) sau V(variabil),
dupa care urmeaza descrierea structurii de inregistrare a fisierului.
Pentru formatul fix de inregistrare vom avea o singura descriere de inregistrare de
nivel 01, in timp ce pentru un format
variabil, vom avea atatea inregistrari de tip 01 cate formate distincte de inregistrari
avem.
De regula primul octet dintr-o inregistare cu format variabil il reprezinta tipul codificat
(de la 0 la 9, sau de la A la Z) al inregistrarii, in functie de care programul executa
ramura aferenta acelui tip de inregistrare.
Fisierele in format variabil au la fiecare inregistrare un camp invizibil din punctul de
vedere al programatorului, in care se afla lungimea inregistrarii, astfel ca sistemul
stie precis de unde pana unde tine fiecare inregistrare.
Exmplu de declarare a uni fisier secvential cu format fix de inregistrare

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.

Ca regula generala dintr-o sectiune declarativa nu se poate face apel catre o


sectiune nedeclarativa.
Invers, este permis apelul atat din sectiuni declarative cat si nedeclarative, catre
orice alta sectiune declarativa.
Instructiunile din declarative sant activate automat la producerea unei erori asupra
fisierelor indicate in declarative, caz in care variabila FILE-STATUS receptioneaza o
valoare diferita de zero, dar care in prealabil trebuie sa fie si anticipata
prin numele de conditie de nivel 88 aferent, sau inaintea unui grup report secificat la
folosirea reportului pentru listare.

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
FILE-STATUS-ul asociat operatinuilor efectuate asupra fisierelor, este un camp pe 2
caractere, ce cuprinde codificarea erorilor aparute in timpul executiei.
Initial prima pozitie lua valori de la 0 la 4 iar cea de-a doua de la 0 la 9.
Mai nou au aparut o serie de coduri de erori extinse, care au prima cifra 9 iar al
doilea byte este de fapt un camp de tipul 99 COMP-X care poate lua valori de la 0 la
255, si pentru a afisa corect aceasta valoare de FILE-STATUS cu 9 pe prima pozitie,
avem nevoie la afisare de 4 pozitii, una pentru prima pozitie care este 9 si 3 pentru al
doilea octet care poate lua valori de la 0 la 255, asa zisele FILE-STATUS
"implementor-defined", care pot sa difere de la o platforma la alta.
De aceea cand folosim declarativele pentru tratarea erorilor la operatiunile pe fisiere,
trebuie separate erorile neblocante (cele care au prima pozitie 0,1,2 si cele cateva
neblocante care au 9 pe prima pozitie majoritatea celor cu 9 pe primul octet fiind
insa blocante) prin specificarea lor explicita, restul erorilor , nespecificate in mod
explicit, vor fi tratate ca erori blocante intrand pe ramura de oprire program a
declarativelor.
Atat pentru erorile neblocante dar in deosebi pentru cele blocante va trebui afisata
valoarea FILE-STATUS-ului , tinand cont de forma speciala a celor cu 9 pe prima
pozitie, impreuna cu un mesaj care sa precizeze despre care anume fisier este
vorba.
De aceea in cazul in care o clauza USE este folosita pentru mai multe fisiere, inainte
de oricare operatie pe un anumit fisier, va trebui incarcata variabila cu denumirea
fisiereului, care urmeaza a fi listata in declarative in caz de eroare pe acel fisier.
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).
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

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 :

5. Editorul de rapoarte Cobol


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.
Structura generala a unui raport
Editorul de rapoarte COBOL admite urmatoarele grupe de editare:
- REPORT HEADING: antetul raportului; apare o singura data, la inceputul
raportului; poate contine titlul sau alte informatii de identificare

Page 31 of 92

- REPORT FOOTING: contine informatii care se afiseaza o singura data, la sfarsitul


raportului (totaluri generale, informatii de incheiere...)
- PAGE HEADING: anetul de pagina, contine informatii care se afiseaza la inceputul
fiecarei pagini (informatii de identificare a paginii, eventual cap de tabel etc. )
-PAGE FOOTING: informatii care se afiseaza la sfarsitul fiecarei pagini (controlul
paginarii etc.)
- CONTROL HEADING: antetul unei grupe de control si contine informatii de
identificare a grupei. Acestea vor fi afisate la fiecare schimbare a caracteristicii de
grupare.
-CONTROL FOOTING: contine informatii care se afiseaza la sfarsitul fiecarei grupe
de control (date de identificare, subtotaluri la nivelul grupei respective etc.)
-DETAIL: grupa de editare de baza a raportului si contine un rand curent al situatiei
de iesire.
Un raport nu trebuie sa contina obligatoriu toate grupele de editare.
Declararea raportului in sectiunea FILE SECTION
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.
Clauza REPORT defineste numele raportului care va fi descris in REPORT
SECTION, in cazul de mai sus lista.
Declararea raportului in sectiunea REPORT
Sectiunea REPORT de la nivelul DATA DIVISION. cuprinde rubrici RD prin care se
descrie structura raportului.

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

sectiunea DECLARATIVES).De exemplu putem suprima imprimarea grupurilor de


control cu mai mult de 3 linii.

Instructiunea USE pentru report


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

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
Accesul direct la o inregistrare se realizeaza pe baza unei chei relative de la 1 la n,
unde n este numarul maxim de inregistrari, chia de acces fiind deci numerica.
Pentru citirea secventiala in cazurile cand accesul este SEQUENTIAL, formatul de
citire este identic cu cel de la fisiere secventiale La citirea secventiala si accesul
DYNAMIC pe un fisier selectiv se foloseste urmatoare forma de :
READ secvential pe fisier selectiv pentru acces dinamic :

Se observa ca singura diferenta fata de READ-ul secvential este clauza NEXT


RECORD.
.
Daca citirea se face in mod direct pentru accesul RANDOM sau DYNAMIC, se
incarca mai intai cheia relativa cu valoarea cheii pe care dorim s-o citim si se
executa instructiunea:
READ pentru acces direct

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 de dupa INVALID KEY este executata in cazul in care nu exista


inregistrarea cu cheia relativa specificata.
Daca exista , atunci se poate executa o citire secventiala si astfel inregistrarea
corespunzatoare cheii relative este adusa in bufferul de modificare.
In acest moment inregistrarea poate fi modificata si apoi rescrisa cu :
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 :
instructiunea WRITE cu INVALID KEY adaugare directa

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

La fel ca orice fisier, in paragraful FILE-CONTROL vom intalni:


Fraza select pentru declararea unui fisier indexat

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

Daca un program contine o descriere de inregistrare de forma:

atunci putem defini o cheie de inregistrare la modul urmator:

care determina sistemul Cobol sa perceapa campul fullname ca pe o variabila


compusa cu structura urmatoare:

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

Forma generala a instructiunii SORT

Clauza WITH DUPLICATES IN ORDER pastreaza ordinea initiala din fisierul de


intrare pentru cheile duble.
AlphabetName reprezinta un nume de alfabet definit in subrica SPECIAL-NAMES

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.

Instructiunea sort nu poate fi utilizata in sectiunea de DECLARATIVE, si nici in


procedurile de intrare sau iesire ale unei instructiuni SORT sau MERGE.
Cheia de sortare nu trebuie sa contina clauza OCCURS, sau sa fie inclusa intr-un
camp cu aceasta clauza.

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
Va fi folosita in instructiunea sort sub forma INPUT-PROCEDURE is ProcName, si
va inlocui fraza USING FisIntrare, unde ProcName specifica un nume de paragraph,
in care se va deschide normal fisierul de intrare FisIntrare, se va citi din el si se vor
face filtrari de inregistrari sau alte prelucrari, dupa care se va scrie in fisierul
intermediar de sortare, inregistre cu inregistrare pe masura ce sant citite si
prelucrate din fisierul de intrare.
Scrierea in fisierul de sortare se face cu :
Instructiunea RELEASE de scriere in sort
RELEASE SDRecordName [FROM Identifier]

Unde SDRecodName este numele inregistrarii fisierului de sortare.


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
Aceasta fraza OUTPUT-PROCEDURE is ProcName, va inlocui deci fraza GIVING
FisIesire, iar in pargraful ProcName se va citi secvential fisierul intemediar dj
sortat cu instructiunea RETURN, se vor opera filtrele sau alte operatii sau calcule
cumulative pe inregistrarea citita din sort sin in final se vor scrie in fisierul de iesire,
cu WRITE secvential sau indexat, in functie de natura fisierului de iesire.
Instructiunea RETURN de citire din sort
RETURN SDFileName RECORD [INTO Identifier]
AT END StatementBlock
END-RETURN

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.
Exercitiu : Sa se scrie un program de sortare cu iesire intr-un fisier selectiv.
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 asain final inchise fisierele.
Instructiunea MERGE realizeaza acest lucru automat :
Instructiunea MERGE

Specificatiile sant similare cu cele de la SORT, cu deosebirea ca la intrarea in


interclasare putem avea doar fraza USING , nu si o procedura de intrare ca la SORT
Exercitiu : Sa se creeze un fisier indexat din interclasarea a doua fisiere secventiale,
utilizand instructiunea MERGE cu forma OUTPUT PROCEDURE.
10. Subprograme, apelare, parametrii

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:

BY REFERENCE - semnifica faptul ca parametrul afferent este transmis printr-o

referinta catre adresa unde acesta se afla si prin urmare orice


modificare facuta in subprogram este vizibila si in programul
appellant.
BY CONTENT - specifica situatia in care catre subprogram este trimisa o copie a
parametrului din programul apelant si drept urmare eventualele
modificarie efectuate in subprogram nu vor fi vizibile si in
programul principal
BY VALUE - exista si aceasta optiune( in unele versiuni mai noi de Cobol), de
transmitere a parametrilor catre
un subprogram, dar care nu este in standardul ANS85 si care
semnifica faptul ca valoarea parametrului transmis nu poate fi
modificata in subprogram, se poate folosi numai ca atare cu valoarea
initiala transmisa de programul principal.

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

Iar in subprogram vom avea ceva de forma urmatoare:


IDENTIFICATION DIVISION.
PROGRAM-ID DateValidate IS INITIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
- - - - - - - - - - LINKAGE SECTION.
01 DateParam
PIC X(8).
01 DateResult
PIC 9.
PROCEDURE DIVISION USING DateParam, DateResult.
Begin.
- - - - - - - - - - - - - - - - - - - - - - EXIT PROGRAM.
------.
- - - - - - - - - - - -

Se observa ca importanta este ordinea parametrilor nu numele acestora, in program


si in subprogram.

Clauza IS INITIAL

Semnifica faptul ca la apelarea repetata a subprogramului toate variabilele si


fisierele din subprogram se vor gasi in starea initiala.
Daca dupa apelull CALL din programul principal urmeaza:
Instructiunea CANCEL
CANCEL nume_subprogram
atunci zona de memorie ocupata de subprogram va fi eliberata si la o eventuala
rechemare a subprogramului, chiar daca acesta nu contine IS INITIAL,
subprogramul va fi tot in starea initiala in mod implicit (pentru ca zona de memorie
aferenta lui, de la apelul anterior, a fost eliberata prin CANCEL)

Page 45 of 92

Instructiunea EXIT PROGRAM


Opreste executia subprogramului si transfera controlul programului principal.
Daca am folosi STOP RUN in cadrul subprogramului, s-ar opri intreaga unitate de
executie, adica atat subprogramul cat si programul appellant, ceea ce evident nu
este de dorit, pentru ca in programul principal de regula urmeaza executia altor
instructiuni dupa apelul unui subprogram.
Instructiunea GOBACK
Are forma:

si la fel ca EXIT PROGRAM preda controlul programului apelant, eventual cu


transmiterea catre acesta prin intermediul clauzelor GIVING sau RETURNING, care
sant echivalente, a unei valori sau adrese.

Clauza IS COMMON

Este folosita in cazul subprogramelor incluse intr-un program principal si permite


apelul nu doar din cadrul programului principal ci si dintr-un alt subprogram aflat pe
acelasi nivel cu subprogramul apelat.
Exemplu apelare programme incluse
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

Permite accesul la zona de memorie descrisa cu IS EXTERNAL, in programul


principal, din orice subprogram care insa trebuie sa aiba si el o descriere identica a
zonei de memorie respective.
Exemplu :
WORKING-STORAGE SECTION.
01 SharedRec IS EXTERNAL.
02 Denumire
PIC X(4).
02 Valoare
PIC 9(5).

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

Unde literal-1 specifica denumirea punctului de intrare in subprogram, iar celelate


doua date fiind parametrii de apel ai subprogramului.
Instructiunea ENTRY nu poate fi folosita in apelurile de subprograme imbricate.
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.
Urmeaza apoi subprogramul "controller":
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.
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 .

Necesitatea utilizarii subprogramelor


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

Orice appel de functie trebuie precedat de cuvantul cheie FUNCTION , iar in


paranteza se precizeaza parametrii functiei (nume de variabile, literali, constante
etc).
Ex : DISPLAY 'lungimea sirului "ABC" este:' FUNCTION LENGTH('ABC')
Mai jos avem:
Tabelul tuturor functiilor Cobol

Page 50 of 92

Page 51 of 92

Page 52 of 92

12. PROCEDURE DIVISION, comenzi principale


Instructiunile care pot aparea in PROCEDURE DIVISION pot fi grupate in
urmatoarele categorii:
Instructiuni grupate pe categorii
Categorie Verb
Arithmetic ADD
COMPUTE
DIVIDE
INSPECT (TALLYING)
MULTIPLY
SUBTRACT
Conditional ADD (SIZE ERROR)
CALL (OVERFLOW)
COMPUTE (SIZE ERROR)
DELETE (INVALID KEY)
DIVIDE (SIZE ERROR)
GO TO (DEPENDING)
IF

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
ACCEPT (DATE, DAY or TIME)
ACCEPT MESSAGE COUNT
INSPECT (REPLACING)
MOVE
STRING
UNSTRING
EXAMINE
TRANSFORM
INITIALIZE
INSPECT (CONVERTING)
SET (TO TRUE)
SET (TO FALSE)
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
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

Clauza ROUNDED specifica faptul ca se face rotunjire la numarul de zecimale al


operandului in care se depune rezultatul, valabil si pentru ADD.
Instructiunea de inmultire MULTIPLAY
Prima forma inmulteste identifier-1 cu identifier-2. identifier-n iar rezultatul este
depus in identifier-1, cu sau fara rotunjire :

Page 59 of 92

A doua forma este :

In care se de[une in identifier-3 rezultatul inmultirii dintre identifier-1 si identifier-2.


Instructiunea de impartie DIVIDE

Imparte identifier-2 la identifier-1 si rezultatul il depune cu sau fara rotunjire in


identifier-2.

Page 60 of 92

Imparte identifier-2 la identifier-1 si rezultatul il depune cu sau fara rotunjire in


identifier-3.

Imparte identifier-1 la identifier-2 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.

Imparte identifier-1 la identifier-2 si rezultatul il depune cu sau fara rotunjire in


identifier-3, iar restul impartirii il depune in identifier-4.
Instructiunea COMPUTE
Este o combinata a celor patru operatii si are forma :

Astfel ea asigneaza lui identifier-1,., identifier-n valoarea expresiei de dupa semnul


egal (sau EQUAL), cu sau fara rotunjire.
Instructiuni de intrare-iesire , INPUT-OUTPUT
Instructiunea DISPLAY

Page 62 of 92

Afiseaza pe suportul standard de iesire orice tip de date, si are forma :

UPON schimba destinatia implicita a device-ului de afisare cu un alt device, de

pilda putem pune de exemplu environment-name, dupa care sa facem o


preluare a valorii respective cu instructiunea ACCEPT FROM environment-value.
WITH NO ADVANCING retine cursorul de pe ecran pe aceeasi linie, in mod normal
el trece pe linia urmatoare dupa DISPLAY.
Exemplu : DISPLAY Adresa exacta este : W-ADR-EX
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 :

Mnemonic-Name poate fi de exemplu environment-value , caz in care daca avem

inaintea instructiunii ACCEPT o instructiune DISPLAY Nume-Variabila UPON


environment-name, vom putea accepta valoarea variabilei Nume-Variabila, setata in
mediu de lucru.
De remarcat in acest caz ca Nume-Variabila (de la DISPLAY), trebuie sa fie acelasi
atat in program cat si in mediul de lucru, la ACCEPT putand sa dam un nume diferit
de variabila, fata de cele doua de mai sus.
La formatul 2 variabilele trebuie sa aiba dimensiunile :
01 CurrentDate
* CurrentDate este in

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

* DAY-OF-WEEK unde 1=luni, 2=marti..etc

01 CurrentTime
PIC 9(8).
* CurrentTime timpul in format HHMMSSss

Putem folosi si formate cu anul pe 4 caractere:


ACCEPT DATE [YYYYMMDD]
ACCEPT DAY [YYYYDDD]

cu marirea corespunzatoare a variabilei de primire.


Instructiuni activate la compilare - Compiler-directing Statements
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.
Exemplu inlocuire pseudo-text:
Acest text apare in fisierul cobol care apeleaza instructiunea COPY

Page 64 of 92

copy Payroll
replacing ==(TAG)== by ==Payroll==.

Aceasta este descrierea fisierului Payroll apelata de COPY


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

Iar acesta este rezultatul in urma apelului de COPY cu inlocuire.

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

Tipul datelor primitoare

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 :

Modifica o variabila de tip pointer, incrementand cu plus UP sau minus DOWN,


cu una din cele trei valoari care urmeaza dupa BY
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
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 :

Inspecteaza sursa alfanumerica SourceStr$i si numara in variabila Counter#i de


cate ori apare sirul Compare$il inaintea sau dupa delimitatorul Delim$il.
ALL trateaza toate ocurentele valide
LEADING - trateaza ocurentele de la prima valida pana la prima invalida
Exemplu:
INSPECT FullName TALLYING UnstrPtr FOR LEADING SPACES.
INSPECT SourceLine TALLYING ECount
FOR ALL "e" AFTER INITIAL "inceput"
BEFORE INITIAL "sfarsit".

Forma-2 Inspect REPLACING :

Page 67 of 92

Aceasta forma inlocuieste sirul SourceStr$i cu sirul ReplaceChar$il inainte


sau dupa delimitatorul Delim$il
FIRST trateaza doar prima ocurenta valida
Exemplu:
INSPECT StringData REPLACING FIRST "R" BY "G"
AFTER INITIAL "B" BEFORE INITIAL "S".
INSPECT StringData REPLACING
ALL "CUCU" BY "CALU"
AFTER INITIAL "C" BEFORE INITIAL "P".

Forma-3 Inspect Combinat :


Este o imbinare a primelor doua forme de inspect, cu mentiunea ca intai se face
contorizarea sirului initial si abia dupa aceea inlocuirile.

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

adica oriunde apare x in SourceStr$i va fi inlocuit cu A, u cu B si t cu C


Instructiunea STRING
Este folosita in special pentru concatenarea de siruri alfanumerice si are urmatoarea
forma generala:

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

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
DestCounter#i - contorizeaza numarul de subsiruri in care a fost spart sirul initial
Exemplu:
DATA DIVISION.
FILE SECTION.
FD CommaDelimitedFile.
01 CommaDelimitedRec
PIC X(205).
88 EndOfFile
VALUE HIGH-VALUES.
FD
01

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

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
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 :

Clauza REPLACING permite alegerea valorilor de initializare pentru toate tipurile de


date, altfel initializarea se face cu valorile implicite, zero, spatiu etc..

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 :

De remarcat ca IF-ul se poate inchide foarte usor cu un simplu punct ., in loc de


END-IF, drept care folosirea punctelor intre IFEND-IF este complet interzisa,
ca si in cazul altor instructiuni cu ramuri multiple si instructiune terminala ENDinstr.
Instructiunea EVALUATE
Este o instructiune complexa cu ramuri multiple pe conditii multiple, cu ajutorul
careia putem transpune usor in algoritm de program in conditii complexe pe multiple
ramuri.
Cuvintele cheie imediat dupa EVALUATE si inainte de WHEN se numesc subiecte,
iar cele de dupa WHEN si instructiunea imperativa care-i urmeaza sant obiectele.
Ca numar si tip de data ele vor trebui sa corespunda, astfel incat comparatiile sa
aiba sens.
ALSO separa fiecare subiect de subiectul succesor si la fel pentru obiectele
corespondente. El poate aparea de oricate ori la subiecte, doar ca tot de atatea ori
trebuie sa apara si la obiectele corespunzatoare.
Conditiile care urmeaza dupa WHEN sant evaluate de sus in jos si prima care este
gasita adevarata va fi executata.

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

Putem calcula valoarea RCA cu EVALUATE astfel:


EVALUATE Cap-Cil

ALSO Varsta ALSO Vechime-auto ALSO

WHEN 1 THRU 1200 ALSO


300 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO
350 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO
280 TO Valoare-RCA
WHEN 1 THRU 1200 ALSO
330 TO Valoare-RCA

Accidente

18 THRU 25 ALSO 1 THRU 5 ALSO N MOVE


18 THRU 25 ALSO 1 THRU 5 ALSO D MOVE
18 THRU 25 ALSO 5 THRU 10 ALSO N MOVE
18 THRU 25 ALSO 5 THRU 10 ALSO D MOVE

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:

Aceasta e forma cea mai simpla de PERFORM, care determina executia


paragrafelor, sectiunilor sau instructiunilor, de la procedure-name-1 si pana la

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

Acest format seamana si el cu aldoilea, doar ca incetarea executiei este conditionata


de indeplinirea conditiei condtion-1, iesirea din perform facandu-se inainte
(BEFORE) sau dupa (AFTER) indeplinirea ei.
EXIT specifica faptul ca iesirea din perform se va face la intalnirea instructiunii
EXIT, care va trebui sa existe pe una din ramurile performului.
Ultima forma de perform este pe baza de index , actiunea repetata a performului
efectuanduse prin variatia unia sau mai multor indecsi pana la limita superioara a
acestora.
AFTER semnifica existenta unui al doilea indice de repetare a PERFORM-ului si
care trebuie sa-si ating el maximul mai intai pentru ca primul indice dinaintea lui sa
fie incrementat cu inca o unitate.

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 :

KEY IS specifica cheia de sortare a vectorului si este necesara doar la al doilea


format de SEARCH, numit SEARCH BINAR.
TableItem este campul din vector dupa care acesta este ordonat crescator sau
descrescator si care este declarat cheie cu ajutorul clauzei KEY IS.
De remarcat ca vectorul trebuie sortat in prealabil dupa acest camp declarat cheie.
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 :
SET identifier-2 TO NumeIndex
Deci nu e obligatoriu sa facem VARYING pe identifier-2, pentru a putea afisa indexul
sau a face cu el alte operatii.
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).
SEARCH-ul ALL, sau BINAR
Acesta presupune pe linga existenta variabilei de tip index in clauza OCCURS, si a
unei chei de sortare a vectorului, declarat prin clauza KEY IS, si sortarea prealabila a
vectorului dupa aceasta cheie.
Daca in vector exista campuri de cheie necompletate si sortarea este crescatoare,
atunci acestea vor trebui completate cu HIGH-VALUES (constanta figurativa), pentru
a le pozitiona la coada vectorului.
Daca in vector exista campuri de cheie necompletate si sortarea este
descrescatoare, atunci acestea vor trebui completate cu LOW-VALUES (constanta
figurativa), pentru a le pozitiona la coada vectorului.
Avand indeplinite toate aceste conditii putem utiliza a doua forma a SEARCH-ului,
mai rapida ca prima forma si anume SEARH-ul BINAR sau ALL :

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).
PERFORM VARYING J FROM 1 BY 1 UNTIL J = 250
SEARCH ALL TAB-CLI-1 AT END
DISPLAY'CLIENT ABSENT IN TABELA-1 :' W2-CLI(J)
WHEN W1-CLI(I) = W2-CLI(J)

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.
Instructiuni fara effect - Null Operation
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.

Executa iesirea fortata dintr-un paragraph sau sectiune, controlul trecand la


paragraful sau sectiunea imediat urmatoare.

Realizeaza iesirea dintr-un subprogram cu cedarea controlului in programul


appellant eventual cu transmiterea unui parametru, la fel ca la instructiunea
GOBACK.
Instructiunea CONTINUE
Este folosita de exemplu pe unele ramuri de IF sau EVALUATE pe care nu vrem sa
le desfiintam deocamdata, dar pe care nu dorim sa se mai execute ceva anume:

Deci ea nu executa nimic, iar controlul programului trece la instuctiunea imediat


urmatoare dupa IF-ul sau EVALUATE-ul care o continea.
Testarea conditiei de clasa
IS [NOT] NUMERIC, ALFABETIC

Page 84 of 92

O gasim legata in instructiuni de selectie IF, EVALUATE in secventele de validare de


date .Are urmatoarea forma generala:

Clasa unui operand este determinata astfel:


NUMERC daca contine caracterele numerice 0,1,2...,9 cu sau fara semn
ALFABETIC - daca contine literele A,B,C,......,X,Y,Z spatiu sau literele mici a,b,c,...,z
Sau orice combinatie intre acestea si spatiu.
A-LOWER - numai literele mici si spatiu
A-UPPER numai literele mari si spatiu
Class-name-1 - contine numai carcatere definite in class-name-1 (definit in
SPECIAL-NAMES) si/sau spatiu.
De remarcat ca daca vreau sa testez identifier-1 daca este numeric sau alphabetic,
trebuie sa-l descriu in WORKING ca fiind alphanumeric, altfel e posibil sa
converteasca diversele date primite si neconforme cu structura care trebuie sa fie
(numerica sau alfabetica).
Instructiuni pentru legatura cu alte programe NON-Cobol
Instructiunea EXECUTE
Permite crearea unui mechanism de legatura cu subsysteme non-cobol:
General Format
EXEC[UTE] text-name text-data END-EXEC
Exemplu : EXEC SQL
SELECT CAMP1, CAMP2
INTO :H-CAMP1, :H-CAMP2
FROM TABELA1
Where rownum <= 1

Page 85 of 92

END-EXEC

13. Conectare din COBOL la o baza de date


Instructiuni conectare
1. Se instaleaza pe masina client, clientul de oracle sau alta baza de date, pt
creearea driverului de conectare la baza de date.Se pot instala clienti pt mai multe
baze de date diferite.
2. Se creeaza mai intai DSN-Conectare (DataSourceName vezi procedura de
creeare in pagina urmatoare), iar in programul Cobol va apare urmatoarea secventa:
EXEC SQL
CONNECT TO NumeBazaDeDate' USER User.Password' using DSNConectare
END-EXEC
$set sql(dbman=odbc) directiva de compilare pentru baze de date ($ in col 7), prima
instructiune din program, inainte de id-division.
3. Pentru definirea unei DSN, de conectare la o baza de date, se intra in Windows
pe Control panel->Administrative Tools->Data Source (ODBC)->File DSN->Add, ca
in figua din pagina urmatoare

Page 86 of 92

Variabila de conectare SQLCA la o baza de date


In zona Workink..se insereaza EXEC SQL INCLUDE SQLCA END-EXEC , care
genereaza:
01 SQLCA.
05 SQLCAID PIC X(8).
05 SQLCABC PIC S9(9) COMP-4.
05 SQLCODE PIC S9(9) COMP-4. - Memoreaza codul de retour al unei
instructi Sql
05 SQLERRM.
49 SQLERRML PIC S9(4) COMP-4.
49 SQLERRMC PIC X(70).
05 SQLERRP PIC X(8).
05 SQLERRD OCCURS 6 TIMES
PIC S9(9) COMP-4.
05 SQLWARN.
10 SQLWARN0 PIC X.
10 SQLWARN1 PIC X.

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

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.
DISPLAY "Ouverture du curseur Taiga".
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.
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

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.

Comenzi de baza in Cobol-Microfocus


1. Animate->Setings -> Stabilire director si program curent
pt animatie (Debuger)->program.int
2. Ctrl+F7 ->Compilare program curent si generare program.int
3. F11-> Start executie pas cu pas a programului curent
4. F9, pe o linie de program fiseaza un punct de oprire pe linie
5. F5 -> rulare program pana la primul punct de oprire
6. Shift+F5-> Terminare executie program curent (Se poate relua
executia pas cu pas cu F11)
7. Ctrl+Shift+F5-> Terminare executie program curent si reluare
automata a executiei pas cu pas.
8. Alt+2->Afisare-Ascundere fereastra cu rezultate compilare
9. Alt+3->Afisare-Ascundere fereastra afisare valori variabile, in ea
merge F9 la nivel de variabila, permitand oprirea
programului la schimbarea valorii variabilei marcate cu F9.
Fereastra este accesibila doar in timpul executiei programului
14. Registri speciali Special registers
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 .
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

S-ar putea să vă placă și