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
 CodD   Nume   Adresa   Telefon 

Conturi
 CodD   Cont   Suma 

Operatii
 Cont   Data   Valoare 

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
 CNP   Nume   Adresa   Telefon 

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