Sunteți pe pagina 1din 85

Prof.univ.dr.

Nicolae Ţăndăreanu

SISTEME EXPERT
Lecţia 4
Baze de date şi spredsheeturi ı̂n Guru

2003-2004
2 N. Ţăndăreanu: Lecţia 4
N. Ţăndăreanu: Lecţia 4 3

1 Obiective

Obiectivele acestei lecţii sunt următoarele:

• ı̂nsuşirea formatelor pentru transmiterea datelor ı̂n Guru

• ı̂nsuşirea modului de a proiecta şi utiliza formele ca interfeţe


grafice utilizator pentru transmiterea datelor

• utilizarea mijloacelor grafice de vizualizare a datelor ı̂n Guru

2 Definirea schemelor de relaţii

Mediul de programare GURU oferă numeroase facilităţi cu privi-


re la gestionarea bazelor de date relaţionale:

• permite definirea schemelor de relaţii;

• permite obţinerea instanţelor de relaţii, procesarea informaţii-


lor din acestea, ı̂ntocmirea de rapoarte şi statistici pe bazele
de date;

• acceptă compatibilitatea cu alte limbaje de gestiune a bazelor


de date prin preluarea informaţiilor procesate cu acestea;

• ı̂mbină tehnicile de procesare a spredsheeturilor, bazelor de


date relaţionale şi a sistemelor expert.
4 N. Ţăndăreanu: Lecţia 4

Documentaţia GURU utilizează conceptul de tabel. Acesta este


legat de conceptele de schemă de relaţie şi instanţă a unei scheme
de relaţie.

Definirea unui tabel presupune definirea unei scheme de relaţii,


iar procesarea unui tabel ı̂nseamnă introducerea datelor, vizualiza-
rea şi actualizarea acestora.

Definirea unei scheme de relaţii ı̂nseamnă specificarea unui nu-


me simbolic care va deveni numele tabelului, asocierea unui fişier
şi specificarea structurii unui tuplu, adică definirea tipului de date
şi a lungimii fiecărei componente a tuplului.

Managementul datelor se poate realiza ı̂n principal prin două


mijloace:

− utilizând GURU interactiv;

− prin meniul Commander.

Definirea unei scheme de relaţii se realizează prin intermediul co-


menzii DEFINE. Mediul de programare GURU permite două mo-
duri de utilizare a acestei comenzi: modul interactiv şi modul unitar.

1. Modul interactiv presupune că elementele necesare defini-


rii tabelului se transmit conversaţional: numele tabelului şi
eventual numele unui fişier, iar pentru fiecare câmp al unui
N. Ţăndăreanu: Lecţia 4 5

tuplu se precizează numele câmpului, tipul şi lungimea aces-


tuia; modul interactiv se iniţiază prin tastarea comenzii:

Guru > define simb

unde simb este numele tabelului.


GURU conversează cu utilizatorul cerându-i acestuia informa-
ţii cu privire la numele fişierului asociat tabelului şi structura
câmpurilor tabelului. La ı̂ntrebarea:

Guru > FILE?

utilizatorul răspunde tastând numele unui fişier cu extensia


ITB sub care va figura tabelul; numele fişierului se include
ı̂ntre semnele duble de apostrof. Dacă utilizatorul tastează
ENTER ı̂n loc de numele fişierului atunci numele acestuia
este acelaşi cu numele tabelului, cu extensia ITB.
În continuare GURU cere structura câmpurilor din tabel:

Guru > FIELD?

Utilizatorul răspunde cu numele câmpului, tipul acestuia şi


eventual lungimea dacă nu se consideră lungimea standard a
tipului respectiv.

Putem folosi tipurile de câmpuri prezentate ı̂n Tabelul 1.


6 N. Ţăndăreanu: Lecţia 4

STR size pentru câmpuri string de dimensiune


size
NUM pentru câmpuri numerice (8 octeţi)
INT pentru câmpuri ı̂ntregi (2 octeţi)
LOGIC pentru câmpuri logice (1 octet)
BLOB pentru câmpuri BLOB

Tabelul 1: Tipuri de câmpuri

Când utilizatorul nu mai are alte câmpuri de definit, la ultima


interogare FIELD? se răspunde cu ENDDEF.

2. Modul unitar se referă la definirea unui tabel printr-o co-


mandă DEFINE completă, care are forma:

DEFINE nume WITH nume-fisier ;\


FIELD nume_a tip lungime USING format;\
FIELD nume_b tip lungime USING format;\
---------------------------------------
FIELD nume_c tip lungime USING format;\
ENDDEF

Sunt importante următoarele observaţii:

• numele fişierului, reprezentat mai sus prin nume-fisier,


N. Ţăndăreanu: Lecţia 4 7

trebuie inclus ı̂ntre semnele duble de apostrof; specifi-


carea numelui fişierului este opţională; când nu se specif-
ică numele de fişier, ı̂n locul acestuia se consideră numele
tabelului cu extensia ITB;

• specificatorul USING este opţional; când nu se foloseşte,


se consideră formatul standard (definite de anumite vari-
abile de mediu);

• după specificarea USING format se poate utiliza specifi-


caţia:

LABELED eticheta

Aceasta ne permite să introducem un comentariu care


să descrie semnificaţia câmpului respectiv. Eticheta este
un sir de caractere.

Fiecare câmp definit al tabelului are asociată o variabilă field


cu numele având următoarea structură:

nume-tabel.nume-camp

Facem de asemenea observaţia că ı̂ntreg tabelul sau numai an-


umite câmpuri pot fi criptate la citire sau/şi scriere. În acest caz
numai acei utilizatori au acces la citirea sau modificarea datelor din
tabel, care au permisiunea respectivă.
8 N. Ţăndăreanu: Lecţia 4

Utilizând instrucţiunea DEFINE programatorul defineşte struc-


tura unei ı̂nregistrări. După introducerea datelor se obţine o mul-
ţime de ı̂nregistrări. Această mulţime de informaţii, structurată pe
ı̂nregistrări, o numim instanţă a schemei de relaţii.
Sunt importante următoarele observaţii:

• Toate ı̂nregistrările unei instanţe au aceeaşi structură, pre-


cizată ı̂n instrucţiunea DEFINE. Două ı̂nregistrări diferă nu-
mai prin informaţiile pe care le conţin.

• Procesarea unei instanţe se realizează la nivelul unei ı̂nregis-


trări. Aceasta ı̂nseamnă că mai ı̂ntâi se identifică o anumită
ı̂nregistrare, apoi se accesează informaţiile din câmpurile aces-
teia. Accesarea acestora se realizează prin intermediul vari-
abilelor câmp asociate unei ı̂nregistrări.

O bază de date este o mulţime finită de instanţe de scheme de


relaţii. Informaţiile instanţelor de scheme de relaţii sunt combinate
ı̂n vederea obţinerii răspunsului la o interogare a bazei de date.

3 Procesarea tabelelor

Înainte de a utiliza un tabel, el trebuie ı̂ncărcat mai ı̂ntâi ı̂n


memorie. Încărcarea se realizează cu comanda
N. Ţăndăreanu: Lecţia 4 9

USE nume-tabel

Deseori se spune că un asemenea tabel este in use. De exemplu,


comanda

USE angajati

ı̂ncarcă ı̂n memorie tabelul angajati.


După definirea structurii unui tabel cu comanda DEFINE aces-
ta este automat incărcat ı̂n memorie. Dacă tabelul este deja ı̂ncărcat
in memorie şi se ı̂ncearcă reâncărcarea acestuia, va fi afişat un mesaj
de avertisment cu privire la faptul că tabelul se află deja ı̂ncărcat.
Un tabel rămâne ı̂n memorie până la execuţia comenzii:

FINISH nume-tabel

sau

FINISH ALL

În ultimul caz, sunt extrase din memorie toate tabelele aflate
in use. Comanda BYE ı̂nchide automat tabelele la sfârşitul unei
sesiuni de lucru.
Pentru ı̂ncărcarea ı̂n memorie a unui tabel se mai poate utiliza
comanda de ı̂ncărcare a fişierului ataşat tabelului:

USE "nume-fisier"
10 N. Ţăndăreanu: Lecţia 4

În general acest lucru se utilizează atunci când dorim o sortare


(comanda SORT) pentru a genera o versiune sortată a unui tabel
ı̂ntr-un fişier. Se presupune că extensia numelui de fişier este ITB.
Crearea câmpurilor ı̂ntr-un tabel se realizează cu comanda:

CREATE RECORD FOR nume-tabel [WITH nume-forma]


CREATE pozitie RECORD FOR nume-tabel\
[WITH nume-forma]

unde pozitie poate avea una din formele prezentate ı̂n Tabelul 2,
Tabelul 3 şi Tabelul 4.
Comanda CREATE crează ı̂nregistrări ı̂ntr-un tabel ı̂n mod
interactiv. Execuţia acestei comenzi conduce la afişarea pe ecran a
informaţiilor pe care le cere programul. Ieşirea din CREATE se re-
alizează acţionând tasta ESC. Pentru utilizarea comenzii CREATE
este necesar să fie ı̂ndeplinite următoarele condiţii:

1. Numele de tabel trebuie să existe, adică să apară ı̂n DE-
FINE.

2. Tabelul trebuie să fie in use (comanda USE).

3. Trebuie să avem dreptul de a crea ı̂nregistrări.

Subliniem faptul că prin intermediul comenzii CREATE putem


afişa numai acele câmpuri pentru care avem dreptul la scriere.
N. Ţăndăreanu: Lecţia 4 11

FIRST noua ı̂nregistrare devine prima


din tabel
LAST noua ı̂nregistrare devine ulti-
ma din tabel
recnum este o expresie numerică a
cărei valoare dă numărul
ı̂nregistrării. Dacă recnum=4
atunci este vorba de a patra
ı̂nregistrare. Dacă recnum
depăşeşte numărul de
ı̂nregistrări din tabel atunci se
va adăuga o nouă ı̂nregistrare
la sfârşitul tabelului. Dacă
recnum este negativ atunci
CREATE presupune valoarea
1.

Tabelul 2: Parametrul pozitie ı̂n comanda CREATE


12 N. Ţăndăreanu: Lecţia 4

NEXT num noua ı̂nregistrare este mem-


orată cu num poziţii după
ı̂nregistrarea curentă; dacă num
lipseşte atunci este vorba de
prima ı̂nregistrare aflată la
dreapta ı̂nregistrării curente;
dacă num + k, unde k este
numărul ı̂nregistrării curente,
depăşeşte numărul total de
ı̂nregis- trări atunci se consid-
eră ultima ı̂nregistrare
PRIOR num la fel ca la NEXT num, cu deose-
birea că se procedează cu num
poziţii ı̂nainte de ı̂nregistrarea
curentă

Tabelul 3: Parametrul pozitie ı̂n comanda CREATE


N. Ţăndăreanu: Lecţia 4 13

WITH nume-forma specifică o formă de ecran


care va fi folosită la citirea
datelor ı̂n tabel (comanda
FORM-ENDFORM). Este
necesar ca forma specificată să
fie ı̂ncărcată ı̂n memorie

Tabelul 4: Parametrul pozitie ı̂n comanda CREATE

De exemplu, comanda:

CREATE RECORD FOR angajati

poate să conducă la introducerea datelor ı̂n prima ı̂nregistrare din


tabelul angajati:

Record Number: 1
Nume: Ionescu
Stabil: true
Varsta: 25
Nroreluc: 200
Salbrut:1000000

Pentru a ı̂ncheia introducerea datelor ı̂ntr-un anumit câmp se


acţionează tasta ENTER.
14 N. Ţăndăreanu: Lecţia 4

Vizualizarea unor ı̂nregistrări din tabel se face cu comanda

BROWSE

Forma ei este:

BROWSE nume-tabel scop


BROWSE nume-tabel FOR conditii scop WITH fields
BROWSE nume-tabel WITH nume-forma

unde scop specifică ı̂nregistrarea sau ı̂nregistrările care se doresc a


fi văzute sau editate. Dacă acestea nu există atunci se semnalează
o eroare. Ultima ı̂nregistrare afişată devine ı̂nregistrarea curentă.
Valoarea parametrului scop poate fi:

CURRENT
ALL
NEXT
NEXT num
PRIOR
PRIOR num
RANGE num1, num2

Dacă nu se precizează acest parametru atunci se consideră că


valoarea acestuia este ALL. Semnificaţia valorilor specificate mai sus
este descrisă ı̂n Tabelul 5 şi Tabelul 6.
N. Ţăndăreanu: Lecţia 4 15

Facem observaţia că num poate fi o expresie numerică. Dacă


valoarea acesteia este negativă sau depăşeşte numărul maxim de
ı̂nregistrări atunci valoarea ei se consideră a fi egală cu 1. Dacă
are o valoare reală, care nu este număr ı̂ntreg, atunci se face o
trunchiere.
Referitor la entităţile FOR şi WITH facem următoarele precizări:

• FOR conditii arată că dorim să vizualizăm numai acele ı̂nre-
gistrări din scop care ı̂ndeplinesc condiţiile specificate.

• WITH fields precizează care câmpuri dorim să le operăm;


entitatea fields reprezintă o listă de câmpuri, separate prin
virgulă.

• WITH nume-forma determina afişarea ı̂nregistrărilor din tabelă


ı̂ntr-un format specificat de utilizator; forma specificată tre-
buie să fie incărcată in memorie.

Utilizarea comenzii BROWSE determină ştergerea ecranului şi


afişarea ı̂nregistrărilor solicitate. Pentru a ı̂nlocui o valoare a unui
câmp trebuie să ne deplasăm cu cursorul la acel câmp şi să tipărim
noua valoare. Pentru a părăsi modul BROWSE se acţionează tasta
ESC.
Astfel, cu ajutorul comenzii:

BROWSE angajati FOR stabil=true


16 N. Ţăndăreanu: Lecţia 4

CURRENT afişează ı̂nregistrarea curentă


ALL afişează toate ı̂nregistrările
ı̂ncepând cu prima ı̂nregistrare
NEXT afişează prima ı̂nregistrare de
după cea curentă. Dacă nu
există aceasta, atunci nu se
afişează nimic. Dacă nu există
ı̂nregistrare curentă atunci se
consideră prima ı̂nregistrare.
NEXT numr se afişează următoarele numr
ı̂nregistrări de după cea
curentă. Dacă nu există
ı̂nregistrare curentă atunci
se lucrează cu primele numr
ı̂nregistrări.
PRIOR afişează ı̂nregistrarea care pre-
cede pe cea curentă. Dacă
nu există, atunci se afişează
un mesaj. Dacă nu există
ı̂nregistrare curentă atunci se
consideră ultima ı̂nregistrare.

Tabelul 5: Parametrul scop ı̂n comanda BROWSE


N. Ţăndăreanu: Lecţia 4 17

PRIOR numr afişează numr ı̂nregistrări care


preced pe cea curentă; dacă
nu există ı̂nregistrare curentă
atunci se consideră ultimele
ı̂nregistrări.
RANGE num1,num2 afişează un număr de
ı̂nregistrări ı̂n domeniul
specificat de num1 şi num2,
inclusiv aceste valori. Dacă nu
se precizează domeniul atunci
se consideră valoarea ALL.
Când num1>num2, se consideră
vizualizarea ı̂n ordine inversă.

Tabelul 6: Parametrul scop ı̂n comanda BROWSE


18 N. Ţăndăreanu: Lecţia 4

se vizualizează acele ı̂nregistrări pentru care

angajati.stabil=true

adică ı̂nregistrările angajaţilor cu contract de muncă pe periodă


nedeterminată.
Pentru precizarea unor concepte introduse până acum vom con-
sidera programul definire.ipf de mai jos, care defineşte o schemă
de relaţie:

DEFINE tabel1 WITH "tab.itb";


FIELD unu STR 10 USING "%10a";
FIELD doi INT USING "dd";
ENDDEF

Prin secvenţa de instrucţiuni de mai sus definim :

• numele tabel1 al unui tabel,

• numele tab.itb al fişierului ataşat tabelului

• structura unei ı̂nregistrări oarecare a tabelului; ı̂n cazul de


faţă, fiecare ı̂nregistrare are două câmpuri ( primul, de tip
string şi lungime 10; al doilea de tip ı̂ntreg cu două cifre)

Vom prezenta acum efectele executării instrucţiunilor CREATE


şi BROWSE. Pentru a observa aceste efecte vom lucra ı̂n mod
conversaţional.
N. Ţăndăreanu: Lecţia 4 19

Guru> perform definire


Guru>create records

Efectul pe monitor:

Record Number: 1
UNU: __________
DOI: __

Introducem ı̂nregistrări vizualizând acest proces pe monitor:

Record Number: 1
UNU: UNU
DOI: 1

Record Number: 2
UNU: DOI
DOI: 2

Record Number: 3
UNU: __________
DOI: __

şi acţionând tasta ESC obţinem prompterul Guru

Guru>
20 N. Ţăndăreanu: Lecţia 4

Introducem comanda de vizualizare a ı̂nregistrărilor din tabel

Guru>browse

Efectul pe monitor:

Record Number: 1
UNU: UNU
DOI: 1

Record Number: 2
UNU: DOI
DOI: 2

şi obţinem ı̂n continuare prompterul Guru:

Guru>

Introducem comanda:

Guru>create next record

Pe monitor apare:

Record Number: 3
UNU: __________
DOI: __
N. Ţăndăreanu: Lecţia 4 21

Introducem două ı̂nregistrări pe care le vom identifica ulterior


prin faptul că al doilea câmp are două cifre:

Record Number: 3
UNU: TREIA
DOI: 31

Record Number: 4
UNU: PATRUA
DOI: 41

Record Number: 5
UNU: __________
DOI: __

Acţionăm tasta ESC, prin care ı̂ncheiem această etapă şi obţinem
prompterul Guru:

Guru>

Introducem comanda de vizualizare a ı̂nregistrărilor introduse


pânaă ı̂n momentul de faţă:

Guru>browse

Efectul pe monitor:
22 N. Ţăndăreanu: Lecţia 4

Record Number: 1
UNU: UNU
DOI: 1

Record Number: 2
UNU: DOI
DOI: 2

Record Number: 3
UNU: TREIA
DOI: 31

Record Number: 4
UNU: PATRUA
DOI: 41

Guru>

Introducem comanda:

Guru>create prior 2 record

Efectul pe monitor:

Record Number: 2
UNU: __________
DOI: __
N. Ţăndăreanu: Lecţia 4 23

Acest fapt este corect deoarece avem patru ı̂nregistrări intro-


duse. În continuare vom introduce 3 ı̂nregistrări:

Record Number: 2
UNU: ANA
DOI: 1

Record Number: 3
UNU: PETRE
DOI: 2

Record Number: 4
UNU: SORIN
DOI: 4

Record Number: 5
UNU: __________
DOI: __

În acest moment acţionăm tasta ESC. În consecinţă obţinem


prompterul Guru:

Guru>

şi vrem să vizualizăm din nou tot tabelul:


24 N. Ţăndăreanu: Lecţia 4

Guru>browse

Efectul pe monitor:

Record Number: 1
UNU: UNU
DOI: 1

Record Number: 2
UNU: ANA
DOI: 1

Record Number: 3
UNU: PETRE
DOI: 2

Record Number: 4
UNU: SORIN
DOI: 4

Record Number: 5
UNU: DOI
DOI: 2

Record Number: 6
UNU: TREIA
DOI: 31
N. Ţăndăreanu: Lecţia 4 25

Record Number: 7
UNU: PATRUA
DOI: 41

Guru>

Sunt de reţinut din executarea acestor operaţiuni următoarele


observaţii:

• Utilizarea cuvântului records ı̂n loc de record ı̂n comanda


CREATE.

• Utilizarea comenzii browse fără a se specifica numele tabelului


la care se referă. Acest fapt este explicat prin aceea că există
un singur tabel in use şi ı̂n consecinţă comanda de vizualizare
se referă implicit la acest tabel.

• Intercalarea câmpurilor ı̂n instrucţiunea CREATE care uti-


lizează parametrul prior 2.

• În directorul ı̂n care lucrăm constatăm că există fişierul tab.itb
şi nu există nici un fişier cu numele tabel1.itb.
Să presupunem că ı̂n acelaşi director avem următorul pro-
gram, definire1.ipf:

DEFINE tabel1;
26 N. Ţăndăreanu: Lecţia 4

FIELD unu STR 10 USING "%10a";


FIELD doi INT USING "dd";
ENDDEF

La comanda:

Guru>perform definire1

sistemul răspunde cu mesajul

File already exists: tab.itb (definire : 1)

Explicaţia constă ı̂n faptul că numele programului are lungimea


9. Luându-se primele 8 caractere, ı̂n locul programului se va
lua ı̂n considerare tot primul program, definire.ipf.

Dacă redenumim programul definire1.ipf cu numele def1.ipf, după


execuţia acestuia se constată apariţia fişierului tabel1.itb.
Să presupunem ı̂n continuare următoarele acţiuni pentru fişierul
tab.itb:

Guru>browse range 2,4


N. Ţăndăreanu: Lecţia 4 27

Sistemul răspunde afisând pe monitor:

Record Number: 2
UNU: ANA
DOI: 1

Record Number: 3
UNU: PETRE
DOI: 2

Record Number: 4
UNU: SORIN
DOI: 4

Guru>

Obţinerea unei ı̂nregistrări existente ı̂n tabel şi afişarea valorilor


ei se face cu comanda OBTAIN. Forma ei este:

OBTAIN pozitie
OBTAIN pozitie RECORD FROM nume_tabel
OBTAIN pozitie RECORD FROM nume_tabel FOR conditii

unde pozitie poate avea una din valorile specificate ı̂n Tabelul 7
şi Tabelul 8.
De exemplu, comanda:
28 N. Ţăndăreanu: Lecţia 4

FIRST obţine prima ı̂nregistrare din


tabel
LAST obţine ultima ı̂nregistrare
num arată a câtea ı̂nregistrare din
tabel se consideră; dacă num
este mai mare decât numărul
total de ı̂nregistrări atunci se
consideră ultima ı̂nregistrare
PRIOR num consideră ı̂nregistrarea aflată
cu num poziţii ı̂naintea celei
curente. Dacă num este prea
mare atunci se consideră pri-
ma ı̂nregistrare. Dacă num este
omis atunci se ia valoarea 1
NEXT num obţine ı̂nregistrarea num după
cea curentă; dacă num este prea
mare atunci se consideră ulti-
ma ı̂nregistrare; dacă nu se pre-
cizează num atunci se consideră
că valoarea acestui parametru
este implicit 1

Tabelul 7: Parametrul pozitie ı̂n comanda OBTAIN


N. Ţăndăreanu: Lecţia 4 29

FROM nume-tabel precizează numele tabelului;


dacă lipseşte acest parametru,
se consideră tabelul default.
FOR conditii indică faptul că ı̂nregistrarea
solicitată trebuie să
ı̂ndeplinească condiţiile speci-
ficate

Tabelul 8: Parametrul pozitie ı̂n comanda OBTAIN

OBTAIN NEXT RECORD FROM angajati\


FOR Salbrut<1000000 & Varsta>30

obţine următoarea ı̂nregistrare din tabelul angajati, care satisface


condiţiile specificate.

Rezultatul unei comenzi OBTAIN este influenţat de valoarea


variabilei de mediu E.SUPD. Dacă această variabilă are valoarea
TRUE, atunci este suprimată afişarea pe ecran a ı̂nregistrării obţi-
nute. Variabila de mediu E.SUPD este de tip LOGIC şi implicit are
valoarea FALSE.

Înregistrarea obţinută ı̂n urma execuţiei instrucţiunii OBTAIN


devine ı̂nregistrare curentă. Valorile câmpurilor ı̂nregistrării curente
pot fi accesate şi setate.
30 N. Ţăndăreanu: Lecţia 4

De exemplu, atribuirea

angajati.nroreluc:=10

setează câmpul nroreluc al ı̂nregistrării curente din tabelul anga-


jati.
Dacă nici o inregistrare nu satisface conditiile declarate ı̂n instruc-
ţiunea OBTAIN atunci variabila utilitară #FOUND ia valoarea FAL-
SE, altfel ea este TRUE.
Sortarea elementelor unui tabel se realizează cu comanda

SORT

Sintaxa ei este următoarea:

SORT directie expresii


SORT nume_tabel BY directie expresii
SORT nume_tabel TO "nume_fisier" BY directie expresii
SORT nume_tabel TO "nume_fisier" BY directie\
expresii directie expresii

Comanda SORT permite sortarea ı̂nregistrărilor unui tabel du-


pă anumite criterii şi crearea unui nou tabel ı̂n ordinea specificată.
Dacă numele tabelului nu este precizat, atunci este vorba de tabelul
default. Un tabel poate fi sortat ı̂n mai multe feluri, mai multe ver-
siuni sortate ale aceluiaşi tabel pot să existe simultan ı̂n mai multe
N. Ţăndăreanu: Lecţia 4 31

fişiere separate. Versiunea sortată se depune ı̂n fişierul indicat. Dacă


nu se precizează fişierul ţintă atunci se suprascrie tabelul original.
Dacă nu există spaţiu suficient pe disk atât pentru fişierul original
cât şi pentru cel sortat, atunci sortarea va distruge tabelul original.
Cantitatea de disk necesară trebuie să asigure o copie a tabelu-
lui plus un anumit spaţiu necesar unor fişiere temporare GURU.
Parametrii din comanda SORT sunt descrişi ı̂n Tabelul 9.

După ce precizăm direcţia de sortare, trebuie să precizăm expre-


siile care dau criteriile de sortare. Fiecare expresie poate cuprinde
unul sau mai multe câmpuri. Ordinea ı̂n care sunt enumerate aces-
te expresii dau precedenţa, de la stânga spre dreapta. De exemplu,
comanda:

SORT angajati BY AZ nume

sortează ı̂nregistrările din tabela angajati după câmpul nume.


Deoarece nu a fost specificat un nume de fişier, versiunea originală
a tabelei angajati este ı̂nlocuită cu versiunea sortată.
32 N. Ţăndăreanu: Lecţia 4

BY directie este ASCENDING (sau AZ)


sau DESCENDING (sau ZA);
cuvântul BY este opţional
expresii precizează un câmp ı̂n tabel
sau o expresie care implică
unul sau mai multe câmpuri
ı̂n tabel
nume_tabel numele tabelului pe care
vrem să ı̂l sortăm
TO nume_fisier oferă numele fisierului ı̂n
care găsim versiunea sor-
tată; dacă TO nume_fisier
lipseşte, atunci sortarea se
face ı̂n cel original

Tabelul 9: Parametrii comenzii SORT


N. Ţăndăreanu: Lecţia 4 33

4 Câmpuri virtuale. Marcarea ı̂nregis-

trărilor

Câmpurile unui tabel sunt de două feluri: actuale şi virtuale.


Câmpurile actuale sunt cele care primesc valori de la utilizator. Cele
virtuale primesc valori prin calcule făcute sub GURU. Câmpurile
virtuale se definesc la fel ca cele actuale cu deosebirea că se pre-
cizează modul de calcul a valorilor acestora. Tipul şi dimensiunea
acestora nu este necesar să se precizeze. Precizarea modului de cal-
cul a valorii unui câmp virtual se face specificând ı̂n comanda DE-
FINE a tabelului respectiv a următoarei structuri:

FIELD nume_field =expresie

unde expresie este o expresie formată cu ajutorul altor câmpuri


din tabel.
Pentru a considera un exemplu, să presupunem că dorim să
definim un tabel ı̂n care o ı̂nregistrare să cuprindă următoarele
informaţii cu privire la persoanele care lucrează la o ı̂ntreprindere
dată: numele persoanei, existenţa contractului de muncă cu du-
rata nedeterminată, vechimea ı̂n muncă, numărul de ore lucrate,
tariful pe oră şi salariul persoanei. Se observă că nu toate aceste
informaţii sunt independente. Într-adevăr, salariul unei persoane
rezultă din tariful pe oră, numărul de ore lucrate şi vechimea ı̂n
34 N. Ţăndăreanu: Lecţia 4

muncă. Pentru simplificare, vom presupune că salariul se obţine


ı̂nmulţind numărul de ore lucrate cu tariful pe oră. Astfel, putem
defini tabelul angajati:

DEFINE angajati
field nume str 10 using "%10a" labeled "Nume angajat"
field stabil logic labeled "Contract de munca cu\
perioda nedeterminata - true"
field vechime int using "%2n"
field nroreluc num using "nnn.nn"\
labeled "Numarul de ore lucrate"
field tarif num using "nnnnn"
field salbrut =nroreluc*tarif labeled\
"Salariul brut, camp virtual"
ENDDEF

Fiecare ı̂nregistrare conţine ı̂n afara câmpurilor definite de uti-


lizator un câmp special, de tip logic. Acest câmp este utilizat pen-
tru a marca ı̂nregistrarea respectivă. Câmpul respectiv are valoarea
precizată ı̂n variabila utilitară #MARK. Dacă valoarea câmpului este
FALSE atunci ı̂nregistrarea nu este marcată; dacă valoarea este
TRUE atunci se consideră că ı̂nregistrarea este marcată. Marcarea
ı̂nregistrărilor se face cu scopul prelucrării acestora (de exemplu
ştergerea acelor ı̂nregistrări din tabel). Marcarea ı̂nregistrărilor se
N. Ţăndăreanu: Lecţia 4 35

face cu comanda MARK care are forma:

MARK RECORD IN nume_tabel WITH expresie scop


MARK RECORDS IN nume_tabel WITH expresie\
FOR conditii scop

Automat când se crează o ı̂nregistrare, ea este marcată cu FAL-


SE. Prin intermediul comenzii MARK putem marca cu TRUE ı̂nre-
gistrările unui tabel care ı̂ndeplinesc anumite condiţii.

CURRENT se marchează ı̂nregis-


trarea curentă
ALL toate ı̂nregistrările
NEXT se marchează urmă-
toarea ı̂nregistrare
NEXT num următoarele num
PRIOR se marchează prece-
denta celei curente
PRIOR num precedentele num
RANGE num1,num2 precizează domeniul

Tabelul 10: Parametrul scop ı̂n comanda MARK

Parametrii din comanda MARK au următoarea semnificaţie:


36 N. Ţăndăreanu: Lecţia 4

• scop precizează ı̂nregistrările care vor fi marcate şi poate avea


una din forme prezentate ı̂n Tabelul 10.

• expresie este o expresie logică, ı̂nregistrările din scop se


marchează cu valoarea acestei expresii; dacă expresie lipseşte
atunci se consideră că valoarea ei este TRUE.

De exemplu, instrucţiunea

MARK RECORDS IN angajati WITH true FOR nume\


IN ["Popescu","Ionescu"]

are ca efect marcarea acelor ı̂nregistrări din tabelul angajati care


au ı̂n câmpul nume valorile "Popescu" şi "Ionescu".
Toate ı̂nregistrările unui tabel, marcate cu TRUE, sunt elimi-
nate cu comanda COMPRESS. Forma comenzii COMPRESS este
următoarea:

COMPRESS nume_tabel

Ca efect, şterge toate ı̂nregistrările marcate cu TRUE, renu-


merotează ı̂nregistrările rămase şi comprimă tabelul. Tabelul tre-
buie să fie ı̂ncărcat ı̂n memorie, nu există ı̂nregistrare curentă după
compresie.
De exemplu, instrucţiunea

COMPRESS angajati
N. Ţăndăreanu: Lecţia 4 37

elimină ı̂nregistrările marcate cu TRUE din tabela angajati. Pen-


tru a elimina un tabel ı̂n ı̂ntregime, se recomandă utilizarea comen-
zii DESTROY.
O ı̂nregistrare marcată TRUE se demarchează cu comanda

UNMARK

Comanda UNMARK are următoarea formă sintactică:

UNMARK
UNMARK scop
UNMARK IN nume_tabel scop
UNMARK IN nume_tabel FOR conditii scop
UNMARK IN nume_tabel WHILE conditii scop

Semnificaţiile parametrilor acestei comenzi sunt prezentate ı̂n


Tabelul 11.
Comanda UNMARK demarchează ı̂nregistrările marcate cu TRUE
care satisfac condiţiile specificate. Tabelul trebuie să fie ı̂ncărcat
ı̂n memorie. Dacă numele tabelului este omis, se foloseşte tabelul
implicit.
Astfel, demarcarea ı̂nregistrărilor marcate cu TRUE ı̂n tabelul anga-
jati, care ı̂ndeplinesc condiţia varsta<35 se obţine cu comanda:

UNMARK IN angajati FOR varsta<35


38 N. Ţăndăreanu: Lecţia 4

scop precizează care ı̂nregistrări dorim


să le demarcăm; aici putem
să trecem următoarele expresii:
CURRENT, NEXT num, PRIOR num,
RANGE numr1,numr2, ALL; dacă
nu trecem scop atunci se de-
marchează ALL
FOR conditii demarchează numai acele
ı̂nregistrări care satisfac
conditii
WHILE conditii demarchează toate ı̂nregistrările
până la acea ı̂nregistrare pentru
care con ditii sunt false

Tabelul 11: Parametrii comenzii UNMARK

Comanda DEFAULT specifică ce tabel ı̂ncărcat ı̂n memorie va fi


considerat ca tabel implicit. Sintaxa comenzii este:

DEFAULT nume_tabel
DEFAULT IS nume_tabel

Dacă nu se foloseşte comanda DEFAULT atunci tabelul spec-


ificat ı̂n prima comandă USE din sesiunea curentă devine tabelul
N. Ţăndăreanu: Lecţia 4 39

implicit. Dacă se ı̂nchide tabelul implicit, atunci tabelul cel mai


recent referit ı̂ntr-o comandă USE devine tabel implicit. Pentru a
determina numele tabelului implicit se poate face apel la variabila
utilitară #DEFAULT, care conţine numele tabelului implicit.

5 Transmiterea şi vizualizarea ı̂nregis-

trărilor unui tabel. Utilizarea forme-

lor.

Să presupunem că a fost definită o schemă de relaţii cu aju-


torul comenzii DEFINE. În consecinţă, se cunoaşte structura unei
ı̂nregistrări adică, câmpurile acesteia, ordinea de aşezare a câmpurilor,
dimensiunea şi tipul fiecăruia. Prin transmiterea unei ı̂nregistrări
ı̂nţelegem introducerea de valori ı̂n câmpurile acesteia conform spe-
cificărilor din comanda DEFINE.
Mediul de programare GURU permite executarea urnătoarelor ope-
raţiuni:

• transmiterea tuturor câmpurilor unei ı̂nregistrări;

• transmiterea numai a anumitor câmpuri dintr-o ı̂nregistrare,


ı̂n particular o ı̂nregistrare goală sau identică cu ı̂nregistrarea
curentă.
40 N. Ţăndăreanu: Lecţia 4

Informaţiile se pot lua dintr-un fişier text, de la tastatură sau


din celulele unui spreadsheet.
Comanda care permite executarea acestor operaţiuni are numele
ATTACH. Sintaxa acesteia este următoarea:

ATTACH FROM "nume_fisier" TO nume_tabel


ATTACH FROM "nume_fisier" TO nume_tabel WITH fields
ATTACH numrec TO nume_tabel
ATTACH FROM CELL "cellblock" TO nume_tabel WITH fields

unde:

• ATTACH FROM: ataşează ı̂nregistrarea care urmează la o anu-


mită informaţie; cuvântul FROM este opţional.

• "nume_fisier": numele fişierului sursă care conţine ı̂nregis-


trările; ı̂nregistrările trebuie să aibă structura ı̂nregistrărilor
din tabel.

• TO nume_tabel: numele tabelului ı̂n care se vor introduce


ı̂nregistră- rile; dacă este omis, atunci se utilizează tabelul
curent.

• WITH fields: numai câmpurile enumerate ı̂n acestă structură


vor primi valori; prin lipsă, se consideră că toate câmpurile
unei ı̂nregis- trări vor primi valori.
N. Ţăndăreanu: Lecţia 4 41

• numrec: specifică numărul de ı̂nregistrări care se vor transmite


tabelului.

• CELL "cellblock": identifică blocul de celule din spreadsheet


din care vor fi luate valori; blocul de celule se defineşte listând
numele a două celule separate prin virgule; toate celulele din
spreadsheet cuprinse ı̂n acest bloc se vor transmite ca valori
ale câmpurilor tabelului.

Comanda ATTACH utilizează valorile variabilei de mediu E.CF


pentru a determina formatul fişierului sursă: 0- fişier ASCII; 1- for-
mat DIF; 2-fişier compatibil BASIC; 5- fişier SDF; 7- fişier WK1
(Lotus); 8- fişier DBF (dBase III sau IV).
Pentru câmpurile nespecificate ı̂n comanda ATTACH există ur-
mătoarele două situaţii posibile:

• se pot transmite valori standard acestor câmpuri; valorile


standard sunt prezentate ı̂n Tabelul 12 şi ı̂n acest caz val-
oarea variabilei E.LMOD trebuie setată cu valoarea FALSE
(ı̂n realitate această setare a variabilei E.LMOD este stan-
dard);

• valorile câmpurilor nespecificate ı̂n ATTACH se iau din ı̂nregis-


trarea curentă; ı̂n acest caz variabila E.LMOD se setează cu
TRUE.
42 N. Ţăndăreanu: Lecţia 4

Tipul câmpului Valoarea setată


string NULL
NUM şi INT 0.0
LOGIC FALSE

Tabelul 12: Setări standard

Aplicaţia 5.1 Adăugare de ı̂nregistrări ı̂ntr-un tabel.


Considerăm următoarea problemă: la o şcoală se organizează
un concurs ı̂ntre elevi. Fiecare elev ı̂nscris la concurs susţine o
probă orală şi una scrisă la două discipline: prima disciplină este
la alegere din disciplinele de română, franceză, engleză; a doua dis-
ciplină este de asemenea la alegere, dar din matematică, fizică,
chimie. La fiecare disciplină se calculează media aritmetică a notei
de la oral şi de la teză. În final fiecare candidat obţine o notă, care
este media aritmetică a notelor de la cele două probe.
Se pune problema de a introduce datele concursului ı̂ntr-un tabel.
Este necesar să considerăm ı̂nregistrări cu următoarea structură:

fname STR 10
lname STR 10
limba STR 10
l1 NUM (dd.dd)
l2 NUM (dd.dd)
N. Ţăndăreanu: Lecţia 4 43

med1 NUM (dd.dd)


stiinta STR 10
s1 NUM (dd.dd)
s2 NUM (dd.dd)
med2 NUM (dd.dd)
notafin NUM (dd.dd)

Definirea schemei de relaţii are loc ı̂n programul b11.ipf al


cărui conţinut este următorul:

DEFINE elevi WITH "conc.itb";\


FIELD fname STR 10;\
FIELD lname STR 10;\
FIELD limba STR 10;\
FIELD l1 NUM USING "dd.dd";\
FIELD l2 NUM USING "dd.dd";\
FIELD med1 NUM =(l1+l2)/2;\
FIELD stiinta STR 10;\
FIELD s1 NUM USING "dd.dd";\
FIELD s2 NUM USING "dd.dd";\
FIELD med2 NUM =(s1+s2)/2;\
FIELD notafin NUM =(med1+med2)/2;
ENDDEF;
use conc;
44 N. Ţăndăreanu: Lecţia 4

CREATE FIRST RECORD FOR conc;


FINISH conc;

Următorele trei observaţii sunt necesare:

• numele fişierului ataşat tabelului elevi este "conc.itb";

• programul utilizează câmpuri virtuale pentru calculul medi-


ilor;

• se introduc ı̂nregistrări ı̂n tabel prin comanda CREATE.

Programul b12.ipf de mai jos crează noi ı̂nregistrări ı̂n tabelul


definit mai sus.

LOCAL FORM trans;


AT 2,9 TO 22,65 PUT BORDER "FRBW";
AT 3,10 TO 21,64 PUT "FOBG";
AT 4,16 PUT "TRANSMIT O INREGISTRARE IN TABELUL \
conc";
AT 6,20 PUT "NUMELE ELEVULUI:";
AT 6,36 GET fname STR USING "%10a";
AT 7,20 PUT "PRENUMELE ELEVULUI:";
AT 7,39 GET lname STR USING "%10a";
AT 9,12 PUT "LIMBA STUDIATA:";
AT 9,27 GET limba STR USING "%10a";
N. Ţăndăreanu: Lecţia 4 45

AT 10,12 PUT "NOTA LA ORAL:";


AT 10,25 GET l1 NUM USING "dd.dd";
AT 11,12 PUT "NOTA LA TEZA:";
AT 11,25 GET l2 NUM USING "dd.dd";
AT 14,12 PUT "DENUMIREA DISCIPLINEI(stiinta):";
AT 14,43 GET stiinta STR USING "%10a";
AT 15,12 PUT "NOTA LA ORAL:";
AT 15,25 GET s1 NUM USING "dd.dd";
AT 16,12 PUT "NOTA LA TEZA:";
AT 16,25 GET s2 NUM USING "dd.dd";
ENDFORM;
USE conc;
yesno:="y";
CLEAR;
PUTFORM trans;
WHILE yesno="y" DO
ATTACH 1 TO conc;
getform trans;
INPUT yesno USING "r" WITH "CONTINUATI?(y/n)";
ENDWHILE;
FINISH ALL;

Aplicaţia 5.2 Vizualizarea ı̂nregistrărilor unui tabel.


46 N. Ţăndăreanu: Lecţia 4

Ne propunem ı̂n această aplicaţie să vizualizăm ı̂nregistrările


introduse ı̂n fişierul conc ı̂n cadrul aplicaţiei anterioare. Pentru
vizualizare utilizăm forma viz. Programul este următorul:

LOCAL FORM viz;


AT 2,9 TO 22,65 PUT BORDER "FRBW";
AT 3,10 TO 21,64 PUT "FOBG";
AT 4,16 PUT "TRANSMIT O INREGISTRARE IN TABELUL \
conc";
AT 6,20 PUT "NUMELE ELEVULUI:";
AT 6,36 PUT fname STR USING "%10a";
AT 7,20 PUT "PRENUMELE ELEVULUI:";
AT 7,39 PUT lname STR USING "%10a";
AT 9,12 PUT "LIMBA STUDIATA:";
AT 9,27 PUT limba STR USING "%10a";
AT 10,12 PUT "NOTA LA ORAL:";
AT 10,25 PUT l1 NUM USING "dd.dd";
AT 11,12 PUT "NOTA LA TEZA:";
AT 11,25 PUT l2 NUM USING "dd.dd";
AT 12,12 PUT "MEDIA:"; AT 12,19 PUT med1;
AT 14,12 PUT "DENUMIREA DISCIPLINEI(stiinta):";
AT 14,43 PUT stiinta STR USING "%10a";
AT 15,12 PUT "NOTA LA ORAL:";
N. Ţăndăreanu: Lecţia 4 47

AT 15,25 PUT s1 NUM USING "dd.dd";


AT 16,12 PUT "NOTA LA TEZA:";
AT 16,25 PUT s2 NUM USING "dd.dd";
AT 17,12 PUT "MEDIA:";AT 20,34 PUT med2;
AT 20,20 PUT "MEDIA FINALA:";AT 20,34 PUT notafin;
ENDFORM;
USE conc;
E.SUPD:=TRUE;
OBTAIN FIRST FROM conc;
putform viz;
yesno:="y";
WHILE yesno="y" DO
TALLY viz;
INPUT yesno WITH "DORITI SA VEDETI ALTA "+\
"INREGISTRARE?(y/n)";
OBTAIN NEXT FROM conc;
ENDWHILE;
finish all;

Sunt de remarcat următoarele observaţii:

• forma viz diferă de forma trans numai prin faptul că ı̂n ea
apar valorile virtuale din tabelul vizualizat;
48 N. Ţăndăreanu: Lecţia 4

• setarea variabilei E.SUPD;

• utilizarea comenzii TALLY.

6 Regăsirea informaţiilor

6.1 Generarea rapoartelor

Informaţiile conţinute ı̂n unul sau mai multe tabele pot fi afişate
pe ecran sau la imprimantă sub diferite forme. Pentru a obţine
forma dorită, progra- matorul trebuie să definească un model de
raport. Modelul raportului se poate defini:

• interactiv, cu ajutorul comenzii DESIGN;

• unitar, cu ajutorul comenzii TEMPLATE de definire a mod-


elului de raport.

Legătura dintre modelul unui raport şi datele din tabele se real-
izează cu ajutorul comenzii REPORT. Rutarea rezultatelor obţinute
prin comanda REPORT este controlată de următoarele variabile de
mediu, care se setează cu TRUE sau FALSE:

E.OCON : rutează rezultatele la consolă ;


N. Ţăndăreanu: Lecţia 4 49

E.ODSK: rutează rezultatele la un fişier pe disc, numele aces-


tuia se găseşte ı̂n variabila utilitară #DSKOUT (standard, dsk-
out.txt);

E.OPRN: rutează rezultatele la imprimantă, iar #PRNOUT con-


ţine portul de imprimantă care se va utiliza.

Un model de raport se defineşte cu ajutorul a trei paternuri. Un


patern defineşte o porţiune a modelului de raport. Cele trei tipuri
de paternuri sunt următoarele:

• paternuri de detaliu;

• paternuri de headere;

• paternuri de subsoluri.

Un patern de detaliu controlează modul ı̂n care informaţiile din


ı̂nregistrările tabelelor apar pe o pagină de raport. Din informaţiile
de detaliu se pot calcula statistici cu privire la acestea (numărul
de linii scrise pe o pagină, media unor câmpuri etc). Informaţiile
de detaliu pot să conţină literali ( de exemplu mesaje), non-literali
(valori ale unor variabile), culoarea cernelei de scris (sub forma
"FX" unde F precizează termenul foreground, iar X dă culoarea).
Culoarea de fond (background) se poate defini numai prin comanda
DESIGN.
50 N. Ţăndăreanu: Lecţia 4

Paternurile de headere şi de subsoluri diferă de paternurile de


detaliu numai prin locul pe care ı̂l ocupă informaţia ı̂n raport şi
organizarea conţi-
nutului:

• Un patern de header controlează informaţia care apare ı̂nainte


de detaliul raportului. Un model de raport conţine un header
de raport şi unul sau mai multe headere de pagină, acestea din
urmă putând să fie imbricate prin definirea unor niveluri de
imbricare.

• Un patern de subsol controlează modul ı̂n care se finalizează


informa- ţia din raport. Există două tipuri de paternuri de
subsol: subsol de raport şi subsol de pagină. Un subsol de ra-
port precizează modul ı̂n care se ı̂ncheie un raport. Un subsol
de pagină arată cum se ı̂ncheie o pagină a unui raport.

Cel mai simplu model de raport arată astfel:


N. Ţăndăreanu: Lecţia 4 51

Header de raport

Detaliu

Subsol de raport

Headerul de raport apare numai la ı̂nceputul primei pagini a


raportului, iar subsolul de raport apare numai la sfârşitul ultimei
pagini a raportului.
Există două posibilităţi:

• prima pagină a raportului să conţină numai headerul de ra-


port; spunem ı̂n acest caz că utilizăm un break după headerul
de raport; fiecare din celelalte pagini ı̂ncep cu headerul de
pagină şi se ı̂ncheie cu subsolul de pagină;

• prima pagină conţine headerul de raport şi o pagină de raport;


fiecare din celelalte pagini ı̂ncep cu headerul de pagină şi se
ı̂ncheie cu subsolul de pagină.

Cele două operaţiuni importante, definirea modelului de raport


şi asocierea dintre informaţiile tabelelor şi modelul de raport definit
52 N. Ţăndăreanu: Lecţia 4

se realizează cu instrucţiunile TEMPLATE, respectiv REPORT.


Definirea modelului de raport ı̂ncepe cu instrucţiunea TEM-
PLATE şi se termină cu ENDTEMPLATE. Între aceste două en-
tităţi sunt descrise: headerul de raport, subsolul de raport, headerul
de pagină, subsolul de pagină, perechi imbricate de forma header-
subsol şi detaliile unei pagini de raport. Structura unei pagini de
raport este aceeaşi pentru toate paginile raportului. Paginile unui
raport diferă numai prin informaţiile afişate şi nu prin formă.
Sintaxa definirii unui model de raport este următoarea:

[LOCAL] TEMPLATE nume_model


REPORT {HEADER,FOOTER} AT nr1,nr2 [SKIP n]\
[WITH BREAK]
PAGE {HEADER,FOOTER} AT nr1,nr2 [SKIP n]
GROUP {HEADER,FOOTER} AT nr1,nr2 [SKIP n]\
[WITH BREAK] LEVEL {a-z}
DETAIL AT nr1,nr2 [SKIP n] [WITH BREAK]\
[LIMIT {1-255}]
AT nr1,nr2 PUT exp [USING "........."]
AT nr1,nr2 TO nr3,nr4 PUT "culori"
ENDTEMPLATE

Semnificaţiile cuvintelor cheie sunt prezentate ı̂n Tabelul 13 şi


Tabelul 14.
N. Ţăndăreanu: Lecţia 4 53

TEMPLATE Precizează numele şi ı̂nceputul


definiţiei modelului de raport;
fiecare instrucţiune TEM-
PLATE este completă, adică
are asociată o instrucţiune
ENDTEMPLATE
REPORT HEAD- Precizează liniile headerului
ER de raport: nr1 arată linia de
ı̂nceput, iar nr2 arată numărul
ultimei linii
REPORT FOOT- Precizează liniile subsolu-
ER lui de raport; nr1 şi nr2 au
semnificaţia celor de la RE-
PORT HEADER
PAGE HEADER Precizează liniile headerului de
pagină

Tabelul 13: Parametrii unui model de raport


54 N. Ţăndăreanu: Lecţia 4

PAGE FOOTER Precizează liniile subsolului


de pagină
GROUP HEADER Arată gruparea liniilor de
header ı̂ntr-un raport
GROUP FOOTER Arată gruparea liniilor de sub-
sol ı̂ntr-un raport
DETAIL Specifică liniile de detaliu
SKIP Arată câte linii goale se
tipăresc după un header,
subsol sau detaliu
WITH BREAK Cauzează un break de pagină
LEVEL Urmat de o literă (de la a la z)
specifică nivelul unui grup de
headere sau subsoluri
LIMIT Urmat de un număr ı̂ntreg spe-
cifică numărul maxim de de-
talii care să fie tipărite pe o sin-
gură pagină de raport
ENDTEMPLATE Specifică sfârşitul modelului de
raport

Tabelul 14: Parametrii unui model de raport


N. Ţăndăreanu: Lecţia 4 55

Următoarele observaţii sunt utile la proiectarea unui model de


raport:

• Headerul şi subsolul de raport apar o singură dată ı̂n rapor-


tul respec- tiv. Raportul ı̂ncepe cu headerul de raport şi se
ı̂ncheie cu subsolul de raport. Variabilele sau expresiile care
apar ı̂n aceste paternuri sunt mai ı̂ntâi evaluate şi apoi se in-
troduc ı̂n secţiunile precizate de paternuri. Această afirmaţie
este valabilă pentru orice patern al raportului. Se pot utiliza
variabile utilitare şi variabila %. În general variabilele utilitare
conţin data ı̂ntocmirii raportului (#DATE) sau date statistice
cu privire la informaţiile extrase şi afişate de patern (#SUM,
#AVER, etc). Variabila % desemnează peste tot numărul curent
de pagină.

• Headerul şi subsolul de pagină definesc textul care apare la


ı̂nceputul, respectiv la sfârşitul fiecărei pagini de raport. Cel
mult un header de pagină şi un subsol de pagină poate să
conţină un model de raport. GURU reevaluează toate ele-
mentele paternului care nu sunt constante ı̂nainte de a afişa
pagina de raport respectivă.

• Un model de raport poate fi declarat LOCAL sau GLOBAL,


poate fi salvat ı̂ntr-un fişier context şi de asemenea ı̂ncărcat
56 N. Ţăndăreanu: Lecţia 4

dintr-un asemenea fişier; poate fi vizualizat cu ajutorul comen-


zii SHOW; poate fi descărcat din memorie cu ajutorul comen-
zii RELEASE.

Generarea unui raport prin utilizarea unui model de raport se


realizează cu ajutorul comenzii REPORT, care are următoarea sin-
taxă:

REPORT nume_model FROM nume_tabel FOR conditii scop


REPORT nume_model FROM nume_tabel FOR conditii,
FROM nume_tabel FOR conditii,
..................................
FROM nume_tabel FOR conditii scop
REPORT nume_model FROM nume_tabel FOR conditii scop
GROUP BY breaks ORDER BY directie sortexp
..................................
directie sortexp

parametrii sunt descrişi ı̂n Tabelul 15.

6.2 Instrucţiunea SELECT

Listarea informaţiilor conţinute ı̂ntr-un tabel se poate realiza de


asemenea cu ajutorul instrucţiunii SELECT. Sintaxa instrucţiunii
este următoa- rea:
N. Ţăndăreanu: Lecţia 4 57

scop arată domeniul ı̂nregistrărilor


considerate; el poate fi: CUR-
RENT, ALL, NEXT numr,
PRIOR numr, RANGE a,b;
dacă lipseşte se consideră a fi
ALL;
breaks conţine unul sau mai multe
câmpuri din ı̂nregistrare; apare
un break când se modifică una
din aceste valori. Primul câmp
este folosit pentru grupul cu cel
mai mare nivel ş.a.m.d.
ORDER BY Sortează conţinutul informaţii-
lor
sortexp Este un câmp sau o expresie cu
câmpuri din ı̂nregistrare

Tabelul 15: parametrii instrucţiunii REPORT


58 N. Ţăndăreanu: Lecţia 4

nume_tabel reprezintă numele tabelului


din care se extrag informaţiile
scop arată ı̂nregistrările care se iau
ı̂n considerare : CURRENT;
PRIOR num; NEXT numrec;
RANGE num- rec1,numrec2

Tabelul 16: Parametrii comenzii SELECT

SELECT expresii FROM nume_tabel scop


SELECT expresie USING ".....",expresie USING "....."\
FROM nume_tabel scop
SELECT expresii USING "....." FROM nume_tabel\
FOR conditii scop GROUP BY breaks\
ORDER BY directie sortexp directie sortexp

Parametrii acestei comenzi sunt prezentaţi ı̂n Tabelul 16 şi


Tabelul 17.
Efectul execuţiei acestei instrucţiuni este următorul: din mulţi-
mea de ı̂nregistrări selectate prin scop se extrag acele ı̂nregistrări
care satisfac condiţiile exprimate ı̂n entitatea conditii; valorile
afişate sunt cele precizate ı̂n entitatea expresii şi ele formează o
linie afişată; ordinea liniilor este precizată de entităţile directie şi
sortexp.
N. Ţăndăreanu: Lecţia 4 59

conditii se consideră toate ı̂nregistrările


indicate ı̂n scop, care satisfac
aceste conditii
breaks constă din unul sau mai multe
nume de câmpuri; ca efect,
apare un break ori de câte ori
unul din aceste câmpuri a fost
modificat
expresii reprezintă un nume de câmp
sau o expresie cu asemenea en-
tităţi
directie poate fi ASCENDING (sau
AZ); DESCENDING (sau ZA)
sortexp este un câmp sau o expresie cu
asemenea entităţi

Tabelul 17: Parametrii comenzii SELECT


60 N. Ţăndăreanu: Lecţia 4

Facem observaţia importantă cu privire la faptul că mediul de


programare GURU acceptă şi alte variante ale acestei instrucţiuni.
În sinteza de aplicaţii vom prezenta o exemplu ı̂n care selecţia se
va realiza din mai multe tabele cu ajutorul aceleiaşi instrucţiuni
SELECT.
Următoarele setări ale variabilelor de mediu sau utilitare sunt
utile ı̂n comanda SELECT:

• E.STAT=TRUE ; se realizează calculele statistice.

• E.SPGN=TRUE; suprimă numerotarea paginilor afişate.

• E.PDEP conţine numărul de linii ale paginii afişate (maxi-


mum 255).

• E.PAUS=TRUE dacă se doreşte o pauză după fiecare umplere


a ecranului; prin acţionarea unei taste oarecare se continuă
afişarea.

• #TITLE conţine şirul de caractere care va fi tipărit ca titlu al


unei pagini.

• #AVER este un tablou unidimensional conţinând mediile statis-


tice pentru coloanele afişate.

• #MAX este un tablou unidimensional conţinând valorile maxime


pentru coloanele afişate.
N. Ţăndăreanu: Lecţia 4 61

• #MIN este un tablou unidimensional conţinând valorile minime


pentru coloanele afişate.

• #LEGEND este un tablou unidimensional; componentele aces-


tuia re- prezintă titlurile coloanelor; dimensiunea tabloului se
declara cu ins- trucţiunea DIM; ı̂n mod normal componentele
conţin stringuri de lungime cel mult 40.

• E.LEGH=TRUE dacă utilizăm #LEGEND pentru titlurile co-


loanelor.

• E.SUPH=TRUE dacă nu dorim să utilizăm titluri pentru


coloane.

• E.DECI şi E.PNT controlează numărul de cifre, respectiv in-


dicatorul de punct zecimal pentru afişarea datelor numerice.

7 Spredsheeturi ı̂n GURU

Spredsheetul oferă un mijloc modern şi eficient de procesare


a datelor. Mediul de programare GURU oferă toate facilităţile de
care se bucură un utilizator care apelează la un spredsheet şi ı̂n plus
programatorul beneficiază de compatibilitatea acestei structuri cu
alte componente GURU. Astfel, se pot realiza transferuri de date
din spredsheet ı̂ntr-o bază de date, se pot utiliza spredsheeturile ı̂n
62 N. Ţăndăreanu: Lecţia 4

sisteme expert sau datele introduse ı̂ntr-un spredsheet se pot obţine


ı̂n urma execuţiei unui program sau chiar a consultării unui sistem
expert.

Un spredsheet este un bloc dreptunghiular de celule aranjate pe


linii şi coloane. Liniile sunt numerotate de sus ı̂n jos cu numerele
1,...255. Coloanele sunt notate de la stânga spre dreapta cu car-
acterele A,B,...,Z. În cazul ı̂n care este necesar un spredsheet cu
mai multe coloane şi a fost epuizată lista alfabetului atunci pentru
coloanele care urmează se utilizează secvenţa ordonată lexicografic
AA,...,AZ,BA,....

La intersecţia unei linii cu o coloană se află o celulă. Orice celulă


are un nume. Numele unei celule se obţine din codul coloanei şi
numărul liniei pe care se găseşte celula respectivă, punând carac-
terul # ı̂n faţa acestora. De exemplu, #D6 reprezintă celula aflată
pe linia 6, coloana D.

Numele unei celule este o variabilă celulă. Numele unei variabile


celulă se mai poate exprima ca ı̂n cazul tablourilor, numele tabloului
fiind #. Astfel, celula #D6 se mai poate scrie sub forma #(6,4). O
asemenea scriere ca elemente de tablou este utilă ı̂n algoritmi, când
trebuie să utilizăm indici.

Pentru deplasarea de la o celulă la alta a spredsheetului se uti-


lizează un cursor. Poziţia iniţială a cursorului este celula #A1. De-
N. Ţăndăreanu: Lecţia 4 63

plasarea cursorului se face cu tastele UP, DOWN, LEFT, RIGHT şi


direcţia de deplasare a acestuia este reprezentată ı̂n colţul dreapta
sus a spredsheetului după cum urmează:

• ^ reprezintă deplasarea ı̂n sus (UP);

• v reprezintă deplasarea ı̂n jos (DOWN);

• < reprezintă deplasarea la stânga (LEFT);

• > reprezintă deplasarea la dreapta (RIGHT).

Tot ı̂n acelaşi colţ al spredsheetului se mai afişează numărul


de linii şi de coloane ale spredsheetului şi numele celulei active. În
fiecare moment o singură celulă este activă, cea aflată ı̂n dreptul
cursorului. Un bloc de celule este un grup compact de celule, de
formă dreptunghiulară. Pentru definirea unui asemenea bloc trebuie
să precizăm celula nord-vest şi celula sud-est a blocului respectiv.
Pentru definirea unui spredsheet apelăm componenta CALC a
mediului GURU prin intermediul comenzii:

Guru > CALC

La tastarea acestei comenzi se defineşte un spredsheet standard


cu 30 de linii şi 30 de coloane, fiecare celulă având o lungime stan-
dard de 9 caractere. Dacă intenţionăm să utilizăm un spredsheet
nestandard atunci trebuie să precizăm ı̂n comanda CALC numărul
64 N. Ţăndăreanu: Lecţia 4

de linii şi numărul de coloane al spredsheetului. Astfel, un spred-


sheet cu k linii şi s coloane se obţine prin execuţia comenzii:

Guru > CALC k,s

Pe ecranul monitorului apare o imagine având forma şi conţinutul


din Figura 1.

30,30 >=A1
||
:A :B :C :D :E :F :G :H
1
2

3
4

19

Figura 1: spredsheet

Când se lucrează cu un spredsheet interesează trei zone ale


spredsheetului:
N. Ţăndăreanu: Lecţia 4 65

• celula activă spredsheet;

• linia de comandă;

• linia imagine.

Linia de comandă şi linia imagine sunt ultimele două linii ale
spredsheetului. În Figura 1 linia de comandă este desenată prin lin-
ie punctată. Ea este inactivă. Activarea ei se obţine acţionând tasta
ESC. De ı̂ndată ce linia de comandă a fost activată, ea aşteaptă in-
troducerea unei entităţi. Entitatea introdusă poate fi:

• o valoare NUM, STR sau LOGICAL;

• o expresie sau un text de program;

• o comandă.

Dacă se introduce o valoare atunci entitatea respectivă se atribuie


celulei active a spredsheetului. Dacă se introduce o expresie atunci
valoarea expresiei se atribuie celulei active.
În expresia respectivă putem utiliza:

• orice celulă a spredsheetului;

• orice variabilă utilitară;

• orice variabilă de mediu;


66 N. Ţăndăreanu: Lecţia 4

• orice variabilă de lucru sau element de tablou;

• orice variabilă field.

Unei celule putem să ı̂i ataşăm un text program; ı̂n acest caz
valoarea atribuită celulei active este valoarea ultimei variabile din
textul program căreia nu i se asignează nici o valoare. De exem-
plu să presupunem că introducem valorile 1,2,3 respectiv ı̂n #A1,
#A2, respectiv #A3. Aceste atribuiri se obţin dacă pentru fiecare din
variabilele celulă enunţate realizăm următoarele operaţiuni:

• celula activă este celula considerată; aceasta ı̂nseamnă că ı̂n


momentul considerat cursorul de spredsheet se găseşte ı̂n drep-
tul celulei;

• acţionăm tasta ESC; prin aceasta operaţiune linia de comandă


devine activă;

• introducem ı̂n linia de comandă valoarea celulei;

• acţionăm tasa ENTER.

În continuare să presupunem că celula activă este #A4. Activăm
linia de comandă şi introducem textul program de mai jos:

IF #A1 < #A2 THEN X:=#A1+#A3;


ELSE X:=#A3+1;
N. Ţăndăreanu: Lecţia 4 67

ENDIF
X;

Acţionăm tasta ENTER la terminarea introducerii acestui text.


Constatăm că #A4 primeşte valoarea 4. Să modificăm valoarea ce-
lulelor #A1 şi #A2, acestea devenind 5, respectiv 7. Constatăm că
valoarea celulei #A4 nu s-a modificat. Pentru actualizarea valorii
respective trebuie să introducem comanda:

\COMPUTE

pe linia de comandă. După acţionarea tastei ENTER constatăm ac-


tualizarea aşteptată: valoarea celulei #A4 este 8. Comanda COMPUTE
va actualiza toate celulele care se găsesc ı̂n situaţie similară cu celu-
la A4. Dacă setăm E.ICOM:=TRUE, GURU evaluează celulele la
fiecare acţionare a tastei ENTER.
Linia imagine ne arată entitatea asociată celulei active: valoarea
directă, expresia sau textul de program. Dacă celulei active i s-a
ataşat o valoare directă ı̂n spredsheet atunci valoarea respectivă
se regăseşte ı̂n linia imagine. Dacă celulei i s-a ataşat o expresie
sau un text de program şi s-a executat comanda \COMPUTE atunci
valoarea celulei active este specificată ı̂n spredsheet pe poziţia care
corespunde celulei active, iar ı̂n linia imagine găsim nu valoarea
acesteia ci expresia sau textul de program ataşat.
68 N. Ţăndăreanu: Lecţia 4

O comandă specificată ı̂n linia de comandă a unui spredsheet


execută o anumită operaţiune:

• \SAVE nume_fis salvează spredsheetul ı̂n fişierul nume_fis.


ICF

• \COMPUTE actualizează valorile celulelor.

• \UNDEFINE celula sau \UNDEFINE celula1 TO celula2 va


atribui valoarea nedefinită pentru celula menţionată sau pen-
tru blocul de celule definit de celula1, celula2.

• \STOP termină procesarea spredsheetului.

• \BYE determină ı̂nchiderea componentei CALC.

Să observăm că o comandă spercificată ı̂n linia de comandă


ı̂ncepe cu caracterul backslash.
Pentru a explica alte detalii privind procesarea datelor dintr-un
spredsheet să realizăm următoarele operaţiuni:

• Introducem ı̂ntr-un spredsheet valorile #A1=1, #A2=2, #A3=3,


#A4=4, #A5=5, #B1=6, #B2=7, #B3=8, #B4=9, #B5=10.

• Ataşăm celulei #C1 expresia #A1+#B1.

• Introducem comanda:
N. Ţăndăreanu: Lecţia 4 69

\COPY #C1,#C2 TO #C5

La ı̂ntrebarea Adjust?(y/n) răspundem cu y.

• Plimbăm cursorul peste celulele #C2 TO #C5 şi observăm ex-


presiile ataşate.

• Introducem comanda \compute. Observăm noile valori ale


celulelor.

• Ataşăm unei celule expresia

sum(cela,celb)

Grupul (cela,celb) defineşte un grup de celule. Valoarea


atribuită celulei este suma elementelor blocului.

Sunt importante de asemenea următoarele observaţii:

• Încărcarea unui spredsheet ı̂n memorie se obţine cu comanda:

LOAD nume

Deoarece comanda nu ı̂ncepe cu caracterul backslash se subı̂n-


ţelege că această comandă se execută sub prompterul GURU.
70 N. Ţăndăreanu: Lecţia 4

Se presupune că acest spredsheet a fost creat cândva şi salvat


cu comanda \SAVE. De asemenea se presupune că entitatea
nume din comanda LOAD are extensia ICF.

• Putem ı̂ncărca informaţia dintr-un tabel ı̂ntr-un spredsheet,


fără să introducem datele celulă cu celulă.
Etapele sunt următoarele:

• Intrăm ı̂n modul spredsheet:

CALC

• Declarăm in use tabelul cu care lucrăm:

\USE SAL

• Dacă nu dorim să apară două zecimale la fiecare celulă


atunci este necesar să utilizăm atribuirea

\E.DECI:=0

• Putem converti ı̂nregistrările din tabelul SAL la valori


de celule, cu prima valoare fiind plasată ı̂n #B6 astfel:

\CONVERT SN,SAL1,Q1,SAL2,Q2 FROM SAL TO \


N. Ţăndăreanu: Lecţia 4 71

CELL #B6

Fiecare câmp din ı̂nregistrare corespunde unei coloane;


o ı̂nregistrare se aşează pe o linie. spredsheetul trebuie
să aibă suficient spaţiu pentru a primi toată informaţia.
Valorile din tabel sunt acum valori ale celulelor din spred-
sheet.

Forma generală a comenzii CONVERT este următoarea:

\CONVERT expresii FROM nume_tabel TO \


CELL bloc_cells

Se mai poate introduce condiţia

FOR conditii

ı̂ntre specificaţia de nume_tabel şi specificaţia TO.

• Dacă setăm E.OPRN:=TRUE atunci comanda:

\DISPLAY #A2 TO #G7

va avea ca efect trimiterea la imprimantă a valorile blocului


specificat.
72 N. Ţăndăreanu: Lecţia 4

• Comanda:

\ATTACH FROM CELL celbloc TO nume_tabel \


WITH fields

crează ı̂ntr-un tabel noi ı̂nregistrări care constau din valori ale
unor celule din spredsheet.

• Atunci când textul de program ataşat unei celule este de di-


mensiune mai mare, adică nu se reduce la 3-4 instrucţiuni,
este de preferat să se introducă textul ı̂ntr-un fişier separat,
iar celulei respective să i se ataşeze comanda

PERFORM nume_fisier

Fişierul ataşat este un fişier IPF.

Exemplul 7.1 Considerăm un spredsheet ı̂n care celulele au urmă-


toarele valori: #A1=1; #A2=2; #A3=3; #A4=4; #B1=6; #B2=7; #B3=8;
#B4=9.
Considerăm tabelul proba ı̂n care ı̂nregistrările au structura
definită astfel:

DEFINE proba;\
FIELD nume1 INT using "ddd";\
N. Ţăndăreanu: Lecţia 4 73

FIELD nume2 INT using "ddd";\


ENDDEF

Pe linia de comandă a spredsheetului introducem comanda:

\ATTACH FROM CELL #A1 TO #B4 TO proba

Ca efect al execuţiei acestei comenzi ı̂nregistrările tabelului proba


provin din liniile blocului de celule ale spredsheetului: prima ı̂nre-
gistrare conţine câmpurile nume1=1, nume2=6 etc.

8 Exerciţii propuse pentru rezolvare

TEMA nr. 8.1


Realizaţi următoarele:

• Scrieţi o formă care sa ceara numele studentului, prenumele


şi nota la examen (pentru un număr necunoscut de studenţi).

• Salvaţi rezultatul ı̂ntr-un tabel care are trei câmpuri: Nume,


Prenume, Promovat. Primele două câmpuri sunt de tip string,
iar ultimul de tip logic. Afişati apoi graficul situaţiei de la
examen (promovaţi, nepromovaţi).

TEMA nr. 8.2


Societatea comercială, ROM3 cumpără şi vnde autoturisme BMW,
SKODA, AUDI şi DACIA. Ea deţine o situaţie de tipul următor:
74 N. Ţăndăreanu: Lecţia 4

Ziua din lună


Marca auto
Preţ cump. Preţ vânz. Buc. cump. Buc. vând.

• Creaţi o bază de date cu situaţia pe o săptămână.

• Scrieţi un program care să ceară de la utilizator numele a


3 zile şi să afişeze pe acelaşi ecran graficul de la vânzări şi
graficul de la cumpărări (pe OX marca auto, pe OY situaţia)

TEMA nr. 8.3


Creaţi o formă de tipul următor:

NUME

PRENUME

Număr de zile lucrate

Tarif/zi

SALARIU REALIZAT

Nume birou

Salariul realizat se obţine ı̂nmulţind numărul de zile cu tariful/zi.


N. Ţăndăreanu: Lecţia 4 75

• Scrieţi un program care să utilizeze forma de mai sus ca


interfaţă de intrare pentru a introduce date ı̂ntr-un tabel cu
numele salarii.

• Scrieţi un raport pe baza de date obţinută care să conţină o


pagină break de titlu raport şi ı̂n rest fiecare pagină să conţină
salariile persoanelor grupate pe câte un birou, ordonate de-
screscător după salarii.

TEMA nr. 8.4


Creaţi un spredsheet cu 6 linii şi 4 coloane având următoarea struc-
tură:

− prima linie : tip televizor; număr bucăţi; preţ/buc; total de


ı̂ncasat

− celelalte linii conţin date cu privire la aceste câmpuri

• Ataşaţi fiecărei celule din coloana a patra cı̂te un program


care să calculeze suma de ı̂ncasat pentru fiecare tip de aparat;
acest program va citi pentru fiecare tip de aparat un coeficient
de indexare a sumei, coeficient care se extrage dintr-o bază de
date.

• Utilizaţi facilităţile CALC pentru a calcula suma totală de


primit, care se va introduce ı̂n celula din linia 6, coloana 4.
76 N. Ţăndăreanu: Lecţia 4

TEMA nr. 8.5

• Definiţi un tabel cu 5 ı̂nregistrări de următoarea structură:


nume angajat, număr de zile lucrate, tarif/zi.

• Transferaţi datele ı̂ntr-un spredsheet.

• Utilizaţi facilităţile CALC pentru a calcula salariul pe care


ı̂l primeşte fiecare din cei 5 angajaţi şi suma totală pe care o
are de plătit ı̂ntreprinderea.

• Calculaţi ı̂n spredsheetul respectiv impozitul pe care ı̂l are de


plătit fiecare angajat (25% din suma de ı̂ncasat).

• Calculaţi cât mai are de primit fiecare angajat.

TEMA nr. 8.6


Definiţi un tabel cu numele alfa cu ı̂nregistrări de forma:

INDEX Cı̂mp1 Cı̂mp2 Rezultat

unde INDEX poate fi 1,2 sau 3. Cı̂mp1 şi Cı̂mp2 sunt de tip nu-
meric.
Se cer următoarele:
N. Ţăndăreanu: Lecţia 4 77

• Introduceţi date ı̂n tabelul alfa. Al patrulea cı̂mp rezultă din


calcul astfel:





 Cimp1 + Cimp2 daca IN DEX = 1


Cimp1 − Cimp2 daca IN DEX = 2 (1)





 Cimp1 ∗ 3/4 + Cimp2 ∗ 1/4 daca IN DEX = 3

• Marcaţi ı̂nregistrările n1, n2,...,np şi calculaţi cı̂mpul Rezul-


tat pentru aceste ı̂nregistrări.

TEMA nr. 8.7

• Definiţi două tabele cu ı̂nregistrări de tipul:

NUME PRENUME NOTA1 NOTA2 NOTA3

• Introduceţi ı̂nregistrări ı̂n cele două tabele astfel ı̂ncât ele să
aibă ı̂nregistrări comune.

• Obţineţi tabelul reun care să conţină reuniunea ı̂nregistrărilor


celor două tabele.
78 N. Ţăndăreanu: Lecţia 4

TEMA nr. 8.8


Definiţi un tabel cu ı̂nregistrări de tipul:

NUME PRENUME NOTA1 NOTA2 NOTA3

Transferaţi datele tabelului ı̂ntr-un spredsheet. Utilizaţi mijloacele


specifice spredshetului pentru a calcula media notelor pentru fiecare
ı̂nregistrare. Realizaţi un tabel care să conţină persoanele respective
ordonate ı̂n ordinea descrescătoare a mediilor notelor.

TEMA nr. 8.9


Definiţi două tabele cu ı̂nregistrări de tipul:

NUME PRENUME NOTA1 NOTA2 NOTA3

Introduceţi ı̂nregistrări ı̂n cele două tabele astfel ı̂ncât ele să aibă
ı̂nregistrări comune. Obţineţi tabelul dif care să conţină ı̂nregistrările
care nu sunt comune celor două tabele.

TEMA nr. 8.10


Definiţi două tabele cu ı̂nregistrări de tipul:

NUME PRENUME NOTA


N. Ţăndăreanu: Lecţia 4 79

Se cer următoarele:

• Introduceţi datele n tabele.

• Scrieţi un program care să formeze tabelul cu acele ı̂nregistrări


care sunt ı̂n primul tabel şi nu sunt ı̂n al doilea.

• Eliminaţi din al doilea tabel acele ı̂nregistrări care sunt ı̂n


primul tabel.

TEMA nr. 8.11 Scrieţi un program care să creeze două tabele.
Primul tabel are nregistrări de forma:

Cod carte Titlu carte Nr.cititori

Al doilea tabel are ı̂nregistrări de forma:

Cod carte Autor Editura

Scrieţi al doilea program care să citească numărul K şi să afişeze
informaţii de forma:
Cartea T scrisă de A a fost citită de N cititori
unde T=titlul cărţii, A=autorul, N=numărul de cititori, iar N¿K.

TEMA nr. 8.12


Consideraţi n puncte n plan, definite prin coordonatele carteziene.
80 N. Ţăndăreanu: Lecţia 4

Scrieţi o funcţie GURU care să calculeze numărul punctelor aflate


ı̂n coroana circulară definită de cercurile de ecuaı̂e x2 + y 2 = R1 şi
x2 + y 2 = R2 , unde R1 > R2 . Ataşaţi fiecărui cadran numărul de
puncte aflate ı̂n interiorul coroanei, ı̂n cadranul respectiv. Reprezen-
taţi graficul funcţiei obţinute. Realizaţi de asemenea graficul PIE.

TEMA nr. 8.13


Realizaţi un spredsheet ı̂n care o linie are forma următoare:
Nume elev, nota1, nota2, nota3, media
Scrieţi un program GURU care să creeze un tabel cu datele spred-
sheetului, ordonat după medie. Reprezentaţi grafic situaţia elevilor
cu medii n intervalul (n,n+1], pentru n=5,6,7,8,9.

TEMA nr. 8.14


Scrieţi un program GURU ı̂n care să descrieţi situaţia rezervărilor
de camere ı̂ntr-un hotel. O ı̂nregistrare are forma:

Numărul camerei Situaţia camerei Tarif/zi data

unde ”Situaţia camerei” ı̂nseamnă liberă sau numele persoanei care


o ocupă, iar ”data” ı̂nseamnă data ocupării. Utilizând o formă
ı̂ntocmiţi nota de plată pentru o persoană dată.

TEMA nr. 8.15


Se consideră o bază de date care conţine informaţii referitoare la
N. Ţăndăreanu: Lecţia 4 81

sportivii participanţi la un campionat de gimnastică cu următoarea


structură: ŢARA (10 caractere), NUME(20 caractere), NOTA1,
NOTA2 şi NOTA3 (numere ı̂ntre 0 şi 10 cu două zecimale). Se pre-
supune că ı̂nregistrările nu sunt grupate pentru o ţară şi numărul
de sportivi ai unei ţări diferă de la ţară la ţară.
Introduceţi date ı̂n tabelul respectiv. Adăgaţi un câmp la ı̂nregistrare
cu suma notelor pentru fiecare candidat. Realizaţi un raport pe baza
de date care să afişeze rezultatele delegaţiei unei ţări pe o pagină, iar
ı̂n pagină sportivii sunt aranjaţi ı̂n ordinea descrescătoare a puncta-
jelor totale. Ţările sunt aranjate după ordinea alfabetică a numelor.

TEMA nr. 8.16


Se consideră o bază de date care conţine informaţii referitoare la
concurenţii participanţi la olimpiada internaţională de informatică,
cu următoarea structură: ŢARA (10 caractere), NUME (20 carac-
tere), P1, P2 şi P3 (punctaje, numere ı̂ntregi ı̂ntre 0 şi 10). Se
consideră o altă bază de date care conţine informaţiile ŢARA(10
caractere) şi NUME (20 caractere) al profesorului ı̂nsoţitor din ţara
respectivă (un singur profesor pentru fiecare ţară).

• Introduceţi date ı̂n cele două baze.

• Realizaţi un raport ı̂n care o pagină conţine următoarele in-


formaţii: ŢARA, NUME profesor, lista cu participanţii ţării,
82 N. Ţăndăreanu: Lecţia 4

care au obţinut peste 15 puncte, ordonate descrescător după


media notelor obţinute. Ţările sunt aşezate ı̂n ordinea de-
screscătoare a punctajelor tuturor participanţilor din pagina
afişată.

TEMA nr. 8.17


Se consideră o bază de date care conţine informaţii referitoare la
sportivii participanţi la un campionat de gimnastică, cu următoarea
structură: ŢARA (10 caractere), NUME (20 caractere), NOTA1,
NOTA2 şi NOTA3 (numere ı̂ntre 0 şi 10 cu două zecimale). Se
presupune că ı̂nregistrările nu sunt grupate pentru o ţară şi numărul
de sportivi ai unei ţări diferă de la ţară la ţară.

• Introduceţi date ı̂n tabelul respectiv.

• Scrieţi un program care să primească de la tastatură nu-


mele unui sportiv şi să afişeze informaţiile ataşate acestuia:
ţara,notele şi locul ocupat de concurent ı̂n clasamentul global
al sumei notelor. În cazul ı̂n care nu există nici un sportiv cu
numele respectiv să se afişeze un mesaj corespunzător.

TEMA nr. 8.18


Baza de date CONTURI conţine ı̂nregistrări de forma CONT (string
de lungime 8), NUME FIRMA (25 caractere) şi SOLD (valoare re-
ală ı̂n milioane). Soldul poate fi negativ, ı̂n cazul ı̂n care firma a
N. Ţăndăreanu: Lecţia 4 83

cheltuit mai mult ca disponibilul ei. Primul simbol al contului spe-


cifică clasa contului respectiv şi acesta este o cifră a bazei zece.

• Introduceţi date ı̂n baza respectivă.

• Introduceţi de la tastatură clasa şi afişaţi toate firmele din


clasa respectivă cu sold negativ.

• Ordonaţi ı̂nregistrările din bază ı̂n ordinea descrescătoare a


soldurilor.

TEMA nr. 8.19


Baza de date CONTURI conţine ı̂nregistrări de forma CONT (string
de lungime 8), NUME FIRMA (25 caractere) şi SOLD (valoare re-
ală ı̂n milioane). Primul simbol al contului specifică clasa contului
respectiv şi acesta este o cifră a bazei zece.

• Introduceţi date ı̂n baza respectivă.

• Realizaţi un raport pe baza de date ı̂n care informaţiile pe


o pagină se referă la firmele de o clasă dată, paginile sunt
ordonate ı̂n ordinea crescătoare a claselor, iar pe o pagină
sunt trecute firmele ı̂n ordine alfabetică şi soldurile acestora.

TEMA nr. 8.20


84 N. Ţăndăreanu: Lecţia 4

• Creaţi o bază de date care să conţină date referitoare la bol-


navii internaţi la un spital având ı̂nregistrări cu următoarea
structură: NUME BOLNAV (25 caractere), DIAGNOSTIC
(10 caractere), DATAINT (data internării), MEDIC (20 car-
actere).

• Introduceţi date ı̂n bază.

• Afişaţi bolnavii care sunt internaţi de cel puţin două săptămâni,


ordonaţi ı̂n ordinea crescătoare a datelor de internare.
N. Ţăndăreanu: Lecţia 4 85

TEMA nr. 8.21

• Creaţi o bază de date care să conţină date referitoare la bol-


navii internaţi la un spital având ı̂nregistrări cu următoarea
structură: NUME BOLNAV (25 caractere), DIAGNOSTIC
(10 caractere), DATAINT (data internării), MEDIC (20 car-
actere).

• Introduceţi date ı̂n bază.

• Afişaţi diagnosticul cu care sunt internaţi cei mai mulţi pa-


cienţi, numele pacienţilor ı̂mpreună cu numele medicilor care
ı̂i tratează. Ordonarea se va face după numele medicului, ı̂n
ordinea lexicografică (atât numele medicului cât şi numele
pacienţilor).

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