Download pdf - COBOL ROMANA

Transcript
  • Page 1 of 92

    Suport Curs de programare COBOL Autor : Ioan Pogangeanu

    Firma Kepler-Rominfo Bucuresti Toate drepturile privind multiplicarea , fotocopierea , distribuirea sau publicarea unor parti din acest curs, rezervate firmei Kepler-Rominfo Bucuresti, oricare din actiunile mai sus amintite, fiind permise doar cu acordul scris al firmei.

  • Page 2 of 92

    Cuprins

    1. Introducere n COBOL.................................................................................................. 5

    Ce este limbajul Cobol? ...................................................................................................5

    Avantaje Cobol versus alte limbaje de manipulare date......................................................6

    Caracteristicile generale ale limbajului Cobol ...................................................................7

    2. Structura generala a programelor COBOL ........................................................................ 7

    Setul de caractere ............................................................................................................7

    Operatori relationali .........................................................................................................8

    Structuri ierarhice ............................................................................................................9

    Formate de scriere cod Cobol.........................................................................................10

    Diviziunile unui program Cobol.......................................................................................11

    3. Declararea datelor n COBOL ..................................................................................... 14

    Categorii principale de date............................................................................................14 Clauza VALUE ............................................................................................................................. 14 Clauza OCCURS.......................................................................................................................... 14 Clauza REDEFINES ..................................................................................................................... 15 clauza RENAMES ........................................................................................................................ 15 Numerele de nivel......................................................................................................................... 15

    Tipuri de variabile ..........................................................................................................16 Alfabetice..................................................................................................................................... 16 Alfanumerice ................................................................................................................................ 16 Numerice ..................................................................................................................................... 16

    Clauza NEXT pentru constante utilizator .................................................................................... 16 Daca avem o descriere de forma urmatoare:........................................................................................ 16 [USAGE IS DISPLAY] .............................................................................................................. 17 [USAGE IS] COMPUTATIONAL ................................................................................................ 17 [USAGE IS] INDEX .................................................................................................................. 18 [USAGE] IS POINTER ............................................................................................................. 18 [USAGE] IS PROCEDURE POINTER ........................................................................................ 19 Tipuri de date definite de utilizator, clauza TYPEDEF .................................................................. 19

    Formate de editare numerice ..........................................................................................20

    Literali...........................................................................................................................21

    Constante figurative.......................................................................................................22

    4. Fisiere secventiale ..................................................................................................... 22

    Declararea fisierelor .......................................................................................................22

    Fraza SELECT pentru fisiere secventiale .........................................................................22

    Forma generala rubrica FD (File Description), cu principalele clauze: ...............................23

    Instructiuni utilizare fisiere .............................................................................................24 Instructiunea OPEN ...................................................................................................................... 24 Instructiunea READ secvential ....................................................................................................... 24 Instructiunea WRITE secvential ..................................................................................................... 25

  • Page 3 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 4 of 92

    INPUT-PROCEDURE ......................................................................................................42

    Instructiunea RELEASE de scriere in sort........................................................................42

    OUTPUT-PROCEDURE ...................................................................................................42

    Instructiunea RETURN de citire din sort ..........................................................................42

    9. Interclasare fisiere ..................................................................................................... 43

    Consideratii generale .....................................................................................................43

    Instructiunea MERGE .....................................................................................................43

    10. Subprograme, apelare, parametrii .......................................................................... 43

    Consideratii generale .....................................................................................................44

    Forma generala instructiune CALL subprogram: .............................................................44

    Exemplu apelare subprogram din programul principal : ...................................................45

    Clauza IS INITIAL ......................................................................................................45

    Instructiunea CANCEL ...................................................................................................45

    Instructiunea EXIT PROGRAM .................................................................................46

    Instructiunea GOBACK ..................................................................................................46

    Clauza IS COMMON...................................................................................................46

    Exemplu apelare programme incluse ..............................................................................46

    Clauza IS GLOBAL .....................................................................................................47

    Clauza IS EXTERNAL ................................................................................................47

    Puncte de intrare intr-un subprogram - Entry points ........................................................47 Instructiunea ENTRY .................................................................................................................... 48

    Necesitatea utilizarii subprogramelor ..............................................................................49

    11. Functii intrinseci Built-in functions...................................................................... 50

    Tipuri de functii in Cobol ................................................................................................50

    Forma generala de apelare a unei functii Cobol ...............................................................50

    Tabelul tuturor functiilor Cobol.......................................................................................50

    12. PROCEDURE DIVISION, comenzi principale .......................................................... 53

    Instructiuni grupate pe categorii .....................................................................................53

    Instructiuni aritmetice ....................................................................................................56 Instructiunea de adunare ADD ....................................................................................................... 56 Instructiunea de scadere SUBTRACT............................................................................................. 58 Instructiunea de inmultire MULTIPLAY ........................................................................................... 59 Instructiunea de impartie DIVIDE................................................................................................... 60 Instructiunea COMPUTE ............................................................................................................... 62

    Instructiuni de intrare-iesire , INPUT-OUTPUT..................................................................62 Instructiunea DISPLAY................................................................................................................. 62 Instructiunea ACCEPT ................................................................................................................. 63

    Instructiuni activate la compilare - Compiler-directing Statements ..................................64

  • Page 5 of 92

    Instructiunea COPY ...................................................................................................................... 64

    Manipulari de date - Data Movement................................................................................65 Instructiunea MOVE...................................................................................................................... 65 Instructiunea SET ......................................................................................................................... 66 Instructiunea INSPECT ................................................................................................................. 67 Instructiunea STRING .................................................................................................................. 69 Instructiunea UNSTRING ............................................................................................................. 70 Instructiunea INITIALIZE ............................................................................................................... 72

    Instructiuni conditionale.................................................................................................73 Instructiunea IF ............................................................................................................................ 73 Instructiunea EVALUATE .............................................................................................................. 73 Instructiunea PERFORM ............................................................................................................... 76 Instructiunea SORT pentru matrici ............................................................................................... 78 Instructiunea SEARCH.................................................................................................................. 79

    SEARCH-ul secvential ............................................................................................................. 79 SEARCH-ul ALL, sau BINAR .................................................................................................... 81

    Instructiuni fara effect - Null Operation............................................................................83 Instructiune EXIT .......................................................................................................................... 83 Instructiunea CONTINUE .............................................................................................................. 84

    Testarea conditiei de clasa .............................................................................................84 IS [NOT] NUMERIC, ALFABETIC................................................................................................... 84

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

    13. Conectare din COBOL la o baza de date................................................................. 86

    Instructiuni conectare ....................................................................................................86

    Variabila de conectare SQLCA la o baza de date .............................................................87

    Directiva compilare ordine Sql si testare instructiuni Sql.................................................88

    Definire, deschidere,citire, inchidere cursor Sql in Cobol .................................................89

    Gestionarea indicilor pe baza de date..............................................................................90

    Tratarea erorilor in lucrul cu o baza de date.....................................................................90

    Comenzi de baza in Cobol-Microfocus ............................................................................91

    14. Registri speciali Special registers ....................................................................... 91

    1. Introducere n COBOL Ce este limbajul Cobol?

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

  • Page 6 of 92

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

  • Page 7 of 92

    Caracteristicile generale ale limbajului Cobol Cobolul este un limbaj simplu fara functii si tipuri de date definite de utilizator, dar suplu in acelasi timp , in sensul ca reuseste sa raspunda oricaror cerinte de structuri de date de business si algoritmi de calcul oricat de complicati. Initial Cobolul a fost gandit ca un limbaj care sa fie inteles si de neprogramatori. Astfel o serie intreaga de instructiuni folosesc sintaxa limbajului vorbit din Engleza, cum ar fi ADD, SUBSTRACT, DIVIDE, MULTIPLAY, PERFORM, MOVE etc.. Ca o alternativa stiintifica la operatiile de calcul aritmetic de mai sus (primele 4) exista si instructiunea COMPUTE Variabila = Expresie aritmetica Una din principalele caracteristici ale limbajului este portabilitatea acestuia. Astfel au fost dezvoltate compilatoare de cobol pentru o gama foarte larga de masini si sisteme de operare ca Windouws, Unix, AS/400, DOS, OS2, VSE,VMS etc.. Mentenabilitatea programului se face intr-un mod facil, deoarece toate referirile externe la drivere, fisiere , simbol monetar sau punct zecimal , vor fi clar definite in diviziunea de mediu (ENVIRONMENT DIVISION). Astfel cand un program Cobol este portat pe o alta platforma hard, sau alta regiune geografica, cu alte simboluri monetare etc.., programatorul stie datorita structurii bine definite a Cobolului ca nu trebuie sa modifice programul decat in diviziunea mai sus amintita, si astfel orice portare se face rapid si eficient. De asemenea partea de procedura a unui program poate fi foarte bine structurata prin apeluri succesive de paragrafe sau sectiuni, astfel incat scheletul unui program de cateva mii de linii sa incapa in primele 100-200 de linii, astfel incat imaginea de ansamblu a algoritmului programului sa poata fi observata foarte usor si la fel de usor sa se poata interveni in cazul unor modificari sau erori de program. 2. Structura generala a programelor COBOL Setul de caractere La baza tutror instructiunilor si frazelor cobol sta urmatorul set de caractere : 0 to 9 Digits A to Z Uppercase letters a to z Lowercase letters Space + Plus sign - Minus sign or hyphen

    0 la 9 Numerele A la Z Litere mari a la z Litere mici

  • Page 8 of 92

    Spatiu + Semnul plus - Semnul minus sau liniuta de unire * Asterisc / Slash = Semnul egal $ Semnul Dollar . Punctul ~ Punctul zecimal , Virgula sau punctul zecimal ; Punct si virgula " Ghilimele Apostrof ( Paranteza stanga ) Paranteza dreapta > Simbolul mai mare decat < Simbolul mai mic decat

    cu precizarea ca numele de variabile incep cu o litera si sa fie diferit de orice cuvant rezervat cobol. Operatori relationali Intre variabilele numerice , sau variabila numerica cu literal numeric, sau chiar pentru variabile\si literali alfanumerici, sau de tip index se pot face o serie intreaga de comparatii, detaliate in tabelul de mai jos, in care apare atat expresia matematica cunoscuta etc..,cat si fraza cobol care poate fi folosita la astfel de comparatii. De asemenea avem echivalenta intre urmatoarele fraze cobol :

    Mai jos avem tabelul cu toti operatorii relaionali, atat in forma matematica cat si fraza cobol corespunzatoare :

  • Page 9 of 92

    Structuri ierarhice

  • Page 10 of 92

    Orice program Cobol este conceput ca o structura ierarhica formata din urmatoarele elemente : Diviziuni Sectiuni Paragrafe Fraze Instructiuni Diviziunile contin sectiuni, sectiunile contin paragraphe formate din una sau mai multe fraze, care la randul lor sant formate din una sau mai multe instructiuni. Fiecare din primele trei structuri ierarhice sant niste blocuri de cod care incep cu numele structurii urmat de cuvantul cheie DIVISION respectiv SECTION (pentru primele doua) si doar numele pentru paragraph. Sfarsitul oricareia din cele trei structuri ierarhice este marcat de numele structurii urmatoare de acelasi nivel. Frazele sant instructiuni cumplexe formate din inlantuirea mai multor instructiuni elementare si care la sfarsit pot contine punctul de sfarsit de propozitie (asemanator cu regula din limba vorbita).Practic in loc de punct este mult mai eficient si lipsit de riscuri sa se foloseasca cuvantul cheie END-nume-instructiune-complexa(dupa care poate urma si punctul in situatia obligatorie de mai jos), care este mult mai lizibil si fara alte riscuri de erori de programare. Punctul este insa absolut necesar inaintea oricareia din primele trei structuri de program precum si la sfarsitul oricarei instructiuni de descriere de date. Formate de scriere cod Cobol Exista un format fix folosit de la inceputurile Cobolului si unul free disponibil in Net_Expres.Vom explicita inatai formatul fix utilizat in majoritatea aplicatiilor. Coloanele 1-6 sant rezervate pt numere de secventa sau comentarii de modificare Coloana 7 este o coloana indicator astfel :

    * semnifica o linie de comentariu - semnifica o linie de continuare a unui literal $ directiva de compilare

    Coloanele 8-11 Aria A Se scriu diviziunile, sectiunile,paragraphele si numerele de Nivel. Ele pot fiscrise si in zona urmatoare B, dar de regula se gasesc in aceasta prima zona Coloanele 12-72 Aria B In aceasta zona se scriu obligatoriu instructiunile executabile Coloanele 73-80 tot ce este scris in aceasta zona este considerat comentariu

  • Page 11 of 92

    Formatul FREE, aparut mai recent, incepe din coloana 1 (care corespunde coloanei 7 din formatul fix, doar ca aici nu mai avem - pentru continuare de literar), si fara sa mai existe Zona A sau Zona B. Diviziunile unui program Cobol

    Ca structura, un program Cobol este impartit in patru mari diviziuni fixe, dar nu si obligatorii toate, fiecare din ele furnizand diverse informatii : [IDENTIFICATION DIVISION.] Este diviziunea in care se specifica numele programului si autorul ,data scrierii programului, a compilarii,sau dupa numele programului (in cazul suprogramelor) se poate specifica IS COMMON, INITIAL sau EXTERNAL, al caror inteles va fi explicat la capitolul suprograme. Exemplu inceput de program : IDENTIFICATION DIVISION. PROGRAM-ID. CFM615. AUTHOR. CVA-KEPLER. DATE-WRITTEN. MAI 2004. Tot la nivelul acestei prime diviziuni, mai pot aparea rubrica SECURITY sau REMARKS, urmate de specificatii corespunzatoare, dar pe care programul le ia tot ca pe comentarii. Numele programului, care urmeaza dupa PROGRAM-ID., este nu doar cu titlu de comentariu, ci va fi folosit efectiv de catre LINK-erul de suprograme Cobol, la apelul unei instructiuni CALL, care realizeaza apelul de subprogram. [ENVIRONMENT DIVISION. ] Dupa cum sugereaza si numele ei, este diviziunea in care este descris mediul de lucru al programului, fisierele accesate de program, cu numele lor si tipul fiecarui fisier.Avem de-a face aici cu doua mari sectiuni : [CONFIGURATION SECTION.] [SOURCE-COMPUTER. nume.] [OBJECT-COMPUTER. nume.] [SPECIALS-NAMES. Nume-1,..nume-n.] (Simbol monetar, punct zecimal,etc)

  • Page 12 of 92

    [INPUTOUTPU SECTION.] [FILE-CONTROL. Intrari file-control.] - Fisiere intrare sau iesire [I-O-CONTROL.intrari input-output.] - Puncte de reluare, zone de memorie partajabile etc.. De remarcat la asignarea numelor pentru fisierele de lucru, aceste nume pot fi chiar cele reale cu sau fara calea catre fisierul de pe device, sau pot fi numele unor variabile in care s-au incarcat in prealabil aceste nume reale. [DATA DIVISION.] Este diviziunea in care sant descrise toate varibilele de lucru din program, precum si structurile de fisiere cu descrierea campurilor aferente. In functie de versiunea de cobol folosita pot aparea in aceasta deviziune sectiuni mai multe sau mai putine.Vom enumera cateva din cele mai des utilizate corespunzatoare versiunii de cobol ANS85 : [FILE-SECTION.] Contine rubricile FD (File Description) aferente structurii de date a fisierelor accesate in program [WORKING-STORAGESECTION.] - descrise toate varibilele de lucru din program [LINKAGE-SECTION] Contine variabilele transmise la apelul de subprograme [REPORT-SECTION] Cuprinde descrierea randurilor unui raport, in cazul generarii raportului cu instructiunea GENERATE REPORT PROCEDURE DIVISION. Este diviziunea obligatorie in orice program, ea continand algoritmul efectiv al programului , compus din toate instructiunile executabile, care realizeaza scopul programului. Ea poate contine sau nu sectiuni definite cu nume date de programator, in cadrul sectiunilor aflandu-se sau nu paragraphele, la fel denumite de catre programator si obligatoriu una sau mai multe instructiuni executabile. De regula ultima instructiune din program este STOP RUN, dar aceasta poate fi inlocuita si cu END-Nume-Program sau si aceasta din urma poate fi omisa, programul oprindu-se automat dupa executarea ultimei instructiuni (situatie intalnita insa mai rar in practica, pentru ca de regula programul poate fi oprit pe mai multe

  • Page 13 of 92

    ramuri, caz in care dupa STOP RUN mai exista si alte paragraphe sau sectiuni de program. Exemplu de program minimal : PROCEDURE DIVISION. DISPLAY ' Hello world' Executia acestui program va determina afisarea pe ecran a mesajului : Hello world Este bine insa ca orice program Cobol sa aiba ID DIVISION urmata de Program-id. Nume-program. fiindca fara acest Nume-program, programul de fata nu va putea fi legat (apelat) de un alt program, daca va fi nevoie de acest lucru. Mai jos apare un exemplu generic de program Cobol: Identification Division. PROGRAM-ID. Nnume program. AUTHOR. Ionescu A. Environment Division. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT AX-FICHIER ASSIGN UT-S-AX. SELECT FPARAM ASSIGN TO PARAMDAT ORGANIZATION line SEQUENTIAL FILE STATUS FILE-STAT-P. Data Division. FILE SECTION. FD AX-FICHIER . 01 REC-AX PIC X(66). FD FPARAM RECORD 6 RECORDING F. 01 ENR-PARAM. 05 PROC-FICHIER PIC 999. 05 PROC-CMR PIC 999. WORKING-STORAGE SECTION. 01 FILE-STAT-P PIC XX. 88 OK-TRAIT-P VALUE '00'. 88 FIN-FPARAM VALUE '10'. Procedure Division. Deschidere fisiere, cursoare, prelucrari date, afisari etc.. STOP RUN.->optional, dar e bun ca evidentiaza sf programului

  • Page 14 of 92

    3. Declararea datelor n COBOL

    Categorii principale de date Exsta trei mari categorii de date in Cobol si anume: Variabile Literali Constante figurative Fiecare din datele de mai sus va fi descris in sectiunea corspunzatoare, in functie de rolul pe care-l indeplineste in cadrul procedurii programului. Forma generala de descriere a unei date este : Numar-nivel nume-data [Sablon-descrire] [Clauza]. Ex : 01 rand-imprimanata. 05 cod-produs PIC 9(5). 05 denumire-produs PIC X(25) OCCURS 5. 05 val-manopera PIC Z(3)9.99 VALUE ZERO. Clauza VALUE Are forma generala : VALUE IS literal Cu ajutorul ei se atribue o valoare unei constante, sau se initializeaza o variabila din WORKING, sau se atribuie o valoare unui nume de conditie (nivel 88).

    Clauza OCCURS care apare mai sus defineste un vector cu 5 pozitii, fiecare pozitie avand lungimea de 25. Are urmatoarea forma generala : OCCURS FROM Intreg-1 TO Intreg-2 DEPENDING ON Nume-Variabila

    Unde Intreg-1 este dimensiunea minima a vectorului definit de OCCURS, Intreg-2 dimensiunea maxima, iar DEPENDING ON Nume-Variabila specifica dimensiunea reala a tabloului la momentul executiei, in functie de numarul intreg continut in Nume-Variabila.

  • Page 15 of 92

    Clauza REDEFINES redefineste o zona de memorie cu o anumita structura initiala, intr-o zona de memorie, aceeiasi de fapt dar cu alta structura. De exemplu zona de memorie rand-imprimanata descrisa mai sus o putem redefini astfel : 01 rand-imp2 redefines rand-imprimanta pic x(13) occurs 10. Deci obligatoriu cele doua zone trebuie sa aiba aceeasi lungime, pentru ca de fapt este o singura zona de memorie dar cu doua structuri diferite.

    clauza RENAMES

    Practic apeleaza sub un alt nume o zona de memorie de la campul-1 la campul-n, adica :

    General Format 66 data-name-1 RENAMES data-name-2 THROUGH data-name-3

    Numerele de nivel Pot avea urmatoarele valori:

    01-49 pentru variabile simple sau de grup 66 pentru variabile care utilizeaza clauza RENAMES

    Clauza renames este surclasata cu succes de adresarea mult mai directa:

    data1(3:5) - Selecteaza din pozitia 3 urmatorii 5 octeti din data1 sau data1(3) Selecteaza din pozitia 3 toate caracterele ramase

    77 numai pentru variabile simple Ex : 77 valoare pic S9(7)V99 comp. 78 pentru constante definite de utilizator Ex : 78 temp-max value 39. deci fara sablon de descriere Ca valoare poate lua si un literal sau chiar o expresie aritmetica sau

  • Page 16 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 17 of 92

    Se observa ca x2 redefineste de fapt doar primul octet al lui x1, iar valoarea constantei next-offset va puncta catre valoarea celui de aldoilea octet al lui x1 si nu catre primul octet al lui x3. De asemenea pot aparea confuzii la definirile cu occurs:

    Unde offset-a puncteaza catre valoarea primului element elem in timp ce offset-b puncteaza catre valoarea celui de al doilea element elem si nu catre primul octet din afer-tabl. [USAGE IS DISPLAY] Este clauza implicita la tipul numeric si semnifica faptul ca fiecare cifra a valorii variabilei este in format zecimal despachetat, adica corespunzator formatului intern de reprezentare a masinii respective (ASCII, EBCDIC, BCD- Binary Code Decimal pentru COMP-3 etc). Din pacate aceasta clauza implicita pentru formatul numeric este nerecomandata pentru ca de regula cu datele de tip numeric se efectueaza calcule aritmetice, care presupun mai intai trecerea din acest format in formatul binar de reprezentare a numerelor, efectuarea calculelor si apoi reconvertirea rezultatului in formatul initial. Datele in format zecimal despachetat (sau DISPLAY) ocupa : 1 cifra 1 octet [USAGE IS] COMPUTATIONAL De aceea pentru formatul numeric se va folosi clauza COMPUTATIONAL, sau mai pe scurt COMP , sau BINARY sau COMP-4(in versiunile mai noi de Cobol) Exemplu : 77 NR-ORDINE PIC S9(5) COMP. S-ul din fata lui 9 specifica faptul ca numarul respectiv poate avea si semn.

  • Page 18 of 92

    Datele in format binar (sau COMP), ocupa memorie astfel : 1-4 cifre 2 octeti 5-9 cifre 4 octeti 10-18 cifre 8 octeti De remarcat ca semnul sau punctul zecimal nu ocupa spatiu suplimentar in nici un format. Putem avea COMP-1 sau COMP-2 pentru numere mari in virgula mobila in simpla sau dubla precizie. De remarcat ca pentru aceste doua formate (spre deosebire de toate celelalte) nu mai este necesar nici un sablon cu PIC, deoarece sistemul aloca automat 4 bytes pentru comp-1 si 8 bytes pentru comp-2, ex :

    77 nr-intrari comp-1. 01 valoare comp-2.

    COMP-3 este formatul zecimal impachetat sau binary-coded-decimal (BCD), care va ocupa ca lungime jumatate din partea intreaga a numarului de cifre plus 1, fiecare cifra fiind memorata pe jumatate de octet. Mai exista chiar si COMP-5 (pentru valori cu semn) si COMP-X(pentru valori fara semn) care este formatul binar nativ al masinii respective, ideal ca viteza pentru operatiile aritmetice, dar care din pacate nu poate fi folosit la descrierea datelor din fisierele externe. Masurarea exacta a dimensiunii campurilor este necesara in cazul in care dorim sa redefinim o anumita zona de memorie, care poate contine initial campuri numerice impachetate sau binare. [USAGE IS] INDEX Eeste un tip aparte de variabila numerica, fara clauza PICTURE, este folosit la indexarea vectorilor, pentru a face posibila utilizarea instructiunii SEARCH, de cautare intr-un vector si este gestionat automat de cobol. Variabilele de tip index pot fi setate doar cu instructiunea SET, atribuire de valori sau incrementari (Up, Down). O variabila index nu poate fi afisata cu DISPLAY, sau mutate cu MOVE intr-o alta variabila. Se poate atribui valoarea aferenta unei variabile index unei alte variable tot cu instructiune SET. Ex: SET var-index to var-obisnuita unde var-obisnuita va fi numerica de lungimea maxima a vectorului asociat variabilei index. [USAGE] IS POINTER

  • Page 19 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 20 of 92

    In Cobol, ca si in multe alte limbje, putem defini tipuri particulare de date ca in exemplul de mai jos cu ajutorul clauzei TYPEDEF :

    prin care am definit astfel noile tipuri de date struct-1 si USHORT, pe care le putem folosi apoi in descrierea unor alte variabile astfel:

    Care structura de date este echivalenta cu urmatoarea descriere:

    Formate de editare numerice Corespunzator acestor formate numerice de reprezentare interna, exista mai multe formate de reprezentare externa (pe ecran sau la imprimanta). - Insertia simpla, adica caracterele ,B 0 /

    , are rol de separator de mii Ex : 01 valoare pic 999,999,999 Adica numarul 123456789 va apare 123,456,789 B introduce un blank in pozitia respectiva Ex : 01 val pic 999B99 adica numarul 12345 va apare 123 45 0 introduce cifra 0 Ex : 77 val pic 999099 adica numarul 12345 va apare 123045

    / introduce un / pe pozitia respectiva Ex : 01 data-contract pic 99/99/9999. Adica data 01032010 va fi afisata 01/03/2010 - Insertia speciala, contine doar punctul zecimal .

  • Page 21 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 22 of 92

    Ex literali numerici : 123 sau 123.45 sau -1234 Ex literali alphanumerici : 123 sau +123$ sau abc123

    Constante figurative Sant niste literali speciali cu valori precise si care spre deosebire de literalii obisnuiti in momentul in care sant atribuiti unei variabile incarca variabila respectiva cu acea constanta figurativa pe toata lungimea variabilei. Astfel in Cobol exista urmatoarele constante figurative : SPACE sau SPACES incarca cu spatii variabila de atribuire ZERO , ZEROS sau ZEROES incarca cu zerouri variabila de atribuire HIGH-VALUE sau HIGH-VALUES incarca variabila de atribuire cu valoarea maxima Posibila LOW-VALUE sau LOW-VALUES incarca variabila de atribuire cu valoarea minima Posibila ALL urmat de un literal - incarca variabila de atribuire cu valoarea literalului pe toata lungimea variabilei, practic transforma orice literal intr-o constanta figurativa.

    4. Fisiere secventiale

    Declararea fisierelor

    Orice fisier extern folosit intr-un program Cobol, trebuie declarat mai intai in paragraphul FILE-CONTROL din sectiunea INPU-OUTPUT SECTION din cadrul diviziunii ENVIRONMENT DIVISION, prin: Fraza SELECT pentru fisiere secventiale

    FileName este numele variabilei din programul Cobol, asociata fisierului

  • Page 23 of 92

    LINE specifica faptul ca dupa fiecare inregistrare din fisier exista un carriage-return urmat de un line-feed character, lucru specific fisierelor de tip text obtinute din editoarele obisnuite. RECORD in acest caz fisierul se prezinta ca o insiruire continua de inregistrari, dar faptul ca se cunoaste lungimea inregistrarii, permite separarea acestora. In exemplul de mai jos fraza SELECT face asocierea dintre numele din program al fisierului (FisStudenti) si numele de pe suportul extern(STUDENTI.DAT), se specifica apoi organizarea (LINE SEQUENTIAL)si eventual se asociaza si variabila de status de fisier (FILE-STAT-P), pe care o putem testa dupa fiecare operatiune executata asupra fisierului (deschidere fisier, citire, scriere, inchidere fisier), si astfel sa putem trata eventualele erori care se impun a fi tratate in mod special. Pentru acelasi fisier declarat in select , exista obligatoriu in DATA DIVISION / FILE SECTION si o rubrica FD sau SD sau RD, dupa cum avem de a face cu un fisier de date obisnuit, sau unul de sortare (SD), sau unul de listare dar care va fi generat cu instructiunea GENERATE REPORT (pt RD). Mai jos avem : Forma generala rubrica FD (File Description), cu principalele clauze:

    Se observa ca in afara de cuvantul cheie FD urmat de numele fisierului din programul Cobol, restul clauzelor sant optionale, ele oferind insa informatii necesare,

  • Page 24 of 92

    mai ales in cazul fisierelor cu structura variabila, legate de limitele intre care se afla lungimea inregistrarii. Data-name-7 , Data-name-8,...reprezinta structurile de date pe tipuri de inregistrari, aferente fisierului din clauza FD, care trebuie sa apra imediat dupa clauza FD. [info] specifica o clauza optionala, iar daca clauza respectiva este incadrata si intr-un chenar, atunci inseamna ca ea este obligatorie pentru varianta de Cobol-74, dar incepand de la varianta specificata in cerculetul oval de langa patrat, ea a devenit optionala. Formate generale asemanatoare exista pentru SD sau RD Instructiuni utilizare fisiere Am vazut in exemplele de mai sus ca prima operatiune executata asupra unui fisier este cea de schidere cu forma generala : Instructiunea OPEN

    INPUT specifica faptul ca fisierul este deschis in citire si este permisa doar citirea inregistrarilor inlantuite una cate una in acces secvential. Daca fisierul nu exista pe support va generata o eroare . OUTPUT fisierul este deschis in iesire , drept care este permisa doar scrierea in acesta. Daca fisierul nu exista pe support el va fi creat automat. I-O - fisierul este deschis in mod input-output si deci sant premise atat citirea cat si scrierea, precum si stergerea DELETE sau rescrierea REWRITE. Acest mod de deschidere este permis numai pentru fisierele selective sau indexate. EXTEND este modul de deschidere a unui fisier in mod output, cu pozitionarea pointerului de scriere dupa ultima inregistrare din fisier si permite astfel inserarea de noi inregistrari la sfarsitul acestuia. A doua operatiune executata asupra unui fisier este cea de citire secventiala cu forma : Instructiunea READ secvential

  • Page 25 of 92

    In loc de END-READ putem avea . (punctul) , dar este de preferat aceasta instructiune terminala, ca de altfel pentru oricare alta instructiune, pentru ca este mult mai lizibila si face mai mica posibilitatea de a gresi la scrierea programului. Cand scriem ntr-un fisier secvential utilizam instructiunea write cu urmatorul format : Instructiunea WRITE secvential

  • Page 26 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 27 of 92

    ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FisStudenti ASSIGN TO STUDENTI.DAT ORGANIZATION IS LINE SEQUENTIAL FILE STATUS FILE-STAT-P. DATA DIVISION. FILE SECTION. FD FisStudenti. 01 Rec. 02 StudentId PIC 9(7). 02 NumeStudent. 03 PreNume PIC X(8). 03 Initiala PIC XX. 03 Nume PIC X(8). WORKING-STORAGE SECTION. 01 FILE-STAT-P PIC XX. 88 OK-TRAIT-P VALUE '00'. 88 FIN-FPARAM VALUE '10'.

    Declarative Este zona de procedura , prima in cazul in care exista in program, in care sant tratate erorile asupra fisierelor, sau sant specificate operatiuni specifice de efectuat inaintea unui grup report. Zona incepe cu cuvantul cheie DECLARATIVES, contine una sau mai multe sectiuni specifica fiecarei clause USE si se incheie cu END- DECLARATIVES. In cazul tratarii erorilor la operatiile cu fisiere, fiecarui fisier ii va corspunde cate o sectiune si o clauza USE cu urmatoarea forma generala:

    Aceasta forma este specifica tratarii erorilor la operatiile pe fisiere, dar am vazut la generarea automata a rapoartelor ca mai exista o forma specifica pentru USE si anume:

    Caz in care se pot introduce diverse calcule prealabile listarii unui grup.

  • Page 28 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 29 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 30 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 31 of 92

    ASSIGN TO var-fis-student si in cast caz var-fis-student este o variabila de program de tip alphanumeric in care va fi incarcata denumirea reala a fisierului de pe disc, fie cu o instructiune ACCEPT fie in alt mod (camp dintr-un fisier etc..). La un fisier pe imprimanta unde implicit am mai multe tipuri de randuri (cu structuri diferite), acestea vor fi descrise in WORKING-STORAGE SECTION si vor fi mutate pe rand intr-un rand de imprimanta cu lungimea maxima si abia dupa aceea va fi scris randul in fisierul de imprimanta. Astfel forma generala de scriere a unui rand la imprimanta este :

    5. Editorul de rapoarte Cobol Generalitati Vom desemna prin notiunea de raport o situatie finala care se afiseaza la imprimanta sau se inregistreaza pe suport magnetic in vederea imprimarii ulterioare. Intrarile raportului sunt in general date provenite din fisiere de intrare sau din baza de date. Partea semnificativa a unui raport consta din randurile de detaiu. Pentru realizarea mai multor grade de total, se stabilesc caracteristici de grupare (caracteristici de control): un camp din articol care poate lua valori comune mai multor inregistrari. Articolele cu aceeasi valoare pe caracteristicile de grupare formeaza o asa numita grupa de control. Structura generala a unui raport Editorul de rapoarte COBOL admite urmatoarele grupe de editare: - REPORT HEADING: antetul raportului; apare o singura data, la inceputul raportului; poate contine titlul sau alte informatii de identificare

  • Page 32 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 33 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 34 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 35 of 92

    sectiunea DECLARATIVES).De exemplu putem suprima imprimarea grupurilor de control cu mai mult de 3 linii.

    Instructiunea USE pentru report

    In cazul in care inaintea unui anumit grup de listare e nevoie de anumite operatiuni particulare care nu sant executate de report, acestea pot fi specificate in sectiunea de declarative unde instructiunea USE are urmatoarea forma :

    iar operatiile specifice necesare, vor fi scrise in sectiunea aferenta clauzei USE. Descrierea detaliata a sectiunii de declarative am vazut-o in urma cu cateva capitole in alineatul DECLARATIVE.

    Registrii speciali report : LINE-COUNTER si PAGE-COUNTER

    Primul contorizeaza numarul de linie in cadrul paginii, iar al doilea numarul de pagina in cadrul raportului. Ei sant actualizati automat in cadrul reportului si pot fi folositi in orice moment in vederea afisarii in diverse grupuri ale reportului, ca sursa de date.

    Obs: amandoi registrii pot fi modificati prin instructiuni cobol in cadrul procedurii.

    6. Fisiere selective Caracteristici generale

    Aceste fisiere rezolva problemele de acces direct la inregistrari urmata de modificarea sau stergerea acestora precum si inserarea directa de noi inregistrari. Accesul la inregistrarile unui fisier selectiv se poate face atat secvential, prin specificarea clauzei ACCESS MODE is DYNAMIC sau SEQUENTIAL, sau in mod direct prin specificarea in clauza SELECT a tipului de acces RANDOM sau DYNAMIC. Clauza select Forma generala a clauzei SELECT pentru fisiere selective este :

  • Page 36 of 92

    OPTIONAL specifica faptul ca fisierul trebuie sa existe fizic pe driver-ul specificat, altfel este generata o eroare. RelKey este cheia relativa, care poate fi un camp din working sau din fisier SEQUENTIAL accesul este secvential RANDOM accesul este permis numai direct DYNAMIC acces atat direct cat si secvential Moduri de acces Accesul direct la o inregistrare se realizeaza pe baza unei chei relative de la 1 la n, unde n este numarul maxim de inregistrari, chia de acces fiind deci numerica. Pentru citirea secventiala in cazurile cand accesul este SEQUENTIAL, formatul de citire este identic cu cel de la fisiere secventiale La citirea secventiala si accesul DYNAMIC pe un fisier selectiv se foloseste urmatoare forma de : READ secvential pe fisier selectiv pentru acces dinamic :

    Se observa ca singura diferenta fata de READ-ul secvential este clauza NEXT RECORD. . Daca citirea se face in mod direct pentru accesul RANDOM sau DYNAMIC, se incarca mai intai cheia relativa cu valoarea cheii pe care dorim s-o citim si se executa instructiunea: READ pentru acces direct

  • Page 37 of 92

    Daca nu este gasita cheia , se va executa instructiunea de dupa INVALID KEY. Instructiunea START Se poate folosi numai daca accesul este RANDOM sau DYNAMIC si ea practic potitioneaza pointerul de citire inaintea inregistrarii aferente cheii respective si are urmatorul format :

    Instructiunea de dupa INVALID KEY este executata in cazul in care nu exista inregistrarea cu cheia relativa specificata. Daca exista , atunci se poate executa o citire secventiala si astfel inregistrarea corespunzatoare cheii relative este adusa in bufferul de modificare. In acest moment inregistrarea poate fi modificata si apoi rescrisa cu : Instructiunea REWRITE

    Practic pe INVALID KEY e un pic cam greu de iesit, pentru ca de regula trebuie mai intai sa aduc inregistrarea in bufferul de modificare, printr-o citire directa sau secventiala, operez modificarile de campuri necesare, dupa care execut REWRITE. Se poate iesi pe INVALID KEY doar printr-o eroare de programare prin modificarea campului numeric de cheie relativa si incercarea de a executa REWRITE.

  • Page 38 of 92

    Pentru a adauga o inregistrare intr-un fisier selectiv , dupa ce incarcam cheia selectiva cu valoarea aferenta, putem lansa : instructiunea WRITE cu INVALID KEY adaugare directa

    Pe INVALID KEY se poate iesi daca cheia respectiva exista deja in fisier. Pentru a putea face modificari intr-un fisier selectiv, acesta trebuie sa fie descis I-O. In acest caz putem realiza si stergerea unei inregistrari, dupa ce in prealabil am incarcat cheia relativa cu valoarea corespunzatoare inregistrarii care urmeaza a fi stearsa : instructiunea DELETE cu INVALID KEY stergere directa

    Pe INVALID KEY se iese atunci cand nu este gasita cheia incarcata in prealabil, implicit prin valoarea cheii aflata in buffer la momentul stergerii, sau explicit prin incarcarea concreta a unei valori in cheia relativa.

    7. Fisiere indexate

    Caracteristici generale Au fost practic cel mai mult folosite in practica, deoarece permit folosirea de chei alfanumerice si nu doar una singura ca la fisierele selective. Pentru fiecare cheie in parte este creat automat pe suportul de date un index, pe baza caruia se poate face accesul la date pe cheia respectiva. Exista un singur fisier .idx, care va contine toate tabelele de index asociate cheilor definite. Prima cheie trebuie sa fie unica si se numeste cheie primara, ea facand parte obligatoriu din corpul inregistrarii, in contrast cu tipul selectiv, unde putea sa nu faca parte din inregistrare, restul cheilor (de la 1-254) pot sa nu fie unice.

  • Page 39 of 92

    La fel ca orice fisier, in paragraful FILE-CONTROL vom intalni: Fraza select pentru declararea unui fisier indexat

    Clauza ALTERNATE RECORD KEY IS specifica cheia sau cheile alternative, care pot avea sau nu dubluri. Daca accesul este dynamic, este posibila citirea secventiala a fisierului indexat dupa una din cheile sale, numita si cheie de referinta. Cheia implicita este cea primara, iar daca dorim sa stabilim o alta cheie de referinta , executam o instructiune START sau READ direct, dupa care putem executa: Instructiunea READ secvential pentru acces DYNAMIC

    Daca accesul este secvential, forma de citire este aceeasi cu cea de la fisiere secventiale si evident putem parcurge fisierul doar in ordinea cheii primare. Dupa cum vedem citirea secventiala in acces dynamic seamana perfect cu cea de la fisierele selective. Instructiunile READ, WRITE, REWRITE, START si DELETE in acces direct Toate cele cinci instructiuni in acces direct, presupun mai inatai incarcarea cheii de referinta cu valoarea cheii pe care dorim s-o accesam, urmata apoi de executia instructiunii, formatul fiind acelasi ca la fisierele selective. SPLYT KEY - setare cheie fisier indexat

  • Page 40 of 92

    Daca un program contine o descriere de inregistrare de forma:

    atunci putem defini o cheie de inregistrare la modul urmator:

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

    In felul acesta putem defini chei complexe pe fisiere indexate fara a fi nevoiti sa construim efectiv structurile de campuri din inregistrare, ci doar simpla lor enumerare ca mai sus si asocierea cu cheia de inregistrare.

    8. Sortare cobol Necesitatea sortului cobol Pe diferite platforme hardware si sisteme de operare pot exista diverse utilitare cobol pentru sortare,interclasare, transformare fisier din secvential in indexat etc.. Problema este ca aceste utilitare nu sant portabile de pe o platforma pe alta, fapt care ar ridica ceva problema la migrarea unei aplicatii. Folosind insa sortul sau interclasarea Cobol problemele portarii de pe un sistem pe altul dispar, chiar daca scierea in Cobol a unui program de sortare sau interclasare (MERGE), este ceva mai laborioasa. Intr-un program de sortare vom avea un fisier de intrare in sortare, care va avea o rubrica FD corespunzatoare, un fisier de lucru (sortare) la care va corespunde rubrica SD, si un fisier de iesire normal tot cu rubrica FD. Este bine ca fisierul de iesire sa fie asignat la un fisier diferit de cel de intrare, pentru ca in cazul intreruperii programului, fisierul de intrare se poate distruge, nemaifiind posibila reluarea programului.

  • Page 41 of 92

    Forma generala a instructiunii SORT

    Clauza WITH DUPLICATES IN ORDER pastreaza ordinea initiala din fisierul de intrare pentru cheile duble. AlphabetName reprezinta un nume de alfabet definit in subrica SPECIAL-NAMES din ENVIRONMENT DIVISION, si care face referire la setul de caractere, altul decat cel implicit, ca ASCII , EBCDIC, etc.. USING specifica fisierul de intrare in sortare GIVING - specifica fisierul de iesire din sortare Exemplu sortare simpla : SORT WorkFile ON ASCENDING ProvCode DESCENDING VendNumber USING SalFile GIVING SortedSalFile.

    Instructiunea sort nu poate fi utilizata in sectiunea de DECLARATIVE, si nici in procedurile de intrare sau iesire ale unei instructiuni SORT sau MERGE. Cheia de sortare nu trebuie sa contina clauza OCCURS, sau sa fie inclusa intr-un camp cu aceasta clauza.

  • Page 42 of 92

    De remarcat in program ca deschiderea fisierului de intrare, de iesire si cel intermediar se face in mod automat, ca si citirea din cel de intrare sau intermediar de sortare, ca si scrierea in cel intermediar de sortare si cel de iesire. Exista cazuri in care dorim sa prelucram doar o parte din datele fisierului de intrare, adica sa facem o selectie pe intrare, sau oricare alta operatie inaintea sortarii propriuzise. In acest caz vom folosi sortul cu procedura de intrare : INPUT-PROCEDURE Va fi folosita in instructiunea sort sub forma INPUT-PROCEDURE is ProcName, si va inlocui fraza USING FisIntrare, unde ProcName specifica un nume de paragraph, in care se va deschide normal fisierul de intrare FisIntrare, se va citi din el si se vor face filtrari de inregistrari sau alte prelucrari, dupa care se va scrie in fisierul intermediar de sortare, inregistre cu inregistrare pe masura ce sant citite si prelucrate din fisierul de intrare. Scrierea in fisierul de sortare se face cu : Instructiunea RELEASE de scriere in sort

    RELEASE SDRecordName [FROM Identifier]

    Unde SDRecodName este numele inregistrarii fisierului de sortare.

    Mai mult, daca dorim sa prelucram si datele rezultate din sort inainte ca ele sa fie scrise in fisierul de iesire, atunci vom putea utiliza : OUTPUT-PROCEDURE Aceasta fraza OUTPUT-PROCEDURE is ProcName, va inlocui deci fraza GIVING FisIesire, iar in pargraful ProcName se va citi secvential fisierul intemediar dj sortat cu instructiunea RETURN, se vor opera filtrele sau alte operatii sau calcule cumulative pe inregistrarea citita din sort sin in final se vor scrie in fisierul de iesire, cu WRITE secvential sau indexat, in functie de natura fisierului de iesire. Instructiunea RETURN de citire din sort

    RETURN SDFileName RECORD [INTO Identifier] AT END StatementBlock END-RETURN

  • Page 43 of 92

    Se observa asemanarea perfecta cu instructiunea READ secvential dintr-un fisier secvential, cu deosebirea ca READ a fost inlocuit cu RETURN.

    De remarcat ca dintr-o forma de sort cu GIVING, n-am putea scrie direct intr-un fisier indexat sau selective, lucru perfect posibil in cazul folosirii OUTPUT-PROCEDURE.

    Exercitiu : Sa se scrie un program de sortare cu iesire intr-un fisier selectiv. 9. Interclasare fisiere Consideratii generale In practica curenta apare de multe ori necesitatea unirii mai multor fisiere mici in unul singur mai mare. Lucrul ar fi relativ simplu daca am adauga fisierele unul la sfarsitul celuilalt, dar de regula acestea pot fi intr-o anumita ordine, care se doreste a fi pastrata in fisierul final. Ca sa realizam acest lucru intr-un program cobol obisnuit, ar fi destul de laborios, trebuie deschise toate fisierele, citit cate o inregistrare din fiecare fisier, comparate cheile, apoi cheia cea mai mica se scrie in iesire si tot asain final inchise fisierele. Instructiunea MERGE realizeaza acest lucru automat : Instructiunea MERGE

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

  • Page 44 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 PAR2PARn, exact in ordinea in care apar in instructiunea CALL din programul principal si care are urmatoarea: Forma generala instructiune CALL subprogram:

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

  • Page 45 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 46 of 92

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

    si la fel ca EXIT PROGRAM preda controlul programului apelant, eventual cu transmiterea catre acesta prin intermediul clauzelor GIVING sau RETURNING, care sant echivalente, a unei valori sau adrese. Clauza IS COMMON Este folosita in cazul subprogramelor incluse intr-un program principal si permite apelul nu doar din cadrul programului principal ci si dintr-un alt subpr