|
Lucrarea
7
Crearea unor formulare
complexe
1. Vizualizarea unei liste de înregistrari
Exemplu:
*** CitVal.PRG - ferestra de citire valori
sir si numerice
FUNCTION openCitVal(titlu, mesaj, val_init,mask, nr_poz)
PUBLIC fmCit, valRet, buOK
valRet = val_init
buOK = .F.
fmCit = new CitValFORM()
fmCit.text = titlu
fmCit.txMesaj.text = mesaj
fmCit.efValoare.Picture = mask
fmCit.efValoare.MaxLength = nr_poz
fmCit.efValoare.value = val_init
fmCit.ReadModal()
IF buOK
RETURN valRet
ENDIF
RETURN CHR(0)
FUNCTION citText(titlu, mesaj, val_init, lng)
* titlu = titlul ferestrei, mesaj
= mesajul explicativ
* val_init = valoarea initiala afisata, lng = nr. maxim
de caractere de citit
cRez = openCitVal(titlu, mesaj, val_init, REPLICATE("X",lng),
lng)
IF ASC(cRez)=0
RETURN ""
ENDIF
RETURN cRez
FUNCTION citNumar(titlu,
mesaj, val_init, lng, nrRenunt)
* titlu = titlul ferestrei, mesaj
= mesajul explicativ
* val_init = valoarea initiala afisata, lng = nr. maxim
de caractere de citit
* nrRenunt = numar ce va fi returnat cad se apasa Renunt
cRez = openCitVal(titlu, mesaj, val_init, REPLICATE("9",lng),
lng)
IF TYPE("cRez")<>"N"
RETURN nrRenunt
ENDIF
RETURN cRez
CLASS CitValFORM OF FORM
this.Left = 60
this.Top = 10
this.Height = 6
this.Width = 54
this.MDI=.F.
DEFINE TEXT txMesaj OF this;
PROPERTY;
Text "Mesaj", Left 4, Top 1, Height
0.76, Width 44
DEFINE ENTRYFIELD efValoare OF this;
PROPERTY;
Value "Valoare", Left 4, Top 2,
Height 1, Width 44
DEFINE PUSHBUTTON buOK OF this;
PROPERTY;
Text "&OK", Left 8, Top 4,
Height 1.5, Width 14,;
OnClick CLASS::buOK_onClick
DEFINE PUSHBUTTON buRenunt OF this;
PROPERTY;
Text "&Renunt", Left 32, Top
4, Height 1.5, Width 14,;
OnClick CLASS::buRenunt_onClick
Procedure buOK_OnClick
buOK = .T.
valRet = form.efValoare.Value
form.Close()
RETURN
Procedure buRenunt_OnClick
buOK = .F.
form.Close()
RETURN
ENDCLASS
*****************************
|
Exemplu:
…
SET PROCEDURE TO CitVal.PRG
cNumePers = cittext("Citire nume", "Introduceti numele",
"", 24)
DO
cAnStudiu = citnumar("Citire an studiu", "Introduceti
anul de studiu", 1, 1, 0)
UNTIL cAnStudiu>0 .AND. cAnStudiu<7
…
|
Exemplu:
Metoda 3
de vizualizare a listelor rezultat:
SEEK cNume
IF EOF()
aPers = new ARRAY(1)
aPers[1] = "Nu exista studenti cu numele "+cNume
ELSE
i=1
aPers = new ARRAY(0)
DO WHILE .NOT. EOF() .AND. nume=cNume
aPers.Add(1)
aPers[i]=CODS+" "+Left(nume,16)+STR(bursa,14,0)
SKIP
i=i+1
ENDDO
ENDIF
form.lbPers.DataSource="ARRAY aPers"
|
2. Selectia datelor conditionate relational
3. Formulare de interogari
Exemplu:
Se va crea cu ajutorul modulului Designer un formular care va avea
câmpuri de editare pentru câmpurile din tabela Stud
si un control de tip BROWSE pentru
vizualizarea masinilor care apartin studentului afisat.
Câmpurile si controlul BROWSE
se vor lega la câmpurile tabelei la rulare. Pentru aceasta
se vor deschide tabele si se va stabili relatia între ele
pe evenimentul onOpen pentru formular.
În ipoteza în care numele câmpurilor sunt efNume,
efAdresa, brMasini
rutina va fi:
USE stud IN 1
USE masini IN 2 INDEX iMCods
SELECT 1
SET RELATION TO cods INTO masini CONSTRAIN
form.efNume.DataLink = stud->nume
form.efAdresa.DataLink = stud->adresa
form.browse_y.alias=masini
form.browse_y.fields=masini->nrm
Butoanele de navigare si cel de închidere a formularului
pot fi cele din exemplele precedente. În plus pe evenimentul
onClose al formularului vor trebui închise tabelele prin:
CLOSE DATABASES
*********************************
|
4. Probleme propuse
P1. Rulati exemplele prezentate în
acest capitol.
P2. Adaugati
la fisierul CitVal.PRG functii pentru citirea
de valori de tip data calendaristica si logic.
P3. Se considera
o baza de date pentru gestionarea informatiei pentru o banca, având
urmatoarele tabele, indexate dup câmpurile subliniate:
Deponent
Conturi
Operatii
Un deponent poate avea mai multe conturi. Pentru
un cont pot exista mai multe înregistrari în tabela Operatii.
Depunerile vor avea valoare pozitiva, iar extragerile valoare negativa.
Câmpul Cont->Suma
va contine suma totala din acel cont (suma tuturor operatiilor efectuate).
Se cere:
a) Sa se creeze un formular care sa afiseze toate conturile pentru
un deponent selectat precum si suma totala pe care deponentul o are la
banca.
b) Sa se creeze un formular care sa afiseze toate operatiile efectuate
într-un cont si care sa verifice corespondenta câmpului Cont->Suma
cu valoarea obtinuta prin însumarea operatiilor efectuate în
cont.
c) Sa se creeze un formular pentru citirea unei operatii de depunere
sau extragere într-un cont al unei anumite persoane. Se va citi
numele persoanei si apoi se va permite selectarea contului dintre cele
apartinând acelei persoane. Nu se va permite extragerea unei sume
care sa depaseasca valoarea contului (din câmpul Cont->Suma).
P4. Se considera
o baza de date pentru gestionarea informatiei legata de un parc de masini,
având urmatoarele tabele:
Proprietari
Masini
NRM |
CNPProp |
An |
Culoare |
CodMas |
TipMasini
CodMas |
Denumire |
Fabricant |
Motor |
Un proprietar poate avea mai multe masini. Fiecare
tabela are un anumit tip în tabela TipMasini.
Se cere:
a) Sa se creeze un formular care sa afiseze intr-un ListBox toate
masinile pentru un proprietar, specificat prin nume.
b) Sa se creeze un formular care sa afiseze intr-un ListBox toate
masinile fabricate de un anumit fabricant, specificat prin nume fabricant.
In lista se vor afisa fabricant, denumire masina, nrm, culoare si nume
proprietar.
c) Sa se creeze un formular care sa afiseze intr-un ListBox toate
masinile care au o anumita culoare, selectata dintr-un listbox cuprinzand
toate culorile distincte intalnite in tabela Masini. In lista se vor afisa
nrm, fabricantul, denumire masina si motor.
©
s.l. dr. ing. Dan Pescaru '2004
|