Zone de lucru. Sortare si indexare.
În aplicatii, apare necesitatea de a lucra cu mai multe tabele în paralel. Pentru aceasta, mediul Foxpro dispune de zone de lucru, iar în fiecare dintre acestea se poate deschide câte un tabel. Aceste zone de lucru sunt numerotate cu numere naturale de la 1 la 32767, iar primele 10 pot fi referite si prin literele A-J. De asemenea, o zona de lucru poate fi referita prin tabelul deschis în cadrul acesteia.
Comenzi si functii utile :
· USE <nume_tabel> [IN <zona>] deschide tabelul T în zona de lucru n . Daca nu se precizeaza zona de lucru, tabelul va fi deschis în zona curenta.
· USE (fara parametri) determina închiderea tabelului deschis în zona de lucru curenta.
· SELECT n | alias_tabel determina ca zona de lucru identificata prin n sau alias_tabel sa devina zona cur 13213e419n enta . Un alias este un nume atribuit unui tabel ; un tabel poate fi referit prin alias-ul sau sau prin zona de lucru în care este deschis.
· SELECT 0 selecteaza (determina sa fie zona curenta) zona de lucru n, unde n este cel mai mic numar de zona nefolosita.
· SELECT([ 0 | 1 | alias_tabel ])
SELECT(0) - întoarce numarul zonei curente
SELECT(1) - întoarce un numar n, unde n este cel mai mare numar corespunzator unei zone neutilizate.
SELECT(alias_tabel) - întoarce numarul zonei în care este deschis tabelul cu aliasul respectiv.
SELECT() - întoarce numarul zonei curente daca SET COMPATIBLE este OFF si numarul minim al zonei neutilizate daca SET COMPATIBLE este ON.
· USED([<zona>]) -întoarce .T. sau .F., dupa cum zona de lucru specificata este utilizata sau nu (i.e. exista un tabel deschis în aceasta). Daca nu se specifica zona, este vorba de cea curenta.
· DBF(alias_tabel | zona) - întoarce numele tabelului care are alias-ul respectiv sau care este deschis în zona de lucru specificata.
Pentru observarea zonelor de lucru si a tabelelor deschise în cadrul acestora, se utilizeaza optiunea Data Session din meniul Window.
Pentru situatiile practice, un tabel ordonat este mult mai folositor. Ordonarea unui tabel presupune:
- alegerea unui câmp al tabelului drept criteriu de sortare;
- alegerea ordinii sortarii: crescatoare sau descrescatoare.
Daca exista mai multe înregistrari pentru care câmpul-criteriu are aceeasi valoare, ordinea lor poate sa nu fie importanta, dar, de multe ori, se doreste ca înregistrarile cu aceeasi valoare a câmpului criteriu sa fie ordonate la rândul lor dupa alt criteriu. De exemplu, la un examen de admitere, primul criteriu este nota obtinuta, iar al doilea, este numele concurentilor.
Dezavantajele sortarii:
- se creeaza noi fisiere pe disc;
- este costisitoare ca timp.
Avantajul sortarii: cautarea foarte rapida care se poate efectua într-un tabel sortat.
Efectul este crearea unui nou tabel cu numele specificat. În acest tabel sunt copiate înregistrarile din tabelul activ, în ordinea valorilor din câmpul <camp1>, în ordine crescatoare. Înregistrarile pentru care <camp1> are aceeasi valoare sunt la rândul lor sortate dupa <camp2> , etc.
Implicit, sortarea dupa fiecare din aceste câmpuri se face în ordine crescatoare. Modul de sortare se poate preciza pentru fiecare câmp în parte, incluzând dupa numele sau una din optiunile "/A" (pentru sortare crescatoare) sau "/D" (pentru sortare descrescatoare).
Obs.: Pentru câmpurile de tip logic, se considera .F. <.T.
Nu se poate face sortare dupa câmp memo.
Daca dorim ca un tabel sa fie sortat dupa un câmp de tip caracter fara a se face distinctie între literele mari si mici, vom adauga dupa câmpul respectiv optiunea "/C".
Clauze:
- ASCENDING| DESCENDING determina ordinea de sortare pentru toate câmpurile-criteriu pentru care nu s-a specificat una din optiunile "/A" sau "/D". Ordinea implicita este ASCENDING;
- FIELDS <lista_campuri> - din structura noului tabel vor face parte numai câmpurile specificate. Informatia din celelalte câmpuri nu este copiata în noul tabel. Numele din lista se separa prin virgula.
- FIELDS LIKE<lista sabloane> - în noul tabel sunt copiate câmpurile ale caror nume se potrivesc cu unul din sabloane.
- FIELDS EXCEPT<lista sabloane> - în noul tabel sunt copiate toate câmpurile în afara de cele ale caror nume se potrivesc cu unul din sabloane.
- <Domeniu> - poate fi ALL, REST, NEXT <numar> sau RECORD <numar> si face ca în noul tabel creat sa fie copiate înregistrarile din domeniul specificat. Domeniul implicit este ALL- toate înregistrarile sunt sortate.
Exemplu:
Fie tabelul CLIENT (ccod, cnume, cprenume, coras, cadresa, ctelefon, cafaceri). Sa se sorteze descrescator dupa cifra de afaceri.
list
sort on cafaceri/D to fclient
use fclient
list
III. Indexarea tabelelor
Indexarea este posibilitatea de ordonare logica a unui tabel permitând parcurgerea într-o anumita ordine a înregistrarilor fisierului prin sistemul pointerilor.
Indexarea presupune extragerea din fiecare înregistrare a fisierului de baza, a cheii care determina ordinea. Aceasta cheie împreuna cu numarul logic al înregistrarii respective vor fi aranjate într-un fisier index (simplu indexat, cu extensia .IDX).
Un index este în esenta un tablou cu 2 coloane. O coloana se refera la înregistrarea din tabel prin valorile date de cheie, iar cealalta coloana contine numarul înregistrarii ce da pozitia initiala în tabel. Ca efect deci, un fisier index este o sortare virtuala a unui tabel, în timp ce înregistrarile acestuia ramân neschimbate.
Fisier
sortat dupa nume: 1 Albu 2 Dragomir 3 Oprean Fisier
indexat dupa nume: 3 Albu 2 Dragomir 1 Oprean
Exemplu:
Fisier initial:
1 |
Oprean |
2 |
Dragomir |
3 |
Albu |
Modul de lucru cu un tabel indexat este urmatorul:
1. mai întâi se creeaza fisierul index asociat tabelului (indexarea tabelului); se dau cheile si criteriile de indexare;
2. daca se doreste utilizarea tabelului indexat anterior, se deschide tabelul si o data cu el se deschid si fisierele index asociate, fie automat de FoxPro, fie manual de utilizator;
3. se realizeaza operatiile dorite asupra tabelului (stergere, modificare, listare), înregistrarile fiind vazute în ordinea data de indexul activ. Modificarea continutului tabelului implica actualizarea automata a fisierelor index deschise pentru tabelul respectiv;
4. dupa ce se termina lucrul cu tabelul, acesta se închide împreuna cu fisierele index asociate.
Ř Fisierele index asociate unui tabel pot fi:
a. simplu indexate (fisiere index simple, cu extensia .IDX) ce contin un singur criteriu de ordonare;
b. multiplu indexate (fisiere index compuse, cu extensia .CDX), care memoreaza mai multe criterii de ordonare, doar unul singur fiind activ la un moment dat.
Clauze:
- UNIQUE Pentru cazul in care se produc valori duplicat pentru campul de indexare, Visual FoxPro va construi intotdeauna indecsi secundari. Daca dorim un index primar, atunci se specifica aceasta clauza.
- ADDITIVE permite crearea unui fisier index pentru un tabel, în conditiile în care fisierele index deschise anterior ramân deschise.
Ř Fisierele compuse sunt de 2 tipuri:
- structurale, deschise si asociate automat tabelului odata cu deschiderea acestuia, folosind comanda USE. Ele au acelasi nume cu tabelul, au extensia .CDX si sunt create folosind clauza TAG fara OF.
- nestructurale, nu sunt deschise automat cu tabelul. Au nume diferit de numele tabelului si va fi specificat în clauza OF.
Cum se deschid sau se activeaza fisierele index?
· Odata cu deschiderea unui tabel, se pot deschide si fisiere index asociate acestuia (care anterior au fost create cu o comanda INDEX):
[INDEX <lista fisiere index>|?]
[ORDER [<expresie_numerica>|<fisier.IDX>|[TAG]<nume tag>[of<fisier.CDX>]]]
[ASCENDING|.]...
· Daca nu se da ORDER, atunci primul fisier index din lista va fi cel activ.
<expresie_numerica> este numarul de ordine al fisierului index simplu sau al tagului. Numararea se face astfel:
- mai întâi fisierele.IDX (în ordinea din lista)
- apoi tag-urile din fisierele structurale (în ordinea definirii lor)
- apoi tag-urile din fisierele nestructurale în ordinea aparitiei lor.
· Daca se doreste deschiderea unor fisiere index pentru tabelul activ (dupa ce acesta a fost deschis) se utilizeaza comanda:
SET INDEX TO [<lista_fisiere_index> | ?]
[ORDER <expN> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[ASCENDING | DESCENDING]]
[ADDITIVE]
Se vor deschide toate fisierele din lista. Noua lista de fisiere index o va înlocui pe cea veche, daca nu se precizeaza clauza ADDITIVE.
· Pentru a schimba ordinea de accesare, pentru a selecta un anumit fisier sau tag activ utilizam:
SET ORDER TO [<expN1> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[IN <expN2> | <expC>]
[ASCENDING | DESCENDING]]
[IN <expN2> | <expC>] permite activarea unui index dintr-o alta zona de lucru decât cea activa. Este posibila si folosirea de alias-uri în locul numarului zonei de lucru.
Cum se închid sau se dezactiveaza fisierele index?
· Pentru a închide toti indecsii, în afara de cel compus structural, vom da comanda:
SET INDEX TO
· SET ORDER TO dezactiveaza toti indecsii, fara a-i închide.
· CLOSE INDEX - închide toate fisierele index din zona de lucru curenta, în afara celui structural.
Fisierele index pot fi închise si cu CLOSE ALL, USE, CLOSE DATABASES.
Vizualizarea indexului activ la un moment dat se realizeaza prin:
LIST STATUS sau
DISPLAY STATUS
Pot aparea situatii când doua sau mai multe înregistrari corespund la aceeasi valoare a cheii de indexare:
SET UNIQUE ON | OFF - din multimea de înregistrari cu aceeasi valoare a cheii de indexare, va putea fi accesata numai prima dintre acestea.
Ce se întâmpla la modificarea continutului unui tabel?
Modificarea continutului unui tabel determina actualizarea fisierelor index deschise pentru tabelul respectiv, dar cele care nu sunt deschise în momentul executarii modificarilor nu vor fi reactualizate, deci vor memora o stare anterioara a tabelului. Apar astfel discrepante între tabel si fisierul index respectiv, care trebuie reactualizat cu noul continut al tabelului, operatie care poarta numele de reindexare. Reindexarea este necesara si când se modifica tipul indexarii (cu acces unic sau acces multiplu - SET UNIQUE). Comanda folosita este:
REINDEX [COMPACT] - determina reactualizarea tuturor fisierelor .IDX sau a tag-urilor din .CDX deschise curent pentru tabelul activ.
Functii referitoare la indexarea tabelelor:
- NDX(), CDX()- dau numele fisierelor index deschise într-o zona de lucru.
- Functia TAG - întoarce numele unui index simplu sau al unei etichete dintr-un index compus.
- Numele fisierului simplu indexat activ sau al tag-ului activ cu functia ORDER.
- Ordinea de accesare a înregistrarilor unui fisier indexat este determinata de cheia de indexare. Cheia de indexare se poate afla cu functia KEY.
Comenzi referitoare la indexare
a) trecerea de la un fisier simplu indexat la un tag dintr-un fisier index compus cu:
COPY INDEXES <lista de fisiere index> | ALL [TO <fisier.CDX>]
(tag-urile vor avea acelasi nume cu fisierul .IDX)
b) operatia inversa: transformare tag în fisier .IDX:
COPY TAG <nume tag> [of <fisier.CDX>] TO <fisier.IDX>
c) dupa b), tag-ul ramâne totusi în lista de indecsi a tabelului. Pentru a sterge tag-ul din fisierul compus:
DELETE TAG...
Obs: Daca dintr-un fisier compus se sterg toate tag-urile, fisierul este sters în întregime de pe disc.
d) cautarea unei înregistrari într-un tabel indexat se face cu:
- comanda SEEK <expresie>; daca este gasita, pointerul se pozitioneaza pe ea, iar FOUND() ia valoarea .T.; altfel pointerul se pozitioneaza dupa ultima înregistrare.
- functia SEEK(expresie,[<expN>|<expC>]) întoarce o valoare logica: .T. daca este gasita o înregistrare (prima din ele) pentru care valoarea cheii de indexare este egala cu expresia (din argumentul functiei); prin al doilea argument al functiei, se specifica tabelul în care se face cautarea (prin zona de lucru sau alias).
Obs: Functia SEEK înlocuieste combinatia: comanda SEEK si functia FOUND().
Observatii:
1) Presupunem ca avem 2 câmpuri numerice cafaceri, cavere si dorim indexare dupa cafaceri si in interiorul sau dupa cavere.
use client
index on cafaceri+cavere to alfa
list
Sistemul aduna valorile din câmpurile cafaceri si cavere, iar apoi face indexarea, deci se obtine un rezultat eronat.
Operatorul "+" are un sens pentru câmpuri, valori numerice, si alt sens pentru caractere.
Rezolvarea problemei se face prin:
a) sort on cafaceri, cavere to gama
sau
b) index on str(cafaceri)+str(cavere) to delta
2) Litera mare este diferita de litera mica, prin urmare se pot folosi pentru cautari functiile:
UPPER - transforma literele mici in litere mari
LOWER -transforma literele mari in litere mici.
1. Completati una dintre valorile câmpului dDesen, de tip General, al tabelului DEPARTAMENT.
Indicatie: Browse pe tabelul DEPARTAMENT; dublu click pe una dintre valorile câmpului dDesen (valoarea este "gen"); din meniul Edit se alege optiunea Insert Object, se selecteaza tipul de fisier (de exemplu Paintbrush Picture), se creeaza (sau se deschide unul deja existent), dupa care se da click în afara ferestrei.
2. Analizati primele doua pozitii din data angajarii pentru al 3-lea salariat considerate drept:
- caractere (LEFT (DTOC (sDataAng), 2))
- numere (VAL (LEFT (DTOC (sDataAng), 2))).
3. Care este rezultatul functiei ALLTRIM(" test ")+ "x"?
Obs: În laboratorul 1, am vazut ca:
- LTRIM (sir_caractere) suprima spatiile libere (blank-urile) din stânga;
- RTRIM(sir_caractere) si TRIM(sir_caractere) suprima blank-urile din partea dreapta.
Pentru suprimarea blank-urilor atât din stînga, cît si din dreapta, se utilizeaza functia ALLTRIM(sir_caractere).
4. Ce afiseaza STATUS?
R: Informatii despre starea sistemului: baza de date deschisa, tabelul activ, indexul activ, directorul de lucru (setat prin comanda SET DEFAULT TO h:\.) si valorile variabilelor sistem (stabilite prin comenzi SET). O astfel de variabila este TALK (vezi laborator 1).
5. Ce efect are BROWSE LOCK 3? Dar BROWSE FREEZE snume?
6. Pentru salariatii angajati în 1994, adaugati în câmpul sInfo sirul de caractere "spor de fidelitate".
REPLACE sinfo WITH sinfo+"spor de fidelitate" FOR year(sdataang)=1994
7. Adaugati în regim BROWSE un câmp calculat (de exemplu 10*ssalariu).
BROWSE FIELDS a=ssalariu*10
Obs: Afisarea acestui câmp nu presupune introducerea lui în tabel.
Comanda :
BROWSE FIELDS snume, a=ssalariu*10
determina afisarea numelor angajatilor si a valorii salariilor acestora pe 10 luni.
II. [Zone de lucru]
8. Deschideti ferestra Data Session (din meniul Window).
a) Sa se închida tabelul SALARIAT.
USE salariat
b) Sa se deschida (prin comenzi) tabelul SALARIAT în zona 3 si tabelul DEPARTAMENT în zona 8.
USE salariat IN 3
USE departament IN 8
c) Sa se activeze zona în care este deschis tabelul SALARIAT. Listati contintul tabelelor.
BROWSE
SELECT salariat
BROWSE
9. Analizati comanda SELECT si functia SELECT(); comanda USE si functia USED().
?SELECT() && afiseaza numarul zonei curente (3)
SELECT 8 && zona 8 devine zona curenta
?SELECT() && 8
?USED() && afiseaza .T. (pentru ca zona curenta este folosita)
USE && se închide tabelul DEPARTAMENT în zona 8
? USED() &&afiseaza .F. (zona curenta nu este folosita)
10.Ce efect are comanda SELECT 0? Ce efect are "USE ?" ?
USE departament IN 1 && deschide tabelul DEPARTAMENT în zona 1
SELECT 0 && selecteaza zona de lucru avînd numarul minim, dintre cele
&& nefolosite
? SELECT() && afiseaza 2
USE? && afiseaza o fereastra de dialog, din care putem alege tabelul care
&& dorim sa se deschida în zona curenta
11.Ce afiseaza SELECT(), SELECT(0); SELECT(1); SELECT("salariat")?
? SELECT() && numarul zonei curente
? SELECT (0) && numarul zonei curente
SET COMPATIBLE ON
? SELECT() && numarul zonei disponibile, având numarul minim
? SELECT(1) && numarul zonei disponibile având numarul maxim (32767)
?SELECT("salariat") && numarul zonei în care este deschis tabelul având alias-ul
&& "salariat"
12. Deschideti tabelul SALARIAT, atât în zona de lucru 1, cât si în zona 2. Folositi alias-uri. Ce afiseaza functia ALIAS()? Ce afiseaza functia DBF()?
Indicatie: USE salariat AGAIN ALIAS "sal2" IN 2
sau SELECT 2
USE salariat AGAIN ALIAS "sal2"
? ALIAS() && alias-ul zonei de lucru curente
? ALIAS(1) && alias-ul zonei 1 (SALARIAT)
? ALIAS(2) && alias-ul zonei 2 (SAL2)
SELECT 1
? DBF() && tabelul deschis în zona curenta, afisat cu calea din sistemul de
&& fisiere al sistemului de operare (H:\..\SALARIAT.DBF)
? DBF(2) && tabelul deschis în zona 2
? DBF("sal2") && tabelul corespunzator alias-ului "sal2"
13. Sortati tabelul SALARIAT dupa salariu în ordine crescatoare si în cadrul salariului descrescator dupa anul angajarii.
SORT ON ssalariu/a, sdataang/d TO sortsal
USE sortsal
BROWSE
14. Indexati tabelul SALARIAT în mod unic dupa numarul departamentului. (idep.idx)
USE salariat
BROWSE
15. Indexati alfabetic salariatii care au mai putin de 5 ani vechime.(inume.idx)
INDEX ON snume FOR (DATE()-sdataang)/365<5 TO inume
BROWSE
Obs: Ultimul index creat devine activ (în sensul ca tabelul urmeaza ordinea impusa de acesta).
16. Indexati crescator dupa salariu.(isal_cresc.idx)
BROWSE
17. Deschideti cei 3 indecsi creati anterior. Determinati ca inume.idx sa devina indexul activ. Observati indecsii deschisi si pe cel activ în fereastra Data Session, efectuând click pe butonul Properties.
SET INDEX TO idep, inume, isal_cresc && deschidere indecsi, implicit, primul din
&& lista este cel activ
SET ORDER TO inume && inume devine indexul activ
sau
SET INDEX TO inume, idep, isal_cresc && inume va fi, implicit, indexul activ
sau
SET INDEX TO idep, inume, isal_cresc ORDER inume &&deschidere indecsi +
&& activare
18. Pentru tabelul DEPARTAMENT, creati un index compus structural care sa contina indecsi dupa nume, manager si locatie.
CLOSE TABLES
USE departament && DEPARTAMENT va fi deschis în zona 1 (implicit activa)
INDEX ON dnume TAG "nume"
INDEX ON dmanager TAG "manager"
INDEX ON dlocatie TAG "locatie INDEX ON dnume TAG "nume"
Obs : Neprecizarea numelui fisierului index compus conduce la crearea unui index având acelasi nume cu fisierul (index structural): departament.cdx. Observati prezenta acestui fisier în directorul curent de lucru.
USE departament && redeschidem tabelul ; în Data Session ->Properties vom
&& vedea ca indexul structural s-a deschis automat,
&& însa fara ca vreun tag sa devina activ.
19. Pentru tabelul SALARIAT, creati un index compus nestructural care sa contina tag-uri dupa nume, departament si data angajarii (isal_comp). Închideti toti indecsii. (CLOSE INDEXES)
USE salariat IN 2
SELECT 2
INDEX ON snume TAG "nume" OF isal_comp
INDEX ON sdep TAG "dep" OF isal_comp
INDEX ON sdataang TAG "data" OF isal_comp
20. Sa se închida tabelul SALARIAT. Sa se deschida tabelul si, odata cu el, toti indecsii simpli asupra lui si sa se activeze indexul dupa salariu (într-o singura comanda: USE salariat INDEX.ORDER .).
USE
USE salariat INDEX idep, inume, isal_cresc ORDER isal_cresc
21. Aceeasi operatie, dar indexând înregistrarile în ordinea descrescatoare a salariului.
SET ORDER TO isal_cresc DESCENDING
Obs: Indecsii se creeaza crescator, dar ordinea poate fi schimbata la activare, prin precizarea clauzei DESCENDING în comanda SET ORDER TO.
22. Sa se deschida, în plus fata de acesti indecsi, si indexul compus nestructural creat anterior, activând eticheta care realizeaza indexarea dupa nume.
SET INDEX TO isal_comp ADDITIVE
SET ORDER TO TAG nume
Obs: Clauza ADDITIVE permite deschiderea noului index, adaugându-l la lista celor deja deschisi; altfel, ar fi înlocuit lista indecsilor deschisi.
23. Închideti toti indecsii. Mariti salariul unui angajat cu 30% si redeschideti indexul dupa salariu. Cum este ordonat continutul tabelului? Folositi comanda REINDEX.
CLOSE INDEXES && sau SET INDEX TO
BROWSE
REPLACE ssalariu WITH ssalariu*1.3 FOR scod=7369
BROWSE
SET INDEX TO isal_cresc && deschidere + activare (fiind primul în lista)
BROWSE
Se va observa ca tabelul nu va fi ordonat (înregistrarea modificata apare pe vechea ei pozitie, chiar daca noua valoare a salariului nu mai respecta ordinea crescatoare). Modificarea din tabel nu este vizibila în index pentru ca acesta a fost închis. Reamintim ca modificarile asupra unui tabel se fac automat asupra indecsilor deschisi la momentul respectiv. Pentru reactualizarea indexului, se da comanda:
REINDEX
BROWSE && tabelul este ordonat crescator
24. a) Sa se obtina lista salariatilor din departamentul 30, în ordine alfabetica.
BROWSE
b) Sa se obtina lista salariatilor, în ordine descrescatoare a vechimii.
BROWSE
25. Tabele totalizatoare: suma salariilor pe departamente.
Obs: Se utilizeaza comanda :
TOTAL ON nume_camp TO nume_tabel FIELDS lista_campuri
Pentru aplicarea acesteia, tabelul trebuie sa fie indexat dupa criteriul dupa care se face totalul (sdep). Comanda creaza un nou tabel în care, pentru fiecare valoare distincta a lui sdep se face totalul pentru fiecare din câmpurile precizate în clauza FIELDS a comenzii.
INDEX ON sdep TO idep2
TOTAL ON sdep TO totsal FIELDS ssalariu
USE totsal
LIST sdep, ssalariu
26. Sa se listeze salariatii (nume + prenume) în ordine alfabetica a job-ului pe care îl practica si în ordine descrescatoare a salariilor.
USE salariat
CALCULATE MAX(ssalariu) TO x
BROWSE
LIST snume, sprenume
27. Creati fisierele indexate:
- NX1: dupa nume + prenume;
- NX2: dupa job + data angajarii;
STR (YEAR(sdataang))+ STR (MONTH(sdataang))+ STR (DAY(sdataang)) TO nx2
sau
- NX3: dupa cod departament + salariu.
INDEX ON STR (sdep) + STR (ssalariu)
Faceti ca NX2 sa fie indexul activ. Vizualizati cu BROWSE.
SET INDEX TO nx2
BROWSE
IV.
28. De comentat: import/export de date din bazele de date;
Import: În meniul sistem: File -> Import ; Se alege tipul fisierului din care dorim sa importam date (.XLS, .DB etc), numele acestui fisier (From) si tabelul în care importam (To).
Export: File -> Export ; Se alege tipul fisierului în care exportam (.DBF, .XLS, Delimited Text etc.), numele acestuia (To) si numele tabelului FoxPro din care exportam (From).
29. Suma salariilor doar daca numele celui de-al patrulea salariat începe cu o litera mare (IIF, SUM, ISUPPER)
Obs.: IIF(<conditie>, <expresie1>, <expresie2>); daca valoarea conditiei este .T., intoarce expresie1, altfel intoarce expresie2.
CALCULATE SUM (ssalariu) TO x
GO 4
?IIF(ISUPPER(snume), x, "Nu incepe cu litera mare")
30. Pentru
toti salariatii care nu au comision, al caror nume începe cu "
Obs:
Se va utiliza functia LIKE("
Pentru completarea unui câmp cu valoarea NULL se utilizeaza combinatia Ctrl+0.
Identificarea valorilor null se realizeaza prin functia ISNULL(expresie).
REPLACE
ssalariu WITH ssalariu *
FOR LIKE("
LIST snume FOR LIKE("*M*", snume)
Obs: Daca dorim si afisarea numelor care contin litera "m" (minuscula) folosim o functie de conversie (UPPER).
LIST snume FOR LIKE ("*M*", UPPER(snume))
Tema :
Gânditi tabelul care raspunde la urmatoarele întrebari si evident raspundeti:
- data nasterii studentului ..;
- numarul total de studenti restantieri;
- cel mai bun student din grupa;
- mediile studentilor caministi nascuti în 1983;
- lista ordonata alfabetic a studentilor necaministi (sortare si indexare);
- media notelor pe grupe; numarul de studenti restantieri pe grupe;
- lista studentilor pe grupe, iar în cadrul unei grupe dupa medii;
- informatii complete despre cel mai tânar student din grupa.
|