Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
TABLOURI DE VARIABILE, MASIVE
In activitatea de programare, poate aparea necesitatea lucrului cu variabile indexate sau variabile dublu indexate, cazuri similare cu cele din algebra cand utilizam matrici. De aceea alocam un mic spatiu acestor situatii.
DEFINIRE TABLOURI DE VARIABILE (DIMENSION).
Exemple :
DIME T(10) are drept efect definirea unui tablou de variabile de dimensiune 10.
Si anume :
T(1), T(2), . , T(10)
DIME A(2,3) are drept efect definirea unui tablou de dimensiuni 2 x 3, deci de 6 variabile dublu indexate:
A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
T, A din DIMENSION reprezinta numele tabloului atribuit de utilizator, iar parametrii din paranteze reprezinta dimensiunea tabloului.
Referirea la anumite variabile se face prin numele tabloului si 'indicele sau indicii' coreapunzator :
T(5) este cea de a 5 - a variabila din tabloul T.
A(2,1) este variabila din linia a 2 - a, coloana I - a din tabloul A etc.
INITIALIZARE TABLOURI DE VARIABILE.
Initializarea unui tablou se poate face GLOBAL sau INDIVIDUAL pentru fiecare variabila din tablou in parte. Iata :
STORE 0 TO T
are drept efect atribuirea valorii 0 tuturor celor 10 variabile T(1), . , T(10)
Sau
STORE 1 TO A
va avea ca efect atribuirea valorii 1 tuturor celor 6 variabile din tabloul definit mai sus.
Acestor tipuri de initializari le spunem ca se executa 'GLOBAL' pentruca toate variabilele tabloului iau aceeasi valoare stabilita printr-o comanda :
STORE <valoare> TO <nume tablou>
Initializarea INDIVIDUALA se refera la faptul ca aceasta operatie (initializarea) se executa variabila cu variabila :
STORE 0 TO T(1),T(3),T(4)
STORE SPACE(5) TO T(2)
STORE 'POPESCU ION' TO T(5)
STORE 'STR A VLAICU BL Z99 SC A APT 88' TO T(6) etc
Sau
A(1,1) = 17
A(1,2) = 11
A(1,3) = 2000
A(2,1) ='VINERI'
A(2,2) = 'NOIEMBRIE' etc.
Din exemplele de mai sus, mai deducem ca in FOX se poate lucra cu tablouri de variabile de tipuri diferite chiar in acelasi tablou. Unele variabile pot fi numerice, altele de tip sir de caractere, de tip logic, de tip data calendaristica etc.
Evident, la initializarea globala, prin atribuirea aceleiasi valori tuturor variabilelor din tablou, aceste variabile vor avea acelasi tip.
In mod obisnuit, pentru a lucra cu tablouri, mai intai acestea trebuie definite : DIMENSION . , apoi procedam la initializari sau atribuiri de valori acestor tablouri sau variabile ale tablourilor.
In lucrarea FOXPRO 2.5 2.6 de G Dima si M Dima Ed TEORA cap 4, este dezvoltata aceasta tema foarte bine si o recomandam acelor cititori care vor sa - si completeze cunostintele si cu alte facilitati si instrumente de lucru cu masive si tablouri.
In continuare ne referim la folosirea de tablouri pentru lucrul cu datele din inregistrarea curenta a unui fisier de date, si anume la comenzile :
01. SCATTER , GATHER.
SCATTER este comanda prin care se transfera datele inregistrarii curente in variabilele unui tablou .
Exemplu :
Fisierul TAXE.DBF are structura data in cursul C02 pagina 21:
SECTIA C 10
ANSTUD N 1
FORMA C 3
NRLEG N 7
NUMSTUD C 20
RATA_1 N 8
RATA_2 N 8
RATA_3 N 8 cu semnificatiile precizate.
Presupunem ca fisierul contine date si dorim modificarea unor date din anumite inregistrari.
Inregistrarea curenta este cea marcata hasurat, corespunzatoare studentului POP ION.
SECTIA |
ANSTUD |
FOR- MA |
NRLEG |
NUMSTUD |
RATA_1 |
RATA_2 |
RATA_3 |
. | |||||||
MARKETING |
2 |
ZI |
112233 |
POP ION |
3500000 |
3000000 |
0 |
. |
| ||||||
. |
SCATTER TO T
T(1) T(2) T(3) T(4) T(5) T(6) T(7) T(8)
FIGURA C03.14 (SCATTER TO T)
Comanda :
SCATTER TO T
Are drept efect (vezi figura de mai sus
Transferul datelor din inregistrarea curenta in variabilele unui tablou.
Tabloul se creaza odata cu executia comenzii.
Variabilele se 'initializeaza' cu valorile din campurile din inregistrarea curenta.
Dimensiunea tabloului este 8 pentruca inregistrarea contine 8 campuri.
Nu este obligatoriu pentru aceasta comanda ca tabloul T, sa fi fost predefinit.
Tipurile variabilelor vor fi aceleasi cu ale campurilor care au 'transmis' datele.
Deci in urma executiei comenzii ,
Variabila T(1) are valoarea 'MARKETING',
Variabila T(2) are valoarea 2
Variabila T(3) are valoarea 'ZI '
.
Variabila T(8) are valoarea 0.
Corespondenta dintre campurile fisierului si variabilele tabloului este 'gestionata' de FOX.
Acum, modificam valorile din aceste variabile (din toate sau doar din unele).
T(8)=1500000
Deci in variabila corespunzatoare pt RATA_3 am introdus 1500000 care va 'inlocui' pe cea preexistenta adica pe 0.
Nemodificand indicatorul de inregistrare, deci pastrand inregistrarea curenta care a 'furnizat' datele, ne punem problema ca datele din tablou (eventual modificate) sa le aducem in inregistrarea de unde au fost transferate in memoria de lucru.
Folosim o comanda cu efect invers :
GATHER FROM T
In acest fel valorile din variabilele tabloului T vor fi transferate in campurile din inregistrarea curenta :
T(1) ----------> SECTIA
T(2) ----------> ANSTUD
T(3) ----------> FORMA
.
T(8) ----------> RATA_3
In acest fel, in inregistrarea curenta s-au readus aproape toate datele nemodificate, doar pentru RATA_3 in loc de 0 s-a adus 1500000.
Pentruca tabloul T a fost creat de SCATTER, la aplicarea comenzii GATHER nu avem probleme de compatibilitate intre tipurile variabilelor si numarul lor cu tipurile campurilor si numarul acestor campuri.
Daca tabloul T este creat de utilizator cu DIMENSION, si atribuim valori acestor variabile, pentruca GATHER sa se execute corect, este necesar ca sa asiguram compatibilitatea dintre variabile,tipurile lor,continuturile acestora,numarul variabilelor si campurile fisierului ca tipuri,lungimi si numarul campurilor.
Acest mod de lucru, pe langa unele avantaje, are si dezavantaje dintre care mentionam doar pe cel al gestionarii variabilelor indexate create de SCATTER (care variabila are semnificatia RATA_1, care are semnificatia FORMA, etc).
Alte forme ale celor 2 comenzi, sunt mult mai comode in lucrul cu inregistrari din fisiere de date.
01.1 SCATTER MEMVAR, GATHER MEMVAR.
SCATTER MEMVAR va avea efectul schitat in figura de mai jos:
SECTIA |
ANSTUD |
FOR- MA |
NRLEG |
NUMSTUD |
RATA_1 |
RATA_2 |
RATA_3 |
. | |||||||
MARKETING |
2 |
ZI |
112233 |
POP ION |
3500000 |
3000000 |
0 |
. | |||||||
. |
SCATTER MEMVAR
M.SECTIA M.FORMA M.NUMSTUD M.RATA_2
M.ANSTUD M.NRLEG M.RATA_1 M.RATA_3
FIGURA C03.16 (SCATTER MEMVAR)
In urma executiei comenzii SCATTER MEMVAR, datele din inregistrarea curenta s-au transferat in variabile de lucru in memorie care au acelasi nume cu al campurilor din fisier (verificati tastand DISP MEMO). Pentru lucrul cu aceste variabile, utilizatorul va adauga 'prefixul M.' fiecarui nume de camp din structura fisierului activ.
Acum modific date, daca este cazul :
M.RATA_3 = 1500000
Readucerea datelor din memorie in inregistrarea curenta o vom executa cu comanda simetrica :
GATHER MEMVAR
In programare, vom avea avantajul ca numele variabilelor este acelasi cu al campurilor, mai putin prefixul si deci nu avem problema semnificatiilor variabilelor in care se face transferul de catre SCATTER.
Transferul invers cu GATHER MEMVAR, se face automat din variabile in campuriile corespunzatoare, scutindu-ne de utilizarea unor comenzi REPLACE.
Inafara unor interventii brutale si aleatorii asupra variabilelor, nu vom avea nici probleme de compatibilitate intre variabile si campuri (in cazul utilizarii lui GATHER).
Pentru utilizarea altor variante ale comenzilor SCATTER, GATHER recomandam HELP-ul sistemului FOX, sau cap 5.17 din cartea mentionata in pagina C03.13.
01.2 LUCRUL CU CAMPURI DE TIP MEMO.
In C 01 pagina 02 am dat un exemplu de lista: TABEL C01.02.
Pentru aceasta lista, datele din coloana ADRESA pot avea lungimi variabile.
Daca dorim sa creem fisierul ANGAJATI.DBF pentru datele corespunzatoare acestei liste atunci in structura vom introduce pentru coloana respectiva un camp de tip MEMO:
NRLEG N 5 nr legitimatie
NUMPR C 25 nume prenume
ANANG N 4 anul angajarii
DNAST D 8 data nasterii
ADRES Memo 10 adresa angajatului
Salvam structura si introducem date fie cu APPEND, fie cu BROWSE.
Pentru primele 4 coloane introducem pe rand :
NRLEG NUMPR ANANG DNAST ADRES
.
2013 ZLATARIU MARIN 1998 31/08/79 Memo
Ajungand in coloana ADRES sub care, in inregistrarea curenta, apare scris Memo,
pentru a putea introduce adresa
vom tasta CTRL + PGDN activand o fereastra specifica unui
astfel de camp. Acum introducem adresa completa (
Terminand introducerea adresei tastand CTRL + W, salvam continutul introdus si se inchide fereastra specifica unui camp MEMO, revenind in fereastra APPEND sau BROWSE.
Ce s - a intamplat la crearea structurii in care am introdus un
Fisierului ANGAJATI.DBF i s-a asociat un fisier ANGAJATI.FPT in care se vor pastra datele corespunzatoare campului ADRES de tip MEMO.
Gestiunea legaturilor dintre fisierele DBF si cele asociate FPT o realizeaza sistemul FOX,
utilizatorului revenindu - i sarcina sa stie cum sa exploateze datele dintr-un asemenea camp (introducere date, consultarea acestora).
Deasemenea, la salvarea fisierelor de date, trebuie sa nu uitam de cele asociate (FPT).
Un camp MEMO poate fi activat (CTRL + PGDN) in vederea vizionarii continutului sau, modificandu-l eventual. Iesirea din fereastra MEMO se face cu CTRL + W daca dorim
salvarea modificarilor efectuate sau cu ESC daca nu dorim salvarea modificarilor efectuate in continutul campului.
Alte comenzi, specifice acestor tipuri de campuri, le gasiti in cartea mentionata mai sus cap 5.16 CAMPURILE MEMO.
Noi vom folosi in exemple si campuri MEMO atentionand cititorul asupra unor aspecte practice, in capitolele destinate realizarii de programe.
Acum :
01.3 SCATTER MEMVAR MEMO, GATHER MEMVAR MEMO.
Daca fisierul activ este ANGAJATI.DBF si inregistrarea curenta este cea de mai sus referitoare la ZLATARIU MARIN, atunci o comanda ca :
SCATTER MEMVAR MEMO
Va avea efectul descris la SCATTER MEMVAR, dar in plus, va fi transferata in variabila de memorie corespunzatoare si valoarea din campul ADRES de tip MEMO.
Pentru utilizator accesul la o asemenea variabila se face folosind 'prefixul' : M.
? M.ADRES este comanda de afisare a continutului variabilei M.ADRES
Continutul acestei variabile poate fi modificat asemanator unei variabile de tip sir de caractere.
M.ADRES = SUBSTR(M.ADRES,1,5)+'A VLAICU str Aleea AMARA nr 2'
Readucerea datelor din variabilele de lucru din memorie in inregistrarea curenta se face cu :
GATHER MEMVAR MEMO
In acest fel s-au actualizat si datele din campul MEMO din fisier, respectiv fisierul FPT asociat.
Deja am utilizat 2 comenzi pentru campul MEMO :
Afisarea continutului : ? M.ADRES , si atribuirea de valoare : M.ADRES = .
In plus am utilizat si functia SUBSTR(), si operatorul de concatenare ' + '.
Cititorul este indemnat sa exerseze exemplele date mai sus. Revenind in BROWSE si ajungand in campul MEMO, cu CTRL + PGDN vizualizam continutul acestuia si vom constata ca s-a modificat, dupa aceea iesim cu ESC.
Copyright © 2024 - Toate drepturile rezervate