Exemplu:
Se va scrie un program care sa permita împrumutarea,
restituirea si vizualizarea cartilor împrumutate de un student.
Tabelele sunt cele prezentate anterior. Tabela
Studenti va fi indexata dupa codS în iScodS.ndx si dupa nume
în iSnume.ndx, tabela Titluri va fi indexata dupa titlu în
iTtitlu.ndx, iar tabela Carti dupa NRI în iCnrI.
Pentru aceasta se vor proiecta patru formulare,
dintre care unul principal si trei pentru implementarea operatiilor.
Formularul principal va avea un meniul orizontal
care va permite apelarea celor trei formulare pentru operatii si,
în plus va permite închiderea aplicatiei. Toate formularele
vor fi de tip modal.
Deoarece crearea formularului principal se încadreaza
în subiectele tratate în capitolele anterioare se vor
prezenta în continuare doar formularele pentru operatii.
Formularul de imprumut carti va citi si verifica
un nume de student si un titlu de carte iar la adaugare, daca exista
un exemplar disponibil din cartea respectiva îl va înlantui
în lista de carti împrumutate a studentului respectiv
si va compelta data cu data curenta.
*** Fisierul ImprCarti.WFM
****************
****************************************
…
CLASS imprcartiFORM OF FORM
this.OnOpen = CLASS::FORM_ONOPEN
this.OnClose = CLASS::FORM_ONCLOSE
this.Text = "Imprumut carti"
…
DEFINE ENTRYFIELD EFNUME OF THIS;
PROPERTY;
Valid CLASS::EFNUME_VALID,;
Value "",;
…
DEFINE TEXT TXCODS OF THIS;
PROPERTY;
Text "",;
…
DEFINE ENTRYFIELD EFTITLU OF THIS;
PROPERTY;
Valid CLASS::EFTITLU_VALID,;
Value "",;
…
DEFINE TEXT TXAUTOR OF THIS;
PROPERTY;
Text "",;
…
DEFINE PUSHBUTTON BUIMPRUMUT OF THIS;
PROPERTY;
Group .T.,;
Text "&Imprumuta",;
OnClick CLASS::BUIMPRUMUT_ONCLICK,;
…
DEFINE PUSHBUTTON BURENUNT OF THIS;
PROPERTY;
Group .T.,;
Text "&Renunta",;
OnClick CLASS::BURENUNT_ONCLICK,;
…
Procedure Form_OnOpen
SET EXACT OFF
USE studenti IN 1 INDEX iSNume ALIAS stud
USE titluri IN 2 INDEX iTtitlu ALIAS tit
USE carti IN 3
RETURN
Procedure Form_OnClose
CLOSE DATABASE
RETURN
Procedure EFNUME_Valid
SELECT stud
SEEK TRIM(form.efNume.value)
IF FOUND()
form.txCods.text = cods
form.efNume.value = nume
ELSE
form.txCods.text = "Nu exista!"
ENDIF
RETURN .T.
Procedure EFTITLU_Valid
SELECT tit
SEEK TRIM(form.efTitlu.value)
IF FOUND()
form.txAutor.text = autor
form.efTitlu.value = titlu
ELSE
form.txAutor.text = "Nu exista!"
ENDIF
RETURN .T.
Procedure BURENUNT_OnClick
form.Close()
RETURN
Procedure BUIMPRUMUT_OnClick
* verifica datele introduse
IF form.txCods.text = "Nu exista!"
MsgBox("Student invalid!")
form.efNume.SetFocus()
RETURN
ENDIF
IF form.txAutor.text = "Nu exista!"
MsgBox("Cartea nu exista!")
form.efTitlu.SetFocus()
RETURN
ENDIF
* verifica daca exista un exemplar liber
SELECT tit
SEEK TRIM(form.efTitlu.value)
pCarte = pInv
SELECT carti
DO
GO pCarte
IF ""=TRIM(codS)
EXIT
ENDIF
pCarte = UrmT
UNTIL pCarte = -1
IF pCarte = -1
MsgBox("Nu exista nici un exemplar disponibil!")
form.efTitlu.SetFocus()
RETURN
ENDIF
* imprumuta exemplarul gasit
SELECT stud
SEEK TRIM(form.efNume.value)
pOldPCI = PCI
* Adauga in fata listei
REPLACE PCI WITH pCarte
SELECT Carti
REPLACE cods WITH stud->cods
REPLACE data WITH DATE()
REPLACE UrmS WITH pOldPCI
form.Close()
RETURN
ENDCLASS
*************************************
Formularul de restituire carte va citi un nume de student si va
completa un combobox cu toate cartile împrumutate. Retituirea
se va realiza prin scoaterea din lista cu înlantuirea urmS.
*** Fisierul restCarti.WFM
******
…
CLASS restcartiFORM OF FORM
this.OnOpen = CLASS::FORM_ONOPEN
this.OnClose = CLASS::FORM_ONCLOSE
this.Text = "Restituire carte"
…
DEFINE ENTRYFIELD EFNUME OF THIS;
PROPERTY;
Value "",;
Valid CLASS::EFNUME_VALID,;
…
DEFINE TEXT TXCODS OF THIS;
PROPERTY;
Text "",;
…
DEFINE COMBOBOX CBCARTI OF THIS;
PROPERTY;
Style 1,;
…
DEFINE PUSHBUTTON BURESTITUIE OF THIS;
PROPERTY;
Text "&Restituie",;
OnClick CLASS::BURESTITUIE_ONCLICK,;
…
DEFINE PUSHBUTTON BURENUNTA OF THIS;
PROPERTY;
Text "&Renunta",;
OnClick CLASS::BURENUNTA_ONCLICK,;
…
Procedure EFNUME_Valid
aCarti = NEW ARRAY(0)
SELECT stud
SEEK TRIM(form.efNume.value)
IF FOUND()
form.txCods.text = cods
form.efNume.value = nume
IF PCI=-1
MsgBox("Nu a imprumutat nici o carte!")
ELSE
nPoz = PCI
SELECT carti
DO
GO nPoz
aCarti.Add(1)
strCarte = LEFT(LTRIM(STR(NRI,7))+REPL(" ",9),9)
SELECT tit
GO carti->pTitlu
strCarte = strCarte + titlu
aCarti[aCarti.size] = strCarte
SELECT carti
nPoz = urmS
UNTIL nPoz = -1
ENDIF
ELSE
form.txCods.text = "Nu exista!"
ENDIF
form.cbCarti.dataSource = "ARRAY aCarti"
IF(aCarti.size>0)
form.cbCarti.value = aCarti[1]
ELSE
form.cbCarti.value = ""
ENDIF
RETURN .T.
Procedure BURENUNTA_OnClick
form.Close()
RETURN
Procedure Form_OnOpen
PUBLIC aCarti
SET EXACT OFF
USE studenti IN 1 INDEX iSNume ALIAS stud
USE titluri IN 2 INDEX iTtitlu ALIAS tit
USE carti IN 3
aCarti = new ARRAY(0)
form.cbCarti.dataSource = "ARRAY aCarti"
form.cbCarti.value=""
RETURN
Procedure Form_OnClose
CLOSE DATABASE
RELEASE aCarti
RETURN
Procedure BURESTITUIE_OnClick
strCarte = form.cbCarti.value
nNRI = VAL(LEFT(strCarte,6))
IF nNRI=0
MsgBox("Nu a fost selectata nici o carte!")
RETURN
ENDIF
SELECT stud
SEEK TRIM(form.efNume.value)
nPoz = PCI
SELECT carti
GO nPoz
IF NRI = nNRI
* cartea se afla pe prima pozitie in lista
* scot de la inceput
nUrm = urmS
REPLACE codS WITH ""
REPLACE data WITH {0/0/0}
REPLACE urmS WITH 0
SELECT stud
REPLACE PCI WITH nUrm
ELSE
* scot din mijlocul listei
DO
GO urmS
IF NRI = nNRI
nUrm = urmS
REPLACE codS WITH ""
REPLACE data WITH {0/0/0}
REPLACE urmS WITH 0
GO nPoz
REPLACE urmS WITH nUrm
EXIT
ELSE
nPoz = RECNO()
IF urmS = -1
MasgBox("Tabela de carti este eronata!")
EXIT
ENDIF
ENDIF
UNTIL .F.
ENDIF
form.Close()
RETURN
ENDCLASS
*******************************
Fereastra de vizualizare împrumuturi foloseste aproape acelasi
de la completarea comboboxului anterior. Diferenta este ca afisarea
se va face într-un listbox.
*** fisierul ListsCarti.WFM ************
…
CLASS listcartiFORM OF FORM
…
Procedure EFNUME_Valid
aCarti = NEW ARRAY(0)
SELECT stud
SEEK TRIM(form.efNume.value)
IF FOUND()
form.txCods.text = cods
form.efNume.value = nume
IF PCI=-1
aCarti.Add(1)
aCarti[1] = "Nu a imprumutat nici o carte"
ELSE
nPoz = PCI
SELECT carti
DO
GO nPoz
aCarti.Add(1)
strCarte = LEFT(LTRIM(STR(NRI,7))+REPL(" ",9),9)
SELECT tit
GO carti->pTitlu
strCarte = strCarte + titlu
SELECT carti
strCarte = LEFT(strCarte+REPL(" ",32),32) + DTOC(data)
aCarti[aCarti.size] = strCarte
nPoz = urmS
UNTIL nPoz = -1
ENDIF
ELSE
form.txCods.text = "Nu exista!"
ENDIF
form.lbCarti.dataSource = "ARRAY aCarti"
RETURN .T.
…
ENDCLASS
************************************
|