Lucrarea 12

Implementarea structurilor de tip retea.

1. Reprezentarea structurilor de tip retea

2. Exemplu de implementare

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
************************************

3. Probleme propuse

P1. Rulati exemplele prezentate în acest capitol.

P2. Adaugati formulare pentru adaugarea, stergerea si vizualizarea de exemplare de carti în tabela Carti.dbf. Se considera ca se pot introduce doar exemplare pentru carti care exista ca si tiluri în tabela Titluri.dbf.

s.l. dr. ing. Dan Pescaru '2004