Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Foxpro


Qdidactic » stiinta & tehnica » informatica » foxpro
Lucrul cu campurile memo



Lucrul cu campurile memo



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 ’ DACIA 1410 break’

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>






Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright