Sql
Elementele principale folosite de mediile xBase - operatii asupra elementelor xBaseSBD 1. Sisteme de Gestiune a Bazelor de Date Un Sistem de Gestiune a Bazelor de Date (SGBD) este un ansamblu de programe destinate crearii, exploatarii si intretinerii unei baze de date. O baza de date (BD) este un ansamblu de date (logice, coerente, cu inteles) si de legaturi intre acestea. Conceptul de baza de date poate fi definit intr-un mod mai general: O baza de date este un sistem informatic de definire, organizare si prelucrare a informatiei compus din: o colectie de date si eventuale legaturi intre ele; o descriere a datelor si a relatiilor dintre acestea; un sistem de programe de administrare a datelor. Bazele de date pot avea moduri specifice de organizare interna a datelor sau modele organizationale interne. Un astfel de model organizational pentru baze de date este xBase, in cadrul caruia se folosesc structuri de date ce contin informatii cu atribute comune, structuri denumite tabele. In cadrul modelului xBase o baza de date este o colectie formata din una sau mai multe tabele impreuna cu alte elemente necesare prelucrarii informatiei din aceste tabele. Sistemele de Gestiune a Bazelor de Date de tip xBase mai sunt denumite si medii xBase. Cele mai cunoscute dintre acestea sunt mediile dBase si FOX. 2. Elementele principale folosite de mediile xBase Un Sistem de Gestiune a Bazelor de Date (SGBD) de tip xBase lucreaza cu urmatoarele categorii de elemente: 1. tabele - sunt structurile principale pentru stocarea/prelucrarea informatiilor in cadrul SGBD; 2. memovariabile - elemente ajutatoare care faciliteaza lucrul cu alte elemente din cadrul SGBD; 3. indexuri - elemente de ordonare: sunt structuri asociate tabelelor, care permit ordonarea informatiilor stocate in acestea. Ordonarea se face pe baza unuia sau mai multor criterii denumite chei de ordonare. Elementele de ordonare asigura accesul la inregistrarile (articolele din tabele) in ordinea indicata de cheia (cheile) de ordonare. Observatie: prin acces se intelege posibilitatea de cautare, modificare sau afisare a informatiilor dintr-o tabela. 4. machetele de culegere date; in timpul lucrului cu mediul de baze de date este necesara uneori introducerea unor informatii suplimentare de catre utilizator, informatii ce vor fi folosite in activitatile ulterioare de prelucrare. Introducerea acestor informatii se poate face in doua moduri: conversational: pe ecran sunt afisate mesaje la care utilizatorul “raspunde” prin tastarea unor valori adecvate; prin utilizarea unor machete de culegere date, o macheta fiind un set de informatii care se afiseaza pe ecran si care nu se pot modifica, plus un set de zone de editare in care utilizatorul poate sa introduca diverse valori. 5. rapoartele - sunt elemente speciale destinate afisarii pe ecran , sau tiparirii pe hirtie, intr-o forma dorita, a unor informatii din tabelele unei baze de date. 6. programele si procedurile: sunt fisiere text ce contin succesiuni de comenzi xBase; 7. filtrele: sunt elemente ce permit stabilirea unor structuri de validare. Prin aceste structuri se realizeaza validarea implicita a valorilor datelor ce se introduc in tabelele bazei de date, sau se valideaza alte tipuri de marimi; 8. elemente de integrare aplicatie (view): prin legaturi specifice, ele intregreaza toate elementele unei aplicatii xBase; 9. elemente de tip aplicatie: sunt elemetele cele mai complexe dintr-in SGBD; ele integreaza structuri de tip view, programe si proceduri. Toate elementele enumerate mai sus pot fi stocate in fisiere cu structuri specifice si care au o anumita extensie a numelui. Mediul de lucru Fox foloseste urmatoarele extensii pentru fisierele care stocheaza elementele xBase: pentru tabele : .dbf pentru memovariabile .mem pentru indexe .idx si .cdx pentru machete .scr si .fmt pentru rapoarte .frm si .frg pentru programe .prg pentru filtre .qry pentru elemente view .vue pentru aplicatii .app Observatie importanta in mediul FOX , fisierele care stocheaza tabele se numesc (in mod impropriu!) database file (in traducere: fisier baza de date); aceste fisiere NU SUNT BAZE DE DATE, conform definitiilor prezentate anterior. 3. Operatii asupra elementelor xBase Operatiile principale ce se pot efectua asupra elementelor xBase sunt urmatoarele: 1. crearea unui element; 2. editarea unui element (afisare cu posibilitatea de modificare); 3. stergerea unui element; 4. afisare (fara posibilitate de modificare); 5. transformarea unui element; 7. intrerogarea unui element. Operatiile asupra elementelor xBase se realizeaza cu ajutorul comenzilor puse la dispozitie de mediul xBase. Exista doua posibilitati de lansare a comenzilor xBase: interactiv; in acest caz comenzile se pot transmite: prin tastare directa de catre utilizator; prin utilizarea meniurilor Sistemului de Gestiune al Bazelor de Date (SGBD); meniuri sunt din ce mai evoluate la ultimele de SGBD-uri, si prin intermediul sau utilizatorul poate realiza mai rapid activitatile dorite. utilizind programe si proceduri: acestea reunesc succesiuni de comenzi xBase si constituie modalitatea principala de realizare a aplicatiilor xBase. 4. Sintaxa generala a unei comenzi xBase Sintaxa generala a unei xBase comenzi este urmatoarea: nume_comanda [domeniu] [ prelucrare] [clauza] [destinatie/sursa] [altele] Observatie importanta In sintaxa comenzilor xBase se folosesc urmatoarele notatii: elementele dintre paranteze patrate sunt optionale (pot sa lipseasca), iar cele separate de bara verticala | sunt alternative (poate sa fie prezent unul dintre ele). Semnificatia elementelor din sintaxa generala este urmatoarea nume_comanda: este chiar denumirea comenzii si trebuie specificat obligatoriu pe primul cuvint. Numele comenzii poate fi tastat in intregime sau numai primele 4 caractere ale sale. Exemplul 1: comanda de pozitionare dupa continut LOCATE poate fi invocata tastind numai LOCA. domeniu specifica zona din tabela pe care se aplica comanda (daca executia comenzii afecteaza toate articolelele din tabela sau numai o parte din ele). Fiecare comanda are un domeniu implicit de aplicare. Exemplul 2: comanda LIST are ca domeniu implicit intreaga tabela comanda REPLACE are ca domeniu implicit articolul curent. Mnemonicele pentru specificarea domeniului sunt urmatoarele: ALL - toate articolele din tabela; NEXT n - urmatoarele n articole pornind de la articolul curent; REST - urmatoarele articole incepind de la cel curent pina la sfirsitul tabelei. Exemplul 3: LIST NEXT 3 && afiseaza articolul curent si urmatoarele 2 articole LIST NEXT 1 && afiseaza articolul curent prelucrarea: element (zona din comanda) care poate sa mentioneze fie nume de cimpuri asupra carora se face prelucrarea, fie modalitatea in care se face prelucrarea. Exemplul 4: LIST cimp1, cimp2 && se specifica numele unor cimpuri STORE 7 TO varnum && este specificata prelucrarea clauza reprezinta modul de efectuare al comenzii in functie de satisfacerea unei conditii. Specificarea conditiei se face cu o constructii de forma: FOR conditie sau WHILE conditie Exemplul 5: LIST FOR data_livr< ( LIST NEXT 7 WHILE cantitate < 50 destinatie/sursa: element (zona din comanda) care precizeaza numele destinatiei in care se va stoca rezultatul executiei comenzii, respectiv din care se vor prelua date pentru executia comenzii. Exemplul 6: COPY TO tab1 && copiaza continutul tabelei curente in tabela tab1 APPEND FROM tab1 && adauga articole din tabela tab1 in tabela curenta altele: elemente ce pot contine nume de chei de ordonare sau comutatori de tip ON/OFF Exemplul 7: SET TALK ON && activeaza afisarea rezultatului efectuarii comenzilor LIST OFF && afisarea se face fara a afisa si numarul de articol 5. Comenzi de lucru cu tabelele unei baze de date 1) crearea stucturii unei tabele: CREATE nume_tabela Aceasta comanda activeaza un editor de structuri de tabele prin intermediul caruia sunt introduse numele cimpurilor din tabela, tipul si lungimea lor. Operatia de editare se termina dupa introducerea caracteristicilor ultimului cimp al tabelei. 2) modificarea stucturii unei tabele: MODIFY STRUCTURE In urma lansarii acestei comenzi este invocat acelasi editor de structuri de baze de date, cu care se va modifica structura tabelei. Operatia de modificare a structurii poate fi facuta numai pe o baza de date activa (care a fost activata in prelabil). 3) Activarea unei tabele: USE nume_tabela [ALIAS porecla] [INDEX lista_de indecsi] unde: nume_tabela este numele fisierului care stocheaza tabela; porecla este numele dupa care va fi recunoscuta tabela dupa activarea ei ; ATENTIE: in cazul cind aliasul nu este precizat, alias-ul implicit ESTE CHIAR NUMELE TABELEI! lista_indecsi este numele unei structuri de ordonare creata anterior si care este asociata tabelei. 4) copierea unei tabele se realizeaza cu: COPY [domeniu] [FIELDS lista_cimpuri] [clauza] [altele] TO nume_tabela_noua In urma acestei comenzi, tabela activa (curenta) va fi copiata intr-o alta tabela, avind numele nume_tabela_noua. Copierea se face in intregime, daca nu este specificat un domeniu, o lista de cimpuri sau o conditie(clauza). 5) copierea structurii unei tabele: COPY STRUCTURE [FIELDS lista_cimpuri] TO nume_tabela_noua In urma acestei comenzi este copiata doar structura tabelei active (curente), intr-o alta tabela de destinatie denumita nume_tabela_noua. 6) stocarea structurii unei tabele active: COPY STRUCTURE EXTENDED TO nume_tabela_noua In acest caz este creata o tabela denumita nume_tabela_noua, care are o structura fixa, cimpurile ei fiind: - numele cimpului (FIELD NAME) - tipul cimpului (FIELD TYPE) - lungimea cimpului (LENGTH) - numarul de zecimale Articolele acestei noi tabele contin informatii privind structura tabelei sursa (activa). 6. Prelucrarea articolelor dintr-o tabela Operatiile principale de prelucrare a articolelor dintr-o tabela sunt urmatoarele: 1. adaugare de noi articole: 1.1 - prin editarea unor noi articole; 1.2. - prin preluarea lor dintr-o alta tabela; 2. stergere de articole; 3. modificare continut articole; 3.1 - cu afisare continut articole; 3.2 - fara afisare continut; 4. afisare articole. 6.1. Adaugarea de noi articole intr-o tabela Adaugarea de articole noi cu editare. a) Adaugare la sfirsitul tabelei: APPEND [BLANK] La lansarea comenzii este invocat un editor de articole, care prin intermediul unei machete speciale permite introducerea de noi articole in tabela activa (curenta). Macheta de culegere afiseaza in partea stinga, unul sub altul, numele cimpurilor si in continuare cite o zona de editare unde poate fi introdusa valoarea acelor cimpuri. Comanda APPEND permite si editarea inregistrarilor mai vechi existente in tabela (vizualizarea si modificarea acestora). Daca este prezenta optiunea BLANK ,se va adauga la sfirsitul tabelei un articol vid, cu cimpurile initializate cu valori implicite, in felul urmator: - 0, pentru un cimp de tip numeric; - spatiu, pentru un cimp de tip sir de caractere; - .F. , pentru un cimp de tip logic; - o valoare nedefinita pentru cimpurile de tip data calendaristica. b) Adaugarea unei inregistrari vide intr-o pozitie oarecare in tabela se face cu comanda: INSERT [BEFORE] [BLANK] Aceasta comanda se se utilizeaza dupa pozitionarea pe o inregistrare linga care se doreste inserarea unei noi inregistrari. Inserarea se face dupa inregistrarea curenta, sau inainte de ea, daca se specifica optiunea BEFORE. Daca este specificata optiunea BLANK va fi inserata o inregistrate vida. Adaugarea de articole intr-o tabela activa, prin preluarea lor dintr-o alta tabela se face cu : APPEND FROM [FIELDS lista_cinpuri ] [FOR conditie] [altele] nume_tabela Este obligatoriu ca tabela activa sa aiba cel putin un cimp comun cu tabela sursa (activa). Nu este deci obligatoriu ca cele doua tabele, cea in care se adauga si cea din care se preia informatie, sa aiba exact aceeasi structura. 6.2. Stergerea articolelor dintr-o tabela a) Operatia de stergere a articolelor dintr-o tabela se face cu comanda: DELETE [domeniu] [FOR conditie] [WHILE conditie] [altele] Domeniul implicit pentru comanda este articolul curent; comanda nu realizeaza stergerea efectiva a articolelor, ci face doar marcarea articolelor pentru stergere. b) Stergerea efectiva a articolelor marcate se face cu comanda: PACK c) Demarcarea articolelor marcate pentru stergere se face cu comanda: RECALL [domeniu] [FOR conditie] Observatie: functia care arata daca daca un articol este sau nu marcat pentru stergere este: DELETED( ) Aceasta functie intoarce .T. daca articolul curent este marcat pentru stergere, altfel intoarce .F. d) Stergerea tuturor articolelor dintr-o tabela se face cu comanda: ZAP Aceasta comanda pastreaza doar structura tabelei, continutul ei fiind sters. 6.3. Modificarea articolelor dintr-o tabela 3.1) Modificarea articolelor cu afisare. a) EDIT [domeniu] [FIELDS lista_cimpuri] [clauza] [altele] Macheta de editare este identica cu cea afisata pentru comanda APPEND. b) O alta comanda de editare este: BROWSE [domeniu] [FIELDS lista_cimpuri] [FOR conditie] [FREEZE cimp] [altele] Aceasta comanda permite nu numai editarea, dar si adaugarea si marcarea pentru stergere a unor inregistrari. Optiunea FREEZE, daca exista in sintaxa comenzii, determina “inghetarea” tutror cimpurilor, cu exceptia cimpului mentionat dupa cuvintul FREEZE. . Modificarea articolelor fara ca acestea sa fie vizualizate (fara utilizarea unei comenzi de editare). REPLACE [domeniu] cimp1 WITH expresie1 [, cimp2 WITH expresie2 [, ]] [FOR conditie] Domeniul implicit de aplicare a comenzii este inregistrarea curenta. . Afisarea articolelor dintr-o tabela a) LIST [domeniu] [lista_cimpuri] [FOR conditie] [altele] Domeniul implicit al comenzii este ALL (toata tabela). Comanda LIST are citeva variante speciale, care afiseaza alte informatii decit continutul tabelei curente. Acestea sunt: LIST FILES [specificator_nume_fisier] [ TO PRINTER] [altele] Afiseaza lista fisierelor care au numele conform parametrului specificator_nume_fisier. LIST MEMORY [LIKE nume_memovariabila] [altele] Afiseaza informatii despre toate memovariabilele si tablourile de memovariabile existente la un moment dat. LIST STATUS Afiseaza informatii complete despre starea mediului xBase la un moment dat. LIST STRUCTURE Afiseaza informatii despre structura tabelei active (deschise) la un moment dat. b) Alta comanda de afisare: DISPLAY [domeniu] [lista_cimpuri] [FOR conditie] [altele] Domeniul implicit este inregistrarea curenta iar afisarea se face ecran cu ecran. Comanda de afisare DISPLAY, ca si comanda LIST, are formele speciale: DISPLAY FILES, DISPLAY, DISPLAY STRUCTURE, DISPLAY STATUS, cu aceeasi semnificatie ca si la comanda LIST. Comenzi de obtinere informatii pe grupe de articole Comanda pentru efectuarea unor totaluri: SUM [domeniu] [FOR conditie] [lista_expresii] [TO lista_memovariabile] Domeniul implicit este ALL iar expresiile din lista_expresie sunt relevante atunci cind contin si nume de cimpuri. Rezultatul (rezultatele) sumarii (sumarilor) este (sunt) eventual atribuit (atribuite) unei memovariabile (memovariabilelor din lista). Atunci cind lista_expresii lipseste, se efectueaza totalul pentru toate cimpurile numerice. Comanda pentru calculul mediei aritmetice: AVERAGE [domeniu] [FOR conditie] [lista_expresii] [TO lista_memovariabile] Comanda realizeaza media aritmetica a valorilor din unul sau mai multe cimpuri. Rezultatelor medierii se pot fi atribuite unor memovariabile (ca si la comanda SUM) Comanda de calculare a unor valori statistice sau financiare: CALCULATE [domeniu] [FOR conditie] [lista_expresii] [TO lista_memovariabile] Expresiile pot sa contina functii cum ar fi AVG( ), de calcul a mediei, sau MIN() si MAX(), s.a. dar nu combinatii ale lor. 7.Ordonarea tabelelor O tabela realizata prin culegere prezinta de regula o slaba structura de ordine. In activitatea de interogare a tabelelor, este foarte util ca accesul la informatii sa se faca intr-o alta ordine decit cea in care s-au introdus articolele. Exista si un alt motiv care poate justifica ordonarea informatiilor dintr-o tabela: necesitatea utilizarii simultane a mai multe tabele, fie in vederea afisarii de informatii apartinind acestora, fie in vederea modificarii informatiilor dintr-o tabela, in functie de informatiile dintr-o alta tabela. Prin ordonarea unei tabele se intelege asezarea articolelor sale intr-o anumita ordine, pe baza unui criteriu de ordonare. O tabela este ordonata dupa un criteriu daca pozitia fiecarui articol al acesteia respecta criteriul dat, in raport cu articolele anterioare si posterioare. Criteriul dupa care se efectueaza ordonarea se numeste cheie de ordonare; cheia de ordonare este o expresie, care contine cel putin un nume de cimp din tabela (pentru a fi relevanta!) si care are ca urmare o valoare diferita pentru fiecare articol din tabela (in masura in care un cimpurl are o valori diferite de la un articol la altul). O tabela este ordonata crescator (ascendent) sau descrescator (descendent), daca valoarea cheii pentru un articol este mai mare, respectiv mai mica decit cea pentru articolul precedent. Mediile xBase pun la dispozitia utilizatorului doua metode de ordonare a unei tabele: ordonarea fizica, realizata prin schimbarea intre ele a articolelor, pina cind acestea sunt in ordinea dorita; in acest caz se obtine o noua tabela, ce contine aceleasi articole ca si cea initiala, dar asezate in alta ordine, cea data de criteriului de ordonare folosit; ordonarea fizica se numeste sortare. ordonarea logica, care inseamna crearea unei structuri speciale (structura index), ce se ataseaza unei tabele si contine ordinea in care articolele acesteia vor fi accesate; ordonarea logica se numeste indexare. 7.1. Sortarea tabelelor In urma sortarii articolele unei tabele sunt mutate pe pozitii noi, conform ordinii date de valorile cheii de ordonare: Se face cu comanda: SORT ON cimp1[/A] [/D] [, cimp2 [/A] [/D] . . . ] [ASCENDING | DESCENDING] TO nume_tabela FOR conditie In cazul sortarii criteriul de ordonare poate sa fie constituit dintr-un singur cimp sau o lista de cimpuri ale tabelei. Cimpurile pot sa fie urmate de optiunile /A (ordonare crescatoare) sau /D (ordonare descrescatoare). In cazul in care comanda de sortare contine un criteriu de tip lista de cimpuri, ordonarea se va face mai intii dupa valorile primului cimp din lista ; daca exista articole care au valori egale pentru primul cimp din lista, ordonarea se va face dupa al doilea cimp din lista, s.a.m.d. Daca lista contine trei cimpuri, cel de-al treilea va fi folosit numai daca primele doua au condus la valori egale. Clauzele ASCENDING si DESCENDING, daca sunt prezente in comanda, determina stabilirea tipului implicit de sortare (crescator, respectiv descrescator) pentru toate cimpurile care alcatuiesc cheia de sortare. Clauzele /A si /D, daca sunt asociate cimpurilor, au prioritate fata de ASCENDING si DESCENDING. Exemplul 8: fie tabela Depozit, care descrie obiectele aflate intr-un depozit de materiale. Tabela are urmatoarele cimpuri: Cod_Mat (C6) - codul mterialului, are o valoare unica pentru fiecare tip de marerial, este un sir de caractere Den_Mat (C30) - denumirea materialului, este un sir de caractere Calitate (N1) - calitatea (poate fi 1, 2, 3, etc), este un numar Cod_Furniz (C6) - codul furnizorului, are o valoare unica pentru fiecare furnizor si este un sir de caractere Cantitate (N12) - cantitatea pentru un material, de tip numeric Pret_Unit (N10) - pertul unitar pentru un tip de material, de tip numeric Ordonarea articolelor in ordinea crescatoare a codul materialului: USE Depozit LIST SORT ON Cod_Mat /A TO Depozit_m * articolele sunt sortate si depuse in tabela Depozit_m USE Depozit_m LIST Ordonarea articolelor in ordinea descrescatoare a cantitatii: USE Depozit LIST SORT ON Cantitate /D TO Depozit_c * articolele sunt sortate si depuse in tabela Depozit_c USE Depozit_c LIST Ordonarea crescatoare dupa codul furnizorului si descrescatoare dupa pretul unitar, pentru acele materiale de caliatatea 1 (articolele care au acelasi furnizor, vor fi ordonate descrescator dupa pretul unitar): USE Depozit SORT ON Cod_Furniz /A, Pret_unit /D TO Depozit_f FOR Calitate=1 * articolele sunt sortate si depuse in tabela Depozit_f USE Depozit_f LIST 7.2. Indexarea tabelelor
In aplicatiile practice tabelele unei baze de date sunt de dimensiune mare, iar sortarea (rearanjarea fizicaa articolelor) dupa diverse criterii este o opearatie costisitoare. Pe de alta parte, la majoritatea aplicatiilor de baze de date sunt frecvente cerintele de interogare (cautare) rapida a unui anumit articol. Pentru realizarea acestui deziderat este folosita o metoda de ordonare logica, denumita indexare, in urma careia nu se schimda fizic ordinea articolelor in tabela. Prin indexare i se ataseaza unei tabele o structura de ordonare denumita structura index, ce poate sa contina unul sau mai multe criterii de ordonare (unul sau mai multi indecsi). Structura index se memoreaza intr-un fisier index. Structura index (structura de ordonare) contine cupluri de informatie de tipul: <valoare cheie pentru un articol> , <pointer de articol> sau de tipul: <valoare cheie articol> <pointer la un grup de articole> Aceste cupluri din structura index pot fi ordonate crescator sau descrescator dupa valorile cheii pentru articole. Observatie: O structura index asociata unei tabele este similara cu indexul unei carti: cartea corespunde tabelei, iar paginile indexului din carte (care sunt percehi cuvint-numar pagine) corespund structurii index atasate tabelei; un cuvint din indexul cartii corespunde unei valori a cheii de ordonare, iar pagina unde se face trimiterea corespunde cu pointerul de articol. 7.2.1. Tipuri de indecsi a) indecsi simpli INDEX ON expresie_cheie TO nume_index [FOR conditie] In urma acestei comenzi se creeaza o structura de ordonare simpla nume_index, care asigura accesul la articole in ordinea stabilita de cheia de ordonare expresie_cheie. Cheia de ordonare este o expresie continind nume de cimpuri (pentru a fi relevanta). Ordonarea se face crescator, dupa valoarea cheii de ordonare. Structura de ordonare astfel creata se numeste index simplu si se memoreaza intr-un fisier ce va avea numele nume_index si extensia .idx. Acest fisier se numeste fisier index simplu (individual). Index-ul simplu devine activ imediat dupa aplicarea comenzii. Exemplul 9: fie tabela Depozit, care descrie obiectele aflate intr-un depozit de materiale. Tabela are urmatoarele cimpuri: Cod_Mat (C6) - codul mterialului, are o valoare unica pentru fiecare tip de marerial Den_Mat (C30) - denumirea materialului Cantitate (N12) - cantitatea pentru un material Pret_Unit (N10) - pretul unitar pentru un tip de material Furnizor(C30) - furnizorul materialului Ordonarea tabelei prin indexare in ordinea alfabetica a numelui materialelor, cu un index simplu: USE Depozit INDEX ON Den_Mat TO Depix Este creeata structura index simpla Depix, stocata in fisierul Depix.idx: Structura index simpla Depix Tabela de Depozit
Ordonarea alfabetica dupa numele furnizorului; materialele cu acelasi furnizor vor fi ordonate alfabetic dupa denumire: INDEX ON Furnizor+Den_Mat TO Furnix Este creeata structura index simpla Furnix; ordonarea se face dupa o expresie realizata prin concatenarea a doua cimpuri. b) indecsi compusi INDEX ON expresie_cheie TAG nume_index [FOR conditie] [OF nume_fis_cdx] [ASCENDING|DESCENDING] [FOR conditie] In acest caz este creata o structura de ordonare compusa care poate sa contina mai multi indecsi (denumiti TAG-uri), adica informatii despre mai multe criterii de ordonare pentru tabela respectiva. Structura de ordonare compusa este memorata intr-un fisier cu extensia .cdx. Daca structura de ordonare compusa exista deja, prin aceasta comanda se adauga un nou index in aceasta structura de ordonare compusa. Structurile index compuse pot sa fi de doua feluri, dupa cum este specificata sau nu optiunea OF nume_fis_cdx: daca aceasta optiune nu este specificata, este creat (daca nu exista deja!) un index compusa structural, cu acelasi nume ca si tabela. Indexul compus structural este activat automat la activarea tabelei. daca este specificata optiunea OF nume_fis_cdx , este creat (daca nu exista deja!) un index compus nestructural, stocat in fisierul nume_fis_cdx. Acest index trebuie activat explicit, fie in comanda USE, fie cu comanda de activare specifica SET INDEX. Exemplul 10: fie tabela Depozit cu aceleasi cimpuri si continut ca in Exemplul 9. Cu urmatoarele comenzi: USE Depozit INDEX ON Cod_Mat TAG tgcodmat INDEX ON Cantitate TAG tgcantit INDEX ON Furnizor TAG tgfurn100 FOR Cantitate >= 100 sunt creeati trei indecsi (trei criterii): tgcodmat, tgcantit, tgfurniz care vor fi pastrati in structura index compusa structurala denumita Depozit (ca si tabela la care este ea atasata!), stocata in fisierul Depozit.cdx. Cu urmatoarele comenzi: USE Depozit INDEX ON Den_Mat TAG tgdenmat OF Dep_cn INDEX ON Pret_Unit TAG tgpret OF Dep_cn sunt creati doi indecsi: tgdenmat si tgpret, pastrati in structura index compusa nestructurala Dep_cn. Aceasta structura index este memorata in fisierul Dep_cn.cdx. 7.2.2. Activarea indecsilor O tabela poate sa aiba atasate mai multe structuri index, simple -.idx sau compuse- .cdx, dar la un moment dat poate sa fie activ numai un singur index (un singur criteriu de ordonare ), denumit cheia principala de ordonare (master index pentru indecsii simpli sau master tag pentru indecsi compusi). Cheia principala de ordonare este denumita si indexul principal.
Simpla (.idx)
Activarea structurilor index atasate unei tabele se poate face prin doua metode: 1) odata cu activarea tabelei, prin optiunea INDEX din comanda USE: USE nume_tabela [ INDEX lista_indecsi [ORDER nr_index| nume_index_simplu | TAG nume_index_compus [OF nume_fis_cdx] ] ] Structurile de indexare trebuie sa fi fost create anterior activarii tabelei. Parametrul lista_indecsi este o lista de structuri index (simple sau compuse nestructurale), separate prin virgula, ce vor fi activate odata cu tabela. Structura index compusa structurala care are acelasi nume ca si tabela, daca exista, va fi deschisa in mod automat odata cu tabela. 2) folosind comanda speciala de activare a indecsilor: SET INDEX TO [lista_indecsi [ORDER nr_index| nume_index_simplu | TAG nume_index_compus [OF nume_fis_cdx] ] Parametru lista_indecsi si optiunea ORDER au aceeasi semnificatie ca si la activarea indecsilor prin optiunea INDEX din comanda USE. Optiunea ORDER, daca este prezenta in ambele metode de activare, are aceeasi semnificatie, specifica indexul principal (cheia principala de ordonare) dupa care se va face ordonarea articolelor tabelei: - ca un numar, prin parametrul nr_index, avind semnificatia al citelea index din lista indecsilor simpli devine cel principal; - ca un nume de index simplu prin parametrul nume_index_simplu sau - prin optiunea TAG (criteriu) urmata de parametrul nume_index_compus. Parametrul nume_index_compus reprezinta in acest caz denumirea unui index apartinind unei structuri index compuse: - structurale, daca nu se mai specifica nimic in plus; - nestructural, daca este prezenta si optiunea OF nume_fisier_cdx, unde parametrul nume_fis_cdx
este chiar numele
acestei structuri. - doua structuri index simple: Depix (cheia este denumirea materialului) si Furnix (cheia este furnizor+denumire mat.) - doua structuri index compuse: - structurala, Depozit, ce contine indecsii: tgcodmat (cheia este codul materialuli), tgcantit (cheia este cantitatea) si tgfurn100 (cheia este furnizor, pentru acei furnizori care au livrat o cantitate mai mare decit 100); - nestructurala, Depozit_cn, ce contine indecsii: tgdenmat(cheia este denumirea materialului) si tgpret (cheia este pretul materialului). Activarea tabelei Depozit cu activarea tuturor structurilor index atasate ei (simple si compuse) si stabilirea indexului Furnix ca index principal de ordonare (cheie principala de ordonare): USE Depozit INDEX Depix, Furnix, Depozit_cn ORDER Furnix Activarea tabelei Depozit, cu activarea tuturor structurilor index compuse atasate tabelei si stabilirea indexului tgcodmat ca index principal de ordonare (cheie principala de ordonare): USE Depozit INDEX Depozit_cn ORDER TAG tgcodmat Activarea tabelei Depozit, cu activarea tuturor structurilor index atasate ei (simple si compuse) si stabilirea indexului tgdenmat ca index principal de ordonare (cheie principala de ordonare): USE Depozit INDEX Depix, Furnix, Depozit_cn ORDER TAG tgdenmat Activarea tabelei Depozit, cu activarea automata a structurii index compuse Depozit si stabilirea indexului tgfurn100 ca index principal (cheie principala de ordonare): USE Depozit ORDER TAG tgfurn100 Cu comanda USE, de activare a unei tabele, se pot activa toate structurile index atasate acesteia (sau o parte din ele) si se poate specifica, dar nu in mod obligatoriu, indexul principal (cheia principala de ordonare). In cazul in care structurile index atasate la o tabela au fost activate, fie cu comanda USE cu optiunea INDEX , fie cu comanda SET INDEX, fara a se specifica indexul principla, aceasta operatie poate fi facuta cu ajutorul comenzii speciale: SET ORDER TO [ nr_index| nume_index_simplu | TAG nume_index_compus [OF nume_fis_cdx] ] Parametrii comenzii SET ORDER au aceeasi semnificatie ca si la optiunea ORDER prezentata mai sus: - nr_index indica al citelea este indexul principal dintr-o lista de structuri index simple specificata intr-o comanda USE sau SET INDEX executata anterior; - nume_index_simplu indica un index principal dintr-o lista de structuri index simple specificata intr-o comanda USE sau SET INDEX executata anterior; - optiunea TAG indica un index principal apartinind unei structuri index compuse. Observatie: comanda ORDER (ca si optiunea ORDER din comenzile USE si SET INDEX) poate sa includa si parametrul ASCENDING sau DESCENDING, caz in care accesul la articole se va face in ordinea crescatoare repectiv descrescatoare a cheii de indexare principale. Exemplul 12: activarea tuturor structurilor index ale tabelei Depozit si stabilirea indexului Furnix ca fiind principal: USE Depozit SET INDEX TO Depix, Furnix, Depozit_cn SET ORDER TO 2 Stabilirea indexului tgfurn100 ca fiind indexul principal (el este continut de strucctura index compusa Depozit): USE Depozit SET ORDER TO TAG tgfurn100 7.2.3 Cautarea intr-o tabela indexata Cautarea dupa continutul articolelor intr-o tabela ordonata prin idexare este mai performanta daca se foloseste comanda: SEEK expresie Este cautat articolul care are valoarea cheii de ordonare egala cu valoarea expresiei specificate in comanda SEEK. Daca exista mai multe articole care au valoarea a cheii de ordonare identica cu valoarea expresiei, pozitionarea se va face pe primul articol gasit. Pentru a sti daca operatia de cautare s-a terminat cu succes se poate utiliza functia FOUND( ), care aplicata dupa o comanda SEEK expresie, intoarce .T. (adevarat ) in cazul in care a fost gasit un articol pentru care valoarea cheii de ordonare este egala cu expresie. Daca nu este gasit un astfel de articol, functia FOUND() intoarce .F. (fals). Exemplul 13 activarea tabelei Depozit activarea structurii index compuse Depozit_cn si stabilirea indexului principal (cheii principale de ordonare) ca fiind tgdenmat (denumirea materialului), index continut de Depoazit_cn: USE Depozit INDEX Depozit_cn ORDER tgdenmat OF Depozit_cn SEEK ‘Caramida’ ? FOUND( ) && se testeaza daca a fost gasit materialul cu numele “Caramida” .T. ? RECNO( ) && afiseaza numarul de articol pentru acest material 3 DISPLAY && afiseaza intreg articolul
Pentru ca operatiile de ordonare si de cautare dupa continut sa se faca in mod corect, este necesar ca indexul (cheia de ordonare) sa aiba o valoare unica pentru ficare articol din tabela (unicitatea cheii de ordonare). In acest fel informatiile din tabela sunt coerente. Protejarea continutului tabelei impotriva distrugerii unicitatii cheii de ordonare se poate face folosind in comanda de indexare optiunea UNIQUE: INDEX ON expresie_cheie TO fisier_index UNIQUE sau lansind inainte de comanda de indexare, o alta comanda care impune unicitatea cheii: SET UNIQUE ON Prin folosirea parametrului UNIQUE, in structura de indexare ce se creeaza va fi inregistrat doar un singur articol pentru fiecare valoare a cheii, si anume primul gasit. In acest caz, adaugarea de noi articole in tabela se poate face doar respectind conditia de unicitate a cheii de ordonare (nu sunt permise articole cu aceeasi valoare a cheii de ordonare). 8. Lucrul cu simultan cu mai multe tabele In mediile xBase activarea unei tabele se face intotdeuna intr-o asa-numita “zona de lucru”. Daca la activarea tabelei (cu comanda USE) nu se specifica o zona de lucru, in mod implicit aceasta activare se face in zona de lucru 1. Mediile xBase pun la dispozitia utilizatorului mai multe zone de lucru. In fiecare zona de lucru poate fi activata o tabela, ceea ce permite lucrul simultan cu mai multe tabele. La un moment dat exista o singura zona selectata, tabela activa (deschisa) din acea zona fiind denumita tabela curenta; alte zone pot sa contina si ele tabele active (deschise). Daca intr-o zona a fost activata o tabela si apoi inca una, s-a produs implicit dezactivarea celei dintii. Selectarea unei zone se face cu comanda: SELECT nr_zona | alias unde nr_zona este numarul unei zone de lucru ce va fi selectata; se poate folosi si parametrul alias, porecla unei tabele activata intr-o zona de lucru, pentru a selcta acea zona Pentru a specifica un cimp apartinnd unei tabele activate intr-o zona de lucru, atunci cind este selectata curent o alta zona, se foloseste notatia: alias -> nume_cimp sau: nume_tabela nume_cimp Pentru lucrul simultan cu mai mute tabele exista doua posibilitati: 1. folosirea unor tabele nerelationate (necuplate, nelegate prin relatii); - in acest caz pozitionarea in fiecare tabela trebuie sa fie facuta prin comenzi explicite, pentru a folosi simultan in comenzi xBase cimpuri din aceste tabele; 2. folosirea tabelelor realationate (cuplate prin relatii) - in acest caz se foloseste o comanda speciala care “cupleaza” tabelele intre ele, astfel incit orice pozitionare pe un articol in una dintre ele (tabela parinte) sa conduca automat la pozitionare pe articolul corespunzator din celelalte tabele. 8.1. Lucrul simultan cu tabele nerelationate In acest caz tabelele continind informatii ce trebuie utilizate simultan se deschid in zone de lucru distincte. Pozitionarea pe articolele de interes din fiecare tabela se face prin selectarea zonei in care se afla fiecare tabela si pozitionare explicita pe articol. Daca tabelele sunt indexate, pozitionarea se poate face cu SEEK, daca nu cu LOCATE. Exemplul 14 fie tabela Depozit cu cimpurile: Cod_Mat (C6) - codul mterialului, are o valoare unica pentru fiecare tip de material Den_Mat (C30) - denumirea materialului Cantitate (N12) - cantitatea pentru un material Pret_Unit (N10) - pretul unitar pentru un tip de material Furnizor(C30) - furnizorul materialului si tabela Vinzari, cu cimpurile: Cod_Mat (C6) - codul mterialului, are o valoare unica pentru fiecare tip de material Cantitate (N12) - cantitatea vinduta dintr-un amumit material Vinzari Depozit
Se doreste afisarea sumei obtinute din vinzarea unui material din depozit, de exemplu caramizi, material ce are codul C002. Ambele tabele se indexeaza, prin structuri index simple, dupa codul materialului: SELECT 1 USE Depozit INDEX ON Cod_Mat TO Dix SELECT 2 USE Vinzari INDEX ON Cod_Mat TO Vix SELECT 1 SEEK ‘C002’ && se cauta materialul cu codul C002 SELECT 2 SEEK ‘C002’ DISPLAY Depozit.Den_Mat,Cantitate,Cantitate* Depozit.Pret_Unit Se va afisa:
8.2. Lucrul simultan cu tabele relationate In acest caz, ca si in cel precedenrt, tabelele continind informatii ce trebuie utilizate simultan se deschid in zone de lucru distincte. Prin relationarea a doua tabele, orice pozitionare facuta in una din ele conduce automat la o pozitionare in cea de‑a doua. Relationarea nu este o legatura egalitara intre tabele, ci una de subordonare: una din tabele va fi parinte (sau “conducatoare”) iar cealalta va fi copil (sau “condusa”). Comanda ce stabileste o relatie este urmatoarea: SET RELATION TO expresie INTO nr_zona| alias [ADDITIVE] Dupa stabilirea relatiei, mutarea pointerului pe un anumit articol in tabela parinte va duce automat la mutarea pointerului pe articolul corespunzator in tabela copil. Aceasta determinare nu se respecta si invers. Inainte de stabilirea relatiei, pe linga deschiderea celor doua tabele este necesar ca tabela copil sa fie indexata cu aceeasi cheie ca si cea a relatiei (sau inclusa inceasta). La lansarea comenzii, tabela parinte trebuie sa fie deschisa in zona de lucru curent selectata. Tabelele relationate au in general un cimp comun, dupa care este indexata tabela copil. Daca se foloseste optiunea ADDITIVE se pastreaza toate relatiile deja existente ale tabelei parinte. Daca expresia dupa care se face relationarea este numerica, aceasta este evaluata atunci cind pointerul de articol din tabela parinte este mutat; apoi pointerul de articol din tabela copil este mutat conform valorii acestei expresii. Exemplul 15: fie tabelele Depozit si Vinzari cu aceeasi structura si continut ca in exemplul 14. Ca si in exemplul 14 se doreste afisarea sumei obtinute din vinzarea unui material din depozit, de exemplu caramizi, material ce are codul C002. Solutia folosind relationarea celor doua tabele (Vinzari, tabela parinte si Depozit, tabela copil): SELECT 1 USE Depozit INDEX ON Cod_Mat TO Dix SELECT 2 USE Vinzari INDEX ON Cod_Mat TO Vix SET RELATION TO Cod_Mat INTO Depozit SEEK ‘C002’ && se cauta materialul cu codul C002 DISPLAY Depozit.Den_Mat,Cantitate,Cantitate* Depozit.Pret_Unit Se va afisa:
Comanda SEEK aplicata asupra tabelei parinte (Vinzari) va conduce automat la pozitionare pe articolul care are acelasi cod de material, ‘C002’, din tabela copil (Depozit). Comanda SET RELATION face ca unui articol din tabela parinte sa ii corespunda un articol din tabela copil; in acest caz se spune ca relatia este de tip unul-la-unul. In cazul in care unui articol din tabela parinte ii corespund mai multe articole in tabela copil, se poate crea o relatie unul-la-mai-multe. Acest lucru se realizeaza cu comanda: SET SKIP TO nr_zona|alias unde alias este porecla tabelei copil cu care tabela curenta (parinte) este in relatie. Dupa lansarea acestei comenzi, in urma pozitionarii pe un articol in tabela parinte, se va face pozitionarea in tabela copil pe primul articol corespunzator acestuia, apoi pe urmatoarele. Exemplul 16: fie tabelele Depozit si Vinzari cu aceaasi structura ca in exemplul 14. Tabelele au urmatorul continut: Vinzari Depozit
Se doreste afisarea tutror vinzarilor unui material din depozit, de exemplu caramizi, si suma obtinuta din vinzarea acestora. Acest material este prezent in doua articole ale tabelei Vinzari. SELECT 1 USE Depozit INDEX ON Cod_Mat TO Dix SELECT 2 USE Vinzari INDEX ON Cod_Mat TO Vix SELECT 1 SET RELATION TO Cod_Mat INTO Vinzari SET SKIP TO Vinzari * s-a stabilit o relatie unul-la-mai-multe intre tabela Depozit(parinte) si tabela Vinzari(copil) SEEK ‘C002’ LIST FOR Cod_Mat=‘C002’ Cod_Mat, Den_Mat, Vinzari.Cantitate,Pret_unit Se vor afisa toate articolele din tabela copil, Vinzari, care au codul ‘C002’ (caramida)
Pentru afisarea sumei totale obtinute din vinzarea caramizilor, se foloseste comanda: SUM FOR Cod_Mat=‘C002’ Pret_Unit * Vinzari.Cantitate Suma afisata va fi: 2.000.000 (Adica 3000*500+1000*500=2.000.000) Stergerea tuturor relatiilor tabelei curente se face cu comanda: SET RELATION TO Stergerea unei singure relatii a tabelei parinte (curent selectata) cu o tabela copil, se face cu: SET RELATION OFF INTO alias_tabela_copil Bazele de date relationale sunt formate din doua sau mai multe tabele intre care sau stabilit relatii. 8.3. Actualizarea tabelelor In lucrul simultan cu mai multe tabele este posibila actualizarea cimpurilor din tabela curenta cu informatii provenind dintr‑o alta tabela, deschisa in alta zona de lucru. Acest lucru se realizeaza cu comanda: UPDATE ON cimp_cheie FROM numar_zona | alias REPLACE cimp1 WITH expresie1 [RANDOM] Comanda permite utilizarea in zona de lucru selectata a unor informatii provenind dintr-o alta tabela - desemnata cu porecla alias -, activa in alta zona de lucru. Cele doua tabele au un cimp comun, desemnat prin parametrul cimp_cheie, cimp ce controleaza actualizarea. Tabela curenta, care este actualizata prin aceasta comanda, trebuie obligatoriu sa fie indexata sau sortata crescator dupa cimpul comun. Este recomandat ca si tabela de unde se face actualizarea -desemnata prin alias- sa fie indexata sau sortata crescator dupa acelasi cimp. Daca aceasta nu este indexata sau sortata dupa cimpul comun, se foloseste optiunea RANDOM, care cupleaza cele doua tabele. In urma comenzii UPDATE valorile din cimpul cimp1 vor fi modificate conform expresiei expresie1; aceaasta expresie contine deobicei nume de cimpuri din tabela de unde se face actualizarea. Exemplul 17: fie tabelele Depozit si Vinzari cu aceaasi structura ca in exemplul 16. Tabelele au urmatorul continut: Vinzari Depozit
Se doreste actualizarea stocului din Depozit , pe baza vinzarilor. Pentru articolele prezente in tabela Vinzari (in exemplul nostru: Caramida -cod C002, Tabla-cod T002, Nisip-cod N001), cantitatea din tabela Depozit trebuie actualizata (se va scadea cantitatea vinduta). SELECT 1 USE Depozit INDEX ON Cod_Mat TO Dix SELECT 2 USE Vinzari INDEX ON Cod_Mat TO Vix SELECT 1 UPDATE ON Cod_Mat FROM Vinzari REPLACE Cantitate WITH Cantitate-Vinzari.Cantitate LIST
Se observa ca a fost actualizata corespunzator cimpul Cantitate pentru materialele Caramida, Tabla si Nisip. 8.4. Legarea tabelelor Mediile xBase permit realizarea produsului cartezian redus (reuniunea) a doua tabele intr-o tabela destinatie, prin comanda: JOIN WITH nr_zona|alias FOR conditie [domeniu] [FIELDS lista_cimpuri] TO nume_tabela_destinatie Comanda JOIN genereaza o noua tabela, desemnata prin parametrul nume_tabela_destinatie ce contine articole alcatuite prin reunirea articolelor provenind din doua tabele, cea curenta (din zona selectata) si cea desemnata prin parametrul alias. Comanda JOIN functioneaza astfel: pozitioneaza pointerul de articol pe primul articol din tabela curenta, apoi evalueaza conditia pentru acesta; daca conditia este adevarata, este adaugat un articol nou in tabela destinatie, articol ce este format din cimpurile articolului tabelei curente si cele ale tuturor articolelor din tabela alias care indeplinesc conditia. Procedura este reluata pentru al doilea articol din tabela curenta, s.a.m.d. Parametrul lista_cimpuri din optiunea FIELDS poate sa contina cimpuri din ambele tabele, cea curenta si cea alias; in acest caz in tabela nou creata cu comanda JOIN vor fi adaugate numai cimpurile specificate cu parametru FIELDS. Durata comenzii JOIN poate sa fie destul de mare (pentru fiecare articol din tabela curenta este parcursa toata tabela alias!). Exemplul 18: Fie tabelele Depozit si Vinzari cu structura si continutul din exemplul 17. Se doreste crearea unei tabele denumiet ‘Detaliu’ care sa contina toate cantitatile de materiale vindute din acel depozit. Tabela noua creata prin JOIN va contine codul produsului, denumirea, furnizorul, pretul unitar si cantitatea vinduta. SELECT 1 USE Vinzari INDEX ON Cod_Mat TO Vix SELECT 2 USE Depozit INDEX ON Cod_Mat TO Dix JOIN WITH Vinzari TO Detaliu FOR Cod_Mat=Vinzari.Cod_Mat FIELDS Cod_Mat, Den_Mat, Furnizor, Pret_Unit, Vinzari.Cantitate Va rezulta tabela Detaliu cu urmatorul continut:
Exemplul 19: fie tabelele Facturi si Clienti, cu urmatorul continut: Facturi Clienti
Se doreste crearea unei tabele noi denumite Sitfact, care sa contina situatia facturilor pe clienti. SELECT 1 USE Facturi INDEX ON Cod_Client TO Fix SELECT 2 USE Clienti INDEX ON Cod_Mat TO Cix JOIN WITH 1 TO Sitfact FOR Cod_Client=Facturi.Cod_Client FIELDS Cod_Client, Nume_Client, Facturi.Nr_fact, Facturi.Suma
|