Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Zone de lucru. Sortare si indexare. Visual FoxPro

foxpro


Zone de lucru. Sortare si indexare.

I.    Zone de lucru

Î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 . 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.

II. Sortarea tabelelor

     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.

Comanda SORT are urmatoarea sintaxa:

    SORT TO <nume_fisier>

               ON <camp1>[/A|/D][/C] [, <camp2>,.]

     [ASCENDING|DESCENDING][<domeniu>]

     [FOR.] [WHILE.] [FIELDS <lista_campuri>]

      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.

use client

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.

 Comanda INDEX are urmatoarea sintaxa:

 INDEX ON <criteriu>

 TO <fisier.idx> | TAG <nume_tag> [OF<Fisier.cdx>]

 [FOR<conditie>] [COMPACT] [ASCENDING | DESCENDING] [UNIQUE] [ADDITIVE] 

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):

USE [<fisier>|?].....

[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.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **

Exercitii:

I. [Completari laborator 1]

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.

SELECT 3
          BROWSE           
          SELECT departament      

          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"      

III. [Sortare si indexare]

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

     INDEX ON sdep UNIQUE TO idep

     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)

     INDEX ON ssalariu TO isal_cresc

     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                        && închidem tabelul DEPARTAMENT

       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

       CLOSE INDEXES            

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.

INDEX ON snume FOR sdep=30 TO idep30

BROWSE

      b) Sa se obtina lista salariatilor, în ordine descrescatoare a vechimii.

INDEX ON sdataang TO idata

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

      INDEX ON sjob + STR (x-ssalariu) TO ijobsal

      BROWSE

      LIST snume, sprenume

27. Creati fisierele indexate:

-          NX1: dupa nume + prenume;

      INDEX ON snume+sprenume TO nx1

-          NX2: dupa job + data angajarii;

      INDEX ON sjob + ;     && ";"= caracter de continuare al comenzii pe linia urmatoare

      STR (YEAR(sdataang))+ STR (MONTH(sdataang))+ STR (DAY(sdataang)) TO nx2

sau

      INDEX ON sjob + STR (DATE()-sdataang) TO nx2

-          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 "Po", înlocuiti salariul prin ssalariu * nr. aleator din intervalul (0, 1).

Obs: Se va utiliza functia LIKE("Po*", snume). Caracterul "*" este folosit în sabloanele (mastile) pentru specificare formatului unui sir de caractere cu semnificatia "sir format din oricâte caractere, eventual sirul vid".

         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 * RAND();

     FOR LIKE("Po*", snume) AND ISNULL(spccomision)

31. Sa se afiseze salariatii al caror nume contine litera "M".

            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.


Document Info


Accesari: 7248
Apreciat:

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site

Copiaza codul
in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )