CATEGORII DOCUMENTE |
Sunt situatii cand, intr-un anumit camp al unei baze de date, trebuiesc memorate cantitati variabile de informatii. Astfel, intr-o evidenta a personalului unei unitati, informatia studii poate avea lungimea variind de la cateva caractere ("Liceu Informatica, Iasi") la cateva zeci de caractere ("Academia de Studii Economice, Facultatea de Cibernetica Economica, Bucuresti"). Care va fi dimensiunea campului (de tip caracter) care va retine aceasta informatie?
Desigur, campul va fi dimensionat maxim (sa zicem 100 caractere) pentru a putea retine corect toate informatiile, dar sa nu neglijam faptul ca la o parte din articole, poate chiar la majoritatea, vor ramane zone nefolosite. Pe de alta parte, este stiut faptul ca lungimea articolului determina direct marimea timpului de raspuns la interogarile utilizatorilor. Deci, informatia este in intregime memorata, dar in defavoarea timpului de acces si a utilizarii spatiului pe disc.
Ce se intampla daca, in majoritatea aplicatiilor nu avem nevoie de aceste informatii despre studiile personalului?
O solutie ar fi memorarea studiilor intr-o baza de date auxiliara, legata de fisierul principal prin intermediul unui cod. O alta solutie este folosirea tipului memo.
O baza de date, care contine cel putin un camp memo, are asociat un fisier suplimentar in care sunt depuse informatiile propriu-zise. Fisierul asociat poarta acelasi nume ca baza de date si se deschide simultan cu aceasta.
Accesul sistemului la continutul unui camp memo al unui anumit articol se face in modul urmator:
se selecteaza articolul si campul memo dorit;
se citeste adresa inregistrata in campul memo;
se localizeaza zona din fisierul memo care corespunde adresei citite;
se permite accesul la informatia de la aceasta adresa.
Incarcarea unor date intr-un camp memo, la o anumita inregistrare, se face dupa urmatoarele etape:
se gaseste un spatiu liber in fisierul memo asociat bazei de date, suficient pentru memorarea tuturor datelor si se incarca aceste date in spatiul respectiv;
se completeaza la inregistrarea dorita, in campul memo, adresa zonei din fisierul memo unde s-au incarcat datele.
Incarcarea unor date intr-un camp memo se poate face fie direct de catre utilizator, caracter cu caracter, intr-o fereastra de editare, fie prin citirea acestor caractere dintr-un fisier text.
Introducerea directa de catre utilizator se face prin intermediul comenzilor de actualizare APPEND, EDIT, BROWSE. Dupa pozitionarea pe articolul al carui camp memo dorim sa-l introducem sau sa-l editam, vom deschide fereastra de editare prin tastele <ctrl><home>. Iesirea cu salvare se face prin tastele <ctrl><end> / <ctrl><w>.
Pentru a edita un camp memo, fara a mai trece prin fereastra de editare Change, se poate folosi comanda MODIFY MEMO, care deschide direct o fereastra de editare pentru campul memo specificat, al inregistrarii curente din baza de date activa.
MODIFY MEMO <camp memo 1>[,<camp memo 2>.,][ NOEDIT]
[NOWAIT][RANGE <expN1>, <expN2>] [WINDOW<nume fereastra>]
Clauza NOEDIT nu permite modificarea continutului campului memo.
Clauza NOWAIT se foloseste numai in interiorul unui program si are ca efect continuarea executiei programului, dupa deschiderea ferestrei de editare, fara a mai astepta ca utilizatorul sa modifice campul memo respectiv.
Clauza RANGE se foloseste atunci cand se doreste ca numai o portiune din campul memo sa fie editata, si anume partea cuprinsa intre <expN1> si <expN2>.
Clauza WINDOW permite deschiderea ecranului de editare intr-o fereastra.
Exemplu:
USE mijloacef
GO TO 2
MODIFY MEMO loc_folos RANGE 1,40
NOTE se modifica inregistrarea 2, campul loc_folos, numai primele 40 de caractere.
GO TO 4
MODIFY MEMO loc_folos NOEDIT
NOTE se afiseaza campul loc_folos al inregistrarii 4 fara a se permite modificarea sa.
USE
Inchiderea ferestrei memo de editare se poate face folosind comanda CLOSE MEMO.
CLOSE MEMO <camp memo> [ , <camp memo2>..] | ALL
Se vor inchide ferestrele de editare corespunzatoare campurilor memo specificate in lista, salvandu-se eventualele modificari facute acestor campuri. La inchiderea unei baze de date se vor inchide, de asemenea, si ferestrele memo deschise in acel moment, pentru campurile memo ale bazei de date. Clauza ALL are ca efect inchiderea tuturor ferestrelor memo deschise, pentru toate zonele de lucru.
Exemplu:
USE mijloacef
MODIFY MEMO loc_folos NOWAIT
NOTE se deschide fereastra de editare a campului memo loc_folos;
Fara a astepta modificarea campului
WAIT 'Asteptati TIMEOUT 5
NOTE se face o pauza de 5 secunde
CLOSE MEMO loc_folos
NOTE se inchide fereastra memo respectiva
USE
Introducerea datelor dintr-un fisier text se face prin comanda:
APPEND MEMO <camp memo> FROM <fisier> [OVERWRITE ]
Intregul continut al fisierului se adauga sau se suprascrie (clauza OVERWRITE) in campul memo.
Exemplu: se va adauga o noua inregistrare la baza de date mijloacef, campul LOC_FOLOS fiind completat din fisierul ADRESA.TXT ce contine informatiile respective.
USE mijloacef
APPEND BLANK
REPLACE cod WITH ' Masina '
REPLACE denimire
WITH '
REPLACE data_inst WITH ( 08 /21/99)
REPLACE stare WITH .T.
APPEND MEMO loc_folos FROM adresa.txt OVERWRITE
Operatiunea inversa, de extragere dintr-un camp memo a informatiilor intr-un fisier text peste, sau in continuarea vechiului continut, se face prin comanda:
COPY MEMO <camp memo> to <fisier> [ ADDITIVE]
Exemplu:
USE mijloacef
COPY MEMO loc_folos TO adresa.txt
NOTE se copiaza prima adresa
GO TO 2
COPY MEMO loc_folos TO adresa.txt ADDITIVE
NOTE se copiaza a doua adresa
GO TO 3
COPY MEMO loc_folos TO adresa.txt ADDITIVE
NOTE se copiaza a treia adresa
MODIFY FILE adresa.txt NOEDIT
NOTE se vizualizeaza fisierul adresa.txt
USE
Exemplu: sa consideram baza de date mijloacef in care se doreste schimbarea intre ele a locurilor de folosinta ale inregistrarilor 2 si 4. Aceasta se va realiza folosind ca intermadiar fisierul ADRESA.TXT.
CLOSE ALL
USE mijloacef
USE mijloacefin 2 AGAIN
NOTE se deschide baza de date mijloacef si in zona de lucru 2
GO TO 2
COPY MEMO loc_folos TO adresa.txt
NOTE se copiaza campul memo loc_folos al inregistrarii 2 in fisierul adresa.txt
GO TO 4 in B
REPLACE loc_folos WITH b. loc_folos
NOTE se inlocuieste campul memo loc_folos al inregistrarii 2 ( zona de lucru 1 );
cu campul memo loc_folos al inregistrarii 4 ( zona de lucru 2 )
GO TO 4
APPEND MEMO loc_folos FROM adresa.txt OVERWRITE
NOTE se copiaza continutul fisierului adresa.txt in campul loc_folos al inregistrarii 4;
( zona de lucru 1 )
BROWSE
CLOSE ALL
O alta modalitate de a schimba cele doua campuri memo din baza de date este reprezentata de urmatorul program:
CLOSE ALL
USE mijloacef
USE mijloacefin 2 AGAIN
GO TO 2
V= loc_folos
GO TO 4 in B
REPLACE loc_folos WITH b. loc_folos
GO TO 4
REPLACE loc_folos WITH v
BROWSE
CLOSE ALL
Functii relative la campurile memo:
1. MLINE(<camp memo>, <numar>) extrage din campul memo linia data prin numarul ei.
2. MEMLINES (<camp memo>) da numarul de linii al campului memo.
Observatii: Ambele functii sunt influentate de comanda:
Exemplu: sa presupunem ca in campul loc_folos al inregistrarii curente din baza de date mijloacef avem urmatorul text:
Bucuresti
Strada Cuza Voda, nr. 54
Sector 4
Atunci:
? MEMLINE (loc_folos )
NOTE numarul de linii din campul memo
3
? MLINE (loc_folos, 2 )
Strada Cuza Voda, nr. 54
? MLINE (loc_folos, 1, 0 )
Bucuresti
? MLINE (loc_folos, 1, 1 )
ucuresti
? MLINE (loc_folos, 1, 11 )
Strada Cuza Voda, nr. 54
? MLINE (loc_folos, 1, 12 )
trada Cuza Voda, nr. 54
? MLINE (loc_folos, 4 ) ==" "
.T.
Valorile returnate de functiile MEMLINE ( ) si MLINE ( ) sunt influentate de comanda:
SET MEMOWIDTH TO <numar>
Comanda fixeaza lungimea liniilor din campul memo la <numar>.
Implicit lungimea maxima este de 50 caractere; minim pot fi 8 caractere.
Exemplu: vom folosi acelasi camp memo ca si la exemplul anterior:
SET MEMOWIDTH TO 60
? loc_folos
Bucuresti
Strada Cuza Voda, nr. 54
Sector 4
? MEMLINE (loc_folos )
? MLINE (loc_folos, 2 )
Strada Cuza Voda, nr. 54
SET MEMOWIDTH TO 12
? loc_folos
Bucuresti
Strada Cuz
a Voda, nr.
Sector 4
? MEMLINE (loc_folos )
? MLINE (loc_folos, 2 )
Strada Cuz
Observatii: exista o comanda FoxPro prin care se poate deschide o fereastra de editare pentru fiecare camp memo:
Transfer de date intre fisiere si tablouri
De multe ori folosirea tablourilor de date este preferabila folosirii fisierelor de date, pentru ca viteza de accesare a memoriei este net superioara vitezei de accesare a discului. De exemplu, sortarea unui masiv este mult mai rapida decat sortarea unui fisier. Comunicarea intre baze de date si tablouri se realizeaza in ambele sensuri prin comenzi corespunzatoare.
Adaugarea datelor dintr-un tablou intr-o baza de date se poate face prin comanda:
APPEND FROM ARRAY <tablou> [FOR<cond>]
Se adauga la baza de date articolele preluate dintr-un tablou; fiecare linie corespunde unei inregistrari; coloanele se copiaza in ordinea campurilor; se ignora elementele in plus; campurile suplimentare se completeaza automat cu valori vide. Se face conversia la tipul campului, iar daca lungimea este mai mica pentru campuri caracter, se inlocuieste cu asterisc.
Trecerea articolelor din baza de date intr-un tablou se face cu ajutorul comenzii:
COPY TO ARRAY <tablou> [FIELDS <lista campuri>]
[<domeniu>] [FOR<cond>] [WHILE<cond>]
Fiecare articol devine o linie. Daca numarul de inregistrari depaseste numarul de linii, se ignora cele in plus. Spre deosebire de APPEND, se pot selecta campurile care vor fi copiate in tablou prin clauza FIELDS <lista campuri>.
Corectia unor valori ale bazei de date prin utilizarea tablourilor se face la comanda:
REPLACE FROM ARRAY <tablou> [FIELDS<lista campuri>]
[<domeniu>][FOR<cond>][WHILE<cond>]
Se inlocuiesc cu elementele din tabloul specificat acele valori care corespund campurilor din clauza FIELDS (implicit toate campurile) pentru articolele selectate prin clauzele de selectie: <domeniu>, FOR, WHILE. Comanda REPLACE are ca domeniu implicit articolul curent.
Observatii: Sunt cateva comenzi noi in FoxPro relativ la comunicarea intre tablouri si baze de date: GATHER, SCATTER:
a.Adaugarea datelor dintr-un tablou in baza de date se face prin:
GATHER FROM <tablou>/MEMVAR [FIELDS<lista- camp>][MEMO]
Comanda permite copierea continutului tabloului <tablou> sau a unei variabile de memorie in baza de date activa, in inregistrarea curenta, in campurile precizate in clauza FIELDS.
MEMVAR desemneaza variabilele de memorie folosite avand acelasi nume cu campurile in care se vor copia.
MEMO este necesara daca printre campurile de copiat se gaseste si un camp memo.
b. Copierea datelor din baza de date intr-un tablou se face prin comanda:
SCATTER [FIELDS <lista-camp>][memo] TO <tablou>/MEMVAR
Campurile din baza de date activa specificate in clauza FIELDS (sau toate campurile, optiune implicita) se vor copia in tabloul din clauza TO <tablou> sau in variabilele speciale (clauza MEMVAR).
Functii relative in fisiere
nrc |
functia |
explicatii |
FIELD (<expn>)[,<alias>] |
da numele campului cu numar de ordine <expN> |
|
RECSIZE () [<alias>] |
intoarce dimensiunea in octeti a structurii bazei |
|
TYPE (<camp>) |
intoarce tipul unui camp precizat ca sir de caractere |
|
FLDCOUNT () |
intoarce numarul de campuri din structura fisierului |
|
RECHO() [<alias>] |
intoarce numarul articolului curent |
|
EOF() [<alias>] |
intoarce .T. daca s-a ajuns la sfarsitul de fisier |
|
BOF() [<alias>] |
intoarce .T. daca s-a ajuns inaintea primului articol |
|
RECCOUNT() [<alias>] |
intoarce numarul de articole din baza de date activa |
|
FOUND() |
intoarce .T. daca articolul cautat a fost gasit |
|
SELECT() |
da prima zona libera (ca numar) |
|
MLINE(<camp>, <numar>) |
extrage din campul memo linia data prin numarul ei |
|
MEMLINES (<camp>) |
da numarul de linii al campului memo |
|
LOOKUP (<camp1>, <exp>, <camp2>) |
intoarce valoarea <camp1> a articolului care verifica <exp> in campul <camp2> |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1202
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved