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.

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

· Categorii principale de date

14

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

· Consideratii generale

· Forma generala instructiune CALL subprogram:

· Exemplu apelare subprogram din programul principal :

· Clauza IS INITIAL

· Instructiunea CANCEL

· Instructiunea EXIT PROGRAM

· Instructiunea GOBACK

· Clauza IS COMMON

· Exemplu apelare programme incluse

Clauza IS

· GLOBAL

Clauza IS

· EXTERNAL

· Puncte de intrare intr-un subprogram - Entry points

· Instructiunea ENTRY

· Necesitatea utilizarii

subprogramelor

11. Functii intrinseci – Built-in functions

43

44

44

45

45

45

46

46

46

46

47

47

47

48

49

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

· grupate pe categorii

Instructiuni

· aritmetice

Instructiuni

53

53

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

Page 4 of 92

64

·

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

· IS [NOT] NUMERIC, ALFABETIC

· Instructiuni pentru legatura cu alte programe NON-Cobol

· Instructiunea EXECUTE

13. Conectare din COBOL la o baza de date

84

84

85

85

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

1. Introducere în COBOL

91

· Ce este limbajul Cobol?

COBOL este un limbaj de programare de nivel înalt dezvoltat pentru prima oară de către Comitetul CODASYL (Conference on Data Systems Languages), în 1960. De atunci, responsabilitatea pentru dezvoltarea de noi standarde COBOL a fost asumată de către American National Standards Institute (ANSI). Trei standarde ANSI pentru COBOL au fost produse: în 1968, 1974 şi 1985.

Page 5 of 92

Ulterior la mijlocul anilor ’90 a aparut si versiunea de Cobol mai complexa OO-Cobol, orientata pe obiecte.Compatibilitatea cu vechile versiuni de cobol a fost insa mentinuta.

Cuvântul 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

, 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

date, cum ar fi Java, PlSql, C++ etc

consta in faptul ca din cobol am acces atat la

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

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

programatorul stie datorita structurii bine

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

De asemenea avem echivalenta intre urmatoarele fraze cobol :

,cat

si fraza cobol care poate fi folosita la astfel de comparatii.

fraza cobol care poate fi folosita la astfel de comparatii. Mai jos avem tabelul cu toti

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

· 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

Coloanele 73-80

In aceasta zona se scriu obligatoriu instructiunile executabile

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

lucru al programului, fisierele accesate de program, cu numele lor si tipul fiecarui fisier.Avem de-a face aici cu doua mari sectiuni :

cum sugereaza si numele ei, este diviziunea in care este descris mediul de

[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-STORAGE–SECTION.] - 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

SELECT FPARAM ASSIGN TO PARAMDAT

ORGANIZATION line SEQUENTIAL FILE STATUS FILE-STAT-P.

AX-FICHIER

ASSIGN

UT-S-AX.

Data Division.

FILE SECTION.

FD AX-FICHIER

01 REC-AX

FD FPARAM RECORD 6 RECORDING F.

01 ENR-PARAM.

.

PIC X(66).

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

Forma generala de descriere a unei date este : Numar-nivel nume-data [Sablon-descrire] [Clauza]. PIC X(25) OCCURS

nume-data [Sablon-descrire] [Clauza].

este : Numar-nivel nume-data [Sablon-descrire] [Clauza]. PIC X(25) OCCURS 5. Ex : 01 rand-imprimanata. 05 05
este : Numar-nivel nume-data [Sablon-descrire] [Clauza]. PIC X(25) OCCURS 5. Ex : 01 rand-imprimanata. 05 05

PIC X(25) OCCURS 5.

Ex : 01 rand-imprimanata.

05

05

05 val-manopera

cod-produs PIC 9(5).

denumire-produs

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.

Ca valoare poate lua si un literal sau chiar o expresie aritmetica sau

–deci fara sablon de descriere

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

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:

x3. De asemenea pot aparea confuzii la definirile cu occurs: Unde offset-a puncteaza catre valoarea primului

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:

maxima a vectorului asociat variabilei index.

SET var-index to var-obisnuita unde var-obisnuita va fi numerica de lungimea

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

date ca in exemplul de mai jos cu ajutorul clauzei TYPEDEF : prin care am definit

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:

putem folosi apoi in descrierea unor alte variabile astfel: Care structura de date este echivalenta cu

Care structura de date este echivalenta cu urmatoarea descriere:

structura de date este echivalenta cu urmatoarea descriere: · Formate de editare numerice Corespunzator acestor

· 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

pic 99/99/9999.

Ex : 01 data-contract

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

Posibila LOW-VALUE sau LOW-VALUES incarca variabila de atribuire cu valoarea minima

incarca variabila de atribuire cu valoarea maxima

ALL urmat de un literal

-

Posibila 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

DIVISION, prin: · Fraza SELECT pentru fisiere secventiale FileName – este numele variabilei din programul Cobol,

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:

rubrica FD (File Description), cu principalele clauze: Se observa ca in afara de cuvantul cheie FD
rubrica FD (File Description), cu principalele clauze: Se observa ca in afara de cuvantul cheie FD
rubrica FD (File Description), cu principalele clauze: Se observa ca in afara de cuvantul cheie FD

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,

aferente fisierului din clauza FD, care trebuie sa apra imediat dupa clauza FD.

structurile de date pe tipuri de inregistrari,

reprezinta

[info] – specifica o clauza optionala, iar daca clauza respectiva este incadrata si intr- un chenar, atunci inseamna ca ea este obligatorie pentru varianta de Cobol-74, dar incepand de la varianta specificata in cerculetul oval de langa patrat, ea a devenit optionala. Formate generale asemanatoare exista pentru SD sau RD

· 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

cea de schidere cu forma generala : · Instructiunea OPEN INPUT – specifica faptul ca fisierul

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

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

fisier secvential utilizam instructiunea write cu urmatorul format : · Instructiunea WRITE secvential Page 25 of

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:

o sectiune si o clauza USE cu urmatoarea forma generala: Aceasta forma este specifica tratarii erorilor

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:

ca mai exista o forma specifica pentru USE si anume: Caz in care se pot introduce

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

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 :

si in cast caz var-fis-student este o variabila de

este : si in cast caz var-fis-student este o variabila de 5. Editorul de rapoarte Cobol

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 :

de declarative unde instructiunea USE are urmatoarea forma : iar operatiile specifice necesare, vor fi scrise

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

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 :

READ secvential pe fisier selectiv pentru acces dinamic : Se observa ca singura diferenta fata de

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

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 :

aferente cheii respective si are urmatorul format : Instructiunea de dupa INVALID KEY este executata in

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

modificata si apoi rescrisa cu : · Instructiunea REWRITE Practic pe INVALID KEY e un pic

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

· instructiunea WRITE cu INVALID KEY – adaugare directa Pe INVALID KEY se poate iesi daca

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

· instructiunea DELETE cu INVALID KEY – stergere directa Pe implicit prin valoarea cheii aflata in

Pe

implicit prin valoarea cheii aflata in buffer la momentul stergerii, sau explicit prin incarcarea concreta a unei valori in cheia relativa.

INVALID KEY se iese atunci cand nu este gasita cheia incarcata in prealabil,

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

· Fraza select pentru declararea unui fisier indexat Clauza ALTERNATE RECORD KEY IS – specifica cheia

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

· Instructiunea READ secvential pentru acces DYNAMIC Daca accesul este secvential, forma de citire este aceeasi

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:

Daca un program contine o descriere de inregistrare de forma: atunci putem defini o cheie de

atunci putem defini o cheie de inregistrare la modul urmator:

putem defini o cheie de inregistrare la modul urmator: care determina sistemul Cobol sa perceapa campul

care determina sistemul Cobol sa perceapa campul fullname ca pe o variabila compusa cu structura urmatoare:

fullname ca pe o variabila compusa cu structura urmatoare: In felul acesta putem defini chei complexe

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

· Forma generala a instructiunii SORT Clauza WITH DUPLICATES IN ORDER pastreaza ordinea initiala din fisierul

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 déjà 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 asa…in final inchise fisierele. Instructiunea MERGE realizeaza acest lucru automat :

· Instructiunea MERGE

realizeaza acest lucru automat : · Instructiunea MERGE Specificatiile sant similare cu cele de la SORT,

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 LINKAGE- SECTION, in cadrul suprogramului si in WORKING-SECTION (adica normal), in programul principal. Cand sant transmisi parametrii PROCEDURE DIVISION din subprogram va fi urmata de USING PAR1 PAR2…PARn, exact in ordinea in care apar in instructiunea CALL din programul principal si care are urmatoarea:

· Forma generala instructiune CALL subprogram:

urmatoarea: · Forma generala instructiune CALL subprogram: BY REFERENCE - semnifica faptul ca parametrul afferent este

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:

apelul unui subprogram. · Instructiunea GOBACK Are forma: si la fel ca EXIT PROGRAM preda controlul

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

PROCEDURE DIVISION. Begin. CALL "InsertData" MOVE "Programul princ utilizeaza zona comuna" TO SharedItem CALL "DisplayData" STOP RUN. IDENTIFICATION DIVISION. PROGRAM-ID. InsertData. PROCEDURE DIVISION.

PIC X(50) IS GLOBAL.

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

· Instructiunea ENTRY Unde literal-1 specifica denumirea punctului de intrare in subprogram, iar celelate doua date

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 intr- un 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 le- a 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 51 of 92

Page 52 of 92

Page 52 of 92

12. PROCEDURE DIVISION, comenzi principale Instructiunile care pot aparea in PROCEDURE DIVISION pot fi grupate

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

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

In prima forma valoarea din identifier-1 se aduna la valoarea din identifier-2 iar Rezultatul se depune in identifier-2.

din identifier-2 iar Rezultatul se depune in identifier-2. In a doua forma valoarea din identifier-1 se

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.

identifier-3 inlocuind vechea valoare a acestuia din urma. Inainte de TO putem avea oricati identificatori. Page

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

05

b1 pic 9(5). c1 pic 9(7).

01 d1.

05

05

b1 pic 9(5). 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 dintr- un alt operand si la fel ca ADD are tot trei forme cu specificatii practic identice :

Page 58 of 92

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

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

A doua forma este :

A doua forma este : In care se de[une in identifier-3 rezultatul inmultirii dintre identifier-1 si

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

· Instructiunea de impartie DIVIDE

si identifier-2. · Instructiunea de impartie DIVIDE Imparte identifier-2 la identifier-1 si rezultatul il depune

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

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

identifier-3.

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

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

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.

iar restul impartirii il depune in identifier-4. Imparte identifier-1 la identifier-2 si rezultatul il depune

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 :

Este o combinata a celor patru operatii si are forma : Astfel ea asigneaza lui identifier-1,….,

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 :

standard de iesire orice tip de date, si are forma : UPON – schimba destinatia implicita

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 :

si ora de la sistem etc Instructiunea are doua formate : Mnemonic-Name – poate fi de

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

PIC 9(6).

*

CurrentDate este in 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

* CurrentTime timpul in format HHMMSSss

Putem folosi si formate cu anul pe 4 caractere:

PIC 9(8).

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 :

in timpul compilarii programului. Formatul general este : Pseudo-textele aflate intre doua egaluri se folosesc atunci

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

Numeric

Numeric

DBCS

editat /

intreg /

editat

alfanumeric

numeric

Alfabetic

Yes

Yes

No

No

No

Alfanumeric

Yes

Yes

Yes

Yes

No

Alfanumeric editat

Yes

Yes

No

No

No

Numeric intreg

No

Yes

Yes

Yes

No

Numeric

No

No

Yes

Yes

No

Numeric editat

No

Yes

Yes

Yes

No

DBCS

No

No

No

No

Yes

· Instructiunea SET

Format-1 :

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 :

din clauza VALUE atasata fiecaruia dintre ele. Format-2 : Modifica o variabila de tip pointer, incrementand

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:

cu una din cele trei valoari care urmeaza dupa BY Format-3: Seteaza valoarea unui index (asociat

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

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 :

are patru forme distincte: Forma-1 Inspect TALLYING : Inspecteaza sursa alfanumerica SourceStr$i si numara in

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 –

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

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:

caracterelor se face 1 la 1.Forma generala este: Exemplu : INSPECT StringData CONVERTING "xut" TO

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

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

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

VALUE HIGH-VALUES.

88 EndOfFile

FD CustomerFile.

01 CustomerRec.

02 CustName

PIC X(40).

02

AddrLinesUsed

PIC 9.

02

CustAddress. 03 AddrLine PIC X(25) OCCURS 1 TO 6 DEPENDING ON AddrLinesUsed.

02

CustBalance PIC 9(5)V99.

WORKING-STORAGE SECTION.

01

TempAddress

PIC X(150).

01

TempBalance

PIC X(7).

Page 71 of 92

01

AdjustedBalance REDEFINES TempBalance PIC 9(5)V99.

PROCEDURE DIVISION. Begin. OPEN INPUT CommaDelimitedFile OPEN OUTPUT CustomerFile READ CommaDelimitedFile AT END SET EndOfFile TO TRUE END-READ

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 )

initializate dupa natura descrierii lor, cele numerice cu zero, alfanumericele cu spatiu etc. Forma generala este :

si facem initializarea la nivelul campului de nivel 01 , toate subcampurile vor fi

la nivelul campului de nivel 01 , toate subcampurile vor fi Clauza REPLACING permite alegerea valorilor

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 :

statement-2 sau la fel se trece la instructiunea urmatoare : De remarcat ca IF-ul se poate

De remarcat ca IF-ul se poate inchide foarte usor cu un simplu punct ‘.’, in loc de END-IF, drept care folosirea punctelor intre IF…END-IF este complet interzisa, ca si in cazul altor instructiuni cu ramuri multiple si instructiune terminala END- instr.

· Instructiunea EVALUATE

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

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

Valoare-RCA

<1200

18-25

<5 ani <5 ani 5 -10 ani 5 -10 ani

N

300

<1200

18-25

D

350

<1200

18-25

N

280

<1200

18-25

D

330

Putem calcula valoarea RCA cu EVALUATE astfel:

EVALUATE Cap-Cil

ALSO

Varsta ALSO Vechime-auto ALSO

Accidente

WHEN 1 THRU 1200 ALSO

18 THRU 25 ALSO 1 THRU 5 ALSO ‘N’

MOVE

300

TO Valoare-RCA

 

WHEN 1 THRU 1200 ALSO

18 THRU 25 ALSO 1 THRU 5 ALSO ‘D’

MOVE

350 TO Valoare-RCA

WHEN 1 THRU 1200 ALSO

18 THRU 25 ALSO 5 THRU 10 ALSO ‘N’

MOVE

280

TO Valoare-RCA

WHEN 1 THRU 1200 ALSO

18 THRU 25 ALSO 5 THRU 10 ALSO ‘D’

MOVE

330 TO Valoare-RCA

END-EVALUATE

· Instructiunea PERFORM

Determina executarea unui anumit paragraf, in mod repetitiv sau nu, caz in care vorbim de un asa zis PERFORM OUT-LINE, sau a unui grup de linii de cod cuprinse intre PERFORM si END- PERFORM, cand spunem ca santem in cazul unui PERFORM IN-LINE. Exista patru forme de perform si anume:

PERFORM IN-LINE. Exista patru forme de perform si anume: Aceasta e forma cea mai simpla de

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.

imperative-statement-1, si astfel executia se termina. Al doilea format seamana cu primul doar ca executia are

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

intregi identifier-1 sau direct a intregului integer-1 Acest format seamana si el cu aldoilea, doar ca

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

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 :

vectorului ce face obiectul unei instructiuni SEARCH este : KEY IS – specifica cheia de sortare

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

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

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

fara effect - Null Operation · Instructiune EXIT Apare de regula in paragrafele de sfarsit ale

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

Executa iesirea fortata dintr-un perform si trece controlul la instructiunea imediat urmatoare dupa perform.

controlul la instructiunea imediat urmatoare dupa perform. Executa iesirea fortata dintr-un paragraph sau sectiune,

Executa iesirea fortata dintr-un paragraph sau sectiune, controlul trecand la paragraful sau sectiunea imediat urmatoare.

trecand la paragraful sau sectiunea imediat urmatoare. Realizeaza iesirea dintr-un subprogram cu cedarea

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:

dar pe care nu dorim sa se mai execute ceva anume: Deci ea nu executa nimic,

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:

de validare de date .Are urmatoarea forma generala: Clasa unui operand este determinata astfel: NUMERC –

Clasa unui operand este determinata astfel:

NUMERC – daca contine caracterele numerice 0,1,2

ALFABETIC - daca contine literele A,B,C,

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

,9

cu sau fara semn

,X,Y,Z

spatiu sau literele mici a,b,c,

,z

· 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 ‘DSN- Conectare’ END-EXEC

$set sql(dbman=odbc) directiva de compilare pentru baze de date ($ in col 7), prima instructiune din program, inainte de id-division.

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

· Variabila de conectare SQLCA la o baza de date

In zona Workink genereaza:

01 SQLCA.

se

insereaza EXEC SQL INCLUDE SQLCA END-EXEC , care

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

05 SQLERRD

PIC X(8).

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…

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

(forma

completa a instructiunii DB2 , Oracle

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.

<