MINISTERUL EDUCAȚIEI NAȚIONALE Șl CERCETĂRII ȘTIINȚIFICE MODULUL 2 - Sisteme de gestiune a bazelor de date b. Programare Visual FoxPro (Microsoft) • Varianta I • Varianta I •Varianta IV Manual pentru clasa a Xll-a Filiera teoretică, profil real, specializarea: Matematică - informatică Filiera vocatională, profil militar, specializarea: Matematică - informatică EDITURA DIDACTICĂ Șl PEDAGOGICĂ, R.A. Manualul a fost aprobat prin Ordinul Ministrului Educației, Cercetării și Tineretului nr. 1342/51 din 19.06.2007, în urma evaluării calitative și este realizat în conformitate cu programa analitică aprobată prin Ordinul Ministrului Educației și Cercetării nr. 5959 din 22.12.2006. Referenți: prof. gr. /Emma Gabriela Dornescu, Colegiul Tehnic Petru Rareș, metodist de specialitate - Informatică - I.Ș.M. - București prof. gr. II Georgiana Pătrașcu, Colegiul Național Sfântu Sava, București Descrierea CIP a Bibliotecii Naționale a României MILOȘESCU, MARIANA Informatică: SGBD: sisteme de gestiune a bazelor de date: manual pentru clasa a XII-a/ Mariana Miloșescu. - București: Editura Didactică și Pedagogică, 2016 ISBN 978-606-31-0273-8 004(075) © EDP 2016. Toate drepturile asupra acestei ediții sunt rezervate Editurii Didactice și Pedagogice R.A., București. Orice preluare, parțială sau integrală, a textului sau a materialului grafic din această lucrare se face numai cu acordul scris al editurii. EDITURA DIDACTICĂ ȘI PEDAGOGICĂ, R.A. Str. Spiru Haret nr. 12, sector 1, cod 010176, București Tel.: (021)315.38.20 Tel./fax: (021)312.28.85 e-mail: office@edituradp.ro www.edituradp.ro Librăria E.D.P.: str. Gen. Berthelot, nr. 28 - 30, sect. 1 Comenzile pentru această lucrare se primesc: • prin e-mail: comercial@edituradp.ro comenzi@edituradp.ro • prin tel./fax: (021)315.73.98 Redactor-șef: Dan Dumitru Redactor: Liana Facă Coperta: Otilia-Elena Borș Tehnoredactor: Mariana Miloșescu Număr de plan: 61080/2016. Format: 16/70x100 Tiparul executat la DON STAR, Galați Qâfcfca caure hHCnvhi pjrfcO.iifcfc fch fc fc.tfcfc; <..fc ■■ # Analizarea unei probleme în scopul Analizarea problemei de gestiune și identificarea datelor identificării și clasificării datelor ne- necesare pentru a obține informațiile cerute de aplicație. cesare Gruparea datelor în tabele, identificarea relațiilor care există Identificarea relațiilor dintre date între tabele și, pe baza acestor relații, gruparea datelor Identificarea modalităților adecvate aplicației într-o structură de date de tip bază de date. de structurare a datelor care inter- Stabilirea corectă a structurii tabelelor și a relațiilor dintre ele vin într-o problemă astfel încât să se elimine redundanța datelor și să se asigure Utilizarea funcțiilor specifice de pre- integritatea datelor. lucrare a datelor structurate Folosirea comenzilor pentru actualizarea și consultarea tabelelor libere și a bazelor de date. Folosirea limbajului SQL pentru a obține informații din baza de date. dat‘Oj aț aih }fu "oj '’fc i< z/r Folosirea programării conduse de evenimente, a programării vizuale, a interogărilor, a vizualizărilor și a rapoartelor pentru a obține din baza de date informațiile cerute de problemă. Structurarea aplicației pornind de la informațiile pe care Identificarea tehnicilor de programare trebuie să le furnizeze baza de date. Identiicarea operațiilor de adecvate rezolvării unei probleme și prelucrare a datelor din baza de date pentru obținerea acestor aplicarea creativă a acestora informații. Organizarea elementelor interfeței astfel încât Elaborarea strategiei de rezolvare a exploatarea ei să însemne o succesiune logică de operații de unei probleme prelucrare a datelor și de furnizare a informațiilor. Analizarea comparativă a eficienței Analizarea rezolvării unei probleme folosind o aplicație cu linie diferitelor tehnici de rezolvare a pro- de comandă (realizată prin metoda programării structurate sau blemei respective și alegerea celei prin metoda programării pe obiecte) și o aplicație realizată cu mai eficiente variante constructorii vizuali. Stabilirea metodei celei mai eficiente. fc nkj oc pmp JHiHv | Utilizarea instrumentelor de dezvol- Utilizarea instrumentelor pentru dezvoltarea unei aplicații tare a unei aplicații vizuale folosind ■ / Elaborarea și realizarea unei apli- Construirea unei aplicații pentru gestiunea bazelor de date cații, folosind un mediu de progra- folosind ■. ’ > । . mare specific Prezentarea unei aplicații de gestiune pornind de la Prezentarea unei aplicații informațiile pe care trebuie să le furnizeze baza de date. Sisteme de gestiune a bazelor de date II, III, III+, IV au fost realizate de firma Ashton-Tate. Ele au deținut supremația mulți ani și au impus un standard în domeniul bazelor de date relaționale, astfel încât sistemele dezvoltate ulterior, cum este și FoxPro, au preluat și dez- voltat acest standard. Deoarece bazele de date dBase au înmagazinat un volum foarte mare de date, pentru a nu se pierde aceste date și pentru a le putea folosi ulterior cu ajutorul aplicațiilor create cu alte sisteme de gestiune a bazelor de date, toate noile sisteme de gestiune a bazelor de date pentru microcalculatoare, dacă nu folo- sesc standardul dBase, au implementată facilitatea de import al bazelor de date dBase. creat de firma Borland a fost ulterior cumpărat de firma Corel și integrat în setul software creat de această firmă. Nu respectă standardul dBase. a fost creat de firma FoxSoftware și a fost cumpărat ulterior de firma Microsoft. Este sistemul de gestiune a bazelor de date care s-a impus cel mai mult în ultima vreme pe microcalculatoare. a fost creat de firma Microsoft și integrat în setul Microsoft Office. Nu respectă standardul dBase, dar poate importa baze de date dBase. este un instrument complex de organizare a datelor. Ea este formată nu numai din datele care reprezintă informația pro- priu-zisă (datele din tabele), dar și de multe date ajutătoare necesare pentru descrierea structurii tabelelor și a rela- țiilor dintre tabele, pentru regăsirea și interpretarea datelor, astfel încât să vă poată oferi acces la o mare cantitate de informații care să vă ajute să luați decizii. Pentru administrarea ei este necesar un software specializat numit Termenul de bază de date se referă la modelul de organizare a datelor pe suportul de memorare, iar termenul de gestiune se referă la acțiunea de stocare și prelucrare a acestor date. Deja ați putut vedea ce tipuri de date se folosesc într-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a înțelege complexitatea unui sistem de gestiune a bazelor de date. Orice sistem de gestiune a bazelor de date trebuie să asigure următoarele funcții elementare: - » definirea bazei de date, - > actualizarea datelor din baza de date prin: adăugarea de noi înregistrări, ștergerea unor înregistrări, modificarea valorii unor câmpuri din înregistrări; - > interogarea bazei de date (extragerea informațiilor din baza de date). La aceste funcții elementare, pe măsura dezvoltării sistemelor de gestiune a bazelor de date s-au mai adăugat și alte funcții, dintre care cele mai importante sunt: - > generarea formularelor de ecran pentru introducerea datelor, - > generarea rapoartelor, - > noi modalități de interogare a bazelor de date (de exemplu, folosind un limbaj neprocedural cum este SQL). Visual FoxPro este cea mai nouă versiune a sistemului de gestiune a bazelor de date FoxPro. Termenul visual înseamnă că aplicația dispune de instrumentele folosite de programarea vizuală. Sistemul de gestiune a bazelor de date FoxPro este cel mai răspândit produs de acest tip pentru microcalculatoare, deoarece: Informatică - > Este , ceea ce a permis preluarea bazelor de date exploatate prin acest sistem. Sunt baze de date care au fost create acum câțiva ani folosind sistemul de gestiune a bazelor de date dBase. S-a consumat mult timp pentru încărcarea lor și preluarea datelor elementare într-un nou format de bază de date relațională, cum este FoxPro, se poate face simplu, fără pierderea datelor. - > Asigură și cu produsele dBase. - > Poate fi folosit sub : Windows, Unix, System. Deose- birea de la un sistem de operare la altul apare doar în interfață și structura meniului. Aceste deosebiri sunt ușor de depășit, deoarece înseamnă de fapt readaptarea la interfața noului sistem de operare. - > Permite o adaptare ușoară la , fără să necesite imple- mentarea unei variante speciale pentru lucrul în rețea. - > Are implementat conceptul de colecție de date definită ca un , care permite folosirea numelor lungi pentru tabele și pentru câmpuri și implementarea direct în tabelele bazei de date, în loc să fie descrisă în programele de aplicație. - > Permite folosind mecanisme DDE (Dynamic Data Exchange), un canal de comunicație între procese prin care Visual FoxPro poate face schimb activ de date cu alte aplicații și poate să controleze alte aplicații - cum este, de exemplu, comunicarea cu aplicația Excel. Orice modificare făcută într-o foaie de calcul Excel se va reflecta și în tabelul bazei de date FoxPro. - > (Object Linking and Embedding - legarea și încapsularea obiectelor) care permite schimbul de date între aplicații diferite. Aplicațiile FoxPro sunt aplicații client și în ele pot fi legate și încapsulate diferite obiecte produse de aplicațiile server: texte, sunete, imagini, foi de calcul. - > Permite păstrate în diferite formate de fișiere: Access, dBase, Paradox, Excel etc. - > Dispune de un limbaj procedural puternic ce permite descrierea datelor și a aplicațiilor pe baza modelului , în care orice algoritm de rezolvare a unei pro- bleme poate fi descris cu ajutorul a trei structuri de control: liniară, alternativă, repetitivă. - > Are implementat pentru interogarea bazei de date, pe lângă limbajul propriu, atât limbajul de interogare , cât și limbajul (interogarea prin exemple, exemplele fiind create interactiv prin diferite obiecte puse la dispoziție de interfață). Aceste limbaje ușurează folosirea sistemului de către utilizatorii neinformaticieni. - > începând cu versiunea 3.0, în limbajul FoxPro este implementat și modelul . Dacă în programarea clasică datele și programele care le prelucrau erau separate, în programarea orientată pe obiecte programul este definit ca o colecție de obi- ecte care înglobează atât ansamblul de date, cât și algoritmii care prelucrează aceste date. Pentru descrierea algoritmilor se folosește în continuare modelul programării structurate. -> Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are implementat și modelul . în cadrul acestui model, programul este considerat un ansamblu de proceduri care nu se execută într-o ordine descrisă de programator, ci numai atunci când apar în sistem anumite evenimente. Un exemplu de astfel de eveniment este apăsarea unei combinații de taste, care se poate produce în orice moment în sistem și nu la momente determinate de programator. -> Permite a aplicațiilor. Acest tip de proiectare oferă programatorilor posibilitatea de a realiza mai simplu interfața aplicației cu ajutorul obiectelor vizuale. Ei nu mai sunt obligați să precizeze cum trebuie realizată aplicația (să descrie algoritmul de Sisteme de gestiune a bazelor de date rezolvare a problemei), ci ce trebuie să realizeze aplicația. Pentru aceasta, FoxPro pune la dispoziția programatorilor diferite instrumente vizuale numite generatoare sau construc- tori. Acestea sunt programe care permit proiectarea interactivă a bazelor de date, a interogărilor, a rapoartelor, a elementelor de interfață (formulare de introducere a datelor, meniuri, ferestre), a aplicațiilor și a proiectelor. în plus, utilizatorul poate apela și la procedurile asistent (wizard) care îl îndrumă interactiv, pas cu pas, în construirea acestor elemente (pe baza datelor furnizate de către programator în cadrul dialogului interactiv). -> Are o viteză de lucru foarte mare, deoarece folosește o tehnologie specială denumită tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogărilor. Sistemul de gestiune a bazelor de date Visual FoxPro permite două șam hTîfe: Jî ¹ - î Sistemul de gestiune a bazelor de date Visual FoxPro permite două O Vi 4¹ ¹ * l> r ’ I 2.1.1 1. zr J Modul de lucru interactiv se poate desfășura și el în două moduri: prin hrten'necHiP hKăisfe: ' lAiedațb v op'îK Interfața aplicației Visual FoxPro este o interfață grafică de tip MDI (interfață cu mai multe documente), adică în fereastra aplicației pot fi deschise mai multe ferestre document. Ea respectă standardul interfeței de tip Microsoft Windows (meniurile, barele cu instru- mente, scurtăturile de la tastatură). Titlurile meniurilor Barele cu instrumente Microsoft Visual FoxPro File View Format Țools ^Program Window Help Pl Undo Ctrl+Z Meniul Edit conține operațiile pentru editarea textelor, inclusiv a comenzilor din fereastra document Command. Cuț Ctrl+X Copy Ctrl+C Clear Select AII Ctrl+A Find... Ctrl+F în fereastra Command pot fi editate comenzile. Pentru editare se pot folosi aceleași tehnici ca și în cazul editoarelor de texte. Informatică 7 Fereastra aplicației prezintă un sistem de meniuri care pun la dispoziția utilizatorului marea majoritate a comenzilor care formează limbajul de comandă. Comenzile, în funcție de modul în care pot acționa, sunt grupate în meniuri, astfel: - > File conține opțiuni pentru operații cu fișiere: creare, deschidere, salvare, tipărire. Mai conține și opțiunea pentru închiderea aplicației Visual FoxPro: Exit. - > Edit conține opțiuni pentru editarea textelor: operații de selectare, operații de copiere (Cuț, Copy, Paste), operații de căutare și înlocuire (Find și Replace), inserarea sau legarea obiectelor. - » View conține opțiuni pentru modificarea obiectelor afișate în fereastra aplicației. Cea mai importantă opțiune este Țoolbars... care vă permite să alegeți barele cu instru- mente care vor fi afișate. - » Format conține opțiuni pentru formatarea textelor afișate în ferestrele document ale aplicației (fontul, dimensiunea și stilul caracterelor, indentarea și spațiul dintre liniile paragrafelor). - » Țools conține opțiuni prin care puteți alege diferite instrumente: proceduri asistent, editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau pentru executarea pas cu pas a programului (Trace). - > Program conține opțiuni pentru compilarea și executarea programelor. - » Window conține opțiuni pentru operații cu ferestrele document: aranjarea ferestrelor (Arrange AII), ascunderea ferestrei active (Hide), ștergerea ferestrei active (Clear), comutarea între ferestre (Cycle), deschiderea ferestrei de comenzi (Command Window), deschiderea ferestrei pentru vizualizarea tabelelor din baza de date deschi- să și a legăturilor dintre tabele (View Window). - > Help conține opțiuni pentru asigurarea asistenței utilizatorului. Sistemul de meniuri este dependent de context. în funcție de operațiile care se execută, mai pot să apară meniurile: - > Table conține opțiuni pentru manipularea înregistrărilor din tabel: adăugarea de noi înregistrări - Append New Record și Append Records..., marcarea pentru ștergere a înregistrărilor (ștergerea logică) - Delete, refacerea înregistrărilor șterse logic - Recalf ștergerea fizică a înregistrărilor marcate pentru ștergere - Remove Deleted Records, poziționarea pe o înregistrare din tabel - Go to Record..., înlocuirea valorilor unor câmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a reflecta situația actuală - Rebuild Indexes etc. Meniul mai conține și opțiuni pentru stabilirea proprietăților tabelului (Properties...) și pentru alegerea fontului, a dimensiunii și a stilului caracterelor cu care se afișează datele din tabel (Font...) etc. - > Database conține opțiuni pentru manipularea tabelelor din baza de date: crearea unui tabel nou și adăugarea lui la baza de date - New Table, adăugarea unui tabel la baza de date - Add Table, crearea unei noi vizualizări și adăugarea ei la baza de date - New Local View, modificarea structurii tabelului selectat din baza de date - Modify, afișarea conținutului tabelului selectat din baza de date într-o fereastră de editare - Browse, înlăturarea unui tabel din baze de date - Remove, actualizarea indexului tabelului selectat din baza de date - Rebuild Table Indexes, ștergerea fizică a înregistrărilor marcate logic pentru ștergere din tabelul selectat din baza de date - Remove Deleted Records..., editarea relației selectate dintre două tabele ale bazei de date - Edit Relationship..., deschiderea ferestrei generatorului pentru integritatea referențială a bazei de date - Referențial Integrity... etc. Sisteme de gestiune a bazelor de date La fel ca la orice aplicație Microsoft, utilizatorul mai are la dispoziție și meniul contextu- lui sau meniul de comenzi rapide care se deschide atunci când se execută clic cu butonul din dreapta al mouse-ului pe un obiect din fereastră. Opțiunile din acest meniu depind de context (de obiectul indicat cu mouse-ul). Database Designer - Testdata ^Fields: empjd last_name first_name title birth date ^Fields: custjd company contact title address to_nâirie orders J^Fields: productjd prod_name___________ eng_name nojn_unit unit_price | i^Fields: line_no orderjd productjd — unit_price quantity | Obiectul indicat cu mouse-ul ~ a fost spațiul liber al feres- trei generatorului de bază de date. Meniul contextului conține opțiuni care se referă la baza de Obiectul indicat cu mouse- ul a fost un tabel al bazei de date. Meniul contextului conține opțiuni care se referă la tabel. Delete Collapse Modify... Help... Collapse AII New Table... New Remote View... New Local View... Add Table... Stored Procedures... Referențial Integrity... Help... furnizează informații despre obiectul focalizat (titlu de meniu, opțiune de meniu, buton din bara cu instrumente etc.), despre programul care se execută (numele programului) sau despre tabelul bazei de date selectat. în acest ultim caz, furnizează informații despre identificatorul tabelului ( I ) și aliasul tabelului, despre numărul înregistrării curente x din numărul total de înregistrări y. Afișarea se face sub forma /. Aceste informații sunt afișate în partea stângă a barei de stare: Testdata! Customer Record: 1/91 Exclusive Identificatorul tabelului și al bazei Numărul înregistrării curente și numărul de date din care face parte total de înregistrări din tabel în partea dreaptă a barei de stare sunt afișate informații despre tastele comutator Insert (OVR), Num Lock (NUM) și Caps Lock (CAPS). Dacă numele lor este caF'S afișat (ca în exemplu), înseamnă că sunt activate. care pot fi deschise în fereastra aplicației Visual FoxPro sunt: - > Fereastra Command. Se folosește pentru editarea comenzilor. - > Ferestrele pentru constructori și generatoare. Se folosesc pentru crearea și modi- ficarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabele ale bazei de date și indecși (Table Designer), vizualizări (View Designer), interogări (Query Designer), formulare pentru introducerea datelor (Form Designer), rapoarte (Report Designer), meniuri (Menu Designer). - > Fereastra pentru administratorul de proiecte (Project Manager). Proiectul este o colecție de fișiere, date, documente și obiecte Visual FoxPro folosite de o aplicație. Informatică - > Fereastra pentru editarea fișierelor cu texte, a fișierelor de programe și a câmpurilor memo. Numele ferestrei va fi numele fișierului, iar în cazul câmpului memo numele va fi format din numele tabelului și numele câmpului memo, separate prin punct. - > Fereastra pentru editarea unui tabel. Poate să fie de tip Browse, când sunt afișate mai multe înregistrări din tabel, câte o înregistrare pe fiecare rând, sau de tip Edit, când este afișată o singură înregistrare, câte un câmp pe fiecare rând. Numele ferestrei este numele tabelului. Deschiderea unei ferestre document se face automat, la alegerea unei opțiuni de meniu sau printr-o comandă. Operațiile cu ferestrele document (redimensionarea, minimizarea, maxi- mizarea, mutarea, defilarea conținutului) se execută la fel ca la orice aplicație Microsoft Windows. Pentru operația de ascundere a unei ferestre alegeți opțiunea Windows Hide. grupează după funcții butoanele scurtături pentru opțiunile din meniuri. Bara standard conține aceleași butoane ca orice bară standard din aplicațiile Microsoft Office. Celelalte bare grupează în general butoane care corespund ferestrelor document ale generatoarelor (Database Designer, Form Designer, Report Designer, View Designer și Query Designer) sau butoane prin care pot fi inserate diferite controale în formulare sau rapoarte (Form Controls și Report Controls). Controalele care pot fi inserate într-un formular pot fi: etichete, casete de text, deruloare, butoane de comandă, comutatoare, butoane de opțiuni, liste, casete combinate, grile etc. Comenzile vor fi editate în fereastra Command. Fiecare comandă se scrie pe un rând. Terminarea unei comenzi se marchează prin acționarea tastei Enter. Acționarea acestei taste semnifică faptul că interpretorul de comenzi poate prelua această comandă să o analizeze, să o decodifice și să o lanseze în execuție. este o succesiune de caractere organizate conform sintaxei limbajului, prin care i se cere calculatorului să execute o acțiune. Sintaxa se referă la structura liniei de comandă. Linia de comandă are următoarea sintaxă: verb listă_adverbe Enter definește acțiunea precizează modul în care se execută acțiunea comandată de verb Observatii: 1. Cuvintele comenzii (verbe și adverbe) se separă prin spațiu. 2. în general, adverbele din listă pot fi scrise în orice ordine. 3. Cuvintele din comandă pot fi scrise cu litere mari sau mici sau combinație de astfel de litere. 4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvântului. 5. Comanda trebuie scrisă pe un singur rând. Dacă se dorește scrierea ei pe mai multe rânduri, înainte de acționarea tastei Enter (care semnifică terminarea comenzii), trebuie să se scrie caracterul . Prezența lui înseamnă că prin acționarea tastei Enter comanda nu se termină, ci se continuă pe rândul următor. 6. Lungimea maximă a unei linii de comandă este de 1024 caractere. 7. în cadrul sistemului de meniuri, în general, opțiunea de meniu reprezintă verbul comen- zii, iar adverbele sunt precizate prin intermediul controalelor din caseta de dialog. 8. Adverbele pot fi: Sisteme de gestiune a bazelor de date - > nume de câmpuri, nume de variabile de memorie, nume de fișiere, aliasuri, expresii. - > o listă - reprezintă un grup de elemente asemănătoare (nume de câmpuri, nume de variabile de memorie etc.). Separarea lor în listă se face prin virgulă. - > un domeniu (scope) - reprezintă un grup de înregistrări dintr-un tabel. Domeniu! poate fi precizat prin: a. cuvinte cheie: - > Heco: o - înregistrarea cu numărul n, - > Mexi - următoarele n înregistrări, începând cu înregistrarea curentă, - > - toate înregistrările, - > Rest - toate înregistrările până la sfârșitul tabelului, începând cu înregistrarea curentă. b. clauze (precizează un anumit tip de acțiune): -> For - numai înregistrările care satisfac condiția precizată prin expresia logică x, începând cu prima înregistrare a tabelului; -> Whiie - toată secvența de înregistrări care urmează înregistrării curente pentru care expresia logică x este adevărată, până la prima înregistrare pentru care expresia nu este adevărată. -> Alte clauze care pot fi folosite ca adverbe sunt: AH/Like/Except <șablon> - poate fi folosită pentru a preciza un grup de varia- bile de memorie, tablouri de memorie sau fișiere, al căror nume corespunde șablonului. Comanda va acționa asupra tuturor (AII), numai asupra celor care Informatică corespund șablonului (Like) sau numai asupra celor care nu corespund șablo- nului (Except). - controlează ieșirea unei comenzi, redirecționând-o față de ieșirea standard (care este ecranul). Ieșirea poate fi: un fișier: un tablou de memorie: - imprimanta: ? 7 - permite manipularea unui tabel într-o altă zonă de lucru, precizată prin alias. Alias este un nume care se atribuie unui tabel, diferit de numele pe care l-a primit acesta la crearea sa. Poate fi folosit pentru identificarea tabelului. - controlează modul în care se scriu date într-un fișier; prezența acestei clauze precizează că datele vor fi adăugate la fișier (scrise la sfârșitul fișierului), iar absența clauzei precizează că datele vor fi scrise la începutul fișierului (vechile date din fișier se vor distruge). De exemplu, linia de comandă: Display next 30 adresa for nume=’Popescu’ conține verbul display (afișează) și adverbele care precizează ce înregistrări și câmpuri vor fi afișate din tabel. Lista de adverbe conține trei adverbe: next 30 - un adverb prin care se precizează domeniul înregistrărilor care vor fi afișate: următoarele 30 de înregistrări începând cu înregistrarea curentă; adresa - un adverb nume de câmp care precizează ce câmpuri se vor afișa din înregistrări; for nume=’Popescu’ - un adverb precizat printr-o clauză care definește domeniul înregistrărilor: toate înregistrările pentru care valoarea câmpului nume este ‘Popescu’. ₜ ț ₜ j Ir - ₍ fi'''L ' Comenzile sunt memorate în fișiere de comenzi speciale, de tip program executabil, care pot fi încărcate în memorie și lansate în execuție. în loc să se scrie comenzile în fereastra de comenzi, una câte una, și să se ceară de fiecare dată execuția lor, se vor scrie într-un fișier de comenzi. Fișierul de comenzi are extensia .prg. Printr-o singură comandă se va cere executarea programului, adică a grupului de comenzi memorat în fișier. în plus, de fiecare dată când se dorește executarea acelor comenzi, ele nu vor mai fi scrise, ci lansate direct în execuție din fișierul de comenzi. Pentru crearea unui fișier de comenzi se deschide fereastra editorului de texte folosind comanda: u în fereastra de editare se scriu comenzile, câte una pe fiecare rând, așa cum se scriu și în fereastra de comenzi. Operațiile pentru editare (selectare, copiere sau mutare text se- lectat, căutare sau căutare cu înlocuire a unui șir de caractere, anularea ultimei operații) sunt operațiile obișnuite ale unui editor de texte Windows. Comenzile pentru aceste operații se găsesc sub formă de opțiuni în meniul Edit. După ce s-au scris comenzile, se salvează fișierul cu opțiunea File->Șave. Pentru închiderea ferestrei de editare se pot folosi scurtăturile: Ctrl+W pentru închiderea cu salvare sau Esc pentru închiderea fără salvare. Programul se lansează în execuție cu comanda: Pe Sisteme de gestiune a bazelor de date — Configurarea mediului de lucru se face prin intermediul unui ansamblu de comenzi în general, sintaxa comenzii Set este: Set ... unde reprezintă w un parametru al sistemului care poate fi modificat prin comandă. Comanda Set prezintă două forme: Această formă se folosește pentru parametrii care pot avea doar două valori: on - para- metru activat și off - parametru dezactivat. De exemplu: On|Off Controlează parametrul Bell (sunet), care poate fi activat (on) sau dezactivat (off). Implicit este on. Controlează parametrul Clock (afișarea pe ecran a ceasului), care On|Off|Status poate fi activat (on), dezactivat (off) sau poate fi afișat în bara de stare (status). Implicit este off. On|Off Controlează parametrul Status Bar (afișarea barei de stare), care poate fi activat (on) sau dezactivat (off). Implicit este on. Controlează parametrul Blink (clipirea elementelor ecranului: margini, On|Off umbre, texte etc.), care poate fi activat (on) sau dezactivat (off). Implicit este on. On|Off Controlează parametrul Talk (afișarea pe ecran a rezultatului comen- zilor), care poate fi activat (on) sau dezactivat (off). Implicit este on. Această formă se folosește pentru parametrii care pot lua o valoare dintr-un domeniu de mai multe valori. Ei vor fi precizați prin valoare. De exemplu: Schimbă directorul curent în cel precizat prin . Controlează parametrul Clock care reprezintă poziția afișării ceasului pe ecran. Ea poate fi precizată prin coordonatele - numărul rândului și - numărul coloanei. Poziția implicită de afișare este colțul din dreapta [,] sus al spațiului de lucru din fereastra de aplicație Visual FoxPro. Controlează parametrul Hours care reprezintă formatul de afișare al orei. El poate considera ziua ca fiind formată din două grupe de 12 ore (cu precizarea am sau pm) sau dintr-un grup de 24 de ore. Valoarea implicită [12/24] este 72. Permite stabilirea unei liste de căutare; această listă conține mai multe căi de director în care se va căuta fișierul precizat în comandă, dacă nu va fi găsit în directorul curent. Pentru a vizualiza starea parametrilor ce pot fi stabiliți prin comenzi Set, se folosește comanda: Se obțin informații despre starea unui parametru ce poate fi stabilit prin comanda Set, cu funcția: ( ) Numele parametrului se scrie ca un șir de caractere. Dacă numele parametrului este folosit cu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezintă doi parametri cu semnificație diferită. în acest caz se folosește 1 sau 2 pentru a afla informații despre fiecare parametru. Informatică Folosind comenzile Set se poate configura mediul Visual FoxPro pentru diferite tipuri de date. De exemplu, pentru: Tipul numeric Stabilește numărul minim de zecimale afișate. Numărul de zecimale [] este precizat prin , care trebuie să fie o expresie numerică cu valoarea cuprinsă între 0 și 18. Valoarea implicită este 2. Stabilește dacă numărul de poziții zecimale afișate este controlat sau nu. Dacă are valoarea off, numărul de poziții afișate nu este controlat On|Off (depinde de valoarea numerică afișată). Dacă are valoarea on, numărul de poziții afișate poate fi controlat cu comanda Set decimals to. Valoarea implicită a acestui parametru este off. Stabilește, prin expresia de tip șir de caractere , care va fi [] delimitatorul folosit între partea întreagă și partea fracționară a unui număr. Valoarea implicită este punctul. Tipul șir de caractere Controlează modul în care se execută operația de comparare a două șiruri. Dacă are valoarea on, două șiruri, pentru a fi egale, trebuie să On|Off aibă aceeași lungime și să fie identice la nivelul fiecărei poziții a caracterelor. Dacă are valoarea off, șirurile pot avea lungimi diferite. Ele vor fi egale numai dacă se potrivesc până când se termină șirul din dreapta. Valoarea implicită este on. Se pot folosi comenzile Set și pentru redirectarea ieșirilor comenzilor. Ieșirea standard este ecranul. De exemplu, prin comanda ? datele de ieșire vor fi afișate pe ecran. Datele de ieșire pot fi redirectate către un alt echipament: imprimantă sau fișier pe disc. Controlează ieșirea către ecran. Dacă are valoarea on, datele de ieșire vor fi afișate pe ecran; altfel, va fi inhibată afișarea lor. Dacă a On|Off fost inhibată afișarea pe ecran, se poate redirecta ieșirea către imprimantă sau către un fișier pe disc, folosind comanda Set Printer. Valoarea implicită este on. Controlează redirectarea ieșirii către imprimantă. Dacă are valoarea on, permite ieșirea la imprimantă; altfel, această ieșire este inhibată. On|Off Valoarea implicită a acestui parametru este off. Redirectează ieșirea către un fișier specificat prin . Dacă nu se precizează parametrul, ieșirea va fi - implicit - către [[additive]] dispozitivul folosit pentru tipărire. Pentru a configura interactiv (prin intermediul interfeței) mediul de lucru Visual FoxPro, se deschide caseta de dialog Options cu opțiunea Țools->Options.... Caseta conține mai multe secțiuni: - > Data pentru parametrii care stabilesc modul în care se controlează datele din tabele, - > View pentru parametrii care stabilesc obiectele afișate în fereastra aplicației: bara de stare, ceasul, rezultatul comenzilor, mesajele sistemului etc. - > General pentru parametrii generali ai mediului care stabilesc caracteristicile sinetului, ale interfeței de programare, ale modului de introducere a datelor etc. tist | display files dir type deletefile rename copyfile Sisteme de gestiune a bazelor de date - > Edit pentru parametrii care stabilesc modul în care se face editarea unui text și modul în care se salvează fișierele, File Locations pentru parametrii care furnizează informații pentru localizarea fișierelor folosite de Visual FoxPro (calea de director și numele fișierului), - > Forms pentru parametrii generatorului de formulare, - > Project pentru parametrii administratorului de proiecte, - > Controls pentru parametrii bibliotecii de clase vizuale și de controale OLE, - » Regional pentru parametrii care stabilesc formatul datelor calendaristice, al datelor moment de timp și al datelor numerice. / i' . i, 4 ,1/ i a ' ,i î ■ , 9- > ■, r ' ! •', ' r f ■ Sistemul de gestiune a bazelor de date creează mai multe fișiere: fișierele care conțin tabele ale bazelor de date .dbf, fișierele care conțin bazele de date .dbc, fișierele de comenzi .prg, fișierele care conțin câmpurile memo .fpt, fișierele care conțin indecșii .idx și .cdx. Gestionarea acestor fișiere (copiere, mutare, redenumire etc.) implică închiderea aplica- ției și revenirea la interfața sistemului de operare. Pentru a se evita aceste operații, sis- temul de gestiune a bazelor de date Visual FoxPro pune la dispoziția utilizatorilor comenzi pentru gestionarea fișierelor. Aceste comenzi sunt: a. copierea unui fișier: □ ' to unde reprezintă numele fișierului sursă (numele fișierului care se copiază), iar reprezintă numele fișierului destinație (numele sub care se face copierea). b. redenumirea unui fișier: z unde reprezintă numele inițial al fișierului, iar reprezintă noul nume al fișierului. c. ștergerea unui fișier: _ sau . unde reprezintă numele fișierului care se șterge. d. afișarea conținutului unui fișier cu text: [fo .rr | to ■: ] unde reprezintă numele fișierului cu text al cărui conținut se afișează implicit pe ecran, dar poate fi redirectat către imprimantă (to printer) sau într-un alt fișier cu numele (to file ). e. afișarea conținutului unui director: [ ] [] [] [<șablon>] [ | ] Se afișează conținutul directorului care se găsește pe unitatea de disc și care poate fi identificat prin calea de director . Prin <șablon> se poate preciza grupul de fișiere care va fi inventariat (de exemplu, *.prg este un șablon prin care se precizează că vor fi inventariate numai fișierele de comenzi). Afișarea se face implicit pe ecran, dar poate fi redirectată către imprimantă (to printer) sau într-un alt fișier cu numele (to file ). Se mai pot folosi două comenzi, identice din punct de vedere al sintaxei: » ;si | L y [[ ] []] [ . | 4 ; e ] Informatică 15 Se lansează în execuție aplicația Visual FoxPro din interfața sistemului de operare Windows. 1. Se administrează interfața aplicației Visuai FoxPro ■ Se identifică elementele ferestrei de aplicație Visual FoxPro: bara de meniuri, bara cu instrumente, bara de stare, fereastra de comenzi și spațiul de lucru al ferestrei de aplicație. ■ Fereastra Commands este o fereastră document. Se execută cu această fereastră operațiile de minimizare, deplasare, maximizare, redimensionare și restaurare. Aceste operații se execută numai în cadrul ferestrei de aplicație. ■ Se deschide caseta de dialog Toolbars cu opțiunea View-»Țoolbars.... în lista Țoolbar se execută clic pe comutatorul View Designer și apoi clic pe declanșatorul Ok. în fereastra aplicației este afișată o nouă bară cu instrumente. Se deschide din nou caseta de dialog Toolbars. Se verifică să fie activat numai comutatorul Standard din lista Țoolbar. Se execută clic pe declanșatorul Ok. în fereastra aplicației este afișată numai bara standard cu instrumente. ■ Se deschide meniul Window. Se observă informațiile afișate în bara de stare. ■ Se execută operații cu ferestre: Se ascunde fereastra document Command cu opțiunea Window-»Hide. în bara de meniu nu mai este afișat titlul meniului Format, deoarece acest meniu conține opțiuni pentru formatarea textelor editate. El depinde de existența unei ferestre care să permită editarea. Fereastra Command este o fereastră în care se editează comenzi. Se reafișează fereastra apăsând tastele Ctrl+F2 (scurtătura opțiunii Window-» Command Window). -> Se deschide fereastra Debugger cu opțiunea Țools-> Debugger. Fereastra Debugger nu este fereastră document a aplicației Visual FoxPro. -> Se închide fereastra Debug executând clic pe butonul de închidere. 2. Se lucrează cu ferestrele document ale constructorilor ■ Se alege opțiunea File-»Open. Se deschide caseta de dialog Open. în listă este afișat conținutul dosarului Vfp (Visual FoxPro). Se deschide din listă dosarul cu exemple Samples. Se deschide apoi dosarul Data. Din lista ascunsă Files of type se alege articolul Database. Se execută clic, în lista cu fișiere și dosare, pe numele fișierului Testdata.dbc. Se execută clic pe declanșatorul Ok. ■ Se deschide fereastra Database Designer (generatorul bazei de date). în fereastră este afișată baza de date a unei organizații: tabelele și relațiile dintre tabele. în fereastră nu este activat niciun obiect. Meniul Format a fost înlocuit cu meniul Database. ■ Se deschide meniul Database și se identifică opțiunile disponibile. Se închide lista meniu- lui. ■ Se execută clic pe tabelul Products. Se observă informațiile din bara de stare. Se deschide meniul Database. Se identifică opți- unile disponibile. Se închide lista meniului. ■ Se activează pe rând ferestrele document deschise, apăsând tastele Ctrl+F1. ? ■----------------------------------- De ce nu sunt disponibile opțiunile Modify, Browse și Remove? 6^ ------------- --—--------------— De ce nu este disponibilă opțiunea Edh Relationship...? Sisteme de gestiune a bazelor de date ■ Se execută clic pe legătura dintre tabelele Orders și Orditems. Se deschide meniul Database. Se închide lista meniului. De ce este disponibilă opțiunea Edit Relationship...? De ce nu sunt disponibile opțiunile Modify, Browse și Remove? Titlul meniului este afișat în bara de meniuri numai dacă în fereastra aplicației este deschisă o fereastră document de tip bază de date în care sunt afișate tabelele bazei de date \ și relațiile dintre ele. Microsoft Visual FoxPro File Edil Vi&w Țools Prograrn Database Designer - Testda customer ^Fields: custjd company Window Help New Table... Add Table... New RemoteView... New Local View... Modify... Browse Remove Rebuild T able Indexes R emove D eleted R ecords... tifle address | J i^Fields: orderjd 1 custjd empjd to_name to address JJ Referențial Iritegrity... Edit Ștored Procedures... Clean Up Database ^Fields: ~TT emp_id last_name first_name / title . birth date y | & ■ Se execută dublu clic pe tabelul Products. Se deschide fereastra Table Designer (ge- neratorul de tabele). Fereastra are numele tabelului - Products, iar în fereastră sunt afișate datele din acest tabel. în partea superioară a ferestrei sunt afișate numele câmpurilor din tabel (numele fiecărei coloane). Se poate derula conținutul ferestrei folosind barele de derulare. Meniul Database a fost înlocuit cu meniul Table. ■ Se deschide meniul Table. Se identifică opțiunile de meniu care pot fi folosite pentru administrarea înregistrărilor dintr-un tabel. Se închide lista meniului. ■ Se deschide meniul View. Se observă că opțiunile acestui meniu sunt dependente de context. în meniu au apărut opțiuni noi. De exemplu, a apărut un grup de opțiuni de tip butoane radio: Browse și Edit. Este activată opțiunea Browse. Aceasta înseamnă că fereastra generatorului de tabel este de tip Browse. Se execută clic pe opțiunea Edit. Se observă că s-a modificat modul în care sunt afișate datele în fereastra tabelului. De data aceasta, pe fiecare rând este afișat conținutul unui câmp. Numele câmpului apare scris la începutul rândului. Se revine la modul de afișare Browse. ■ Se închid cele două ferestre document. în fereastra Command au apărut comenzile care s-au executat prin intermediul interfeței: OPEN DATABASE C:\vfp\samples\data\testdata.dbc EXCLUSIVE MODIFY DATABASE Informatică Titlul meniului este afișat în bara de meniuri numai dacă în fereastra aplicației este deschisă o fereastră document de tip tabel al bazei de date. Microsoft Visual FoxPro File Edit View Țools Program Window Help Propertl Font... lata £| % L^Customer Go to Record Append New Record Țoggle Deletion Mark Ctrl+Y Ctrl+T Cust id ANATR ANTON AROUT' BERGS BLAUS BLO NP Alfreds Futterkiste Ana T rujillo Emparedai Antonio Moreno Taqui Around the Horn Berglunds snabbkdp 3lauer See Delikatess 3londel pere et fils Append Records... Delete Records... Recall Records... Remove Deleted Records Replace Field... Șize Field Move Field BOLID 3 olido Comidas prepar Resize Partitions BONAP bottm BSBEV CACTLI CENTC CHOPS COMMI consh DRACD 3on app' 3ottom-Dollar Markets 3’s Beverages Cactus Comidas para hevui— Zentro comercial Moctezuma 2hop-suey Chinese Zomercio Mineiro Consolidated Holdings Rebuild Indexes ^rachenblut Delikatessen ________________Contact /laria Anders ^na T ru|illo Antonio Moreno Phomas Hardy Lhristina Berglund ^anna Moos Tedenque Citeaux Martin Sommer .aurence Lebihan • hzabeth Lincoln /ictona Ashworth T'atncio Simpson । Francisco Chang i Yang Wang iPedro Afonso E hzabeth Brown Sven Ottlieb S 0 0 S— 0 S Iv 0 0 A S S Iv 0 S S Fiecare comandă va fi scrisă în fereastra de comenzi. Microsoft Visual FoxPro File Edit View Format Țools Program Window Help Ti ~i 11 u ii ■ Se configurează ceasul și modul în care este afișat timpul: 18 Sisteme de gestiune a bazelor de date set hours to 12 set clock to status ceasul este afișat în bara de stare în format de 12 ore ? set ('clock') STATUS ? set ('hours') 12 set clock off ceasul nu mai este afișat în bara de stare set clock on ceasul este afișat în colțul din dreapta sus al spațiului de lucru al ferestrei ? set ('clock',1) 0.000, 122.333 set clock to 15,60 ceasul este în interiorul spațiu- lui de lucru al ferestrei ? set ('clock',1) 15.000, 60.000 (noile coordonate ale ceasului) set hours to 24 ceasul este afișat în format de 24 de ore 2 set ('hours') 12 ■ Se identifică modul în care se pot modifica interactiv diferiți parametri Set. Se deschide caseta de dialog Options la diferite secțiuni și se urmăresc controalele din următorul tabel în care este prezentată o comparație între modul de lucru comandă și modul de lucru interactiv. Se reiau operațiile de la punctul anterior folosind controalele din caseta de dialog Options. Parametrul Mod comandă Mod interactiv Bell Set Bell On|Off Secțiunea General; grupul de butoane radio Off (fără sunet), Default (cu sunet implicit), Play (cu sunet ales prin intermediul unei casete de text). Clock Set Clock On|Off Secțiunea View; caseta Show; comutatorul Clock. Clock Set Clock to [12|24] Secțiunea Regional; grupul de butoane radio 12-Hour și 24-Hour. Decimals Set Decimals to Secțiunea Regional; caseta de text cu derulor Decimals Digit. Point Set Point to Secțiunea Regional; caseta de text Decimals Separator. Exact Set Exact On|Off Secțiunea Data; comutatorul SET EXACT. Status Bar Set Status Bar On|Off Secțiunea View; caseta Show; comutatorul Status Bar. Talk Set Talk On|Off Secțiunea View; caseta Show; comutatorul Command Result. 3. Se lucrează cu fereastra document a editorului de texte ■ în fereastra Command se scriu și se execută pe rând următoarele comenzi: set fixed on x=4*30 set decimals to 4 ?x set point to ',' 120,0000 ■ Se deschide fereastra de editare cu comanda modify command a1. Numele ferestrei de editare este numele fișierului al.prg. ■ Se activează fereastra de comenzi executând clic în această fereastră. Se selectează comenzile introduse la primul punct. Se copiază în memorie aceste instrucțiuni apăsând tastele Ctrl+C. Informatică 19 ■ Se activează fereastra de editare executând clic în spațiul ei de lucru. Se copiază comenzile din memorie, în această fereastră, apăsând tastele Ctrl+V. Se închide fereastra de editare cu salvarea conținutului, apăsând tastele Ctrl+W. ■ Se deschide din nou fereastra de editare cu comanda modify command a1. în fe- reastra de editare sunt afișate instrucțiunile scrise anterior. Se salvează acest conținut într-un alt fișier de program cu comanda File—> Save As.... în caseta de dialog Save As se scrie în zona de editare Save numele fișierului - a2. Se identifică numele dosarului în care se salvează aceste fișiere cu programe. Se execută clic pe declanșatorul Save. Acum numele ferestrei de editare este a2.prg. Ea conține comenzile din programul a1. Se modifică instrucțiunile următoare, pentru a reveni la afișarea implicită a numerelor (2 poziții zecimale și separatorul punct): set decimals to set point to ■ Se închide fișierul a2 cu salvarea modificărilor, apăsând tastele Ctrl+W. ■ Se execută comenzile din fișierul a1, astfel: se scrie în fereastra Commands comanda Do a1. Rezultatul afișat este 120,0000. ■ Se execută comenzile din fișierul a2, astfel: se scrie în fereastra Commands comanda Do a2. Rezultatul afișat este 120.00. ■ Se copiază fișierul al.prg sub numele nou.prg, folosind comanda: copy file al.prg to nou.prg ■ Se vizualizează lista cu fișierele cu programe din directorul curent și se identifică în listă fișierele program create: al.prg, a2.prg și nou.prg. Se folosește comanda: dir like *.prg ■ Se redenumește fișierul nou.prg cu numele a3.prg folosind comanda: rename nou.prg to a3.prg ■ Se vizualizează lista cu fișiere cu programe din directorul curent create în această sesiune de lucru: al.prg, a2.prg și a3.prg. Se folosește comanda: dir like a*.prg Folosiți autodocumentarea aplicației pentru a afla informații despre: 1. comanda display status (pentru a afla informații, scrieți în fereastra de comenzi: help display status); 2. termenul SQL; 3. controalele din caseta de dialog Toolbars; 4. comenzile set; 5. opțiunile din meniurile Table și Database. Sisteme de gestiune a bazelor de date 22. Tipuri de dale în orice sistem de gestiune a bazelor de date sunt implementate următoarele tipuri de date: - > tipul numeric; - > tipul alfanumeric; - » tipul pentru gestionarea timpului; - > tipul special. Pentru a asigura o mai mare flexibilitate în manipularea și stocarea datelor, în sistemele de gestiune a datelor, ca și în alte sisteme care permit prelucrarea datelor, sunt imple- mentate subtipuri de date. Aceste subtipuri pot fi folosite pentru datele elementare stocate în memorie (variabilele de memorie) și/sau pentru datele elementare stocate în memoriile externe (câmpurile tabelelor care formează baza de date). Subtipurile de date diferă între ele prin modul de stocare a datelor și prin domeniul lor de definiție. în sistemul de gestiune a bazelor de date Visual FoxPro sunt implementate următoarele tipuri și subtipuri de date: Pentru operatorul de atnbrw se folosește simbolul ” : ¹ = De exemplu, n=n+100 înseamnă că variabilei n i se atribuie valoarea expresiei n+100. 1 Numele unei variabile de memorie sau al unui câmp. Informatică 21 Pentru manipularea informației numerice (numere reale sau întregi) există următoarele subtipuri numerice: Pentru variabilele de memorie există un singur tip .«₍ - v, reprezentat în memoria internă pe 8 octeți, care permite manipularea numerelor reale cu o precizie de 16 cifre zecimale. Pentru câmpuri există patru subtipuri numerice. Unele subtipuri au lungime fixă, altele permit modificarea lungimii de către utilizator: - » Subtipul ■ > . . (simplu) poate fi folosit pentru numerele reale. Reprezentarea sa în memoria internă poate avea o lungime cuprinsă între 1 octet și 20 de octeți, în funcție de declarația utilizatorului. Acesta trebuie să precizeze numărul total de caractere folosite pentru reprezentarea numărului (un caracter pentru semnul minus folosit de numerele negative, numărul de cifre pentru partea întreagă, numărul de cifre pentru partea zecimală și un caracter pentru punctul folosit ca separator între partea întreagă și partea zecimală) și numărul de caractere folosite numai pentru partea zecimală. Deoarece numărul maxim de octeți este 20 (deci numărul maxim de caractere folosite pentru număr este 20), acest subtip poate fi folosit pentru reprezentarea cu precizie scăzută a numerelor raționale mici. - > Subtipul <. i . (dublu) poate fi folosit și el pentru numerele reale. Reprezentarea numărului pe suportul de memorare se face în virgulă mobilă, dublă precizie (o metodă optimă de reprezentare a numerelor reale) și are o lungime fixă de 8 octeți. Acest subtip poate fi folosit pentru reprezentarea cu precizie mărită (până la 15 cifre zecimale) a numerelor reale foarte mari (până la ordinul 10³⁰⁸)¹. Deoarece lungimea sa este fixă, pentru o bună gestionare a spațiului de memorare nu se recomandă folosirea acestui subtip pentru numere reale mici cu precizie scăzută. - > Subtipul < (întreg) poate fi folosit numai pentru numerele întregi. Reprezentarea numărului pe suportul de memorare se face în binar pe o lungime fixă de 4 octeți, folosindu-se un bit pentru semn și 31 de biți pentru număr. Deoarece 2³¹ -1 este egal cu 2147483647, domeniul de definiție al acestui subtip este [-2147483648, 2147483647], - > Subtipul (monetar) poate fi folosit pentru memorarea valorilor numerice exprimate în unități monetare. înaintea numărului se introduce simbolul monetar ($). Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale și cu valori cuprinse aproximativ în domeniul [-9x10¹⁴, 9x10¹⁴]¹ ² ³. Este specific domeniului contabil, pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octeți. ., . : . , care pot fi aplicați pe datele de tip numeric sunt: M={+, ; *,/, **|A’ %⁴} Pentru operația modulo se mai poate folosi și funcția mod(a,b) care calculează restul împărțirii lui a la b. - care pot fi aplicați pe datele de tip numeric sunt: ^={>, >=,<,<=,=,#!<>|!=⁵} ¹ Mai exact, numere din intervalul [-1,79769313486232x10308 -1,79769313486232x10308], ² Mai exact, numere din intervalul [-922337203685477,5808 4- 922337203685477,5807] ³ Pentru operația ridicare la putere. ⁴ Pentru operația modulo, prin care se calculează restul împărțirii unui operand de tip numeric întreg la un al doilea operand de tip numeric întreg. ⁰ Variante ale operatorului diferit. 22 Sisteme de gestiune a bazelor de date 2.2.2. Tipuri alfanumerice Sunt implementate următoarele tipuri de date pentru reprezentarea informației alfanu- merice (a textelor): Tipul character (șir de caractere) poate fi folosit atât pentru variabilele de memorie, cât și pentru câmpuri. Fiecare caracter este reprezentat pe suportul de memorare pe un octet, prin codul său ASCII. Lungimea maximă a șirului de caractere este 254 de caractere. Lungimea șirului de caractere dintr-un câmp este fixă pentru întregul tabel și poate fi stabilită până la maxim 254 de caractere. Lungimea șirului de caractere dintr-o variabilă de memorie este variabilă, în funcție de valoarea atribuită datei. Pentru constanta șir de caractere se pot folosi ambele tipuri de delimitatori: apostrof ('Caracter') și ghilimele ("Caracter"). Operatorii de concatenare care pot fi aplicați pe datele de tip șir de caractere sunt: C={+,-} Operatorul + se numește operator de concatenare simplu, iar operatorul - se nu- mește operator de concatenare special. Deosebirea dintre operatorul de concatenare simplu și operatorul de concatenare special este aceea că cel de-al doilea operator mută spațiile de la sfârșitul primului șir de caractere la sfârșitul șirului de caractere concatenat. De exemplu: 'Pop ' + ' Ana' = 'Pop Ana' IPI o IP I I I I + | | |A|nȚT] = |P|o|p | | | | | |A]n|a | 'Pop ' -' Ana' = 'Pop Ana ' 1PI o IP I I I I - I I IA|nȚăn = | P | o | p | | |A|n | a | | | | Operatorii relaționali care pot fi aplicați pe datele de tip șir de caractere sunt: 21= {>, >=, <, <=, =, ==, #|<>| !=, $} Operatorul == (identic) va furniza rezultatul logic adevărat dacă cele două șiruri de caractere sunt identice (conțin exact aceleași caractere, inclusiv spațiile, în exact aceleași poziții). De exemplu, expresia 'abc' == 'abc' are valoarea adevărat, iar expresia 'abc'== ’acb’ are valoarea fals. Operatorul = (egal) compară șirurile caracter cu caracter, de la stânga la dreapta, până când două caractere comparate nu sunt egale sau până când se ajunge la sfârșitul celui de-al doilea șir. De exemplu, condiția "abc" = "ab" are valoarea adevărat, iar condiția "ab" = "abc" are valoarea fals. Operatorul $ (inclus în) va furniza rezultatul adevărat dacă primul șir de caractere este conținut de cel de-al doilea șir de caractere (primul șir este subșir în al doilea șir). De exemplu, expresia 'abc' $ 'abcd' are valoarea adevărat, iar expresia 'abc' $ ’acbd' are valoarea fals. Subtipul memo poate fi folosit numai pentru câmpuri. Se recomandă pentru câmpurile în care se memorează șiruri de caractere ce au o lungime mai mare de 254 de caractere sau care au lungimi foarte diferite între ele, de la o înregistrare la alta. De exemplu, dacă în baza de date a școlii trebuie să se păstreze informații despre cauzele exmatriculării unui elev, aceste informații sunt texte de lungimi diferite, care pot avea și lungimea 0 pentru elevii care nu au fost exmatriculați. Stabilirea unei lungimi optime pentru astfel de câmpuri este imposibilă. în aceste cazuri se preferă subtipul memo, care permite o alo- care dinamică, pentru astfel de câmpuri, a spațiului de memorare de pe disc, diferită de la Informatică 23 un câmp la altul, în funcție de necesitățile de la un moment dat. Memorarea caracterelor din fiecare câmp memo se face într-un fișier asociat tabelului care conține câte o înregis- trare de lungime variabilă asociată fiecărui câmp memo din tabel. Acest fișier are exten- sia .fpt. în tabel, în câmpul memo se păstrează pe 4 octeți doar adresa la care se găseș- te înregistrarea asociată în fișier. Câmpurile de tip memo nu pot fi câmpuri cheie. 123. Tipul logic Pentru tipul logic nu există subtipuri. Tipul logic poate fi folosit atât pentru variabile de memo- rie, cât și pentru câmpuri. Câmpurile care conțin date de tip logic nu pot fi câmpuri cheie. Tipul logic se numește iogicai. El se reprezintă folosind 1 octet de suport de memorie. Mulțimea constantelor logice este: L = {.T.,.F.}¹ Operatorii logici care pot fi aplicați pe datele de tip logic sunt: £= {and, or, not|!} Ordinea de evaluare a operatorilor logici este: not, and, or. 2.23. Tipuri pentru gestionarea timpului în aplicațiile care gestionează un volum mare de date este important să se poată urmări evoluția cronologică a acestor date. Din această cauză orice sistem de gestiune a bazelor de date are implementat tipul de date pentru gestionarea timpului. în Visual FoxPro sunt implementate două tipuri de date pentru gestionarea timpului, atât pentru variabile de memorie, cât și pentru câmpuri: Tipul date (data calendaristică) permite memorarea datelor calendaristice cu precizie de o zi, folosind 8 octeți: 4 pentru numărul anului, 2 pentru numărul lunii și 2 pentru numărul zilei. Fiecare cifră a acestor numere se reprezintă în codul ASCII. Cu tipul date se pot reprezenta date cuprinse între 1 ianuarie 100 și 31 decembrie 9999. Pentru constanta dată calendaristică se folosesc ca delimitatori parantezele acoladă, între paranteze se scrie data. Formatul implicit pentru dată este: ll/zz/aa. Astfel, constanta {01/25/01} specifică data 25 ianuarie 2001. Constanta dată calendaristică vidă se preci- zează astfel: { / / } (câte două spații pentru fiecare număr). Datele invalide (dacă numărul zilei sau al lunii nu este corect) sunt considerate date vide. Operatorii pentru date calendaristice care pot fi aplicați pe datele de tip dată calenda- ristică sunt: ©={+,-} Acești operatori se aplică astfel (s-a notat cu a primul operand, cu b al doilea operand și cu c rezultatul): Operator Tip a Tip b Tip c Execută Exemplu incrementează data din operandul a cu {08/31/01}+1 = -i- D* 2 î3 D numărul de zile din operandul b {09/01/01} .T.= constantă pentru valoarea „adevărat" și .F.= constantă pentru valoarea „fals" ² Tip dată calendaristică. ³ Tip întreg. Sisteme de gestiune a bazelor de date Operator Tip a Tip b Tip c Execută Exemplu decrementează data din operandul a cu {08/01/01 }-1 = D î D numărul de zile din operandul b {07/31/01} calculează diferența în zile dintre primul {08/01/01}- D D î operand și al doilea operand {07/01/01}=31 Subtipul (timp calendaristic) permite memorarea momentelor de timp dintr-o zi, cu o precizie de sutime de secundă, atât față de data curentă, cât și față de momentul zero al sistemului FoxPro, care este considerat data de 1 ianuarie 100. Se memorează folosind 8 octeți: 4 octeți pentru data calendaristică (memorată sub formă de întreg care reprezintă numărul de zile scurse de la momentul zero FoxPro) și 4 octeți pentru timp (memorat sub formă de întreg care reprezintă numărul de secunde scurse de la miezul nopții). Și pentru constanta timp calendaristic se folosesc ca delimitatori parantezele acoladă, între paranteze se scriu data și timpul în formatul U/zz/aa oo:mm:ss [xMf. oo reprezintă un număr format din două cifre pentru oră: 00 Italian zz-ll-aa « Pentru an se pot specifica două Japan/YMD aa/ll/zz sau patru cifre. Formatul implicit USA ll-zz-aa ¹ Parantezele [ ] semnifică faptul că este opțional conținutul lor. ² Tip timp calendaristic; Informatică este cu două cifre. Acest format nu deranjează, în special în cazul anilor mai mici decât 2000. Se poate cere și o afișare a anului cu patru cifre folosind comanda: on Se poate modifica separatorul folosit în cadrul reprezentării datei folosind comanda: ‘’ Modul în care este afișată data pentru gestionarea timpului poate fi controlat cu următoarele comenzi: 12|24 care permite stabilirea unui format cu ziua formată din 24 de ore sau a unui format cu ziua împărțită în două perioade de 12 ore (am și pm) și: on|off care permite afișarea timpului cu secunde (on) sau fără secunde (off). Acest tip de date este folosit numai pentru câmpurile din tabelele bazei de date și permite stocarea unor entități create cu alte aplicații (foi de calcul, imagini grafice, sunete etc.). în Visual FoxPro se folosește numai tipul (date generale) care permite păstrarea în tabelele bazei de date a unor entități de tip document, foaie de calcul sau imagine. Aceste entități sunt considerate obiecte și pot fi stocate în baza de date folosind protocolul OLE de încapsulare și legare a obiectelor. Ele trebuie să fie create cu o aplicație OLE server. Memorarea obiectelor din câmpul general se face într-un fișier asociat tabelului. în tabel, în câmpul general se păstrează pe 4 octeți doar adresa la care se găsește obiectul. Câmpurile de tip general nu pot fi câmpuri cheie. O variabilă de memorie se creează atribuind o valoare numelui variabilei. Valoarea poate fi precizată printr-o constantă, prin numele unei alte variabile de memorie sau printr-o expresie. Tipul datei atribuite determină tipul variabilei. De exemplu, prin operația de atribuire a=2 s-a creat variabila de memorie a de tip numeric. Următoarea operație de atribuire a=2=3 schimbă tipul variabilei de memorie a, deoarece noua valoare atribuită este de tip logic (rezultatul operației de comparare 2=3). Unele comenzi sau funcții Visual FoxPro cer să li se furnizeze un nume, cum ar fi: numele unui fișier bază de date, numele unui câmp, numele unui alias, numele unui fișier index, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosind adresarea indirectă, numele poate fi furnizat prin intermediul unei variabile de memorie sau al unui tablou de memorie, astfel încât să se poată generaliza comanda. Pentru adresarea indirectă se poate folosi : se memorează numele într-o variabilă de memorie, după care poate fi substituit într-o comandă sau într-o funcție prin numele variabilei de memorie sau al elementului de tablou, precedat de semnul &: sau unde este o expresie de tip șir de caractere. în acest caz, șirul de caractere x va fi concatenat cu numele memorat în variabila de memorie. Sisteme de gestiune a bazelor de date Pentru adresarea indirectă se mai poate folosi și expresia nume: se memorează numele într-o variabilă de memorie, după care poate fi substituit într-o comandă sau într-o funcție prin numele variabilei de memorie sau al elementului de tablou, închis între paranteze rotunde: () ' "r expresii' Se vor evalua expresii de mai multe tipuri folosind aplicația Visual FoxPro. în expresii se vor folosi și variabile de memorie. Se deschide fereastra aplicației Visual FoxPro. Comenzile pentru evaluarea unor expresii vor fi scrise în fereastra Command. Pentru a cere evaluarea unei expresii veți scrie înaintea ei semnul ? care semnifică operația de afișare. Rezultatul evaluării va fi afișat în spațiul liber al ferestrei de aplicație. a. Se evaluează expresia următoare pentru a=1, b=2, c=3 și d=3: n a+b b+d a+c c c ⁺ a (a+b) ■ Se folosesc cinci variabile de memorie a, b, c, d, și e. Se atribuie valori primelor patru variabile de memorie, astfel: se scriu patru operații de atribuire, câte una pe fiecare rând. Se termină fiecare operație de atribuire apăsând tasta Enter. a=1 b=2 c=3 d=4 ■ Se atribuie variabilei de memorie e valoarea expresiei, astfel: se scrie pe un rând operația de atribuire și se apasă la sfârșit tasta Enter. e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3) ■ Se afișează valoarea variabilei de memorie e, astfel: se scrie pe un rând comanda și apăsați la sfârșit tasta Enter: ?e în fereastra aplicației va fi afișată valoarea 2.65. b. Se evaluează expresiile următoare pentru x=2, a=1, b=2 și c=3: x(x —3)(x-l) ab a o a 4(—+ c) + (ab)²+3 — _ bc bc 1^3“ -3 2a c. Se compară două date calendaristice: 2 ianuarie 2007 cu 1 februarie 2007: ? {01/02/07} > {02/01/07} .F. d. Se evaluează expresia logică: e = a and b or (not a or not b) pentru a=.T. și b=.T. și pentru a=.F. și b=.F. a=.T. b=.T. Informatică e=a and b or (not a or not b) ?e .T. a=.F. _________________________________27 b=.F. e= a and b or (not a or not b) ?e .T. Observație. După fiecare operație de atribuire, pentru variabilele de memorie a și b se execută o operație de atribuire pentru expresia e, pentru ca expresia să fie evaluată cu noile valori ale variabilelor a și b. e. Se verifică dacă valoarea numărului real x aparține mulțimii A = (0,10]u{30} pentru x=50 și pentru x=5. Pentru a verifica apartenența valorii variabilei x la mulțimea A se evaluează expresia logică: e = (x>0 and x<=10) or x=30. Pentru a verifica dacă valoarea variabilei x nu aparține mulțimii A, se evaluează expresia logică not e. x=50 x=5 e=(x>0 and x<=10) or x=30 e=(x>0 and x<=10) or x=30 ?e ?e .F. .T. ? not e ? not e .T. .F. f. Se aplică diferiți operatori asupra datelor calendaristice. Se adaugă 2 zile la data de 10 februarie 2007 și se obține data de 12 februarie 2007. Se scad 10 zile din data de 1 ianuarie 2007 și se obține data de 22 decembrie 2006. Se calculează diferența de zile între datele 1 ianuarie 2007 și 22 decembrie 2006. ? {02/10/07}+2 ?{01/01/07}-10 ?{01/01/07}-{12/22/06} 02/12/07 12/22/00 10 g. Se stabilește modul în care sunt comparate datele de tip șir de caractere: set exact off .T. ?'ab'='ab 1 î'abc-'abd' ?"='ab' .T. .F. .F. ?'ab -='ab 1 7'abc'=='abcr ?'ab'=" .F. .F. .T. 7'abT^ab' ?'abc'='ab' set exact on .F. .T. 7'ab^'abc' ?*ab -’ab’ î'ab'-abc* .F. .T. .F. ?'abc'='ab' ?'ab ’=='ab' ?’abc'=,ab1' .F. .F. .F. ?,abc’='ab1' ?"='ab' 7'ab^’abT .F. .F. .F. î’ab-’abT ?'ab'=" 7’abT^ab' .F. .F h. Se compară două șiruri de caractere: a='123' ?a>b ? b$a b='12' ,F.7 .T. ?a0, 0 dacă x=0 și -1 dacă x<0). Abs Abs(x) Furnizează valoarea absolută (modulul) argumentului x. Mod(x,y) lnt(x) Ceiling(x) Floor(x) Round(x,y) Sqrt(x) Exp(x) Log(x) Log10(x) Sin(x) Cos(x) Tan(x) Asin(x) Furnizează restul împărțirii argumentului x la argumentul y. Funcții care aproximează datele Furnizează partea întreagă a argumentului. Furnizează cel mai apropiat întreg mai mare sau egal cu argumentul. Furnizează cel mai apropiat întreg mai mic sau egal cu argumentul. Furnizează valoarea numerică a numărului precizat prin argumentul x, rotunjită la numărul de zecimale precizat prin argumentul y. Funcții matematice Furnizează rădăcina pătrată din argument. Furnizează exponențialul argumentului. Furnizează logaritmul natural din argument. Furnizează logaritmul zecimal din argument. Funcții trigonometrice Furnizează sinusul argumentului exprimat în radiani. Furnizează cosinusul argumentului exprimat în radiani. Furnizează tangenta argumentului exprimată în radiani. Furnizează arcsinusul argumentului exprimat în radiani. Informatică Funcția Sintaxa Acos Acos(x) Atan(x) Rtod(x) A'o" Dtor(x) P’ Pi() Ce reprezintă?_____________________________________ Furnizează arccosinusul argumentului exprimat în radiani. Furnizează arctangenta argumentului exprimată în radiani. Realizează conversia din radiani în grade. Realizează conversia din grade în radiani. Furnizează valoarea constantei n (3,141592). 1. Se poate exprima relația dintre un număr, modulul său și semnul său astfel: x = abs(x)*sign(x) 2. Pentru a afla partea fracționară a unui număr x se poate folosi expresia: x - int(x) 3. Se pot folosi funcțiile exp() și log() pentru a calcula valoarea expresiei ab, adică aAb. Matematic, ab = eb*lⁿ și operatorul aritmetic pentru ridicare la putere se poate exprima folosind aceste funcții: aAb = exp(b*log(a)) 4. Se pot folosi funcțiile log() și Iog10() pentru a calcula valoarea oricărui logaritm - matematic: logb(a)= log(a)/log(b) = Iog10(a)/log10(b) 5. Argumentele funcțiilor trigonometrice sin(x), cos(x) și tan(x) sunt specificate în radiani și nu în grade. .. Rezultatul furnizat de funcțiile asin(x), radⁱa™______________________________9rade acos(x) și atan(x) este în radiani. ~ * 6. Pentru a transforma gradele (Degree) în radiani (Radian), și invers, se pot folosi funcțiile Dtor() și Rtod(). 1. Se evaluează expresii numerice folosind funcția sqrt(): pentru a=4. Se scriu comenzile: a=4 e=((sqrt(a+1 )-sqrt(a-1))/ (sqrt(a+1 )+sqrt(a-1 )))*(2-a) ?e -0.25 (rezultatul afișat) Se evaluează expresia: b. pentru x=3. x=3 ?e e-sqrt(sqrt(sqrt(xA2-1))) 1.30 2. Se evaluează semnul expresiei numerice cu funcțiile: sign(), abs(): ? abs(-1000) alfa=-1000 1000 ? alfa=sigiAaLA abs(alfa) ? sign(-IOOO) .T. 30 Sisteme de gestiune a bazelor de date 3. Se aproximează expresii numerice folosind funcțiile: ceiling(), floor(), round(), int(): x=5.253 6 ? fioor(x) ? sign(x) ? floor(x) ? round(x,2) -6 -1 5 5.25 ? int(x) ? round(x,2) ? int(x) ? round(x+0.004,2) -5 -5.25 5 5.26 ? ceiling(x) ? ceiling(x) x=-5.25 -5 4. Se extrage partea fracționară dintr-un număr: x=3.15 0.15 2 x-int(x) ? x-int(x) x=-3.15 -0.15 5. Se calculează modulo (restul împărțirii) folosind operatorul % și funcția mod(): ? mod(5,2) 2 mod(5,2) = 5%2 ? 6.5%3 1 .T. 0.5 ? 5%2 ? mod(6.5,3) 1 0.5 6. Se evaluează expresii numerice folosind funcția sqrt(), log(), Iog10(), exp(): a=2 ?exp(1) ? exp(log(5)) b=3 2.72 5.00 ? aAb=exp(b*log(a)) 2 log(1) ? Iog10(1000) .T. 0.00 3.00 ? exp(0) 2 log(exp(5)) 2 Iog10(1000A2) 1 5.00 6.00 7. Se evaluează funcții trigonometrice folosind funcțiile: sin(), cos(), tan(), asin(), acos(), atan(), pi(), rtod(), dtor(): ? sin(pi()/2) 90.00 ? rtod(asin(-1)) 1.00 ? tan(pi()/4) -90.00 2 sin(dtor(90)) 1.00 ? rtod(acos(-1)) 1.00 ? rtod(atan(1)) 180.00 ? asin(1) 45.00 ? rtod(asin(sqrt(2)/2)) 1.57 ? rtod(atan(-1)) 45.00 r ? rtod(asin(1)) -45.00 Zi ; y । 22.1. Funcții perșii date de tip șir de caractere £ Pentru aceste funcții argumentul este de tip șir de caractere. Argumentul poate fi o variabilă sau un câmp șir de caractere, ori o expresie al cărei rezultat este un șir de caractere. w $ Funcția Sintaxa Ce reprezintă? Funcții pentru conversii w Ase Asc(x) Argumentul x este de tip șir de caractere. Funcția furnizează codul ASCII 0 al primului caracter din argument. itru șiruri Chr Chr(x) Argumentul x este de tip numeric întreg cuprins între 0 și 255. Funcția furnizează caracterul al cărui cod ASCII este argumentul x. Funcția furnizează un rezultat de tip șir de caractere. Funcții care furnizează informatii despre un șir de caractere s Len Len(x) Furnizează un rezultat de tip numeric ce reprezintă lungimea șirului de JW caractere. •ii isalpha Isalpha(x) Furnizează un rezultat de tip logic prin care se testează dacă primul caracter din șirul de caractere este o literă (rezultatul este .T. dacă primul caracter este o literă). Funcția Sintaxa Ce reprezintă? Isupper Isupper(x) Furnizează un rezultat de tip logic prin care se testează dacă primul caracter din șirul de caractere este o literă mare (rezultatul este .T. dacă primul caracter este o literă mare). Ssîower Islower(x) Furnizează un rezultat de tip logic prin care se testează dacă primul caracter din șirul de caractere este o literă mică (rezultatul este .T. dacă primul caracter este o literă mică). Isdigit Isdigit(x) Furnizează un rezultat de tip logic prin care se testează dacă primul caracter din șirul de caractere este o cifră (rezultatul este .T. dacă primul caracter este o cifră). Funcții pentru generarea de șiruri de caractere Replicate Replicate(x,y) Argumentul x este de tip șir de caractere, iar argumentul y este de tip numeric. Funcția furnizează un șir de caractere obținut prin repetarea de y ori a șirului de caractere x. Space Space(x) Argumentul x este de tip numeric. Funcția furnizează un șir de caractere format din x spații. Funcții pentru eliminarea spațiilor sau pentru inserarea spațiilor sau a altor caractere într-un șir de caractere Alltrim Alltrim(x) Elimină spațiile din fața și din spatele (din stânga și din dreapta) șirului de caractere x. Ltrim Ltrim(x) Elimină spațiile suplimentare din fața (din stânga - left) șirului de caractere x. Rtrim, Rtrim(x) Elimină spațiile din spatele (din dreapta - right) șirului de caractere x. Trim Trim(x) Padc Padc(x,n[,y]) Argumentele sunt x,y de tip șir de caractere și n de tip numeric. Funcția completează șirul de caractere x la stânga și la dreapta cu șirul de caractere y astfel încât șirul rezultat să aibă lungimea n. Padî Padl(x,n[,y]) Argumentele sunt x,y de tip șir de caractere și n de tip numeric. Funcția completează șirul de caractere xîn față (la stânga - left) cu șirul de caractere y astfel încât șirul rezultat să aibă lungimea n. Padr Padr(x,yn[,y]) Argumentele sunt x,y de tip șir de caractere și n de tip numeric. Funcția completează șirul de caractere x la sfârșit (la dreapta - right) cu șirul de caractere y astfel încât șirul rezultat să aibă lungimea n. Funcții pentru transformarea unui șir de caractere Lower Lower(x) Furnizează un șir de caractere în care literele din șirul de caractere x sunt transformate în litere mici. Upper Upper(x) Furnizează un șir de caractere în care literele din șirul de caractere x sunt transformate în litere mari. Proper Proper(x) Furnizează un șir de caractere în care literele din șirul de caractere x sunt transformate astfel: prima literă este mare, iar celelalte sunt mici. Chrtran Chrtran(x,y,z) Argumentele x, y, z sunt de tip șir de caractere. Furnizează un șir de caractere obținut prin transformarea șirului de caractere x astfel: toate aparițiile primului caracter din șirul de caractere y sunt înlocuite cu primul caracter din șirul z, toate aparițiile celui de-al doilea caracter din șirul y sunt înlocuite cu al doilea caracter din șirul z etc. Dacă expresia y are mai multe caractere decât expresia z, atunci caracterele care sunt în plus vor fi transformate în caracterul NULL. Dacă expresia z are mai multe caractere decât expresia y, atunci caracterele care sunt în plus vor fi ignorate. Strtran Strtran(x,y Argumentele x, y, z sunt de tip șir de caractere, iar argumentele n și m [,z,n,m]) sunt de tip numeric. Furnizează un șir de caractere prin înlocuirea în șirul de caractere x a șirului de caractere y cu șirul de caractere z. înlocuirea începe cu apariția n a șirului y și se vor înlocui numai m apariții. Dacă ri Sisteme de gestiune a bazelor de date Funcția Sintaxa Ce reprezintă?________________________________________________________________ se precizează șirul z, el va fi considerat șirul vid, iar efectul va fi ștergerea a m apariții ale șirului y începând cu apariția n. Dacă nu se precizează argumentul n, înlocuirea începe cu prima apariție, iar dacă nu se precizează argumentul m, se vor înlocui toate aparițiile. Stuff(x,n,m,y) Argumentele x și y sunt de tip șir de caractere, iar argumentele n și m sunt de tip numeric. Furnizează un șir de caractere obținut prin înlocuirea în șirul de caractere x a unui subșir, care începe din poziția n și are lungimea m, cu șirul de caractere y. Funcții pentru operații cu subșiruri de caractere Left(x,n) Argumentul x este de tip șir de caractere, iar argumentul n este de tip numeric. Furnizează un șir de caractere obținut prin extragerea a n caractere de la stânga șirului x. Right(x,n) Argumentul x este de tip șir de caractere, iar argumentul n este de tip numeric. Furnizează un șir de caractere obținut prin extragerea a n caractere de la dreapta șirului x. Substr(x,m, Argumentul x este de tip șir de caractere, iar argumentele n și m sunt de n) tip numeric. Furnizează un șir de caractere obținut prin extragerea unui subșir de lungime n din șirul x, începând cu poziția m. At(x,y[,n]) Argumentele x și y sunt de tip șir de caractere, iar argumentul n este de tip numeric. Furnizează un rezultat numeric care reprezintă poziția în șirul y a subșirului x. Căutarea se face de la stânga la dreapta, ținând cont de diferența dintre literele mari și mici. Dacă se precizează argumentul n, se caută apariția n. Rat(x,y[,n]) Argumentele x și y sunt de tip șir de caractere, iar argumentul n este de tip numeric. Furnizează un rezultat numeric care reprezintă poziția în șirul y a subșirului x. Căutarea se face de la dreapta la stânga, ținând cont de diferența dintre literele mari și mici. Dacă se precizează argumentul n, se caută apariția n. Atc(x,y[,n]) Argumentele x și y sunt de tip șir de caractere, iar argumentul n este de tip numeric. Furnizează un rezultat numeric care reprezintă poziția în șirul y a subșirului x. Căutarea se face de la stânga la dreapta, fără să țină cont de diferența dintre literele mari și mici. Dacă se precizează argumentul n, se caută apariția n. Atiîne(x,y) Argumentele x și y sunt de tip șir de caractere. Furnizează un rezultat numeric care reprezintă linia de text din șirul y în care apare prima dată subșirul x. Căutarea se face ținând cont de diferența dintre literele mari și mici și de la stânga la dreapta. Ratline(x,y) Argumentele x și y sunt de tip șir de caractere. Furnizează un rezultat numeric care reprezintă linia de text din șirul y în care apare prima dată subșirul x. Căutarea se face ținând cont de diferența dintre literele mari și mici și de la dreapta la stânga. Atcline(x,y) Argumentele x și y sunt de tip șir de caractere. Furnizează un rezultat numeric care reprezintă linia de text din șirul y în care apare prima dată subșirul x. Căutarea se face ținând cont de diferența dintre literele mari și mici și de la stânga la dreapta. Occurs(x,y) Argumentele x și y sunt de tip șir de caractere. Furnizează un rezultat numeric ce reprezintă numărul de apariții ale subșirului x în șirul y. 1. Se pot folosi următoarele funcții pen- tru conversia număr <-> caracter: cod ASCII caracter Informatică 2. Pentru șirul vid funcția Len() furnizează valoarea 0. 3. Funcțiile Replicate(‘ ‘,n) și Space(n) furnizează același rezultat. 4. Funcțiile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() și Padr() pot fi sintetizate în următoarele diagrame șir cu spații șir fără spații a. Funcțiile pot fi folosite pentru -------------------------------------------► două tipuri de operații: < < G — eliminarea spațiilor: Alltrim(), Ltrim(), Trim(), Rtrim() — inserarea spațiilor sau a altor caractere: Padc(), Padl(), Padr() b. Funcțiile acționează în diferite zone ale șirului de caractere: — la stânga șirului: Ltrim(), Padl() — la dreapta șirului: Trim(), Rtrim(), Padr() — la ambele capete ale șirului: Alltrim(), Padc() 5. Transformarea unui șir de caractere se poate face prin două tipuri de operații. a. transformarea din litere mari în litere mici și invers: Lower(), Upper(), Properț) b. înlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff() De exemplu, pentru funcția : și pentru funcția Folosind funcția Stuff() se pot realiza următoarele operații: — inserarea unui șir de caractere, dacă m=0; — ștergerea unui șir de caractere, dacă y=" (șirul vid). Sisteme de gestiune a bazelor de date 6. Operațiile cu subșiruri de caractere se fac prin trei tipuri de operații: a. extragerea unui subșir de caractere dintr-un șir se poate face din diferite poziții ale șirului cu funcțiile : Left(), Right(), Substrrț). între aceste funcții există următoarele relații: — Left(x,n) = Substr(x,1,n); — Right(x,n) = Substr(x,len(x)-n+1,n). b. căutarea unui subșir de caractere într-un șir se poate face în mai multe moduri: — căutarea se face pe o singură linie de text ținând cont de diferența dintre literele mari și mici ' ,' sau fără să se țină cont de diferența dintre literele mari și mici — căutarea se face pe mai multe linii de text: ținând cont de diferența dintre literele mari și mici , sau fără să se țină cont de diferența dintre literele mari și mici ' - , — căutarea se face în următoarele sensuri: de la stânga la dreapta " ' , " . ; sau de la dreapta la sânga c, determinarea numărului de apariții ale unui subșir într-un șir: Se folosesc funcții pentru șiruri de caractere și se observă rezultatul furnizat de ele. 1. Se folosesc funcțiile de conversie: asc(), chr(): ? ase (*123*) ? chr (7) 49 codul ASCII al caracterului 1 b/p semnal sonor ? ase ('abc*) ?asc (T) = asc(*123*) 97 codul ASCII al caracterului a ,T. ? asc('abc,)>asc('123’') ? *z*==chr (asc('z')) .T. deoarece 97>49 .T. ? ase (*A*) ? 122=asc (chr(122)) 65 codul ASCII al caracterului A .T. ? chr (65) ? chr(asc(’Z')+32) A z Informatică 2. Se obțin informații despre un șir de caractere folosind funcțiile len(), isalphaț), isdigit(), isupper(), islowerț): x='Albastru' ? isalpha (y) ? len (x) .F. 8 ? isdigit (y) ? len (") .T. 0 șirul vid ? isalpha (z) ? len ('Ana ’+'IVIaria') mesaj de eroare 10 ? isupper (x) ? isalpha (x) .T. .T. ? islower (x) y='123' .F. z=123 3. Se generează șiruri de caractere folosind funcțiile: replicate (), spaceț): ? replicate ('*',10) Buna ziua ********** ? len (x) ? replicate (chr(7),5) 16 bip, bip, bip, bip bîp ? replicatef ',10)=space(10) x='Buna'+space(8)+'ziua' .T. ? x 4. Se elimină sau se inserează spații și se inserează caractere într-un șir de caractere folosind funcțiile: alltrim(), ltrim(), trim(), rtrim(), padc(), padl(), padr(): x= space(2)+'Popescu'+space(3) 7 ? len (x) a-Salut' 12 ? padc (a,15,'*') ? len (alltrim(x)) *****^^y^^***** 7 ? padc (a,16,'*') ? alltrim(x)=='Popescu' *****^q^^****** .T. ? Ien(padc (a,15,'*')) 2 len (Itrim(x)) 15 10 ? padl (a,10,'*') ? len (rtrim(x)) *****Salut 9 ? padr (a,10,'*') y= Itrim (x) Salut***** ? len (y) ? Ien(padr(a,15,'*'))= len(padl(a,15,'')) 10 .7. z=trim (y) ? Ien(padr(a,15,'*'))= len(padc(a,15,'')) ? len (z) .7. 5. Se transformă un șir de caractere folosind funcțiile: lower(), upper(), proper(), chrtran(), strtran(), stuff(): x= 'abc' Abc y='ABC ? proper(y) ? upper (x) Abc ABC ? proper(y) = proper(upper(x)) ? lower (y) .7. abc ? proper(lower(y)) = proper(x) ? lower(y) = x .7. .T. ? proper('AIFaBeT') ? upper(x) = y Alfabet .T. ? upper(x) = lower(y) ? proper(x) .F. 36 ? upper(y) - lower(x) ? chrtran fabcdef'/bdf/Hr) alelei ? chrtran (Babcdef7bdf7xyz') axcyez ? chrtran fabcdefVbdf,'^') a1c2e 2 len (chrtran('abcdef,'bdf,s12')) 5 2 chrtran ('abcdef,Bbdf7xyzu') axcyez 2 chrtran ('mosor*,"ms'/îp") topor 2 chrtran ('cotor','cor','nai') natal a='Am cumpărat hHet la "Ala Bala Portocala"’ b='la' c='na' d='vala' Sisteme de gestiune a bazelor de date e=strtran(a,b,c,2) ?e Am cumpărat bilet la "Ana Bana Portocana" e=strtran(a,b,d,2,1) ?e Am cumpărat bilet la "Avala Bala Portocala" ?stuff('parcare',4,1 ,'taj') partajare îstufffcaviar',3,3,") car s-a șters subșirul ’via' ?stuff('car',3,0,'via') caviar s-a inserat subșirul ’via' a=stuff(’cod',4,0,'are') ?a codare a=stuff(a,1,0,'dec') ?a decodar 6. Se execută operații cu subșiruri de caractere folosind funcțiile: left(), right(), substr(), at(), rat(), atc(): x= 'Marea Neagra’ ? at ('Nr', a) y='untdelemn' 0 ? left (x,5) ? atc ('Nr', a) Marea 16 ? right (x,6) 2 rat('nr', a) Neagra 16 2 left(y,3) a='Ala Bala Portocala' unt ?at ('la',a,1) ? substr(y,4,2) 2 de ? at ('la',a,2) ? right(y,4) 7 lemn ? at ('la',a,3) 2 Ieft(y,3)=substr(y,1,3) 17 .7. 2 rat ('la',a,3) ? substr(y,len(y)-4+1,4) = right(y,4) 2 .7. 2 occurs('co','cocor') a='str. Iezerului nr. 32* 2 ? at ('nr', a) 2 occurs('la',a) 16 3 Pentru aceste funcții argumentul este de tip dată pentru gestionarea timpului sau de tip dată calendaristică. Funcția Sintaxa Ce reprezintă?_____________________________________________________ Funcții pentru aflarea timpului Date Date() Furnizează data curentă preluată din sistem. Rezultatul este de tip dată calendaristică. Informatică Funcția Sintaxa Ce reprezintă? Dateten DateTimeO Furnizează data curentă și momentul de timp preluate din sistem. Rezultatul este de tip șir de caractere. j; II t Time() Furnizează numai momentul de timp preluat din sistem. Rezultatul este de tip șir de caractere. Funcții pentru extragerea informațiilor din dată Argumentul x poate fi dată calendaristică sau dată pentru gestionarea timpului. Argumentul y este o dată pentru gestionarea timpului. Rezultatul poate fi de tip N (numeric) sau C (șir de caractere). Day Day(x) Furnizează numărul zilei din lună. Rezultatul este de tip N. D'Cte Dow(x) Furnizează numărul zilei din săptămână. Rezultatul este de tip N. L CC .v Cdow(x) Furnizează numele zilei din săptămână. Rezultatul este de tip C. Week(x) Furnizează numărul săptămânii din an. Rezultatul este de tip N. Mere . Month(x) Furnizează numărul lunii din an. Rezultatul este de tip N. Ccwm: Cmonth(x) Furnizează numele lunii. Rezultatul este de tip C. ¥ear Year(x) Furnizează numărul anului. Rezultatul este de tip N (cu patru cifre). Hocrs Hours(y) Furnizează numărul orei. Rezultatul este de tip N. Mtecte Minute(y) Furnizează numărul minutelor. Rezultatul este de tip N. S'S’C Sec(y) Furnizează numărul secundelor. Rezultatul este de tip N. Sece..: M Seconds() Furnizează numărul secundelor scurse de la miezul nopții. Rezultatul este de tip N (real, în care partea întreagă reprezintă secundele, iar partea fracționară milisecundele). Funcții pentru modificarea datei Gomonth(x,n) Argumentul x este de tip dată calendaristică, iar argumentul n de tip numeric întreg. Funcția furnizează un rezultat de tip dată calendaristică a cărei lună este incrementată cu n, dacă n este pozitiv, și decrementată cu n, dacă n este negativ. . dJ&d V 1. Se extrag informații din timpul sistemului folosind funcțiile: date(), time(), timedate(). ? date() set century off 03/02/07 2 time() set date to brîtish 16:52:50 ? date() ? datetime() 02/03/07 02/03/01 04:53:00 PM set century on set hours to 24 ? date() ? datetime() 02/03/2007 02/03/01 16:54:23 2. Se extrag informații despre ziua din dată folosind funcțiile: day(), dow(), cdow(): d={10/05/07} 5 ? day(d) ? cdow(d) 10 Thursday ? dow(d) 3. Se extrag informații despre săptămâna din dată folosind funcția: week(): ? week(d) 19 4. Se extrag informații despre luna din dată folosind funcțiile: monthf), cmonth(): Sisteme de gestiune a bazelor de date ? month (d) May 5 ? gomonth(d,3) ? cmonth (d) 10/08/07 5. Se extrag informații despre an din dată folosind funcția: year(): ? year(d) 2007 6. Se extrag din dată informații despre oră, minute(), sec(), seconds(): d=datetime() ? hours(d) 17 2 minute(d) 14 2X9» Faceți? : minute și secunde folosind funcțiile: hours(), ? sec(d) 12 2 secondsf) 62135.20 Pentru a realiza unele operații este necesar ca un tip de dată să fie transformat într-un alt tip de dată. Transformarea se face folosind funcțiile pentru conversii. Se pot realiza următoarele conversii: a. numeric x» tip șh’ de tip numeric tip șir de caractere Funcția Sintaxa Ce reprezintă?________________________________________________________________ Str Str(m,n,p) Argumentele m, n și p sunt de tip numeric. Funcția convertește numărul m într-un șir de caractere de lungime n care conține p poziții pentru zecimale (cifre situate după punctul zecimal). Dacă numărul conține mai multe poziții decât argumentul n, rezultatul va fi un șir de asteriscuri. Dacă numărul conține mai puține poziții decât argumentul n, șirul de caractere va fi completat cu spații până la obținerea lungimii n. Dacă numărul p este mai mic decât numărul de poziții zecimale, partea zecimală va fi trunchiată. Val Val(x) Argumentul x este de tip șir de caractere. El trebuie să conțină numai caracterele: cifre, punctul zecimal sau semnul minus, altfel conversia se va face eronat. Funcția convertește șirul de caractere x într-un număr. b. tip dată calendaristică tip șir de - ..-.x tip dată calendaristică tip șir de caractere Dtcc(X fjp * Funcția Sintaxa Ce reprezintă?______________________________________________________________ Dtoc Dtoc(x) Argumentul x este de tip dată calendaristică. Funcția furnizează un șir de 8 caractere care reprezintă data. Are forma ll/zz/aa (două caractere pentru numărul lunii, două pentru numărul zilei și două pentru numărul anului, separarea făcându-se cu caracterul /). Informatică 35 Funcția Sintaxa Ce reprezintă? Dtos(x) Argumentul x este de tip dată calendaristică. Funcția furnizează un șir de 8 caractere care reprezintă data. Are forma aaaallzz (patru caractere pentru an, două pentru numărul lunii și două pentru numărul zilei). Ctod Ctod(x) Argumentul x este de tip șir de caractere care formează o dată calendaris- tică. Funcția furnizează data calendaristică precizată prin șirul de caractere. tip dată pentru timp tip șir de caractere Funcția Sintaxa Ce reprezintă? 7 toc Ttoc(x) Argumentul x este de tip dată pentru gestionarea timpului. Funcția convertește această dată într-un șir de caractere. Ciot Ctot(x) Argumentul x este de tip șir de caractere. Șirul de caractere este de forma zz/ll/aa hh:mm:ss apm (câte două caractere pentru fiecare element: zi, lună, an, oră, minut, secundă și am/pm). Funcția convertește șirul de caractere într-o dată pentru gestionarea timpului. tip dată pentru timp tip dată calendaristică Funcția Sintaxa Ce reprezintă?___________________________________________________________________ Ttoc(x) Argumentul x este de tip dată pentru gestionarea timpului. Funcția convertește această dată într-o dată calendaristică. l Ctot(x) Argumentul x este de tip dată calendaristică. Funcția convertește această dată într-o dată pentru gestionarea timpului, considerând ora 12:00:00 am. > x o ,: Avantajul folosirii funcției Dtos() în locul funcției Dtoc() este acela că formatul furnizat de ea permite compararea corectă a două date calendaristice. 1. Se convertesc numere o șiruri de caractere folosind funcțiile: val(), str(): a=’10' -10 a=10 b='15' x=val ('10,25') b=15 ? a+b ? type('x') ?a+b 1015 N 25 ? val(a)+val(b) ?x 2 str(a)+str(b) 25.00 10.00 10 15 c='-10' ?val flOalO') ? Ien(str(a)+str(b)) ? val(c) 10.00 20 Sisteme de gestiune a bazelor de date ? str(a,2)+str(b,2) 1015 ? !en(str(a,2)+str(b,2)) 4 a=12.5 ? str(a) 13 ? Ien(str(a)) 10 a=12345123451 ? str(a) .1234E+11 ? Ien(str(a)) 10 2. Se convertesc date calendaristice «■ șiruri de caractere folosind funcțiile: dtoc(), dtos(), ctod(): d1 ={08/03/01} ?y 20010308 d2={07/04/01} 07/04/01 y=dtos(d2) x=dtoc(d1) ?x>y ?y ?x .T. 20010407 08/03/01 x=dtos(d1) ?x>y y=dtoc(d2) ?x .F. 3. Se convertesc date calendaristice <=> momente de timp folosind funcțiile: dtot(), ttod(): a=datetime() b=date() set hour to 12 ? ttod(a) ? dtot(b) ? dtot(b) 02/03/01 02/03/0100:00:00 02/03/01 12:00:00 AM 4. Se convertesc șiruri de caractere o momente de timp folosind funcțiile: ctot(), ttoc(): a=datetime() 02/03/01 04:52:12 PM 02/03/01 04:52:12 PM ?a îtypefb') ?type('c) 02/03/01 04:52:12 PM C T b = ttoc(a) c=ctot(b) ?b ?c c 2 a> c 0) o> N □ 0 Aceste funcții se pot aplica pe mai multe tipuri de date: Funcția Sintaxa Ce reprezintă? Min(x1,x2,...) Argumentele x1, x2,... trebuie să fie de același tip. Funcția Max(x1,x2,...) compară între ele toate argumentele și furnizează ca rezultat valoarea cea mai mică, respectiv cea mai mare. -"i Between(x,y,z) Argumentele x, y și z trebuie să fie de același tip. Funcția testează dacă valoarea argumentului x se găsește între valorile y și z. Funcția furnizează un rezultat logic (.T. dacă este îndeplinită relația y5) furnizează un rezultat de tip logic egal cu .F., funcția evaluate(‘{05/03/01}+2’) furnizează un rezultat de tip dată calendaristică egal cu data 05/05/01, iar funcția evaluate(‘"abc"+"123"’) furnizează un rezultat de tip șir de caractere egal cu abc123. 3. Funcția poate identifica tipul expresiei scrise ca șir de caractere. De exemplu, type(‘5+5’) furnizează tipul numeric (N), funcția type(‘2>5’) furnizează tipul logic (L), funcția type(‘{05/05/01}+10’) furnizează tipul dată calendaristică (D), iar funcția type(‘$20.00’) furnizează tipul monetar (Y). 4. Funcția (x,y,z) poate fi folosită pentru o structură alter- nativă care este descrisă în pseudocod astfel: îf x then write y else write z endif. ¹ ² 1. Se atribuie o valoare întreagă unei variabile de memorie și se verifică dacă acel număr este divizibil prin 3: a=1 b1='Numarul este divizibil prin 3' b2='Numarul nu este divizibil prin 3¹ ? iif(a % 3 = 0, b1, b2) Numărul nu este divizibil prin 3 a=9 ? iif(a % 3 = 0, b1,b2) Numărul este divizibil prin 3 2. Se verifică dacă o variabilă de memorie este vidă: b1='Variabila de memorie este vida' b2='Variabila de memorie nu este vida' a=" ? iif(empty(a), b1, b2) Variabila de memorie este vida a=0 ? iif(empty(a), b1, b2) Variabila de memorie este vida a=date() Sisteme de gestiune a bazelor de date 3. ? iif(empty(a), b1, b2) Variabila de memorie nu este vida Se calculează maximul și minimul dintr-un șir de valori: a=1 b=2 c=3 ? max(a,b,c) 3 ? min(a,b,c) 1 ? maxfaVbVc') ? minfa'j’b'j’c’) a 4. Se verifică dacă un element există într-o listă: a=1 c=inlist(a,1,2,3,4,5) b1='Elementul este in lista¹ b2=lElementul nu este in lista¹ ?iif(c,b1 ,b2) Elementul este in lista a=10 c=inlist(a,1,2,3,4,5) ?iif(c,b1,b2) Elementul nu este in lista a='A' csinlistflowerfaJ/aVeVi'/o’j'u') b1=’Este vocala¹ b2=’Nu este vocala¹ ?iif(c,b1,b2) Este vocala a^B¹ csinlist(lower(a),aa','e','i','o','u') ?iif(c,b1,b2) Nu este vocala 5. Se verifică dacă o variabilă de memorie aparține unui interval: a^a* c=between(a, ’a’/z') b1='litera mica¹ b2='litera mare¹ ? iif(c,b1,b2) litera mica a='M' c=between(a, ’a'/z¹) ? iif(c,b1 ,b2) litera mare varsta=10 bl^minor' b2=’major¹ ? iif(between(varsta,0,17), b1, b2) minor varsta=18 ? iif(between(varsta,0,17), b1, b2) major - i . hi sunt variabile proprii aplicației, pe care aceasta le creează automat la lansarea în execuție și pe care le păstrează în memorie atât timp cât este în execuție. Aceste variabile nu sunt șterse de comenzile obișnuite de ștergere a variabilelor de memorie. Identificatorul lor începe cu caracterul linie de subliniere _. Variabilele de sistem sunt folosite de către aplicație pentru configurarea mediului Visual FoxPro (de exemplu, configurarea formatelor de ieșire către ecran sau către imprimantă). - ; ? r ? sunt create de către utilizatorul aplicației. Crearea lor înseamnă: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva cores- punzător o zonă de memorie și atribuirea unei valori inițiale. Asupra unei variabile de memorie se pot executa operații de creare și consultare. - - . ₍ - se face prin: 1. Inițializare folosind: — operația de atribuire a unei valori (constantă sau valoare obținută prin evaluarea unei expresii) — comanda Store care are sintaxa: r 2. Introducerea unei valori de la tastatură, folosind comenzile: — Accept. Este recomandată pentru tipul de date șir de caractere. Informatică — Input. Este recomandată pentru tipul de date numeric. — Wait. Este recomandată pentru un singur caracter. Sistemul așteaptă acționarea unei taste. Caracterul tastei acționate poate fi păstrat într-o variabilă de memorie. * Aceste trei comenzi au sintaxa: | | [] Adverbul este opțional și este de tip șir de caractere. El reprezintă un mesaj afișat pe ecran, ca un prompter, care informează utilizatorul despre operația de introducere date care urmează să se execute. 4 înseamnă vizualizarea conținutului ei pe ecran sau la imprimantă. Pentru vizualizarea pe ecran puteți folosi comenzile: — ?. înaintea afișării, cursorul este poziționat pe rândul următor. — ??. înaintea afișării, cursorul rămâne în poziția curentă. Cele două comenzi au sintaxa: | Pentru la imprimantă puteți folosi comanda: — ???. Comanda trimite către imprimantă un șir de caractere exprimat printr-o expresie de tip șir de caractere care poate conține și variabile de memorie: Se pot obține informații complexe despre un grup de variabile de memorie (nume, dacă sunt publice¹ - public sau particulare - private, tip, valoare) folosind comenzile Ș> - ' : | [ <șablon>] [ | ] <șablon> reprezintă descrierea grupului de variabile folosind convențiile clasice pentru caracterele de înlocuire ? și *. Lista de variabile de memorie poate fi afișată pe ecran sau la imprimantă (to prinț) ori salvată într-un fișier (to file ). Chiar dacă sistemul permite definirea a 65.000 de variabile de memorie, este bine să se șteargă variabilele de memorie care nu se mai folosesc. Operația se numește . . - . Se pot folosi următoarele comenzi: 1. pentru eliberarea globală (ștergerea tuturor variabilelor de memorie): — Comanda '" • șterge toate variabilele de memorie și toate tablourile de memorie, lăsând numai variabilele de sistem. — Comanda . r' r: șterge și ea toate variabilele de memorie și toate tablourile de memorie, lăsând numai variabilele de sistem. Suplimentar eliberează și celelalte zone de memorie ocupate de diferite obiecte Visual FoxPro: meniuri, ferestre, controale definite de utilizator și tabele ale bazei de date deschise, inclusiv fișierele folosite pentru exploatarea bazei de date. 2. pentru eliberarea selectivă (ștergerea anumitor variabile de memorie) veți folosi una dintre următoarele comenzi (alegerea se va face în funcție de modul în care puteți să descrieți grupul de variabile de memorie): — Comanda Release AII șterge variabilele de memorie și tablourile de memorie precizate printr-un șablon: variabilele șterse pot să corespundă șablonului (Like) sau pot să nu corespundă șablonului (Except). Sintaxa comenzii este: [i | - = <șablon>] accept input wait ?, ??, ??? list | display memory clear memory release <1 O variabilă publică sau globală poate fi folosită de orice subprogram al aplicației, iar o variabilă particulară sau locală poate fi folosită numai în subprogramul în care a fost creată. Toate variabilele create în fereastra de comenzi sunt publice. declare | define restore from save to Sisteme de gestiune a bazelor de date — Comanda Release șterge variabilele de memorie și tablourile de memorie precizate printr-o listă. Veți alege această comandă dacă nu puteți să descrieți grupul de variabile de memorie printr-un șablon. Sintaxa comenzii este: La închiderea sesiunii de lucru Visual FoxPro, are loc o șter- ------------------------------------► gere a conținutului memoriei memoria internă memoria externă interne alocate aplicației și se (variabile de memorie)__________________(fișierjnem) pierde conținutul variabilelor de "* memorie folosite. Ele pot fi salvate (save) într-un fișier (cu extensia .mem) de unde pot fi readuse ulterior în memoria internă, operație numită restaurare (restore). Comenzile folosite pentru aceste operații sunt: — Comanda Save to salvează, într-un fișier identificat prin nume, toate variabilele de me- morie sau numai cele care corespund (Like) sau nu corespund (Except) unui șablon: [ | <șablon>] — Comanda Restore from readuce în memoria internă variabilele de memorie dintr-un fișier identificat prin nume; dacă nu se precizează clauza additive, variabilele de memorie și tablourile de memorie care existau în memorie înaintea restaurării vor fi distruse: [ ] Structurile de date de tip tablou de memorie au următoarele caracteristici: — Se pot crea numai tablouri cu o singură dimensiune (vectori) sau cu două dimensiuni (matrice). — Tablourile de memorie sunt neomogene. — La creare, elementele tabloului sunt inițializate cu valoarea logică .F. se face prin două operații: cu ajutorul comenzilor declare | define. Comenzile au sintaxa: | ([,]) [, ([,])...........] --------------------------------------------------------------------- Numele tabloului Numărul de elemente Numărul de elemente de memorie după prima dimensiune după a doua dimensiune Printr-o comandă pot fi definite mai multe tablouri de memorie identificate prin nume , , .... Tablourile definite pot fi atât de tip vector, cât și de tip matrice. Comenzile au un singur adverb: lista de tablouri de memorie care se definesc. Separarea tablourilor în listă se face prin virgulă. După ce s-a definit structura tabloului, se poate identifica orice element din tablou astfel: — pentru vectori: (), unde reprezintă numărul de ordine al elementului în cadrul vectorului; — pentru matrice: (expN1,), unde identificarea elementului se face prin numărul liniei și numărul coloanei . se poate face în două moduri: Informatică -> Se atribuie aceeași valoare tuturor elementelor folosind comanda store: Se atribuie câte o valoare fiecărui element folosind operația de atribuire: se face redeclarând structura cu comanda declare | define. Se pot executa următoarele operații: -> Se schimbă dimensiunea tabloului, adică un tablou unidimensional (vector) se poate transforma într-un tablou bidimensional (matrice) și invers. Prin schimbarea dimensiunii nu se distrug datele din tablou. -> Se mărește tabloul, adică se crește numărul de elemente ale tabloului. Elementele adăugate vor fi inițializate cu valoarea logică .F.. -> Se micșorează tabloul, adică se reduce numărul de elemente ale tabloului. Ele- mentele care vor ajunge în afara tabloului, în urma redeclarării structurii, se vor pierde. (obținerea de informații din tabloul de memorie) se poate face prin următoarele operații: -> Se vizualizează toate elementele tabloului (sunt afișate valorile elementelor și informații despre tipul lor) folosind comenzile list memory | display memory care au sintaxa: | -> Se vizualizează valoarea unui element sau a mai multor elemente folosind comanda ?| ?? (elementele tabloului sunt tratate ca variabile de memorie): | sau: | 1. Se creează variabile de memorie; înainte de a crea aceste variabile de memorie se eliberează memoria de orice alte variabile de memorie create anterior: clear memory store a1*a2 to a3 store 0 to a1, a2, a3 accept 'Scrieți numele:' to nume store .T. to b1, b2 Scrieți numele: Popescu x1='alfa' input 'Scrieți varsta:' to varsta x2='beta' Scrieți varsta: 18 a1=2 wait 'Răspundeți cu o litera:' to b3 a2=7 Răspundeți cu o litera: x 2. Se consultă variabilele de memorie: ? a1, a2, a3 2 7 14 ?? a1,a2, a3 2 7 14 (pe același rând cu răspunsul comenzii precedente) ? nume, varsta Popescu 18 ?b1,b2, b3, x1,x2 .T. .T. x alfa beta list memory like a? a1 Pub N 2 ( 2.00000000) a2 Pub N 7 ( 7.00000000) a3 Pub N 14 list memory like ?1 a1 Pub N 2 b1 Pub L .T. x1 Pub C "alfa' 3. Se eliberează memoria internă: display memory sunt afișate informații despre toate variabilele definite anterior: a1, a2, a3, b1, b2, b3, x1, x2, nume, vârsta release varsta, nume display memory sunt afișate informații despre variabilele rămase: a1, a2, a3, b1, b2, b3, x1,x2 release all like a? display memory Sisteme de gestiune a bazelor de date (14.00000000) ( 2.00000000) sunt afișate informații despre varia- bilele rămase: b1, b2, b3, x1, x2 release all except b? display memory sunt afișate informații despre varia- bilele rămase: b1, b2, b3 release all display memory nu mai sunt afișate informații despre variabile utilizator instrucțiuni pentru mai multe valori ale 4. Se testează următoarea secvență de variabilelor a, b și c, definite astfel: (a,b,c)e {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}. input 'a= ’ to a input 'b= ' to b input 'c= ¹ to c b1='Nu este triunghi¹ b2=*Triunghi oarecare’ b3='Triunghi echilateral' b4='Triunghi isoscel' c1=a+b>c and b+c>a and c+a>b c2= a=b and b=c c3= a=b or a=c or b=c ? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1) Ce realizează această secvență de comenzi? Se scrie secvența de comenzi într-un fișier de tip program executabil cu numele alfa, folosind comanda: modify command alfa Se execută programul pentru fiecare valoare a tripletei (a,b,c) din mulțimea de definiție. Pentru executarea programului se folosește comanda: do alfa 5. Se testează următoarea secvență de instrucțiuni pentru mai multe valori ale varia- bilelor a, b și c, definite astfel: (a,b,c)e {(2,3,4), (5,3,4), (2,3,3), (2,1,4)} input ’a= ' to a input 'b= ' to b input 'c= ' to c x=aA2 y=bA2 z=cA2 b1='nu este triunghi' b2='triunghi dreptunghic' b3='triunghi ascutitunghic' b4='triunghi optuzunghic' c1=a+b>c and b+c>a and c+a>b c2=x+y=z or y+z=x or z+x=y Informatică c3=x+y>z and y+z>x and z+x>y c4=x+y copac. Executați operația în două moduri diferite. 19. Scrieți un program care să rezolve următoarea problemă: Pentru executarea unei piese sunt necesare x minute. Afișați timpul necesar confec- ționării a n piese, exprimat în număr de zile, ore și minute. La fabricarea pieselor se lucrează în ritm continuu (24 de ore pe zi). 20. Afișați lista cu variabilele de memorie pe care le-ați creat. în această listă se găsesc și variabilele de memorie definite în programul de la punctul 18. De ce? 21. Ștergeți variabilele de memorie a1, b2 și u. Verificați că operația s-a executat corect. 22. Ștergeți variabilele de memorie b1, b3 și b4. Verificați că operația s-a executat corect. 23. Ștergeți toate variabilele de memorie, mai puțin variabila t. Verificați că operația s-a executat corect. .----- 24. Eliberați memoria internă. | | Sisteme de gestiune a bazelor de date Baza de date este o colecție de tabele între care se pot stabili relații. Un tabel reprezintă o colecție de înregistrări (rândurile tabelului), fiecare înregistrare având aceeași structură de câmpuri (coloanele tabelului). nume tipul datei formatul de afișare masca de introducere ^gticheta valoarea implicită regula de validare textul regulii de validare indexarea valoarea nulă . într-un câmp al tabelului pot fi păstrate date elementare. Tipul datei elementare memorate în câmp determină tipul câmpului. (format). Această proprietate controlează modul în care sistemul de gestiune a bazelor de date afișează valoarea memorată în câmp. Pentru fiecare tip de dată există mai multe formate de afișare. (input mask). Această proprietate controlează valorile datelor introduse în câmp. Ea determină numărul de poziții ale câmpului și, pentru fiecare poziție din câmp, tipul caracterului acceptat: numeric, alfabetic, alfanumeric, caracter special, un anumit caracter, orice caracter. Pentru caracterele alfabetice se poate stabili dacă sunt litere mici sau litere mari. O mască de introducere specială este masca password care afișează pe ecran câte un asterisc pentru fiecare caracter introdus. (caption). Această proprietate controlează titlul afișat pe ecran pentru câmp. Valoarea implicită pentru această proprietate este numele câmpului. Utilizatorul poate schimba această valoare. (default value). Această proprietate controlează inițializarea câmpu- lui. Prin ea se poate stabili valoarea inițială atribuită unui câmp la adăugarea unei înregistrări în tabel. De exemplu, pentru câmpurile de tip dată calendaristică se poate stabili ca valoare inițială data curentă, iar pentru câmpurile logice valoarea true. (validation rule). Această proprietate controlează valorile datelor introduse în câmp. Regula de validare se exprimă printr-o condiție logică, ce trebuie să aibă valoarea true după ce se introduce valoarea câmpului. Regula de validare se poate aplica la nivel de: — câmp, și anume se verifică dacă valoarea introdusă pentru câmp se încadrează într-un anumit interval de valori sau într-o anumită mulțime de valori. Această validare se declanșează la introducerea sau modificarea valorii câmpului. — înregistrare, și anume se verifică dacă valoarea introdusă pentru câmp respectă anumite corelații cu valorile altor câmpuri din înregistrare. Această validare se declanșează după validarea la nivel de câmp, în urma introducerii sau modificării valorii unui câmp sau a ștergerii valorii câmpului. Nu se declanșează dacă se șterge toată înregistrarea. în expresia din condiția de validare pot fi folosite și funcții de sistem sau definite de utilizator. Informatică (validation text). Această proprietate controlează textul afișat în cazul în care datele introduse în câmp nu respectă regula de validare (în cazul în care condiția logică pentru validare are valoarea false după introducerea valorii câmpului). De obicei, prin acest text i se explică utilizatorului regulile de validare pe care trebuie să le respecte datele introduse în câmp. (index). Această proprietate controlează dacă acel câmp este folosit pentru indexare. Indexarea este o tehnologie utilizată de sistemele de gestiune a bazelor de date care permite ordonarea logică, după un anumit criteriu, a înregistrărilor dintr-un tabel, la exploatarea sau vizualizarea datelor din tabel, fără să fie afectată ordinea fizică a înregistrărilor din tabel (ordinea în care sunt scrise). Câmpul devine cheie de indexare. (NULL). Această proprietate controlează dacă în câmp a fost memorată sau nu o valoare nulă (NULL). Această proprietate este utilă pentru a putea face deosebirea dintre un câmp în care utilizatorul nu a introdus date și un câmp în care utilizatorul a introdus o dată neutră pentru acel tip de dată, cum ar fi; 0 pentru datele numerice, șirul vid - șirul de caractere de lungime zero ("") - pentru datele alfabetice, false pentru datele logice sau data vidă ({//}) pentru datele de tip dată calendaristică. De exemplu, dacă ați declarat câmpul telefon numeric, respectiv șir de caractere, valoarea NULL indică faptul că nu se cunosc detalii despre numărul de telefon al acelei persoane, iar valoarea 0, respectiv șirul vid, arată că acea persoană nu are telefon. — adăugarea unei noi înregistrări, — ștergerea unei înregistrări — modificarea valorii unor câmpuri din înregistrări prin care se obțin informații din tabel; consultarea presupune: — operații de căutare a anumitor înregistrări (trebuie să se precizeze criteriul de căutare și modul de afișare a informațiilor - pe ecran, la imprimantă) — operații de sortare (de reordonare fizică a înre- gistrărilor din tabel). Exploatarea unui tabel se poate face: — , adică în ordinea fizică a înregistrărilor (ordinea în care au fost scrise în tabel). — , adică în ordinea logică a înregistrărilor (ordinea dată de valoarea crescătoare sau descrescătoare a unui câmp din tabel). Pentru a avea acces direct, înregistrările din tabel trebuie ordonate logic. Ordonarea logică se face prin crearea unui fișier numit fișier de index care memorează ordinea logică a înregistrărilor. este operația de a înregistrărilor dintr-un tabel. Prin această operație se creează un nou tabel în care înregistrările sunt scrise conform criteriului de ordonare precizat. este operația de a înregistrărilor dintr-un tabel. Prin această operație se creează un fișier special asociat tabelului, numit , care se exploatează împreună cu tabelul (se deschide și se închide împreună cu acesta) și care păstrează evidența ordinii logice a înregistrărilor. El are două câmpuri: un câmp care conține valoarea câmpului folosit pentru indexare (care determină ordonarea), Sisteme de gestiune a bazelor de date numit și , și un câmp cu numărul înregistrării din tabel în care se găsește câmpul. Acest fișier este ordonat crescător sau descrescător, după valoarea cheii de indexare: Tabelul Indexul nr. înreg. a b c 1 10 100 a 2 40 300 b 3 45 200 a 4 23 100 c 5 89 200 d 6 90 400 a 7 12 500 8 34 c a nr. înreg. 10 1 12 7 23 4 34 8 40 2 45 3 89 5 90 6 Căutarea unei înregistrări după valoarea unui câmp se face mult mai rapid atunci când înregistrările sunt ordonate după acel câmp, deoarece în cazul unei structuri ordonate se pot folosi diferiți algoritmi de căutare. De exemplu, pentru a găsi înregistrarea care îndeplinește condiția a=34 (valoarea câmpului a este 34), în cazul unei parcurgeri secvențiale se vor executa 8 operații de verificare, câte una pentru fiecare înregistrare. în cazul ordonării structurii se poate folosi, de exemplu, algoritmul de căutare prin înjumătățirea intervalului. Căutarea se va face în fișierul index folosind acest algoritm. Se împarte fișierul în două: în prima jumătate se vor găsi înregistrările pentru care ae[10,34], iar în a doua jumătate se vor găsi înregistrările pentru care ae[40,90]. Se verifică și se vede că valoarea 34 a câmpului a aparține primului interval. Se împarte și acest interval în două: în prima jumătate se vor găsi înregistrările pentru care ae[10,12], iar în a doua jumătate se vor găsi înregistrările pentru care a e [23,34], Se verifică și se vede că valoarea 34 a câmpului a aparține celui de-al doilea interval. Se împarte și acest interval în două: în prima jumătate se va găsi o singură valoare (23), iar în a doua jumătate se va găsi o singură valoare (34), care este valoarea căutată. Pentru această valoare, în index există numărul înregistrării: 8. Se poziționează în tabel pointerul de înregistrare direct pe înregistrarea 8. în acest caz s-au executat numai trei use operații de verificare (de apartenență a valorii câmpului a la un interval). Indiferent de modul în care este exploatat tabelul, algoritmul de explo- atare cuprinde următorii pași: deschiderea tabelului, prelucrarea și închiderea tabelului. Tabelul este memorat într-un fișier de date care are același nume ca și tabelul și extensia .dbf. Pentru a se putea prelucra înregistrările dintr-un tabel, trebuie fișierul în care acesta este păstrat. Prin operația de deschidere i se alocă o zonă de memorie internă în care urmează să fie transferate de pe disc înregistrările care vor fi prelucrate. Deschiderea fișierului se face fie folosind opțiunea de meniu File->Open..., fie prin intermediul comenzii: După ce au fost prelucrate înregistrările din tabel trebuie fișierul. Prin operația de închidere se eliberează zona de memorie internă alocată fișierului. închiderea fișierului se face prin intermediul comenzii: Informatică Operațiile puse la dispoziție de Visual FoxPro pentru administrarea datelor dintr-un tabel al bazei de date pot fi grupate astfel: — crearea structurii tabelului; — manipularea structurii tabelului. — localizarea înregistrărilor prin parcurge- re secvențială a înregistrărilor din tabel — actualizarea datelor din tabel; — controlarea accesului la înregistrări; — consultarea tabelului. — crearea și administrarea fișierelor index; — localizarea înregistrărilor după valoarea unei chei. Toate comenzile au un domeniu implicit de acțiune. Domeniul implicit de acțiune poate fi schimbat prin explicitarea cu adverbele care sunt scrise între parantezele pătrate [ ]. Un tabel poate fi creat în interiorul unei baze de date ca tabel al bazei de date, sau în afara ei, ca tabel liber. Ulterior, tabelul liber poate fi adăugat la o bază de date. în continuare vor fi prezentate metodele prin care se pot crea tabele libere. în general, aceste metode pot fi folosite și în cadrul unei baze de date. Deosebirea este că pentru un tabel liber nu se pot stabili reguli de validare și nici chei primare, așa cum se poate face pentru tabelele din baza de date. Crearea unui tabel se face în două etape: -> crearea structurii tabelului, -> introducerea datelor în tabel, conform structurii definite. La definirea structurii tabelului poate fi definit și < -.Acest index se numește compus deoarece poate conține mai multe chei de indexare numite (tag). La un moment dat se poate folosi o singură cheie de indexare dintre cheile definite, adică o singură etichetă este activă. Se numește structural deoarece are același nume ca și tabelul. Extensia sa este .cdx. El se creează automat la crearea tabelului, dacă se definește o etichetă de index, și se deschide automat împreună cu tabelul. Este actualizat automat după fiecare operație de actualizare a tabelului (ștergerea sau adăugarea unei înregistrări sau modificarea câmpurilor dintr-o înregis- trare). Indecșii pot fi: - > - cheia primară. Se poate folosi numai în cazul în care tabelul se găsește într-o bază de date. Numai un singur index poate fi folosit pentru cheia primară. ■ > - cheia candidat. Este o cheie care poate deveni cheie primară deoarece nu conține valori duplicate și nici valori nule. Și ea este utilă numai în baza de date. ■ > - cheia unică. Este o cheie care se consideră că nu conține valori duplicate. Dacă există două înregistrări cu aceeași valoare a cheii unice, va fi vizibilă logic numai prima dintre ele, chiar dacă fizic există amândouă. ■ > - cheia obișnuită. Sisteme de gestiune a bazelor de date Folosind indexarea se pot realiza următoarele: - > ordonarea înregistrărilor afișate din tabel (indexul poate fi cheie obișnuită, candidat sau cheie primară); - > controlarea valorilor duble introduse pentru un câmp (indexul poate fi cheie candidat sau primară pentru baze de date și cheie candidat pentru tabelele libere); - > definirea relațiilor între tabele (indexul poate fi cheie obișnuită, candidat sau primară). copy structura to create from create table create în urma operației de creare, tabelul este deschis automat. Crearea structurii unui tabel se poate face prin mai multe metode: - > interactiv - structura se definește prin intermediul controalelor din fereastra document a generatorului de tabele Table Designer; deschiderea ferestrei se poate face fie prin intermediul opțiunii de meniu New... e File, fie prin intermediul comenzii: - > folosind limbajul de comandă - structura se definește prin intermediul adverbelor din ( ( [,] [ ( [,]...] * unde este numele tabelului care se creează și a cărui structură se definește prin precizarea pentru fiecare câmp a numelui său , a tipului , a dimensiunii și a numărului de poziții din partea fracționară (numai pentru câmpurile reale numeric, float și double). - > Prin preluarea structurii dintr-un tabel de structură. Tabelul de structură este un tabel în care se păstrează informații despre structura unui alt tabel (proprietățile câmpurilor). El a fost creat cu comanda copy structure extended. Sintaxa comenzii este: unde este numele tabelului a cărui structură se creează prin preluarea structurii din tabelul de structură care are numele . - > Prin preluarea structurii dintr-un tabel deschis. Pot fi preluate toate câmpurile din structură sau numai o parte din ele. Sintaxa comenzii este: [ ] unde este numele tabelului care se creează și a cărui structură se preia din tabelul deschis în acel moment; se pot prelua toate câmpurile sau numai câmpurile precizate în lista clauzei fields. Manipularea structurii unui tabel se face prin următoarele operații: Structura tabelului poate fi afișată cu comenzile list structure și display structure. Deosebirea dintre aceste două comenzi constă în modul în care se face afișarea: comanda display structure afișează în regim paginat (după umplerea ecranului se Informatică așteaptă confirmare din partea utilizatorului pentru a continua afișarea), iar comanda list structure afișează în regim de defilare (este derulată pe ecran toată informația chiar dacă depășește capacitatea de afișare a ecranului; se vor putea vedea astfel numai ultimele câmpuri din tabel). Comenzile au aceeași sintaxă: | [ | ] [ ] Domeniul implicit al comenzii se referă la faptul că afișarea se face pe ecran. Explicit, afișarea se poate face și la imprimantă sau într-un fișier (adverbele to printer sau to file), sau numai la unul dintre acestea, inhibându-se ieșirea către ecran (adverbul no console). Se poate modifica structura unui tabel deschis în prealabil folosind comanda: Se deschide caseta de dialog Table Designer care conține aceleași controale ca și la crearea tabelului. Se pot face următoarele modificări: — să se insereze câmpuri noi, — să se șteargă câmpuri, — să se modifice caracteristicile unui câmp (nume, tip, lungime). înaintea modificărilor, aplicația salvează datele din tabel într-un fișier cu același nume și cu extensia .bak pentru tabel și .tbk pentru fișierul memo asociat tabelului (care conține valorile pentru câmpurile memo). După efectuarea modificărilor de structură, datele vor fi adăugate din aceste fișiere la noua structură de tabel. Se poate păstra și vechea versi- une, redenumind fișierele nume.bak cu nume_nou.dbf și nume.tbkcu nume_nou.fpt. Mai puteți să deschideți caseta de dialog cu opțiunea de meniu View->Table Designer. Structura tabelului deschis poate fi copiată: -> într-un . Acest tabel are o structură predefinită. El conține 11 câmpuri, câte un câmp pentru fiecare proprietate a câmpului (de exemplu, field_name pentru numele câmpului, field_type pentru tipul câmpului, field_len pentru lungimea câmpului, field_dec pentru numărul de poziții ale părții fracționare, field_null pentru a stabili dacă se acceptă valoarea nuli în câmp, field_defa pentru valoarea implicită a câmpului etc.). în tabel există câte o înregistrare pentru fiecare câmp (așadar, va avea atâtea înregistrări câte câmpuri are tabelul pentru care păstrează structura). Sintaxa comenzii este: unde este numele tabelului în care se va păstra structura. -> într-un precizat prin . Pot fi copiate toate câmpurile din structură sau numai o parte din ele. Sintaxa comenzii este: [ ] Observație. Pentru a vedea ce conțin tabelele în care au fost copiate structurile, ele trebuie deschise. Observație. Dacă într-o comandă nu se specifică numele unui tabel, înseamnă că ea se referă la tabelul deschis. De exemplu, comenzile list structure, modify structure etc. display | list structure modify structure copy to structure extended copy structure to 56 Sisteme de gestiune a bazelor de date Câmpurile dintr-un tabel pot fi manipulate și controlate prin intermediul comenzilor Set și al funcțiilor. J 1. Prin intermediul comenzilor set se poate controla -> Controlul accesului la câmpuri poate fi activat (on) sau inhibat (off) cu comanda: on|off Valoarea implicită este off. -> Se pot preciza câmpurile la care poate avea acces utilizatorul cu comanda: • [ | ] De exemplu: a. Se poate preciza că utilizatorul are acces la toate câmpurile: set fields to all sau set fields off b. Se poate preciza că utilizatorul are acces numai la câmpurile nume și pren: set fields to nume, pren c. Se poate preciza că utilizatorul nu are acces la niciun câmp: set fields to 2. Prin intermediul funcțiilor se pot obține informații despre câmpuri: - > numele câmpului dintr-o poziție precizată se obține cu funcția , unde este numărul de ordine al câmpului; - > numărul de câmpuri din tabel se obține cu funcția ; - > lungimea unui câmp din tabel se obține cu funcția ' unde este numele câmpului; - > dimensiunea înregistrării din tabel se obține cu funcția 2.3.1.4. CâmpcAy Un câmp memo se folosește pentru păstrarea textelor (a șirurilor de caractere cu lungime variabilă sau mai mare de 255 de caractere). El se păstrează într-un fișier separat, asociat tabelului (are același nume cu tabelul, are extensia .fpt și este deschis și închis împreună cu tabelul). Câmpul memo din tabel memorează de fapt adresa la care se găsesc datele din câmp în fișierul memo. Utilizatorul poate încărca datele într-un câmp memo: — de la tastatură, — dintr-un fișier, — din memoria internă (dintr-o variabilă de memorie). Introducerea unui câmp memo de la tastatură se face prin intermediul ferestrei de edi- tare a unui câmp memo. Dacă este deschisă o fereastră de editare a tabelului, fereastra de editare memo se deschide poziționând cursorul pe câmp și executând dublu clic sau apăsând tastele Ctrl+PageDown | PageUp. Dacă nu este deschisă fereastra de editare a tabelului, se poziționează pointerul de înregistrare pe înregistrarea în care trebuie să scrie valoarea câmpului memo și se deschide fereastra de editare memo cu comanda: , Preluarea unui câmp memo dintr-un fișier cu texte (extensia .txt) se face cu comanda: Informatică [ ] Fișierul din care se preia valoarea se identifică prin . încărcarea valorii se face implicit la sfârșitul textului care există deja. Explicit se poate rescrie peste vechiul conținut cu clauza [overwrite]. Comanda complementară este cea de copiere a valorii unui câmp memo într-un fișier text: [ ] Preluarea unui câmp memo dintr-o variabilă de memorie se face cu comanda: Comanda complementară este cea de copiere a valorii unui câmp memo într-o variabilă de memorie, folosind operația de atribuire. Se va realiza baza de date a unei companii care oferă servicii de consultanță, scopul bazei de date fiind gestionarea serviciilor de consultanță asigurate clienților de către angajații companiei. Pornind de la modelul conceptual prezentat în Modulul 1, pentru a putea răspunde la toate aceste cerințe, baza de date va fi formată din următoarele tabele¹: Tabelul va trebui să conțină următoarele date (sub formă de câmpuri): — Identificatorul angajatului (id_ang, I). Este un număr care identifică unic angajatul și este folosit pentru cheia primară. — Numele angajatului (nume, C, 20). Deoarece pot să apară căutări în tabel și după numele angajatului, acest câmp va fi cheie de indexare împreună cu câmpul prenume. — Preumele angajatului (pren, C, 20). — Tip angajat (tîp_ang, C, 1). Acesta este un cod care folosește un singur caracter prin care se identifică tipul angajatului: permanent cu normă întreagă (a), permanent cu jumătate de normă (b), temporar cu normă întreagă (c), temporar cu jumătate de normă (d), colaborator cu ora (e) sau cu angajamentul terminat (f). — Identificatorul superiorului (id_sup, I). Este un număr care identifică angajatul căruia îi este subordonat. Trebuie să fie de același tip ca și câmpul identificatorul angajatului deoarece superiorul este și el angajat al companiei. — Data nașterii (data_n, D). Este data nașterii angajatului. — Data angajării (data_a, D). Este data angajării. — Data încetării angajării (dataj, D). Este data de la care angajatul nu mai face parte din firmă (demisie, demitere, restrângere de activitate, pensionare etc.). El va fi păstrat în continuare în evidențele companiei. — Tariful orar (tarif, I). Este tariful perceput clientului pentru o oră de consultanță asigurată (prestată) de angajat. — Adresa angajatului (adresa, M). Deoarece adresa este un șir de caractere cu lungime care poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spațiul de memorie se va folosi câmpul de tip Memo. ¹ în descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C - character, M - memo, D - date, T - DateTime, L - logic. în cazul în care lungimea câmpului nu este determinată de tipul datelor, se va preciza și lungimea câmpului. De exemplu, nume,C,20 înseamnă câmpul nume este de tip Character și are lungimea 20. Sisteme de gestiune a bazelor de date — Localitatea (loc, C, 15). Deoarece compania are sucursale și birouri de reprezentanță în mai multe localități, și angajații pot avea domiciliile în mai multe localități. — Codul județului (cjud, C, 2). Pentru județ se înregistrează numai codul. Separat, în tabelul Județe vor fi înregistrate și numele județelor. — Codul poștal (cp, C, 5). Este codul poștal al adresei angajatului. — Telefonul fix (tel_f, C, 9). Este numărul telefonului fix al angajatului. — Telefonul mobil (tel_m, C, 9). Este numărul telefonului mobil al angajatului. — Observații (obs, M). Conține informații biografice ale angajatului sau referitoare la activitatea lui în cadrul companiei. Tabelul care va conține următoarele date (sub formă de câmpuri): — Identificatorul clientului (id_cl, I). Este un număr care identifică unic clientul și este fo- losit pentru cheia primară. Este de același tip ca și câmpul id_ang din tabelul Angajați. — Numele clientului (nume, C, 20). Deoarece pot să apară căutări în tabel și după numele clientului, acest câmp va fi cheie de indexare. Este de același tip ca și câmpul nume din tabelul Angajați. — Prenumele clientului (pren, C, 20). Este de același tip ca și câmpul pren din tabelul Angajați. — Tip client (Tip_cl, L). Câmpul va avea valoarea .T. în cazul unui client curent (are un contract de consultanță în derulare). — Identificatorul angajatului (id_ang, I). Este un număr care identifică angajatul atribuit clientului să se ocupe de el. Este de același tip ca și câmpul id_ang din tabelul Angajați. — Data intrării (dataj, D). Este data de la care a devenit clientul companiei de consultanță. — Adresa clientului (adresa, M). Este adresa clientului. Este de același tip ca și câmpul adresa din tabelul Angajați. — Localitatea clientului (loc, C, 15). Este localitatea de rezidență a clientului. Este de același tip ca și câmpul loc din tabelul Angajați. — Codul județului (cjud, C, 2). Este codul județului de rezidență al clientului. Este de același tip ca și câmpul cJud din tabelul Angajați. — Codul poștal (cp, C, 5). Este codul poștal al adresei clientului. Este de același tip ca și câmpul cp din tabelul Angajați. — Fax (fax, C, 9). Este numărul de fax al clientului. — Telefonul fix (telj, C, 9). Este numărul telefonului fix al clientului. Este de același tip ca și câmpul tel_fdm tabelul Angajați. — Telefon mobil (tel_m, C, 9). Este numărul telefonului mobil al clientului. Este de același tip ca și câmpul tel_m din tabelul Angajați. — Observații (obs, M). Conține scurte informații despre client și relațiile sale cu compania de consultanță. Tabelul care va conține următoarele date (sub formă de câmpuri): — Codul județului (cjud, C, 2). Este folosit pentru cheia primară. — Numele județului (njud, C, 15). Un angajat poate să aibă mai mulți clienți, iar de un client se pot ocupa mai mulți angajați. Așadar, între tabelele Angajați și Clienți, tipul de relație este de mai-multe-la-mai-multe. Din această cauză trebuie creat un tabel intermediar , care ține evidența contractelor de consultanță: — Identificatorul contractului (id_cont, I). Este un număr unic folosit pentru identificarea contractului de consultanță. — Identificatorul clientului (id_cl, I) care beneficiază de contractul de consultanță. Informatică — Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care definește categoria de consultanță: instruire, proiectare etc. — Observații (obs_c, C, 254). Conține o scurtă descriere a contractului de consultanță. — Data începerii (dataj, D). Este data la care începe derularea contractului de consultanță. — Terminat (term_c, L). Are valoarea . T. dacă s-a încheiat consultanța. Deoarece estimările se modifică pe parcursul derulării contractului (vor fi mai multe esti- mări pentru același contract) și deoarece se dorește păstrarea unui istoric al acestor esti- mări, ele vor fi înregistrate într-un tabel separat care are următoarea structură: — Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face estimarea. El va fi o cheie secundară, propagată din tabelul Contracte. — Numărul estimării (nr_est, I). Reprezintă a câta estimare este pentru același contract. — Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a făcut estimarea. — Obiectivul estimării (obiectiv, C, 254). Este descrierea obiectivelor pentru această estimare a derulării contractului. Descrierea trebuie să se facă precis și concis. — Termene (term, I). Este numărul estimativ de ședințe în care se va derula contractul. — Cost estimat (cost_e, I). Este costul estimativ al contractului de consultanță. — Data estimăriii (data_e, D). Este data la care s-a făcut estimarea. — Data terminării (data_t, D). Este data estimată pentru terminarea contractului de consultanță. Dar fiecare contract de consultanță se desfășoară pe parcursul mai multor ședințe de consultanță. Din această cauză trebuie creat un tabel intermediar care să țină evidența acestora și care are următoarea structură: — Numărul ședinței (nr_s, I). Este un număr unic atribuit ședinței și este folosit ca o cheie primară a tabelului care ajută la identificarea unei înregistrări din tabel (a unei ședințe). — Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfă- șoară ședința de consultanță. Va fi o cheie secundară propagată din tabelul Contracte. — Identificatorul angajatului (id_ang, I) care s-a ocupat de această ședință de consultanță. — Data ședinței (data_s, D). — Durata ședinței (timp_s, I). Este timpul în care s-a derulat ședința. Se măsoară în minute. — Costul ședinței (cost_s, I). Se calculează ca produs între durată și tariful angajatului. — Rezumat (rez_s, C, 254). Este un rezumat scurt al ședinței, care va fi tipărit pe notele de plată ale clientului. — Observații (obs_s, M). Sunt observații despre modul în care a decurs ședința. Sunt folosite numai în interiorul companiei. Sisteme de gestiune a bazelor de date Așadar, tabelul Contracte leagă între ele toate ședințele prestate pentru o consultanță, iar tabelul Ședințe leagă între ei clientul și angajatul care au participat la acea ședință. Pentru serviciile prestate, compania încasează bani de la client. Clientul nu plătește o singură dată valoarea finală a contractului de consultanță. El va face mai multe plăți pe parcursul derulării contractului. Din această cauză, încasarea nu va fi înregistrată în tabelul Contracte. Clientul nu plătește nici la fiecare ședință. Din această cauză, încasarea nu va fi înregistrată nici în tabelul Ședințe. Clientul poate să aibă cu compania mai multe contracte de consultanță. Din această cauză, încasarea nu va fi înregistrată nici în tabelul Clienți. Va trebui creat un tabel separat, tabelul , cu următoarea structură: — Numărul încasării (nrj, I). Este un număr unic atribuit încasării. El este folosit ca o cheie primară a tabelului și ajută la identificarea unei înregistrări din tabel (a unei încasări). — Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face încasarea. El va fi o cheie secundară propagată din tabelul Contracte. — Data plății (data_p, D). — Modul plății (mod_p, C,50). Se folosește pentru a descrie modul în care s-a făcut plata: numerar (chitanța încasării), ordin de plată (bancă, număr), filă cec (bancă, număr) etc. — Valoare (valoare, I). Este valoarea încasării și reprezintă o parte din valoarea totală a consultanței. — Observații (obsj, C, 254). Sunt detalii referitoare la obiectivul plăților. între aceste tabele s-au stabilit următoarele relații: Tabelul 1 Tabelul 2 Tipul relației Câmpul de legătură Județe Angajați una-la-mai-multe codul județului Angajați Ședințe una-la-mai-multe codul angajatului Județe Clienți una-la-mai-multe codul județului Clienți Contracte una-la-mai-multe codul clientului Contracte Ședințe una-la-mai-multe numărul contractului Contracte Estimări una-la-mai-multe numărul contractului Contracte încasări una-la-mai-multe numărul contractului New Se creează structura tabelului Angajați, astfel: ■ Se deschide caseta de dialog New cu opțiunea File^New.... Se activează butonul radio Table și apoi se execută clic pe butonul New File. ■ Se deschide caseta de dialog Create care conține aceleași controale ca și o casetă de dialog de tip Save As. Se alege din lista ascunsă Save As Type tipul de fișier Table/DBF. Se scrie în caseta de text Enter table numele tabelului Angajați. Se execută clic pe declanșatorul Save. ■ Se deschide fereastra generatorului de tabele Table Designer. Secțiunea Table conține controalele prin care se definește structura tabelului. Structura de câmpuri se definește în grila derulantă care are cinci coloane: — în coloana Name se scrie numele câmpului în caseta de text (de exemplu id_ang). Numele trebuie să conțină numai File Type Project Database (^llabie! Query Form Report Labei f Program Class T ext File f Menu New File Wizard Cancel Help Informatică litere, cifre și linie de subliniere. Atunci când se creează un tabel liber, numele nu trebuie să depășească 10 caractere, iar când se definește un tabel într-o bază de date, poate să aibă până la 128 de caractere. — în coloana Type se alege din lista ascunsă tipul câmpului (de exemplu Integer). Dimensiunea câmpului este prestabilită. — Se verifică să nu fie activat comutatorul din coloana NULL, deoarece nu se pot accepta valori nule în acest câmp. Coloanele grilei reprezintă proprietăți ale câmpului care se țdefinește. Table Designer X Table Index Width DecimalNULL Name Type loc Character 15 4 OK cjud Character 2 Cancel CD Character 5 Character 9 tel_m Character 9 £ obs | Character d |1O dl Jl Insert | । T Delete | C: WFP\angajati. DBF Records: 0 Fields: 16 Length: 132 Comutatoare: Insert - inserează un câmp deasupra câmpului selectat; Delete - șterge câmpul selectat; Bara de stare afișează informații despre tabel: identificatorul tabelului, numărul de înregistrări - Records (are valoarea 0 pentru că nu s-au introdus date), numărul de câmpuri definite - Fields (s-au definit 16) și lungimea înregistrării în octeți - Length (reprezintă suma lungimilor tuturor câmpurilor). ■ Se repetă aceste operații pentru toate câmpurile din tabel. ■ Se definește un index structural pentru acest tabel, cheia de indexare fiind formată din câmpurile nume și prenume (înregistrările vor fi aranjate logic în ordinea alfabetică a numelui și prenumelui; adică, atunci când numele este același, vor fi aranjate în ordinea alfabetică a prenumelui): — Se execută clic pe secțiunea Index. — în grila derulantă se scrie în caseta Name numele etichetei index: Nume. în stânga acestei casete de text se găsește butonul cu săgeată. Săgeata indică ordinea de aranjare: crescător T sau descrescător 4,. Se verifică dacă simbolul corespunde ordo- nării crescătoare. Dacă este necesar, se schimbă ordinea executând clic pe buton. — Se poate alege din lista ascunsă Type tipul de index: Primary, Candidate, Unique sau Regular (cheia obișnuită). Pentru acest index se alege valoarea Regular. — în zona Expression trebuie să fie definită cheia de indexare. Ea poate să conțină maxim 240 de caractere și poate fi formată dintr-un singur câmp (expresie simplă) sau poate să fie obținută prin concatenarea mai multor câmpuri (expresie complexă). Deoarece nu se pot concatena decât câmpuri de tip șir de caractere, celelalte câmpuri trebuie convertite în tipul șir de caractere. Pentru a ușura munca de construire a unei expresii complexe de indexare, se poate face apel la (Expression Builder). Așadar, fie se scrie expresia, fie se execută clic pe buton ca să se deschidă caseta de dialog Expression Builder. Sisteme de gestiune a bazelor de date Expression Builder Functions Ștring: | "text" Logical: Math: | OK C ancei Options... E xpression Date: | {date} Variables: .box .indent Jmargin .padvance .pageno .pbpage .pcolno From Table: | Angajați C N N Expresia se construiește în caseta de text Expression. Folosind controalele se poate alege: numele unui câmp (în lista Fields se execută dublu clic pe numele câmpului), numele unei variabile de memorie sistem sau utilizator (se execută dublu clic pe nu- mele variabilei din lista Variables), tabelul (se alege din lista ascunsă From Table). Din grupul de liste ascunse Function se alege funcția care se va folosi în expresie. Ea poate fi o funcție matematică (Math), o funcție pentru șiruri de caractere (Ștring), o funcție logică sau un operator relațional (Logical) sau o funcție pentru date calendaristice (Date). în momentul în care se alege o funcție (executând clic pe numele ei) vor fi afișate și parantezele (). Parametrii funcției se scriu între paranteze. ■ După ce s-a definit toată structura tabelului, se salvează acționând declanșatorul Ok. Se deschide caseta de dialog prin care utilizatorul este întrebat dacă vrea să introducă date în câmpurile înregistrărilor: Input data records now? Se execută clic pe declanșatorul Yes. Se deschide o fereastră de editare a tabelului, de tip browse. Se scriu cinci înregistrări: 100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50 sector 2, București, B, 23451, 0214567890, 0722111111, 101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Vodă nr. 20 sector 1, București, B, 23456, 0312345678, 0722122222, 102, lonescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector 4, București, B, 34561, 0212346789, 0723189467, 200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Șoseaua Mangalia nr. 34, Constanta, Ct, 34512, 0241123123, 0722134567, 201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului nr. 56, Constanta, Ct, 34562, 0241237893, 0722341561, ■ Se închide fereastra de editare. Se creează tabelul Județe scriind în fereastra de comenzi comanda SQL: create table județe (cjud c (2), njud C (15)) Se creează tabelul Clienți prin preluarea unor câmpuri din tabelul Angajați: ■ Se deschide tabelul Angajați cu comanda: use angajati ■ Se afișează structura tabelului Angajați cu comanda: display structure ■ Se copiază din tabelul Angajați în tabelul Clienți numai câmpurile id_ang, nume, pren, id_sup, data_n, adresa, loc, cJud, cp, tel_m, tel_f, obs cu comanda: Informatică copy structura to clienti fields id_ang, nume, pren, id_sup, data_n, adresa, loc, cjud, cp, tel_m, tel_f, obs ■ Se deschide tabelul Clienți cu comanda: use clienti ■ Se deschide caseta de dialog Table Designer pentru a face modificări în structura tabelului. Se folosește comanda: modify structura ■ în caseta de dialog se fac următoarele modificări. Se schimbă numele câmpurilor: id_ang în id_cl, id_sup în id_ang și data_n în data_i. Se inserează în poziția cores- punzătoare câmpurile: tip_cl și fax. ■ Se vizualizează structura tabelului Clienți cu comanda display structura. ■ Se afișează câte câmpuri are înregistrarea - folosind funcția (răspunsul este 74): ?fcount() ■ Se afișează ce dimensiune are câmpul loc - folosind funcția (răspunsul este 15): ?fsize('loc') ■ Se afișează numele câmpului din poziția 10 - folosind funcția (răspunsul este cp): ?field(10) ■ Se afișează ce dimensiune are înregistrarea - folosind funcția (răspunsul este 126): ?recsize() ■ Se închide tabelul cu comanda: use. La un moment dat există o singură înregistrare care poate fi prelucrată. Ea se numește . Numărul înregistrării curente se păstrează în . El se mai numește indicator de înregistrare sau pointer de înregistrare. Contorul de înregistrare este o zonă de memorie internă care se asociază tabelului la deschiderea lui. La închiderea tabelului contorul se șterge. Se pot folosi următoarele comenzi pentru poziționarea pointerului de înregistrare: poziționarea după numărul înregistrării: , ; -> poziționarea după un criteriu logic: Se poate folosi: -> Comanda goto sau go poziționează pointerul de înregistrare pe o anumită înregis- trare din tabel, precizată prin numărul său. Sintaxa comenzii este: I | | unde reprezintă numărul înregistrării, top prima înregistrare, iar bottom ultima înre- gistrare ■> Comanda skip poziționează pointerul de înregistrare peste un anumit număr de înregis- trări din tabel, față de înregistrarea curentă. Sintaxa comenzii este: [] unde reprezintă numărul de înregistrări peste care se sare înainte dacă n>0 sau înapoi dacă n<0. Dacă numărul lipsește, saltul se face la înregistrarea următoare. goto skip Sisteme de gestiune a bazelor de date Se poate folosi: -> Comanda locate poziționează pointerul de înregistrare pe o înregistrare care îndeplinește condiția specificată. Sintaxa comenzii este: continue locate [] Comanda caută secvențial și poziționează pointerul pe prima înregistrare care îndepli- nește un criteriu de căutare precizat prin condiția din clauza For. Dacă nu găsește nicio înregistrare, pointerul va fi poziționat după ultima înregistrare de date, adică pe marcajul eof. Comanda caută implicit în tot tabelul (AII). Explicit poate căuta numai în anumite înregistrări, precizate prin sau prin clauza while. Cu această comandă se găsește prima înregistrare care îndeplinește criteriul de căutare. - > Comanda continue continuă procesul de căutare definit de ultima comandă locate (caută următoarea înregistrare care îndepli- nește criteriul de căutare precizat în comanda locate). Comanda continue se folosește numai împreună cu comanda locate. Sintaxa comenzii este: Dacă nu se mai găsește nicio înregistrare, în bara de stare se afișează mesajul End of locate scope. Comenzile de poziționare se pot folosi și prin intermediul interfeței. Se alege opțiunea Table-» Goto Record ► . Se deschide un submeniu cu opțiuni pentru poziționarea pe o anumită înregis- trare: Țop (prima înregistrare), Bottom (ultima înregistrare), Next (următoarea înregistrare), Previous (înregistrarea precedentă), Record#... (înregistrarea cu numărul precizat), Locate... (adverbele comenzii locate vor fi definite prin intermediul controalelor din caseta de dialog Locate). ] Prin intermediul funcțiilor se pot obține informații despre înregistrările din tabel: - > numărul de înregistrări din tabel se obține cu funcția ; - > numărul înregistrării curente din tabel se obține cu funcția ; - > sfârșitul de fișier - funcția furnizează un rezultat logic care este .T. dacă pointerul este poziționat pe ultima înregistrare din tabel; Informatică 65 - > începutul de fișier - funcția furnizează un rezultat logic care este .T. dacă pointerul este poziționat pe prima înregistrare din tabel; - > modul în care a decurs căutarea - funcția furnizează un rezultat logic care este .T. dacă a avut succes operația de căutare. Aceste funcții pot fi folosite pentru a testa dacă se mai continuă sau nu procesul de căutare. ■ Se deschide tabelul Angajați cu comanda: use angajati ■ Se execută mai multe operații de poziționare folosind comenzile goto și skip. Se observă informația afișată în bara de stare după fiecare operație de poziționare. ?recno() goto bottom End of file 1 ?recno() encountered ?reccount() 5 ?recno() 5 goto top 6 ?bof() ?recno() skip -7 .F. 1 ?recno() skip-1 skip 2*3 1 ?bof() ?recno() skip -10 .T. 6 Beginning of file goto 3 ?eof() encountered ?recno() .T. ?recno() 3 skip 2 1 ■ Se execută operații de poziționare folosind opțiunea de meniu. Se deschide mai întâi fereastra de editare a tabelului cu opțiunea de meniu View^_Browse "Angajați". Se observă după fiecare operație de poziționare informația afișată în bara de stare și înregistrarea pe care s-a poziționat pointerul de înregistrare în fereastra de editare: Table -> Goto Record ► -» Next -> înregistrarea 2 (era următoarea înregistrare) Table -> Goto Record > -> Bottom înregistrarea 5 (ultima înregistrare) Table -> Goto Record ► -> Record#... -> caseta de dialog Go to Record: se scrie în caseta cu derulor Record valoarea 2 și se execută clic pe declanșatorul Go to —> înregistrarea 2. ■ Se închide fereastra de editare. Se observă în fereastra Command comenzile corespunzătoare acțiunilor executate: skip go bottom go 2 ■ Pentru poziționare se folosesc comenzile locate și continue. Se urmărește efectul lor observând informațiile afișate în bara de stare. locate for id_ang=100 (Se caută angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afișează numele, prenumele, adresa și localitatea angajatului.) Popescu Andrei Str. Morilor nr. 50 sector 2 București continue End of locate scope ? found() .F locate for id_sup=100 ? nume, pren, adresa, loc (Se continuă căutarea angajatului cu codul 100.) (Nu s-a mai găsit un angajat cu codul 100.) (Se verifică dacă s-a mai găsit o înregistrare.) (Nu s-a mai găsit un angajat cu codul 100.) (Se caută angajați! care au ca superior angajatul cu codul 100.) (Se afișează numele, prenumele, adresa și localitatea angajatului.) 66 Sisteme de gestiune a bazelor de date Popescu Andrei Str. i^ordor nr. 50 sector 2 București continue (Se continuă căutarea angajaților care au superiorul cu codul 100.) ? foundQ (Se verifică dacă s-a mai găsit o înregistrare.) X (S-a mai găsit angajatul care are ca superior angajatul 100.) ? nume, prenₛ adresa, (Se afișează numele, prenumele, adresa și localitatea angajatului.) Andronesu Ana Str. Vodă nr. 20 sector 1 București continue (Se continuă căutarea angajaților care au superiorul cu codul 100.) ? foimdO (Se verifică dacă s-a mai găsit o înregistrare.) .T. (S-a mai găsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, toc (Se afișează numele, prenumele, adresa și localitatea angajatului.) ionescu ^aria Stn Zorikwnr. 23 sector 4 București continue (Se continuă căutarea angajaților care au superiorul cu codul 100.) End of locate scope (Nu s-au mai găsit angajați subordonați angajatului 100.) ? found() (Se verifică dacă s-a mai găsit o înregistrare.) .F. (Nu s-au mai găsit angajați subordonați angajatului cu codul 100.) ? eof() (Se verifică dacă s-a ajuns la sfârșitul fișierului.) .T. (S-a ajuns la sfârșitul fișierului.) locate for day(datajn)-day(dateO) and month(date_n) = month(date()) Se caută angajatul care are data de naștere astăzi. Dacă s-a găsit, se afișează numele și prenumele. locate for and upper(pren)='ANA' Se caută angajatul care are numele Andronescu și prenumele Ana. Deoarece nu se știe cu ce tip de caractere au fost scrise numele și prenumele, ele sunt transformate în litere mari. ?tel_f₃ teljm (se afișează numerele de telefon) 0212345678 0721222222 ■ Se execută comanda tocate folosind opțiunea de meniu. Table -> Goto Record > •-» Locate...., ->■ caseta de dialog Locate Record: se execută clic pe declanșatorul Locate înregistrarea 1 (prima înregistrare). Table -> Goto Record > —> Locate». caseta de dialog Locate Record: — se execută clic pe declanșatorul For». -> caseta de dialog Expressîon Builder; — se execută dublu clic pe câmpul pren, se scrie în caseta de text semnul =, apoi în lista de funcții String se execută cUc pe funcția ProperQ și se scrie ca parametru în locul parametrului expC, prenumele 'Mana' (în casetă va fi scrisă condiția Angajati.pren=PROPER('Maria)), — se acționează declanșatorul Venfy pentru a verifica dacă este corectă expresia și apoi — se execută clic pe OK în caseta de dialog Locate Record se execută clic pe declanșatorul Locate -> înregistrarea 3 (prima înregistrare pentru care valoarea câmpului pren este Marfa). ■ Se închide fereastra de editare. Se observă în fereastra Command comenzile corespunzătoare acțiunilor executate: / locate alI locate for Angajati.pren= proper('Maria') 2.3.3. Actualizarea tabelului Observație. Operația de actualizare se execută asupra tabelului deschis. Informatică 67 3-cii; 7O3I ;fl OlO ISUF3il Se poate face: 1 .R7, !p:s _> de la tastatură - se realizează fie prin intermediul opțiunii de meniu Tabie-»Append New Records, fie prin intermediul comenzii: Se deschide fereastra de editare de tip Edit. La sfârșitul fișierului este adăugată o înregistrare vidă. Se completează câmpurile din înregistrare prin intermediul controa- lelor din această fereastră. Dacă se dorește să se mai adauge o nouă înregistrare, după ce s-a terminat completarea câmpurilor unei înregistrări, se apasă tasta Enter. Operația de adăugare se termină prin închiderea ferestrei. -> prin adăugarea unei înregistrări vide - se realizează prin intermediul comenzii: La sfârșitul tabelului se adaugă o înregistrare vidă pentru care urmează să se completeze ulterior valorile câmpurilor. -> dintr-un alt tabel - se realizează fie prin intermediul opțiunii de meniu Table->Append Records..., fie prin intermediul comenzii: [;. ] [for ] unde este numele tabelului din care se adaugă înregistrări. Implicit se adaugă toate înregistrările și toate câmpurile din tabel, dar se poate explicita numai adăugarea anumitor câmpuri (câmpurile precizate în lista de câmpuri a clauzei fields) și/sau numai a anumitor înregistrări (cele care îndeplinesc condiția precizată prin expresia a clauzei for). 2 . Pfb: în hPB'P-nP - > Operația se realizează prin comanda: [ ]( 1 r— Implicit se inserează o înregistrare vidă după înregistrarea curentă și se deschide j fereastra de editare pentru a completa valorile câmpurilor. Explicit, inserarea se poate I g face înaintea înregistrării curente, folosind clauza before, sau se poate insera numai o j înregistrare vidă folosind clauza blank. Se poate face prin următoarele operații: - > ". Operația de ștergere logică nu înseamnă eliminarea fizică a înregistrărilor din tabel, ci numai marcarea lor pentru ștergere. înregistrările șterse logic pot fi refăcute. Operația se realizează fie prin intermediul opțiunii de meniu Table->Delete Records..., fie prin intermediul comenzii: d : [] [ ] [rhbs ] Implicit este ștearsă logic înregistrarea curentă. Explicit poate fi șters logic un grup de înregistrări precizat prin sau clauzele for sau while. - > ,, ’ ' Operația înlătură marcajele pentru ștergere logi- că. Se realizează fie prin intermediul opțiunii de meniu Table->Recall Records..., fie prin intermediul comenzii: [] f ] [ ] browse, edit, change repiace deleted() set deleted zap pack Sisteme de gestiune a bazelor de date Implicit sunt refăcute toate înregistrările marcate logic pentru ștergere. Explicit poate fi refăcut un grup de înregistrări precizat prin sau clauzele for sau while. - > . Operația de ștergere fizică înseamnă eliminarea fizică din tabel a înregistrărilor marcate logic pentru ștergere. înregistrările șterse fizic nu mai pot fi refăcute. Operația se realizează fie prin intermediul opțiunii de meniu Table->Remove Deleted Records, fie prin intermediul comenzii: - > Operația de ștergere fizică a tuturor înregistrărilor înseamnă eliminarea fizică din tabel a tuturor înregistrărilor de date și păstrarea numai a structurii tabelului. Se realizează prin intermediul comenzii: Această operație este echivalentă cu două operații: delete all și pack. în fereastra de editare pot fi marcate logic pentru ștergere sau se poate anula marcajul cu opțiunea Tablei Toggle Deletion Mark sau folosind scurtătura Ctrl+T. Opțiunea are efectul unui comutator. Dacă înregistrarea nu este marcată, o marchează, și invers, dacă este marcată, îi anulează marcajul. se face prin: - > Comanda care stabilește cum pot fi folosite înregistrările șterse logic: on | off unde on înseamnă că înregistrările șterse logic nu pot fi folosite de comenzile care au în sintaxă clauzele for și while, iar off (implicit) înseamnă că înregistrările șterse logic pot fi folosite de toate comenzile. - > Funcția care testează dacă înregistrarea curentă este marcată logic pentru ștergere (valoarea .T. înseamnă că a fost marcată pentru ștergere): Modificarea valorii câmpurilor din înregistrări se poate face: - > prin valori precizate: Se poate folosi comanda repiace care are sintaxa: . [ ] [, [additive]...] [] [ ] [ ] Se înlocuiește valoarea din câmpul cu valoarea obținută în urma evaluării expresiei , valoarea din câmpul cu valoarea obținută în urma eva- luării expresiei etc. Implicit, înlocuirea se face numai în înregistrarea curentă. Explicit, înlocuirea se poate face într-un grup de înregistrări precizat prin sau clauzele for sau while. -> interactiv, de la tastatură: Se pot folosi comenzile , sau care des- chid fereastra de editare. Comenzile browse, edit și change au următoarea sintaxă: | | ¹ [' ] [] [ ] [ ] [ [,]J [ ] [ ] [ I ] [ [ ][ | ][ ] [ ] [partition ] [Ipartition] [nolink] [ledit] [redit] [ [f] [ ]] [ ] [

] Informatică Clauzele din comandă au următoarea semnificație: - permite afișarea numai a câmpurilor precizate în . Lista de câmpuri poate conține nume de câmpuri din tablou sau câmpuri calculate. Separarea în listă se face prin virgulă. Fiecărui câmp i se poate asocia o opțiune. Opțiunile sunt: --- Câmpul poate fi vizualizat dar nu poate fi modificat. : v = Câmpul introdus este evaluat prin expresia logică . Dacă valoarea expresiei este .7., data din câmp este corectă; altfel, se afișează un mesaj de eroare. Se verifică o regulă de validare atunci când trece cursorul prin câmp (fără modificare). Opțiunea se poate folosi împreună cu opțiunea :V. :E= Mesajul de eroare standard produs de introducerea unei valori invalide în câmp poate fi modificat cu mesajul de tip șir de caractere. Opțiunea se poate folosi împreună cu opțiunea :V. = , Se verifică dacă după editare câmpul aparține intervalului definit de valorile (limita inferioară) și (limita superioară). Cele două valori trebuie să fie de același tip. în cazul în care valoarea câmpului nu se încadrează între cele două limite, se afișează un mesaj de eroare care poate fi personalizat cu opțiunea :F. :K = Numele câmpului afișat în fereastra de editare este înlocuit cu '' de tip șir de caractere. = Se va intra în operația de editare cu câmpul respectiv numai dacă este îndeplinită condiția . - > - permite stabilirea fontului caracterelor afișate în fereastra de editare prin nume font și dimensiune font (de exemplu, font 'aria!', 12). - > - permite stabilirea stilului caracterelor afișate în fereastra de editare (de exemplu, 'b'-bold, 'u'- underline, T-italic, 'o'-outline, ’s'- shadow). - > - permite selectarea pentru editare a unui singur câmp (precizat prin ); restul câmpurilor sunt numai pentru informare. - > | - fereastra este deschisă cu configurația pe care a avut-o la ultima operație de editare. - > - nu permite utilizatorului să adauge noi înregistrări în tabel. - > - nu permite utilizatorului să șteargă logic înregistrări din tabel. - > | - nu permite utilizatorului să modifice înregistrările din tabel (nu- mai să adauge sau să șteargă). - > - deschide fereastra de editare cu valori implicite pentru parametri (culoare, dimensiune, poziție, titlu etc.). - > - modifică titlul ferestrei de editare cu numele de tip șir de caractere. - > - precizează coloana în care se împarte fereastra în două partiții: una de tip browse, alta de tip edit; fiecare dintre ele poate fi văzută independent. ■ > - la deschiderea ferestrei de editare, cursorul va fi afișat în partiția din partea stângă, în primul câmp, altfel este poziționat în partea dreaptă. ■ > - cele două partiții nu sunt legate, altfel ele sunt legate, adică atunci când se derulează conținutul unei partiții se derulează și conținutul celeilalte partiții. - > - partiția din partea stângă este de tip invers față de fereastra de editare (de tip browse pentru fereastra edit și de tip edit pentru fereastra browse). ■ > - partiția din partea dreaptă este de tip invers față de fereastra de editare (de tip browse pentru fereastra edit și de tip edit pentru fereastra browse). 70 Sisteme de gestiune a bazelor de date -> valid - validează valorile introduse în câmpuri (validarea se face la nivelul înregistrării și nu la nivelul câmpului, cum face opțiunea V); dacă este adevărată condiția , se trece la următoarea înregistrare, altfel se rămâne la înregistrarea care se modifică și se afișează un mesaj de eroare. Mesajul de eroare poate fi per- sonalizat cu (de tip șir de caractere) cu clauza . Opțiunea :f forțează executarea operației de validare chiar dacă nu s-au făcut modificări în înregistrare, when - are același efect ca și opțiunea w, cu deosebirea că se aplică la nivelul întregii înregistrări, și nu numai la nivelul unui câmp. -> width - limitează lățimea câmpurilor la

caractere; afectează numai formatul de afișare din fereastră, nu și structura tabelului. Comanda browse mai poate avea clauzele: - precizează numărul de câmpuri care pot fi văzute în partiția din stânga a ferestrei browse fără să se deruleze conținutul; partiția se va dimensiona automat pentru a realiza acest format de afișare. -> noPgrd, norgrM _ înlătură grila din partiția stângă, respectiv dreaptă a ferestrei de editare browse. filterQ setfllter Accesul la înregistrările unui tabel poate fi controlat la citire și scriere prin două metode: 1. Metoda ștergerii logice. Această metodă constă în următoarele acțiuni: - > Se șterg logic înregistrările la care nu se dorește accesul - cu comanda delete. - > Se inhibă accesul la înregistrările șterse logic - cu comanda set deleted on. - > Atunci când se dorește accesul la unele înregistrări, se anulează marcajul lor pentru ștergerea logică - cu comanda recall. 2. Metoda filtrului. Această metodă constă în următoarele acțiuni: -> Se construiește un filtru cu comanda: ° unde este o condiție logică pe care trebuie să o îndeplinească înregistrările la care aveți acces. Refacerea accesului la toate înregistrările se face cu comanda: e7-'ț -r ₚₗ. -> Se poate verifica filtrul (condiția pe care trebuie să o îndeplinească înregistrările ca să fie permis accesul la ele) cu funcția logică: iL li I r 1 Se adaogă use angajati Se deschide tabelul Angajați care conține deja cinci înregistrări. append Se deschide fereastra de editare. Adăugați cinci înregistrări. use județe Se deschide tabelul Județe care nu conține înregistrări. append Se adaugă numai înregistrarea pentru București. browse fields cjud:v=isalpha(left(c_jud,1)) and isalpha(right(c_Jud,1)) :e='cod gresit':h⁼,cod județ', njud:h='numejudet' Se execută clic pe opțiunea Append Mode eView (se pot adăuga în- registrări și în fereastra de editare de tip Browse). Se adaugă restul în- Informatică 71 registrărilor în fereastra Browse. Se verifică mesajele de eroare care apar atunci când nu se scrie codul județului format din două litere. use angajati Se deschide tabelul Angajați care conține zece înregistrări. copy structure to ang Se copiază structura tabelului într-un tabel nou ang. use ang Se deschide tabelul Ang care nu conține înregistrări. append blank (de 5 ori) Se adaugă cinci înregistrări vide. browse în fereastra de editare sunt afișate cele 5 înregistrări vide. repiace all tip_ang with 'a' Se completează pentru toți angajați! câmpul tip_ang cu 'a'. goto top Se poziționează pointerul la începutul tabelului, deoarece comanda repiace all l-a poziționat la sfârșitul tabelului. repiace next 3 id_sup with 300, loc with 'Buzău¹, cjud with J with '0238' Primii trei angajați sunt din Buzău și sunt subordonați aceleiași persoane. Pentru numărul de telefon se scrie prefixul pentru Buzău. Pointerul de înregistrare va fi poziționat pe înregistrarea 3. skip Salt la următoarea înregistrare (înregistrarea 4) repiace rest id sup with 100, loc with 'București', cjud with BB',t®Lf with '021' Ultimii doi angajați sunt din București și sunt subordonați aceleiași persoane. Pentru numărul de telefon se scrie prefixul pentru București. Pointerul de înregistrare va fi poziționat pe înregistrarea 5. browse în fereastra de editare se completează cu valori restul câmpurilor. use angajați Se deschide tabelul Angajați. append from ang for cJud='B' Se adaugă din tabelul Ang la sfârșitul tabelului, angajați! din București, append from ang for cJud='Bz' Se adaugă din tabelul Ang la sfârșitul tabelului, angajații din Buzău. browse Se deschide fereastra de editare. Se observă cum s-au executat operațiile. use clienti Se deschide tabelul Clienți. browse Nu conține nicio înregistrare. appen blank (de 6 ori) Se adaugă 6 înregistrări vide. browse Se completează pentru toate înregistrările codul clientului și codul angajatului care se ocupă de el. repiace for id_ang>=100 and id_ang<200 loc with 'București', cjud with ?B', tel J with '02T, fax with '021' Se completează pentru clienții de care se ocupă angajații din București localitatea, codul județului și prefixul pentru telefon și fax. repiace for id_ang>=200 and id_ang<300 loc with Constanta, cjud with 'Ct', tel J with '0241', fax with '0241' Se completează pentru clienții de care se ocupă angajații din Constan- ța localitatea, codul județului și prefixul pentru telefon și fax. repiace for id_ang>=300 and îd_ang<400 loc with 'Buzău', cjud with telj with '0238', fax with '0238' Se completează pentru clienții de care se ocupă angajații din Buzău localitatea, codul județului și prefixul pentru telefon și fax. brow Se completează restul câmpurilor. 2. Se modifică valoarea câmpurilor din înregistrări: use angajati Se deschide tabelul Angajați. browse freeze tarif valid tarif>=300 and tarif<=500 în fereastra de editare se modifică numai tariful. Valoarea introdusă trebuie să aparțină intervalului [300, 500] browse for lower(cJud)='ct' fields nume:r, pren:r, >'0241000000' and telj<'0241999999':e='telefon greșit' 72 Sisteme de gestiune a bazelor de date în fereastra de editare se fac modificări numai pentru angajații din Constanța pentru care se modifică numai numărul de telefon. Pentru valoarea introdusă s-a precizat o regulă de validare și un mesaj afișat în caz de introducere eronată a valorii. replace id_sup with 1000 for id_sup=100 Se înlocuiește în tot tabelul codul superiorului 100 cu 1000. browse Se afișează modificările făcute în fereastra de editare. replace id_sup with 100 for id_sup=1000 Se înlocuiește în tot tabelul codul superiorului 1000 cu 100. browse Se afișează modificările făcute în fereastra de editare. browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365) Se afișează în fereastra browse numai câmpurile nume, pren și varsta (un câmp calculat). Pentru câmpul pren se afișează eticheta prenume. replace for id_ang=104 tîp_ang with ’c’ Se modifică pentru angajatul cu identificatorul 104 tipul angajatului din a în c. replace for id_ang=302 tip_ang with 'b' Se modifică pentru angajatul cu identificatorul 104 tipul angajatului din a în b. browse Se afișează modificările făcute în fereastra de editare. 3, Se șterg delete for lower(c_jud)='ctl browse set deleted on înregistrările din județul Constanța sunt marcate logic pentru ștergere. browse înregistrările marcate logic pentru ștergere nu mai sunt afișate. set deleted off înregistrările marcate logic pentru ștergere sunt afișate. browse Se poziționează cursorul pe o înregistrare marcată logic pentru ștergere. ?deleted() .r Se poziționează cursorul pe o înregistrare care nu este marcată pentru ștergere. ?deleted() .F. recall for lower(cjud)=’ct’ delete record 1 Se refac înregistrările marcate logic pentru ștergere. set deleted on Se marchează logic pentru ștergere înregistrarea 1. browse înregistrarea 1 nu este afișată în fereastra de editare. recall record 1 Se reface înregistrarea marcată logic pentru ștergere, browse înregistrarea 1 este afișată în fereastra de editare. set deleted off 2.3.4. Ce^s^^r-Ba Bazele de date se construiesc pentru a obține informații într-un timp scurt. Informațiile obținute dintr-un tabel pot fi: 1. Detaliate - sub forma unor liste. Se pot folosi comenzile sau . Sintaxa lor este: Sirî | [ [;<; c' >] ] [] ? ] [ ] [ e p.-;i ₍ -] [ ][ ] Deosebirile dintre comanda list și display sunt: Informatică diferențe domeniul implicit de acțiune toate înregistrările înregistrarea curentă modul de afișare defilare paginat (ecran plin) efectul valorii on a nu afișează înregistrările afișează înregistrările parametrului deleted șterse logic șterse logic Observație: comanda list este echivalentă cu comanda display rest, iar comanda display este echivalentă cu comanda list next 1 sau list record recno(). Implicit sunt afișate pe ecran toate câmpurile, inclusiv numărul înregistrării. Explicit se poate afișa numai un grup de înregistrări precizat prin sau clauzele for sau while, numai anumite câmpuri precizate prin clauza fields, fără numărul înregistrării folosind clauza off, iar ieșirea poate fi redirectată la imprimantă sau într-un fișier. - sub forma unor valori. Se pot folosi comenzi sau funcții: Comanda Funcția Efectul A cnt() furnizează numărul de înregistrări :ount, sum, average, calculate sum() furnizează suma unor câmpuri numerice avg() furnizează media aritmetică a unor câmpuri numerice furnizează rezultatul evaluării funcțiilor cnt(), sum() și avg(). Sintaxa comenzilor este: | | [] [] [ ] [ ][ ] [] [ ] [ ] [ ] Domeniul implicit de acțiune al acestor comenzi este: comanda se aplică asupra tuturor înregistrărilor și asupra tuturor câmpurilor numerice, iar rezultatul se afișează pe ecran. Explicit, comenzile acționează numai asupra grupului de înregistrări precizat prin sau clauza for sau while și numai asupra câmpurilor numerice precizate în , iar rezultatul poate fi memorat în variabile de memorie. Se deschide tabelul Angajați. Se calculează media aritmetică a tarifului folosind comanda: average tarif Se calculează și se afișează media aritmetică a tarifului pentru toți angajații. average tarif to v Se calculează media aritmetică a tarifului pentru toți angajații și se păstrează în variabila de memorie v ?v al cărei conținut se afișează. calculate avg(tarif) Se calculează media aritmetică cu ajutorul funcției avg(). average for tip_ang='a' Se afișează media aritmetică pentru toate câmpurile numerice (inclusiv pentru cele care conțin codurile angajaților și ale superi- orilor; din această cauză cererea de informație nu s-a făcut corect) average tarif for tip_ang=,al Se afișează media aritmetică a tarifului pentru angajații per- manenți cu normă întreagă (tip ’a^. average tarif for tip ango'a’ Se afișează media aritmetică a tarifului pentru angajații care nu sunt permanenți cu normă întreagă (tip diferit de 'a'). Sisteme de gestiune a bazelor de date 2. Se numără înregistrările: Prin numărarea înregistrărilor care corespund unui criteriu, se poate afla câți angajați îndeplinesc acel criteriu: count for id_sup=100 Se numără și se afișează câți angajați sunt subordonați anga- jatului cu identificatorul 100. count for id_sup=100 to v Se numără câți angajați sunt subordonați angajatului cu identi- ficatorul 100 și rezultatul se păstrează în variabila de memorie v ? V al cărei conținut se afișează. count for lower(c_jud)='ct' Se numără și se afișează câți angajați sunt din Constanța. count for tarif > 250 Se numără și se afișează câți angajați au tariful mai mare decât 250 lei. 3. Se afișează tete: în liste se pot afișa anumite câmpuri precizate prin lista de câmpuri și anumite înregistrări precizate prin domeniu sau clauzele for sau while: list nume, pren, data_n for month(data_n)=03 Se afișează numele, prenumele și data nașterii pentru toți angajații născuți în luna martie. list for id_sup=100 Se afișează toate câmpurile pentru angajații subordonați angajatului cu codul 100. list nume, pren, idang for id_sup=100 Se afișează numele, prenumele și identificatorul pentru angajații subordonați angajatului cu codul 100. list nume, pren, id_ang for id_sup=id_ang Se afișează numele, prenumele și identificatorul pentru angajații care nu sunt subordonați altor angajați. display nume, pren, id ang for id_sup=id_ang list id ang, nume, pren to file alfa Lista, care conține numai câmpurile cu identificatorul angajatului, numele și prenumele pentru toți angajații, este copiată într-un fișier. dir alfa.* Se afișează lista fișierelor care au numele alfa din directorul curent. Fișierul în care s-a transferat lista are extensia .txt. type alfa.txt Se afișează conținutul fișierului alfa.txt care conține lista. 4. Se verifică modul în care sunt tratate înregistrările șterse logic: Controlul accesului la înregistrările șterse logic se face prin parametrul deleted: delete for lower(cjud)='ct’ Se marchează pentru ștergere logică înregistrările angajaților din Constanța. set deleted on Se atribuie parametrului deleted valoarea on. display Se afișează înregistrarea curentă cu comanda display. list Se afișează toate înregistrările cu comanda list. display all Se afișează toate înregistrările cu comanda display all. set deleted off Se atribuie parametrului deleted valoarea off. display Se afișează înregistrarea curentă cu comanda display. list Se afișează toate înregistrările cu comanda list. display all Se afișează toate înregistrările cu comanda display all. recall for lower(c_jud)='ct' Se refac înregistrările marcate logic pentru ștergere. 5.. Verificarea efectului filtrului definit pentru înregistrări: Se pot defini filtre pentru înregistrări cu ajutorul parametrului filter: set filter to upper(cJud)='B' Se construiește un filtru. Scopul este de a lăsa să treacă numai angajații din București. Informatică ?filter() upperfcjud)='B' list îd ang, nume, pren, loc browse set filter to upper(cJud)=='B' ?filter() upperfcJud)=='B' list id_ang, nume, pren, loc browse set filter to upper(cJud)==’B ' ?filter() (cJud)=='B ' list id ang, nume, pren, loc browse set filter to list id_ang, nume, pren, loc browse Se cere afișarea filtrului. Se afișează condiția logică din filtru. Se afișează atât angajații din București cât și cei din Buzău. Așadar, filtrul nu a fost construit corect. Se definește din nou filtrul, cu o altă condiție logică. Se cere afișarea filtrului. Se afișează condiția logică din filtru. Nu se afișează nicio înregistrare. Din nou filtrul nu a fost definit corect. Se definește din nou filtrul, cu o altă condiție logică. Se cere afișarea filtrului. Se afișează condiția logică din filtru. Se afișează numai angajații din București. Condiția din filtru a fost definită corect. Se anulează filtrul. Se afișează toate înregistrările. z erectil fui definit pentru câmpuri: Se pot defini filtre pentru câmpuri cu ajutorul parametrului fîelds. Se deschide tabelul Clienți cu comanda use clienti. set fields to id_cl, nume, pren, id_ang list Sunt afișate numai câmpurile identificator client, nume și pre- browse nume client, identificatorul angajatului care se ocupă de client, display (numai câmpurile id_cl, nume, pren, \d_ang) set fields to Nu este afișat niciun câmp. r_ browse Sunt afișate toate câmpurile. .1 set fields to all browse /,'< S'P'nwea în urma sortării unui tabel se creează un alt tabel în care înregistrările sunt rearanjate conform criteriului de sortare folosit. Operația acționează asupra tabelului deschis. Sintaxa comenzii este: l i a on |/a | /d] [ Zc] [, [Za | Zd] [ /c].... ] [ascending | dascending] [] [for ] [while ] [fields ] Forma implicită a comenzii este: sort to on unde este numele tabelului obținut în urma sortării tuturor înregistrărilor din tabelul deschis, iar este numele câmpului folosit pentru cheia de sortare. Sortarea se face în ordinea crescătoare a câmpului cheie de sortare. Tabelul sortat va avea aceeași structură ca și tabelul sursă. Explicit, se pot sorta din tabelul sursă numai înregistrările precizate prin sau clauzele for sau while și pot fi folosite mai multe chei de sortare , etc. Sortarea se poate face descrescător, după toată lista de câmpuri cheie de sortare folosind clauza descending, sau poate fi controlată ordinea de sortare la nivelul fiecărui câmp, folosind adverbele Za - crescător, Zd - descrescător sau Zc - fără să se țină cont de diferența dintre literele mari sau mici. Tabelul sortat poate să conțină numai câmpurile precizate prin lista din clauza fields. Sisteme de gestiune a bazelor de date Pentru a putea exploata un tabel în acces direct, trebuie organizat astfel încât să fie permis accesul direct la o înregistrare în funcție de valoarea unui câmp sau a unor câmpuri care vor forma cheia de acces. Soluția este de ordonare logică a înregistrărilor prin intermediul , iar cheia de acces se mai numește Visual FoxPro permite crearea a două tipuri de fișiere de index pe lângă indexul structural: -> care conține o singură cheie de indexare într-un fișier (numele diferit de al tabelului și extensia idx), -> care conține mai multe chei de indexare (etichete index) într-un fișier (numele diferit de al tabelului și extensia cdx). Cheia de indexare poate fi formată dintr-un singur câmp sau din mai multe câmpuri legate printr-o expresie de concatenare. Din această cauză, dacă nu sunt de tip șir de caractere, câmpurile trebuie convertite într-un șir de caractere cu ajutorul funcțiilor de conversie. Am notat cp1 - câmpul 1, cp2 - câmpul 2 și e(cp1 ,cp2) - expresia formată din cele două câmpuri. tip cp1 tip cp2 cp1 convertit cp2 convertit e(cp1,cp2) cp1 cp2 cp1+cp2 cp1 str(cp2) cp1+ str(cp2) cp1 dtos(cp2) cp1+ dtos(cp2) cp1 ttoc(cp2) cp1+ ttoc(cp2) str(cpl) str(cp2) str(cp1)+ str(cp2) str(cpl) dtos(cp2) str(cp1)+ dtos(cp2) str(cpl) ttoc(cp2) str(cp1)+ ttoc(cp2) dtos(cp2) dtos(cp2) dtos(cp1)+ dtos(cp2) dtos(cp2) ttoc(cp2) dtos(cp1)+ ttoc(cp2) ttoc(cp2) ttoc(cp2) ttoc(cp1)+ ttoc(cp2) Câmpurile logice și memo nu pot fi folosite în cheia de indexare. Dacă indexul compus structural se creează împreună cu tabelul, ceilalți indecși se creează după ce a fost creat tabelul, prin comanda: | [ ] [ ][ | ][ ] Forma implicită a comenzii este: - > pentru indexul simplu: - > pentru indexul compus: Implicit, se ordonează crescător toate înregistrările din tabel, iar la crearea noului index toate celelalte fișiere index asociate tabelului sunt închise (cu excepția indexului structural). Explicit, prin fișierul index puteți avea acces numai la înregistrările precizate cu clauza for, ordonarea logică poate fi crescătoare (ascending) sau descrescătoare (descending) și se pot păstra deschise fișierele index deschise anterior (folosind clauza additive). Informatică în afară de indexul compus structural care se deschide automat la deschiderea tabelului, ceilalți indecși trebuie deschiși fie prin opțiunea File->Open (în caseta de dialog Open se alege tipul index (*.idx; *.cdx) din lista Files of țype), fie folosind una dintre comenzile: - > la deschiderea tabelului: [ | [ I ] în lista de fișiere a clauzei index pot fi specificați atât indecși simpli, cât și indecși compuși. Nu este obligatoriu să se precizeze și extensia (doar dacă există două fișiere index, unul simplu și altul compus, cu același nume). Dacă se deschid mai mulți indecși prin clauza order, se precizează care este indexul activ (indexul simplu sau eticheta din indexul compus). - » după deschiderea tabelului: [ | ] [ ] | - > schimbarea indexului activ din lista de indecși deschiși: | [ I ] - » ștergerea etichetelor dintr-un index compus: [, ...] Dacă se deschide tabelul împreună cu un index, este permis accesul direct la înregistrări. Poziționarea pointerului de înregistrare direct pe o înregistrare se face folosind comanda: care caută prima înregistrare cu valoarea cheii de indexare egală cu . Efectul comenzii seek în acces direct este echivalent cu efectul comenzii locate for în acces secvențial. Dacă se găsește înregistrarea, funcția found() va furniza valoarea .T. în locul comenzii seek folosite împreună cu funcția found(), se poate folosi funcția seek(): () Funcția testează dacă există o înregistrare care are cheia de indexare egală cu expresia . Dacă o găsește, poziționează pointerul pe această înregistrare și furnizează valoarea .T., altfel poziționează pointerul la sfârșitul fișierului și furnizează valoarea .F. Se deschide tabelul Angajați. Se sortează acest tabel după următoarele criterii: use angajati Se deschide tabelul Angajați. browse Se afișează conținutul tabelului în fereastra de editare. sort on nume, pren to a1 7« Sisteme de gestiune a bazelor de date Se sortează tabelul după câmpurile nume și pren. Rezultatul sortării este în tabelul a1. sort on id_ang to a2 Se sortează tabelul după câmpul id_ang. Rezultatul sortării este în tabelul a2. sort on id_sup to a3 Se sortează tabelul după câmpul id_sup. Rezultatul sortării este în tabelul a3. sort on loc, id_ang to a4 Se sortează tabelul după câmpurile loc și id_ang. Rezultatul sortării este în tabelul a4. use a1 Se deschide tabelul a1. list nume, pren, id_ang, id_sup, loc browse înregistrările sunt aranjate alfabetic după valoarea câmpurilor nume și pren. Pentru același nume, sunt ordonate alfabetic după prenume. use a2 Se deschide tabelul a2. list nume, pren, id ang, id_sup, loc browse înregistrările sunt aranjate crescător după valoarea câmpului id_ang. use a3 Se deschide tabelul a3. list nume, pren, id_ang, id_sup, loc browse înregistrările sunt aranjate crescător după valoarea câmpului id_ang. use a4 Se deschide tabelul a4. list nume, pren, id ang, id sup, loc browse înregistrările sunt aranjate alfabetic după localitate. Pentru aceeași localitate, sunt aranjate în ordinea crescătoare a identificatorului de angajat. use județe S-a deschis tabelul Județe. modify structure în caseta de dialog Table Designer, deschideți secțiunea Index. Observați că pentru acest tabel nu s-a definit la creare niciun index structural. index on cjud tag cod of județe S-a definit un index structural. Conține o singură etichetă cod, iar cheia de indexare a etichetei este câmpul cJud (codul județului). modify structure în caseta de dialog Table Designer, deschideți secțiunea Index. Se observă că indexul definit este de tip Regular. Se schimbă tipul în Candidate. list înregistrările sunt afișate în ordinea alfabetică a codului județului. browse în fereastra de editare, înregistrările sunt afișate în ordinea alfabetică a codului județului. seek 'ct' Caută înregistrarea pentru care codul județului este ct. ?iif (found(),nJud, 'nu a găsit') Constanta S-a găsit înregistrarea. ?iif(seek('bz'),njud,'nu a găsit') Buzău S-a găsit înregistrai ea. use angajati S-a deschis tabelul Angajați. browse înregistrările sunt afișate în ordinea în care le-ați creat. modify structure în caseta de dialog Table Designer, se deschide secțiunea Index. Se observă ca pentru acest tabel este definit deja de la creare indexul nume care are cheia determinată de expresia nume+pren. Se definește un nou index cu numele cod, de tip Candidate și cu expresia de indexare id_ang. Se mută acest index pe prima poziție în listă. Se definește un nou index cu numele data, de tip Regular și cu expresia de indexare dtos(data_n)+ dtos(data_a). set order to tag cod Ordinea de indexare este dată de eticheta cod. browse Se observă ordinea în care sunt afișate înregistrările. list id_ang, nume, pren Informatică set order to tag nume list id_ang, nume, pren browse Ordinea de indexare este dată de eticheta cod. F"F Se observă ordinea în care sunt afișate înregistrările. ' _ ' Să se creeze un tabel cu structura Cod_numeric_personal, Numele, Data_angajarii, Data_nasterii și să se introducă 8 înregistrări cu date care să corespundă cerințelor următoare: a. Să se afișeze pe ecran toți angajații cu o vechime mai mare de 10 ani; b. Să se afișeze toate persoanele a căror zi de naștere se sărbătorește astăzi. 2. Să se creeze un tabel cu structura Numar_bilet, Oraș, Preț, Numar_vagon și să se introducă 8 înregistrări care să corespundă cerințelor următoare: a. Să se calculeze suma realizată în urma vânzării tuturor biletelor înregistrate în tabel; b. Să se afișeze pe ecran numărul de bilete vândute cu destinația un anumit oraș X, citit de la tastatură. 3. Să se creeze un tabel cu structura Cod_caseta, Nume_film, Actor principal, Tip. Să se introducă în tabel minimum 8 înregistrări, cu date care să corespundă urmă- toarelor cerințe: a. Să se șteargă din tabel toate filmele de tip HORROR; b. Să se afișeze pe ecran toate filmele în care joacă actorul RICHARD GERE. 4. Să se creeze un tabel cu structura: Cod_furnizor, Cod_material, Nume_material, Preț, Cantitate. Să se introducă în tabel minimum 8 înregistrări care să corespundă cerințelor următoare: a. Să se afișeze toate ofertele pentru materialul X (citit de la tastatură), crescător, după prețul oferit; b. Să se afișeze prețul total al materialelor oferite de furnizorul Y (citit de la tastatură). 5. Să se creeze un tabel cu structura: Nume_muncitor, Cod_atelier, Numar_piese_produse, Varsta, Salariul și să se introducă 8 înregistrări care să corespundă cerințelor următoare (O înregistrare corespunde unui muncitor. Codul unui atelier este un număr de la 1 la 9. Pot fi mai mulți muncitori într-un atelier și toți au nume diferite): a. Toți muncitorii ce au produs un număr de piese mai mare cu cel puțin 10% decât o valoare citită de la tastatură vor avea salariul majorat cu 10%. Să se afișeze salariile acestora (după mărirea salariilor) și codul atelierelor din care făceau parte; b. Să se afișeze suma totală necesară măririi salariilor de la cerința a); c. Pentru a putea lucra în străinătate, un muncitor trebuie să aibă o vârstă cel mult egală cu o valoare citită de la tastatură și să producă un număr de piese cel puțin egal cu o valoare dată de la tastatură. Să se afișeze numele celor ce îndeplinesc ambele condiții și atelierele în care lucrează aceștia; d. Să se afișeze numărul mediu de piese produse de toți cei selectați la prima cerință. e. Să se afișeze numărul mediu de piese produse de un muncitor (număr total piese / număr muncitori); f. Să se șteargă articolele referitoare la muncitorii ce produc un număr de piese mai mic decât un număr dat de la tastatură și să se depună într-un tabel nou (cu structura: Nume_muncitor, Numar_piese), aooî să se sorteze alfabetic noul tabel după câmpul Nume_muncitor și să se afișeze s. nat, g. Să se afișeze tabelul inițial, după transferul precizat la cerii ița i) (Atestat.. '06) Sisteme de gestiune a bazelor de date Ele sunt create prin metoda clasică (metoda folosită în variantele anterioare de FoxPro și care s-a păstrat și în Visual FoxPro pentru compatibilitate cu versiunile anterioare). Tabe- lele bazei de date sunt permanente și se me- morează în fișiere .dbf. Ele pot fi create și manipulate prin operațiile descrise în capitolul anterior. Baza de date nu este însă permanen- tă. Ea trebuie definită în fiecare sesiune de lucru sau trebuie scris un program de aplicație în care să fie definită și care trebuie rulat de fiecare dată când trebuie exploatată baza de date. La începutul sesiunii de lucru, tabelele care fac parte din baza de date se deschid în zone de lucru diferite, apoi se construiește ba- za de date prin definirea relațiilor dintre tabele. Aceste relații pot fi numai de tip una-la-una sau una-la-mai-multe. în timpul sesiunii de lucru se execută operații de exploatare și întreținere a bazei de date. La terminarea sesiunii de lucru tabelele se închid și automat se distrug și rela- țiile stabilite între ele, relații care defineau baza de date. în următoarea sesiune de lucru, trebu- ie reluată operația de definire a relațiilor dintre tabele, operații care creează baza de date. Ele sunt create prin metoda containerului, în care baza de date este o entitate permanentă. Tabelele sunt păstrate în continuare în fișiere cu extensia .dbf. Baza de date este însă definită ca un container care va conține: lista tabelelor componente, relațiile dintre tabele și alte date necesare regăsirii informațiilor. Baza de date este memorată într-un fișier cu extensia .dbc, este independentă de programele de aplicații și poate fi păstrată și în afara sesiunii de lucru. Definirea relațiilor se face o singură dată, la crearea bazei de date. Pentru a avea acces la baza de date, este suficient să se deschidă fișierul bazei de date (fișierul .dbc). Prin această metodă poate fi îmbunătățit lucrul cu tabelele bazei de date, deoarece în baza de date pot fi păstrate și alte date, ca de exemplu date despre câmpurile din tabele: etichetele câmpurilor, valoarea implicită a câmpului, regula de validare la nivel de câmp sau la nivel de înregistrare, mesajele care vor fi afișate dacă datele introduse în câmp nu respectă regula de validare etc. — crearea unui fișier nou bază de date; — adăugarea pe rând la baza de date a tabelelor libere create anterior; — construirea unor noi tabele direct în baza de date; — precizarea, pentru tabelele libere create anterior, a proprietăților care nu au putut fi definite la crearea lor: etichetele câmpurilor, valorile implicite ale câmpurilor, regulile de validare la nivel de câmp și la nivel de înre- gistrare, mesajele de eroare pentru regulile de validare; — stabilirea legăturilor între tabele; — stabilirea proprietăților bazei de date; — încorporarea în baza de date a unor entități specifice pentru exploatarea ei: vizualizări și interogări. — deschiderea bazei de date și a tabelelor; — prelucrarea datelor din tabele prin operații de actualizare, consultare, sortare etc.; — închiderea tabelelor și a bazei de date. Informatică în urma operației de creare, baza de date este deschisă automat. Baza de date se poate crea prin următoarele metode 1. : Se alege opțiunea File->New... și în caseta de dialog New se activează butonul radio Database din lista File Type și se execută clic pe controlul New File. Se deschide caseta de dialog Create în care se scrie numele bazei de date în caseta de text Enter și apoi se execută clic pe declanșatorul Șave. Se deschide fereastra generatorului de baze de date Database Designer, în care se poate vedea arhitectura bazei de date: tabele și relații între tabele. Inițial ea afișează containerul gol al bazei de date nou create. 2. se creează și se deschide baza de date. Se deschide apoi fereastra Database Designer cu comanda: DatabaseI Xj Se pot adăuga tabele libere la baza de date prin următoarele metode: 1. : Fie se folosește opțiunea Database^Add Table..., fie se execută clic pe butonul Add Table din bara cu instrumente Database Designer. 2. Se pot adăuga tabele noi la baza de date prin următoarele metode: 1. : Fie folosiți opțiunea New Table...eDatabase->, fie executați clic pe butonul New Table din bara cu instrumente Database Designer. 2. Se pot folosi comenzile: I Afișează numele bazei de date, identificatorul căii de director în care se găsește fișierul, versiunea și lista tabelelor împreună cu câmpurile lor. I Afișează pe două coloane lista tabelelor din baza de date: în coloana Mame - numele tabelului, iar în coloana Source - identificatorul fișierului în care se găsește tabelul. create database modify database add table list | display database list | display tables Sisteme de gestiune a bazelor de date open database set database validate database remove Se îndepărtează un tabel din baza de date fie cu opțiunea de meniu Database-> Remove..., fie executând clic pe butonul Remove Table din bara cu instrumente Database Designer după ce a fost selectat tabelul, fie cu comanda: După ce s-a selectat un tabel în fereastra Database Designer, se poate modifica structura lui fie cu opțiunea de meniu Database->Modify..., fie executând clic pe butonul Modify Table din bara de instrumente Database Designer, fie cu comanda: După ce a fost selectat un tabel în fereastra Database Designer, se poate deschide fereastra de editare pentru a face modificări cu opțiunea de meniu Database->_Browse, executând clic pe butonul Browse Table din bara de instrumente Database Designer, executând dublu clic pe tabel sau cu comanda: Integritatea bazei de date se verifică cu comanda: Dacă s-au deschis mai multe baze de date, una singură este activă (baza de date care se poate exploata). Pentru a activa o bază de date se folosește comanda: Pentru a actualiza sau a consulta o bază de date, ea trebuie deschisă. Deschiderea ei se face fie prin deschiderea unui tabel din baza de date, fie prin comanda: Deschiderea bazei de date nu implică și deschiderea tabelelor care o compun. închiderea bazei de date se face cu comanda: care determină și închiderea tabelelor care fac parte din ea. Dacă se folosește comanda: se vor închide toate bazele de date deschise, toate tabelele încorporate în bazele de date sau libere și toate fișierele asociate exploatării bazelor de date care erau deschise în acel moment. Pentru a folosi un tabel din baza de date, el trebuie deschis. Pentru a administra mai multe tabele din baza de date, fiecare dintre ele trebuie să fie deschis. Pentru a putea deschide mai multe tabele, Visual FoxPro folosește mecanismul zonelor de lucru. Informatică 83 q este o zonă de memorie care se asociază unui tabel la deschiderea lui. pot fi folosite peste 30.000 de zone de lucru. în zona de lucru se păstrează informații despre tabelul deschis în acea zonă: — identificatorul fișierului în care este memorat tabelul, — structura fișierului, — numărul de înregistrări din fișier, — contorul înregistrării curente etc. Identificarea unei zone de lucru se face prin numărul său 1, 2, 3, ... 30.000. Primele zece zone de lucru se pot identifica și prin literele alfabetului: a,b....j. La deschiderea tabelului, acestuia i se poate atribui un alias, adică un nume cu care poate fi identificat tabelul și componentele sale în timpul operațiilor de exploatare. Deschiderea unui tabel într-o zonă de lucru se face cu comanda: in [alias ] [again] unde este identificatorul zonei în care se deschide tabelul, iar este un nume atribuit pentru alias. Dacă acest nume nu se precizează, sistemul îi atribuie implicit un alias: numele tabelului (numele fișierului în care este păstrat tabelul) dacă tabelul este deschis într-o singură zonă sau numărul zonei, dacă tabelul este deschis în mai multe zone. Dacă se dorește deschiderea aceluiași tabel în mai multe zone de lucru, se folosește clauza again începând de la a doua operație de deschidere. Dacă se precizează pentru valoarea 0, tabelul va fi deschis în prima zonă de lucru disponibilă (liberă). La un moment dat, într-o zonă de lucru nu poate fi deschis decât un singur tabel. Dacă în zona respectivă este deschis deja un tabel, el trebuie închis în prealabil. Indiferent de câte zone de lucru se folosesc, la un moment dat una singură dintre ele este zona de lucru activă (curentă), z ona de kicru curentă este zona la care se referă implicit o comandă în care nu se precizează explicit numele tabelului (comanda va acționa asupra tabelului din zona de lucru activă). La începutul sesiunii de lucru, zona de lucru activă este zona 1. Schimbarea zonei de lucru curente se face cu comanda: setect unde poate fi precizată prin numărul său sau prin aliasul sau numele tabelului deschis în această zonă. Alocarea unei zone de lucru unui tabel se poate face la deschiderea lui prin clauza in sau prin selectarea zonei de lucru înainte de deschiderea tabelului. Comanda: use in este echivalentă cu grupul de comenzi: select use . Operațiile care se pot executa în zonele de lucru sunt: — în zona activă se poate citi din tabel și se poate scrie în tabel. — în celelalte zone se poate numai citi din tabel. Identificarea tabelelor se face astfel: — în zona activă, numele tabelului se subînțelege (este implicit în comenzi). — în celelalte zone, prin aliasul său sau prin numele zonei. Identificarea câmpurilor dintr-un tabel se face astfel: Sisteme de gestiune a bazelor de date — în zona activă prin numele câmpului. — în celelalte zone prin identificatorul sau Se pot obține informații despre zonele de lucru și tabelele deschise în aceste zone cu funcțiile: Furnizează implicit numărul zonei de lucru active; dacă se folosește parametrul 1, va furniza numărul ultimei zone de lucru nefolosite. Furnizează un rezultat logic prin care se precizează dacă zona este usad([]) ocupată (.T.) sau liberă (.F.). Implicit, rezultatul funcției se referă la zona curentă, explicit, se referă la zona precizată prin parametrul Furnizează un rezultat logic prin care se precizează dacă tabelul este used() deschis într-o zonă de lucru (.T.) sau nu (.F.). Furnizează un rezultat de tip șir de caractere care poate conține numele c > ([]) fișierului deschis în zona de lucru sau șirul vid, dacă nu este deschis nici- un fișier. Implicit, rezultatul funcției se referă la zona curentă, explicit, se referă la zona precizată prin parametrul . Furnizează un rezultat de tip șir de caractere care poate conține aliasul ' ?([]) fișierului deschis în zona de lucru sau șirul vid, dacă nu este deschis nici- un fișier. Implicit, rezultatul funcției se referă la zona curentă, explicit, se referă la zona precizată prin parametrul . închiderea unui tabel se face cu comanda: [in ] Implicit, se închide tabelul din zona curentă, explicit, se închide tabelul din zona precizată cu clauza in. Tabelul mai poate fi închis și cu comanda de închidere a bazei de date (close databases) sau comanda de închidere a tuturor fișierelor (close all). Se deschide baza de date din exemplul (testdata) din dosarul Data, din dosarul Samples, din dosarul aplicației Visual FoxPro. Pentru deschiderea ei se folosește comanda File-> Open. Se deschide fereastra Database Designer în care sunt afișate tabelele și relațiile dintre tabelele bazei de date. Se deschide fereastra View (sau fereastra Data Session, în funcție de versiunea Visual FoxPro) folosind comanda Window->View Window | Data Session. în fereastră nu este afișat niciun tabel în listă, deoarece a fost deschisă numai baza de date. Se deschid pe rând toate tabelele din baza de date: fie se execută dublu clic în fereastra Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului și implicit tabelul, fie în fereastra View (Data Session) se execută clic pe declanșatorul Open și în caseta de dialog Open se execută clic pe rând pe numele fiecărui tabel din lista Țables in Database. Se deschid pe rând, începând cu zona 1 și terminând cu zona 5, tabelele: Customer, Products, Orditems, Orders și Employee. După ce au fost deschise tabelele, ele vor fi afișate în fereastra View. Se selectează pe rând fiecare tabel din listă. în bara de stare a ferestrei vor fi afișate informații despre tabelul selectat: numărul zonei de lucru și numărul total de înregistrări. Se închide fereastra de comenzi. Informatică ___________________________ Current Session: | Default(1 J View y Open_______________________. B Se deschide caseta de dialog Open executând clic pe declanșatorul Open din fereastra View. Database | T estdata jJ Tables in Database: employee orders orditems Products Current Session: | Default(1) Current Session: |Default[1] Aliases y Set Index Order t TOrder$:Emp_id t Orders: OrderJd Relations Cancel OtheL Select <• Tables Views I*/ Exclusive Lista ascunsă din care se alege baza de date. Lista din care se alege tabelul care se deschide. Grupul de butoane radio din care se aleg tabele (Tables) sau vizualizări (Views). După ce au fost deschise mai multe tabele, numele lor va fi afișat în lista Aliases. Ele sunt afișate în listă în ordinea inversă deschiderii. Selectați un fișier din listă. în bara de stare se va afișa numărul zonei de lucru în care este deschis (Work Area) și numărul total de înregistrări (Records). Zonele de lucru au fost alocate în ordinea deschiderii: primului tabel deschis, zona 1, cel de-al doilea tabel deschis, zona 2 etc. Se pot defini relații între două tabele. Se selectează din lista Alias tabelul sursă și apoi se execută clic pe declanșatorul Relations. Numele tabelului va fi afișat în lista Relations. □ OK | No Order i Cancel j _l Se selectează din lista Alias tabelul destinație și apoi se execută clic pe declanșatorul Relations. Numele tabelului va fi afișat în lista Relations. Se deschide caseta de dialog Set IndexOrder în care este afișată lista de etichete index definite pentru tabel. Executând clic pe eticheta index corespunzătoare relației, se deschide caseta de dialog Expression Builder prin intermediul căreia se poate construi relația. select 1 ?used() .7. ?used(5) .7 ?used(10) .H ?used('orders’) 86 Sisteme de gestiune a bazelor de date .T. ?dbf(1O) ?dbf(3) nimic c:\vfp\samples\data\orditems.dbf ?alias(10) ?alias(3) nimic orditems 3. Se creează baza de date din exemplu: ■ Se creează baza de date Compania cu comanda: create database compania ■ Se afișează informații despre baza de date nou creată cu comanda: display database Se va afișa numele bazei de date, calea fișierului bază de date și versiunea. ■ Se afișează baza de date în fereastra Database Designer cu comanda modify database Fereastra este vidă. Observație. Tabelele din baza de date trebuie să conțină următoarele chei, astfel încât să se poată stabili legături între ele: -> Tabelul Angajati - câmpul id_ang cheie primară; câmpul cheie cJud se va declara de tipul regular deoarece un tabel nu poate avea decât o cheie primară. -> Tabelul Clienti - câmpul id_cl cheie primară; câmpul cheie c Jud se va declara de tipul regular deoarece un tabel nu poate avea decât o cheie primară. -> Tabelul Contracte - câmpul id_cont cheie primară; câmpul cheie id_cl de tipul regular. -> Tabelul Ședințe - câmpul nr_s cheie primară; câmpurile cheie id_ang și id_cont se vor declara de tipul regular. -> Tabelul Estimări - câmpul id_cont cheie de tipul regular. -> Tabelul Incasari- câmpul nrj cheie primară; câmpul cheie id_cont de tipul regular. -> Tabelul Județe - câmpul cJud se va declara de tipul cheie primară. ■ Se adaugă la baza de date tabelele libere create fie folosind opțiunea de meniu, fie cu butonul din bara de instrumente, fie cu comenzile: add table angajati add table clienti add table județe ■ Se afișează informații despre baza de date cu comanda: display database Se va afișa numele bazei de date, calea fișierului bază de date, versiunea și, pentru fiecare tabel adăugat la baza de date, numele, calea fișierului și structura de câmpuri. ■ Se afișează informații despre tabelele din baza de date cu comanda: display tables Se va afișa lista cu numele tabelelor și căile fișierelor. ■ 'Se adaugă la baza de date un tabel nou, cu comanda: create contracte Se deschide fereastra Table Designer care, spre deosebire de cea afișată la crearea unui tabel liber, conține controale noi. De exemplu, pentru câmpul tip_c se poate defini o regulă de validare care să nu permită introducerea în câmp decât a uneia dintre valorile: 'e' - evaluare, 'i' - instruire, ’p' - proiect. Regula de validare poate fi exprimată prin una Informatică dintre următoarele condiții logice: lower(tip_c)='i' or lower(tip_c)='p' or lower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). Se definesc structura tabelului și indecșii. Table Designer Table Name: Database:_______________________ | contracte I Table Properties... | ...................................................................■■l Table H Index Name Type Width DecimalNULL id_cont Integer 4 _J OK id_cl Integer 4 --- tip_c Character 1 Cancel --- obs_c Character 254 dataj Date 8 i > I Insert term Logical 1 ----------1 I_______________________________________ _____________________________________I | Delete | Field Properties (tip_c ) Validation Rule: |LOWER(tip c)="i”.0R.L ... Field Comment: tipul contractului ___| Validation Text: |' 'Ati greșit tipul contractu ... Default Value: I"p" __ Caption: | tip contract J c: \VFP\contracte. DBF Records: 1 Fields: 6 Length: 273 în partea inferioară a fe- restrei au apărut controa- le noi care permit stabili- rea unei reguli de validare la nivelul câmpului selec- tat (Validation Rule), mesajul de eroare afișat (Validation Text), valoa- rea implicită a câmpului (Default Value), eticheta câmpului (Caption), comentarii despre câmp (Field Comment). în exemplu s-au completat aceste casete de text pentru câmpul tip_c - tipul contractului. Regula de validare este: lower(tip_c)='i' or !ower(tip_c)='p’ or lower(tip_c)"'e' iar va- loarea implicită este ’p'. ■ Se adaugă la baza de date și celelalte tabele, cu comenzile: create estimări create ședințe create incasari După fiecare comandă se deschide fereastra Table Designer în care se definesc structura tabelului și indecșii. ■ Se modifică structura tabelelor create liber, adăugându-le reguli de validare și indecși. Se execută pentru fiecare tabel deschiderea cu comanda use și apoi modificarea cu comanda modify structure. ■ După ce au fost adăugate tabelele în baza de date, fereastra Database Designer va conține aceste tabele: ^Fields: cjud njud Fălndexes: cod cp tel_f tel_m obs Olndexes: Vangajat ^Fields: id_cl nume pren tip_cl id ang ^Fields: id_cont id_cl tip_c obs_c data i Fields: id_cont nr_est id_ang obiectiv term rez_s ob$_$ CJlIndexes: ședința număr angajat ^Fields: nrj id_cont data_p mod_p valoare Edit Relationship Table: anga [angajat Relationship Type: One To Many Related T able: | angajat ședințe □ |i OK | Cancel | Help | Sisteme de gestiune a bazelor de date ■ între tabele nu sunt stabilite relații permanente. în prealabil, în tabelele conducătoare s-a stabilit câte un index primar, iar în tabelele conduse indecși de tip regular. Se vor stabili interactiv relații în fereastra Database Designer, glisând indexul primar din tabelul conducător peste indexul regular din tabelul condus. De exemplu, se glisează cheia cu numele angajat din tabela Angajati (câmpul index este id_ang) peste cheia angajat din tabela Ședințe (câmpul index este id_ang). Se deschide caseta de dialog Edit Relationship în care se execută clic pe declanșatorul OK. ■ După ce s-au definit relațiile, fereastra Database Designer va afișa: |ri^ D atabase D esigner - Compania J Fields: cjud njud Olndexe; cod ,+ ^Fields: nr_s id_cont id_ang data_s timp s telj tel_m obs CDlndexes: ^angajat județ ^Fields: nrj id_cont data_p mod_p valoare O Fields: id_cont nr_est id_ang obiectiv term tel_m telj obs Ollndexes: ?client județ obs_c data_i term OJIndexes: Enumăr client _4i între tabelul Județe și tabelele Angajati și Clienti nu s-au stabilit încă relații. în tabelele Angajati și Clienti cheia cjud nu poate fi declarată cheie candidat, deoarece există mai multe înregistrări cu aceeași valoare a cheii (mai mulți angajați și clienți din același județ). Așadar, se poate stabili o relație de tip una-la-mai-multe între tabelul Județe și tabelul Angajati, respectiv Clienti. ■ Deoarece tabelele din baza de date trebuie gestionate împreună, trebuie asigurată integritatea referențială. Pentru fiecare relație se definește regula de integritate referențială astfel: în fereastra Database Designer se execută dublu clic pe o relație. Se deschide caseta de dialog Edit Relationship în care se execută clic pe declanșatorul Referențial Integrity.... Se deschide caseta de dialog Referențial Integrity Builder care conține trei secțiuni: - > secțiunea în care se poate stabili regula de integritate referențială pentru operațiile de modificare, - > secțiunea în care se poate stabili regula de integritate referențială pentru operațiile de ștergere și - > secțiunea în care se poate stabili regula de integritate referențială pentru operațiile de adăugare. Aceste operații se referă la tabelele conducătoare, în care modificarea valorii cheii prima- re poate să ducă la ruperea legăturii cu unele înregistrări din tabelul condus. Se deschide secțiunea corespunzătoare operației pentru care se stabilește regula de integritate, se selectează relația tabel părinte - tabel copil pentru care se stabilește regula și se activează apoi butonul radio corespunzător regulii de integritate. Se poate alege una dintre următoarele reguli de integritate: (se șterg sau se modifică în cascadă toate înregistrările din tabelul copil, legate de înregistrarea ștearsă sau modificată din Informatică tabelul părinte), (dacă există în tabelul copil o înregistrare legată de înregistrarea care se șterge sau se modifică în tabelul părinte, se oprește procesul și se afișează un mesaj de eroare), (operațiile se pot executa fără restricții). ^Referențial Integrity Builder Parent Table Child Table Update Delete Insert Parent Tag Child Tag ț± angajați ședințe Restrict Restrict Restrict | angajat angajat clienti contracte Restrict Restrict Restrict | client client contracte incasari Restrict Restrict Restrict | numar numar --- contracte estimări Restrict Restrict Restrict | număr numar contracte ședințe Restrict Restrict Restrict | număr numar ▼ Rules for Updating | Rules for Deleting | Rules for Inserting Which rule do you want to apply when the key value in the parent table is modified? c Cascade: Update all related records in the child table with the new key value. Restrict: Prohibit the update if there are related records in the child table. r Ignore: Allowthe update and leave related records in the child table alone. OK ] Cancel | Help ■ Se deschide fiecare tabel într-o zonă diferită folosind comenzile: select 1 use angajati select 2 use județe select 3 use clienti select 4 use contracte select 5 use ședințe select 6 use estimări select 7 use incasari ■ Se verifică integritatea datelor existente folosind comanda: validate database ■ Se adaugă date la fiecare tabel. ■ Se închide baza de date cu comanda: close databases în cazul , relațiile se stabilesc folosind comanda set relation to pentru a stabili o relație una-la-una între tabelul conducător și tabelul condus și comanda set skip pentru a transforma relația una-la-una într-o relație de una- la-mai-multe. De exemplu, pentru a stabili o relație de una-la-mai-multe între tabelul Județe (tabelul conducător) și tabelul Angajati (tabelul condus), se scriu comenzile: select 1 Se deschide în zona 1 (A) tabelul conducător (județe). Se use județe deschide în zona 2 (B) tabelul condus (angajati). Tabelul select 2 condus se indexează după câmpul care este cheie use angajati primară în tabelul conducător (cjud) - acest câmp va fi index on cjud to anq jud cheie secundară în tabelul condus. Se activează zona select 1 tabelului conducător. Se stabilește relația una-la-una cu și ș . cjud B comanda set relation to. Se transformă relația una-la- ș' B una în relație una-la-mai-multe cu comanda set skip to. set relation set skip Pentru ruperea legăturii se scriu în ordine comenzile: Sisteme de gestiune a bazelor de date Datele din baza de date ajută la modelarea și analizarea evenimentelor care se produc în cadrul organizației. Metoda cea mai simplă de a genera anumite informații din datele din baza de date este aceea de a prezenta datele sub forma sau a . Alteori este necesar să se prezinte datele sub forma unor care să grupeze și să sintetizeze informațiile. O altă metodă de a obține informații din baza de date este folosirea comenzii care aplică operatorul relațional join pe datele din două tabele sursă, deschise în două zone de lucru diferite, furnizând rezultatul într-un al treilea tabel. Sintaxa comenzii este: [ ] Unul dintre tabelele sursă este deschis în zona curentă, iar celălalt este deschis în zona identificată prin (alias sau număr de zonă). Se leagă într-un nou tabel numai înregistrările din cele două tabele pentru care expresia logică a clauzei for este adevărată. în tabelul destinație pot fi preluate toate câmpurile din tabelele sursă sau numai cele precizate prin clauza fields. Interogarea este operația prin care se extrag date din baza de date - fără să fie șterse sau sau modificate - ce vor fi afișate într-un anumit format. Extragerea se face în funcție de un anumit criteriu numit . Acesta trebuie să definească datele care trebuie extrase: numele câmpurilor, tabelele din care fac parte, criteriile prin care se extrag înregistrările și în ce ordine sunt prezentate. Interogarea este scopul bazei de date. Când un utilizator interoghează baza de date, el pune de fapt o întrebare: „Ce date din baza de date îndeplinesc aceste condiții?". Folosind o interogare se pot executa următoarele operații: - > combinarea înregistrărilor din mai multe tabele într-un singur tabel, - > selectarea numai a înregistrărilor care îndeplinesc un anumit criteriu, - > afișarea înregistrărilor în ordinea dorită, - > afișarea câmpurilor calculate. Interogările pot afișa înregistrări din mai multe tabele. Dacă relația dintre cele două ta- bele este de una-la-mai-multe, interogarea va afișa pe mai multe rânduri câmpurile cores- punzătoare înregistrărilor din al doilea tabel (mai-multe) legate de o singură înregistrare din primul tabel (una), iar în aceste rânduri se vor repeta câmpurile din primul tabel. Pentru operația de interogare, orice sistem de gestiune a bazelor de date are implemen- tate diferite instrumente prin care să se comunice sistemului criteriul de interogare. Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard de interogare. în Visual FoxPro se poate crea o interogare: -> interactiv folosind generatorul de interogări (Query Designer); -> prin (instrucțiunea select - diferită de comanda select folosită pentru selectarea unei zone de lucru). în urma operației de creare, interogarea este salvată într-un fișier cu extensia .qpr care conține specificațiile criteriului de interogare. Acest fișier este un fișier de tip ASCII în care se memorează comanda SQL asociată. Deoarece fișierul conține o comandă SQL, pentru a o executa trebuie să se lanseze în execuție fișierul cu comanda: Informatică Operatorul relațional aplicat pe un tabel creează un alt tabel care conține submulțimi de date din tabelul sursă. Așadar și rezultatul unei interogări va fi tot un tabel, care va conține datele specificate de criteriul de interogare. Destinația interogării (destinația datelor din tabelul obținut) poate fi: - > fereastra de editare Browse, - > diagrama (graph), - > ecranul (screen), - > raportul (report), - » tabelul permanent (table) sau temporar (cursor). Interogarea se aplică pe mai multe tabele ale bazei de date numite tabele sursă, iar rezul- tatul unei interogări este un tabel numit tabel destinație; modificările făcute în tabelul desti- nație nu se reflectă și în tabelele sursă. Parametrii folosiți în construirea unei interogări sunt: din tabelele bazei de date (tabelele sursă). Se recomandă să se preia din tabelele (fields) sursă numai câmpurile strict necesare. dintre tabelele bazei de date (tabelele sursă). Pe lângă legăturile stabilite între tabele în cadrul bazei de date, care vor fi preluate automat, se mai pot stabili noi legături cu tabele care nu au fost legate la baza de date. Dacă se definesc două (join) relații între tabele, ele pot fi legate cu operatorii logici or sau and. prin care se precizează condițiile de filtrare, adică modul în care vor fi selectate datele । • din tabelele bazei de date. Un criteriu de selecție sau de filtrare trebuie să preci- (filter) zeze câmpul sau expresia care conține câmpul, operatorul relațional și valoarea cu care se compară. Pot fi definite mai multe criterii de filtrare legate între ele prin opera- torii logici or sau and (ordinea de evaluare este and și apoi or). prin care se precizează ordinea în care vor fi prezentate rezultatele interogării (în tabelul destinație). Ordinea este dată de un criteriu de ordonare determinat de un (order by) câmp din tabel sau de mai multe criterii de ordonare determinate de mai multe câmpuri. în acest caz, un criteriu de ordonare este luat în considerare numai dacă cele definite anterior au aceeași valoare a câmpurilor pentru două înregistrări. prin care se precizează un criteriu de grupare a datelor. Acest criteriu este dat de cheia de grupare formată din unul sau mai multe câmpuri ale tabelului. Conform acestei chei, înregistrările care au aceeași valoare a cheii de grupare vor fi cumu- late în tabelul destinație într-o singură înregistrare, în care fiecare câmp numeric va (group by) fi calculat prin însumarea valorilor corespunzătoare câmpului din toate înregistrările grupului. Mai pot fi definite și criterii de selecție la nivel de grup prin care se precizează condiția pe care trebuie să o îndeplinească grupul de înregistrări pentru a face parte din tabelul destinație. Condiția este precizată prin câmpul sau expresia care conține câmpul, operatorul relațional și valoarea cu care se compară. Vizualizările sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care pot fi legate prin relații și care permit modificarea lor de către utilizator. Așadar, dacă în cazul unei interogări utilizatorul poate vedea numai un rezultat, în cazul vizualizării utili- zatorul poate interveni și poate modifica valoarea datelor. Orice modificare făcută într-o vizualizare se va regăsi și în tabelul real al bazei de date. Când se creează o vizualizare, se pune de fapt întrebarea: „Cu ce date din baza de date poate interacționa utilizatorul?". Construirea unei vizualizări constă, ca și în cazul unei interogări, în extragerea anumitor date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat în fișierul bazei de date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschisă mai întâi baza de date și apoi vizualizarea, ca orice tabel din baza de date. Sisteme de gestiune a bazelor de date este o structură de date, la fel ca și tabelele bazei de date, iar este un fișier care conține o comandă și care trebuie lansat în execuție la fel ca orice fișier de program. Dacă în cazul interogărilor datele circulă într-un singur sens, de la tabelele bazei de date la formatul ales pentru afișare, în cazul vizualizărilor ele pot circula în ambele sensuri între tabelele bazei de date și vizualizare. Vizualizările se pot construi cu (View Designer). Vizualizarea folosește, pe lângă parametrii întâlniți la interogări, următorii parametri: - > . Aceste câmpuri sunt alese astfel încât să identifice unic relația dintre vizualizare și tabelele sursă. Pentru fiecare tabel sursă trebuie să se definească unul sau mai multe câmpuri cheie care să identifice unic fiecare înregistrare din acel tabel. - » și . Acest parametru stabilește modul în care se transmit datele între vizualizare și tabelele sursă. Astfel, dacă în vizualizare se face modificarea într-un câmp actualizat, modificarea va fi transmisă și în tabelele sursă; altfel, dacă modificarea se face într-un câmp nemodificat, ea nu se va trans- mite și către tabelele sursă. Raportul este o colecție de informații obținute din datele stocate în tabelele bazei de date, prezentate utilizatorului într-o formă cât mai clară și mai concisă. El poate fi tipărit la imprimantă sau afișat pe ecran și prezintă un set de date legate între ele, preluate din tabelele bazei de date. Permite descrierea elementelor care pot să apară: textul afișat deasupra coloanelor, câmpurile din coloane, la care pot fi adăugate și alte texte sau imagini grafice (linii, chenare, imagini). Raportul nu modifică datele dtn tabele. El parcurge secvențial înregistrările din tabele pentru: - > obținerea unor date sintetice: subtotaluri și totaluri, - > obținerea unor rezumate, - > gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informații sintetice și rezumate, - > analize complexe și grafice. în general, raportul este conceput sub forma unui tabel. în plus are și funcția de sortare și grupare a datelor. Raportul se compune din: Secțiunea de conține date care se repetă pentru fiecare înregistrare. date (Detetl) Antetul paginii definește elementele care trebuie să apară în partea de sus a fiecărei pagini (t-’eții- L-ieadei) a raportului. Subsolul paginii definește elementele care trebuie să apară în partea de jos a fiecărei pagini a (l-i’ge ) raportului. Antetul raportu- apare numai pe prima pagină a raportului. El este ca un titlu pentru întregul lui (Repe'L raport și poate conține texte și imagini (de exemplu sigla firmei). l-i -.--.oei’ sau 1 ide) Subsolul raportu- apare numai pe ultima pagină a raportului și cuprinde de obicei un rezumat al lui (Rejjutx datelor din diferite secțiuni ale raportului. sau L'dHUtLcu y) Un raport poate prezenta conținutul unui tabel sau al mai multor tabele din Grupul (Grcup) baza de date. Aceste date pot fi grupate după diferite criterii și totalizate la Informatica nivel de grup. în linia totalului pot fi inserate totaluri ale unor câmpuri, adică date în care sunt cumulate valorile aceluiași câmp pentru întreg grupul de înregistrări. Pot fi definite mai multe Pentru fiecare nivel trebuie definit un criteriu de grupare caracterizat printr-o expresie care este evaluată la fiecare înregistrare. Dacă există un singur nivel de grupare, numărul de grupuri va fi egal cu numărul de valori diferite ale cheii de grupare. Antetul grupului afișează un titlu al grupului (criteriul de grupare) ( ) Subsolul grupu- afișează date sintetice despre grup. lui ( ) Raportul conține informații utile personalului care are atribuții de conducere în cadrul organizației. în funcție de nivelul de conducere pentru care se produce raportul, cantitatea de date prezentată diferă. La nivelul inferior de conducere, nivelul operațional, la care personalul de conducere are rolul de a monitoriza și a controla activitățile zilnice ale angajaților, rapoartele trebuie să fie detaliate și să conțină informații specifice despre activitățile zilnice (de exemplu rapoartele de încasări). La nivelul mediu de conducere (director tehnic, director de vânzări, director de resurse umane etc.) ele trebuie să conțină mai puține detalii și mai multe treceri în revistă, rezumate și analize ale datelor din istoric. Aceste date trebuie să-i ajute să planifice și să controleze operațiile și să implementeze strategii care trebuie să fie bine formulate și argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activităților (încasările rezultate din contractele de consultanță cu un client, încasările rezultate dintr-un anumit tip de consultanță - de exemplu instruire), pot prezenta situații de excepție, care depășesc limitele normale (clienți care au derulat în ultimul trimestru mai mult de cinci contracte de consultanță) sau, atunci când trebuie să se concentreze pe o problemă, pot conține date la cerere (dacă un client nu și-a mai plătit de mult ședințele de consultanță, se poate cere un raport despre client care să conțină contractele și modul în care a plătit pe o perioadă de timp). în funcție de informația prezentată, există trei categorii de rapoarte: - > Rapoarte periodice. Se produc la intervale de timp regulate (săptămânal, lunar, trimestrial etc.), cum este de exemplu raportul lunar al ședințelor cu clienții. - » Rapoarte la cerere. Sunt produse la cerere, cum este de exemplu raportul cu contractele de consultanță ale unui client. - > Rapoarte ale excepțiilor. Sunt produse pentru a atrage atenția asupra unor eveni- mente deosebite, cum este de exemplu raportul încasărilor lunare ale unui angajat permanent cu normă întreagă, care sunt cu mult sub nivelul normal. — Pentru construirea unui raport se poate folosi (Report Designer). El simplifică procesul de creare a rapoartelor, deoarece folosește o procedu- ră simplă: utilizatorul trebuie să precizeze numele coloanelor din tabele care trebuie să g> apară în raport, totalurile pe coloane, subtotalurile pe grupuri de înregistrări, diferite alte calcule. în urma comunicării acestor date, el va genera un tabel care conține toate datele și caracteristicile raportului și care sunt memorate într-un fișier cu extensia .frx. Raportul se poate tipări cu comanda: • ■ • [ [][ ][ ][ p !< l| ii Iii f r! ll Sisteme de gestiune a bazelor de date unde clauza heading permite afișarea unui antet suplimentar la începutul fiecărei pagini, iar clauza summary inhibă afișarea rândurilor cu date și afișează numai rândurile cu totaluri și subtotaluri. Etichetele ( ) sunt asemănătoare rapoartelor. Ele permit alegerea numărului de coloane și dimensiunea hârtiei pe care se va face tipărirea lor. Sunt utile pentru a tipări etichete poștale. Pentru construirea etichetelor se poate folosi (Labei Designer) care este asemănător cu constructorul de rapoarte. Pe baza informațiilor furnizate de utilizator el generează pe o pagină o colecție de etichete poștale care sunt memorate într-un fișier cu extensia .tbx. Interogarea trebuie să răspundă la următoarea întrebare: „Ce angajați (identificați prin nume, prenume și numele județului) au tariful cuprins între 260 și 300?". Afișarea se va face într-o fereastră de editare Browse. Fișierul în care se va salva interogarea va fi al.qry. ■ Se deschide baza de date Compania cu comanda: open database compania. ■ Se alege opțiunea File->New. Se deschide caseta de dialog New în care, din grupul de butoane cu opțiuni File Type, se activează butonul Query după care se execută clic pe butonul New File. ■ Se deschide caseta de dialog Add Table or View. Din lista Jables in Database se selectează mai întâi tabelul Angajați și se execută clic pe butonul Add Table din bara cu instrumente Query Designer, apoi se selectează tabelul Județe și se execută clic pe butonul Add Table. ■ Se deschide fereastra generatorului de interogări Query Designer. în partea superioară este afișat un panou care conține tabelele care au fost selectate din baza de date pentru a face parte din interogare. Fiecare tabel este reprezentat într-o fe- reastră redimensionabilă în care sunt afișate câmpurile și indecșii tabelului. Dacă între tabele există legături, sunt afișate și acestea. Pe lângă aceste legături definite deja în baza de date, se pot crea noi legături fie glisând un câmp index de la tabelul sursă la tabelul destinație, fie prin intermediul obiectelor din caseta de dialog Join Condition care se deschide executând dublu clic pe butonul Add Join din bara cu instrumente Query Designer. în partea inferioară este afișat un panou cu mai multe secțiuni: -> Selection Criteria - conține controale pentru a stabili criteriul de selectare a înregistrărilor. Criteriul poate conține anumite valori ale unui câmp și condiții pentru legăturile temporare dintre tabele. Informatică - > Fields - conține controale pentru a stabili câmpurile din tabel sau câmpurile calculate care vor fi afișate de interogare. - > Order By - conține controale pentru a stabili câmpurile din tabel sau câmpurile calculate care vor determina ordinea de afișare în interogare. - > Group By - conține controale pentru a stabili modul în care vor fi grupate înregistrările afișate de interogare. ■ Se deschide secțiunea Fields. în lista Available Fields sunt afișate câmpurile dispo- nibile în tabelele selectate. Se selectează din această listă grupul de câmpuri Angajați.nume, Angajați.pren, Angajați.tarif și Județe.nJud (se execută clic pe numele câmpului cu tasta Ctrl apăsată). Se execută apoi clic pe declanșatorul Add>. Câmpurile selectate vor fi copiate în lista cu câmpurile selectate pentru a fi afișate - Selected Output. în secțiune se mai pot folosi următoarele controale: butoanele Add AII» (copiază toate câmpurile din tabele în lista Selected Output), 260 and tarif<300. Pentru aceasta se execută clic pe declanșatorul Insert, se alege din lista ascunsă Field Name numele câmpului Angajați.tarif, din lista ascunsă Criteria operatorul More Than și se scrie în caseta de text Example valoarea 260. Se execută din nou clic pe declanșatorul Insert, se alege din lista Field Name din nou numele câmpului Angajați.tarif, din lista Criteria operatorul Less Than și se scrie în caseta de text Example valoarea 300. Cele două condiții au fost adăugate în grilă. Condițiile sunt legate implicit prin operatorul logic and. Dacă trebuie schimbat operatorul logic and cu or se execută clic pe declanșatorul Add Or. Dacă trebuie să se schimbe ordinea în care sunt afișate condițiile ■*,-n-iiția care trebuie mutată și se execută clic pe butonul (H ¹ i " a irrl : ₍ ^'"ată o condiție, se selectează în grilă și se execută clic pe declanș- rc s . .sîjvg'/v. Sisteme de gestiune a bazelor de date ■ Se deschide secțiunea Order By pentru a stabili ordinea în care vor fi afișate înregis- trările. Se selectează din lista Selected Output, care afișează câmpurile din intero- gare, câmpurile Angajați.nume și Angajați.pren, după care se acționează declanșatorul Add>. Câmpurile vor fi adăugate în lista Ordering Criteria. în grupul de butoane radio Order Options este activat butonul Așcending (ordinea alfabetică a numelui și prenumelui). Ordinea câmpurilor din cheia de sortare este Angajați.nume și Angajați.pren, adică ordinea din lista Ordering Criteria (ordinea este dată de ordinea de adăugare la această listă). Dacă trebuie înlăturat un criteriu de sortare, se selectează din lista Ordering Criteria și se acționează declanșatorul și 260; AND Angajati.tarif < 300); Angajati.nume, Angajati.pren ■ Se închide fereastra de editare. ■ Se închide fereastra generatorului de interogări și se salvează interogarea sub numele al.qry. în fereastra Command este afișată comanda asociată interogării create interactiv: ■ Se afișează rezultatul interogării cu comanda: doal.qr ■ Se deschide fereastra de editare de tip Browse: ij^Uucry Nume | Pren T arif 1 Njud ÎAna 280 bucurești Constantin j Lucia 280 buzău Diaconu î Elena 270 bucurești lonescu I Măria 280 bucurești Petrescu iRadu 280 constanta Vlad i Mircea 270 buzău I I ■ Se modifică interogarea astfel încât rezultatul să fie afișat pe ecran. Se deschide inte- rogarea pentru modificare, fie cu opțiunea File^Open, fie cu comanda: modify query c:\vfp\a1 .qpr ■ Se deschide fereastra generatorului de interogări Query Designer. Se execută clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination în care se execută clic pe butonul Șcreen. Se vizualizează comanda SQL asociată acestei interogări. Se execută clic pe butonul Show the SQL Window din bara de instrumente. Se deschide fereastra de editare care afișează comanda SQL. La comandă a fost adăugată opțiunea to screen. Se închide fereastra de editare a comenzii. Se închide fereastra generatorului cu salvare. ■ Se afișează rezultatul interogării cu comanda: do al.qri ■ Rezultatul va fi afișat pe ecran, la fel ca rezultatul unei comenzi list/display. ■ Se modifică această interogare astfel: se vor afișa și angajații care au un tarif de 300 lei, se va afișa o coloană nouă cu vârsta angajaților, iar rezultatul va fi afișat într-o fereastră Browse. Se deschide interogarea pentru modificare. ■ Se deschide fereastra generatorului de interogări Query Designer. Se deschide secțiu- nea Selection Criteria și se înlocuiește valoarea 300 cu 301. Se deschide secțiunea Fields și se scrie în caseta combinată expresia prin care se calculează valoarea câmpului vârsta: int((date()-data_n)/365). Se execută clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination în care se execută clic pe butonul Browse. Se închide cu salvare fereastra generatorului de interogări. ■ Se afișează rezultatul interogării cu comanda do al.qri ■ Se modifică interogarea astfel încât în fereastra de editare coloana Pren să aibă numele Prenume, coloana N_jud numele Județ, iar coloana câmpului calculat Sisteme de gestiune a bazelor de date numele Varsta. Modificarea se va face în comanda SQL. Pentru aceasta se deschide o fereastră de editare cu comanda: modi comm al.qpr ■ Fereastra de editare va afișa comanda SQL. Comanda se modifică astfel: ■ Angajati.nume, Angajati.pren Prenume, Angajați.tarif, Judete.njud Județ; INT((DATE()-Angajati.data_n)/365). Varsta; 1 jvi companialangajati, companialjudete; ii . Judete.cjud = Angajati.cjud; AND (Angajați.tarif > 260; AND Angajați.tarif < 301); o .' .. ' Angajati.nume, Angajati.pren ■ Se închide fereastra de editare. Se afișează din nou rezultatul interogării și se observă modificările apărute în fereastra Browse. ■ Se închide interogarea și baza de date cu comanda close all. Observație. Folosind comanda Join se pot obține aceleași informații (mai puțin câmpul calcuat pentru vârstă): select 1 use angajati index on cjud to angj select 2 use județe index on cjud to jud_cj select 1 . B angjud; nume, pren, B,n_Jud; cJud=B,cJud; and tarif > 260 and tarif < 301 use angjud list Vizualizarea trebuie să răspundă la următoarea întrebare: „Cu ce date din baza de date poate interacționa utilizatorul pentru angajații (identificați prin nume, prenume, vârstă și numele județului) care au tariful cuprins între 260 și 300?". Utilizatorului i se va permite să interacționeze doar cu câmpul tarif. ■ Se deschide baza de date Compania. ■ Se alege opțiunea File->New. Se deschide caseta de dialog New în care din grupul de butoane cu opțiuni File Type se activează butonul View, după care se execută clic pe butonul New File. ■ Se deschide caseta de dialog Add Table or View. Din acest moment se vor urma aceiași pași care s-au executat atunci când s-a creat o interogare. Bara de instrumente View Designer conține primele cinci butoane din bara Query Designer. ■ Fereastra generatorului de vizualizări conține în plus secțiunea Update Criteria. Prin intermediul controalelor din această secțiune se pot stabili (câmpu- rile care realizează legătura între vizualizare și tabelele sursă) și ' - (câmpurile a căror modificare se transmite și către tabelele sursă). Se deschide această secțiune pentru a stabili parametrii vizualizării. Lista Field Name conține lista câmpurilor din vizualizare disponibile pentru actualizare, din tabelul Angajați. Se stabilesc mai întâi câmpurile cheie (care vor identifica unic relația vizualizare - tabel sursă). Aceste câmpuri sunt nume și pren. Se selectează fiecare dintre aceste câmpuri și se activează comutatorul pentru câmpul cheie. Se pot stabili acum câmpurile care pot fi actualizate (ele nu pot fi câmpuri cheie). Singurul câmp care a mai rămas este câmpul tarif. Se va marca pentru actualizare fie executând clic pe comutatorul de actualizare din dreptul său din lista Field Name, fie executând clic pe Informatică declanșatorul Update All. Actualizarea câmpului marcat se poate face într-unul din cele două moduri, precizate de butoanele radio Update using: prin ștergerea vechilor înregistrări și reinserarea celor modificate (SQL DELETE then INSERT) sau prin scrierea modificărilor direct în înregistrare (SQL UPDATE). Se activează butonul radio SQL UPDATE. Se activează comutatorul Șend SQL updates (ca aceste actualizări să se realizeze efectiv). Se salvează vizualizarea sub numele a1. £faView Designer - a1 id_ang nume pren tip_ang id_sup ► Selection Criteria | Table: | Angajati Reset Key | Update All | I⁻ Șend SQL Updates Fields | Order by j Group by j Update Criteria ; FieldName nume W pren Vyarif coloana de comutatoare l pentru câmpuri coloana de comutatoare pentru câmpuri cheie SQLWHERE clause includes: Key Fields Only Key and Updatable Fields Key and Modified Fields Update using: C SQL DELETE then INSERT SQLUPDATE ■ Se deschide vizualizarea (la fel ca un tabel - cu comanda use). ■ Se afișează vizualizarea în fereastra de editare Browse (cu comanda browse). Se fac modificări în câmpurile vizualizării. ■ Se deschide tabelul Angajați. Se afișează conținutul acestui tabel într-o fereastră browse. Modificările făcute în vizualizare se regăsesc în tabel. ■ Se închide baza de date. Se construiește un raport în care se prezintă situația încasărilor cu subtotaluri pentru fiecare contract ■ Se deschide baza de date Compania. ■ Se alege opțiunea File-»New. Se deschide caseta de dialog New în care, din grupul de butoane cu opțiuni File Type, se activează butonul Report, după care se execută clic pe butonul New File. Se deschide fereastra generatorului de rapoarte care este împărțită în mai multe benzi, fiecare bandă reprezentând o zonă din raport. Se poate modifica dimensiunea unei zone pe verticală, glisând bara delimitatoare a zonei. ■ Se definește mediul de date al raportului (tabelele din care raportul preia datele). Se alege opțiunea View-^Data Environment... Se deschide fereastra care este vidă. ■ Se alege opțiunea Data Environment-»Add.... Se deschide caseta de dialog Add Table or View. Se alege din listă tabelul încasări. Se reia operația și se alege din listă tabelul Contracte. Tabelele și relația dintre ele vor fi adăugate în fereastră. Sisteme de gestiune a bazelor de date ■ Se adaugă în fereastra generatorului de rapoarte benzile pentru antetul și subsolul raportului. Se alege opțiunea Report->Țitle/Summary.... Se deschide caseta de dialog Title/Summary în care se activează comutatorul Tifle bând pentru antetul raportului și comutatorul Șummary bând pentru subsolul raportului. [y Report Designer - Reportl |8 , , |9 . | |l0 , , |l1 |l2 Jl3 |14 |15 Banda pentru Page H cadet Banda pentru o Ț a Detail (Detail) Banda pentru 1 2 3 4 5 6 7 8 Labei! FiekJ Line R&ciangls Ruunded feeiang]e Data Groupmg Hapari: Contrele Selectează un obiect. Activează scrierea textului. Activează inserarea unui câmp. Activează trasarea unei linii. Activează trasarea unui dreptunghi. Activează trasarea unui dreptunghi cu colțuri rotunjite. Permite gruparea datelor. Activează bara cu instrumente Report Controls. Toolbar 0 o H ■ ■ . K ■ ■ ■ |6, ■ ■ ■ l< ■ Se stabilesc caracteristicile caracterelor din raport. Se alege opțiunea Report-» Default Font... Se alege în caseta de dialog Font fontul Arial. ■ Se scrie titlul raportului. Se execută clic pe instrumentul Labei, se execută clic în banda pentru antetul raportului în locul în care trebuie să apară titlul și se scrie: Situația încasărilor pe contracte. Se execută clic în banda de antet de pagină și se scriu titlurile coloanelor: Nr. încasare, Nr. contract, Client, Data și Valoare. ■ Se adaugă la raport câmpurile care vor fi afișate. Se execută clic pe instrumentul Field. Se execută apoi clic în banda Detail, sub titlul coloanei Nr. încasare în poziția în care trebuie să apară valoarea câmpului. Se deschide caseta de dialog Report Expression. Se execută clic pe butonul Expression și se deschide caseta de dialog Expression Builder în care se alege din lista Fields câmpul încasări.nr_i. Se reia operația pentru câmpurile încasări.id_cont, Contracte. id_cl, încasări.data_p, încasări.valoare. ■ Se creează grupuri de înregistrări după numărul contractului. ■ Se alege opțiunea Data Grouping...e Report. Se deschide caseta de dialog Data Grouping în care se va defini un singur nivel pentru grup. Se execută clic pe butonul primului grup. Se deschide caseta de dialog Expression Builder în care se alege din lista Fields câmpul încasări.id_cont. Informatică ■ Se definește totalul la nivelul raportului și subtotalul la nivelul fiecărui grup pentru câmpul valoare. Se execută clic pe instrumentul Field. Se execută apoi clic în banda Group, sub câmpul Valoare. Se deschide caseta de dialog Report Expression. Se execută clic pe butonul Expression și, din caseta de dialog Expression Builder, se alege câmpul incasari.valoare. în caseta de dialog Report Expression se execută clic pe butonul Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field în care în grupul de butoane radio Subtotal or Calculate se activează butonul Sum. Se reiau aceleași operații și pentru banda subsolului de raport. IM* Ifcjjiiiil 1 F i ...lyriiLi „bl lix laj^ 1 ^MM MRI Situaula Încasărilor pe conuracte J___| I I _d _^J Nr. încasare Nr. contrad Client Date Vale a na 1 1 1000 0*1(01/01 500 4 1 1000 Ol m/EH 1OOO 6 1 1000 01 (03/01 2000 10 1 10D0 01 (05/01 700 17 1 1000 01 fl 0/01 2000 6200 Li F | ■ Se salvează raportul sub numele a1 . Se închide caseta de dialog. în fereastra Command este afișată comanda cu care a fost creat raportul: create report. ■ Se previzualizează raportul cu comanda: a1 ■ Se poate modifica raportul cu comanda: a1. Se va modifica raportul astfel: deoarece câmpurile pentru numărul contractului și pentru identificatorul clientului se repetă la nivelul grupului, se vor adăuga aceste date în antetul grupului și se vor scoate din secțiunea de date a raportului. 4. ' . \ ' - _ . J : Se construiesc etichete cu numele și adresa clienților ■ Se deschide baza de date Compania. ■ Se alege opțiunea File->New. Se ^HwLabei deschide caseta de dialog New în i care, din grupul de butoane cu opțiuni File Type, se activează ) butonul Labei, după care se execută clic pe butonul New File. Se deschide fereastra caseta de dialog New Labei din care se alege un format pentru etichete (lățime, înălțime și număr de coloane). Se execută clic pe butonul OK. Choose a Layout: Avery No. Height Width Columns 4143 15/16" 4" 2 î : 4144 15/16" 2-1/2” N 4145 15/16" 3-1/2" 4146 1-7/16" 4" 1 4166 2-7/16" 3-1/2" 1 4161 2-15/16" 4” 1 4162 15/16" 3-1/2" 1 Cancel i ■ Se deschide fereastra generatorului de etichete care este împărțită în mai multe benzi, fiecare bandă reprezentând o zonă din etichete. Se poate modifica dimensiunea unei zone pe verticală, glisând bara delimitatoare a zonei. Sisteme de gestiune a bazelor de date Se definește mediul de date al raportului (tabelele din care raportul preia datele). Se alege opțiunea View-»Data Envlronment... Se deschide fereastra care este vidă. Se alege opțiunea Data Environ- ment-»Add ... Se deschide caseta de dialog Add Table or View. Se alege din listă tabelul Clienti. Se stabilesc caracteristicile carac- terelor din etichete. Se alege opțiunea Formata Font.... Se alege în caseta de dialog Font fontul Arial. Dacă formatul prestabilit nu este satisfăcător se pot stabili numărul de coloane, lățimea și înălțimea etichetelor prin intermediul con- troalelor din caseta de dialog Page Setup care se deschide cu opți- unea de meniu File-»Page Setup.... Page Setup Se adaugă la etichete câm- purile care vor fi afișate, astfel: se glisează din tabel în banda Detail câmpurile nume și adresa. Se previzualizează etichetele cu opțiunea de meniu View-» Preview.... Labei Designer - etkhete_clienti.lbx Page Header U Doter ter T Labei Designer - Labe(2 - Page 1 Numele și adresa unui client ■ Se salvează cu numele etiche- te_clienti. ■ Se poate modifica raportul cu co- manda: etichete clienti. Informatică 1. Creați o interogare în care afișați clienții care au fost înregistrați înainte de 01/01/2007. Interogarea va fi afișată în ordinea codurilor angajaților. 2. Creați o vizualizare cu clienții atribuiți angajatului cu codul 200 în perioada 01/01/2000 și 31/12/2001. 3. Creați un raport cu evidența ședințelor. Ședințele vor fi grupate după numărul contractului și, pentru același contract, vor fi afișate în ordine cronologică. Afișați subtotaluri la nivel de grup și un total la nivel de raport pentru durata ședințelor și pentru costul ședințelor. 4. Creați etichete poștale cu numele și adresele angajaților. ___________________________________-O-______________________________________ Este un limbaj specializat pentru manipularea datelor din baza de date, care asi- gură accesul la date, regăsirea și afișarea lor. Stă la baza construirii interogărilor. conține: » este verbul care determină acțiunea ce sunt cuvinte cheie care limitează se va executa și este cuvântul de domeniul înregistrărilor furnizate de început obligatoriu pentru o propoziție. interogare. conține toți identificatorii de câmpuri sunt cuvinte cheie care modifică acțiunea din interogare. definită prin verb. Operatorii aplicați pe sursa de date sunt cuvinte care definesc operații de com- sunt cuvinte cheie care definesc operații binare a datelor din tabele sau interogări. de combinare a datelor din tabele. O instrucțiune SQL este o propoziție care se termină cu caracterul punct și virgulă (;) Instrucțiunile SQL se folosesc pentru a descrie informațiile pe care vreți să le obțineți prin cererea de date din interogare. Sisteme de gestiune a bazelor de date Creare Metoda Limbajul Modul de vizualizare Modul de vizualizare Comanda Realizează 1. Instrucțiuni pentru crearea și manipularea structurilor de date: Creează un tabel. Se poate folosi pentru a crea o interogare acțiune, de tip interogare de creare. Adaugă un câmp la un tabel existent. 2. Instrucțiuni pentru selecția datelor folosite pentru consultarea bazei de date Definește informația care trebuie furnizată din baza de date, sub forma unui set __________________________de înregistrări. Se poate folosi pentru a crea o interogare de selecție.______________ 3. Instrucțiuni pentru manipularea datelor prin adăugarea, ștergerea și modificarea înregistrărilor Adaugă înregistrări într-un tabel. Se poate folosi pentru a crea o interogare acțiune de tip interogare de adăugare. Șterge înregistrări dintr-un tabel. Se poate folosi pentru a crea o interogare acțiune de tip interogare de ștergere. Modifică valorile unor câmpuri din înregistrările unui tabel. Se poate folosi pentru a crea o interogare acțiune de tip interogare de modificare. Afișează toate înregistrările care îndeplinesc condițiile impuse. Elimină înregistrările care conțin valori duplicate în câmpurile selectate, afișându-se o singură înregistrare dintre ele. Elimină înregistrările care conțin valori duplicate în ansamblul lor, nu numai în anumite câmpuri selectate, afișându-se o singură înregistrare dintre ele. Afișează primele înregistrări care îndeplinesc criteriul de selectare. în cazul în care interogarea are ca sursă de date un singur tabel, câm- purile se vor identifica numai prin numele lor. Dacă sursa de date este formată din mai multe tabele, identificatorul câmpului va trebui să conțină, pe lângă numele câmpului, și numele Informatică tabelului. Separarea identificatorilor în listă se face prin caracterul virgulă (,). în lista de selecție, în locul numelor de câmpuri, pot fi și câmpuri calculate prin funcții statistice aplicate pe câmpuri din baza de date: sum(), avg(), count(), min() sau max(). Specifică tabelele și/sau interogările care furnizează sursa de date a interogării. Clauza este însoțită de o expresie care poate conține numele unui tabel sau al unei interogări, o listă de tabele sau interogări, sau rezultatul unei interogări obținut prin aplicarea unui operator pe sursele de date. .---- . _ _ Precizează criteriul de selectare a înregistrărilor. Clauza este însoțită de o expresie logică ce descrie condițiile pe care trebuie să le îndeplinească înregistrările care vor fi afișate. Precizează criteriul de ordonare a înregistrărilor afișate. Clauza este însoțită de identificatorul câmpului sau de lista de identificatori de câmpuri folosiți pentru ordonare. Cuvintele cheie Dese și Ase precizează modul în care se face ordonarea: descrescător, respectiv crescător. Precizează modul în care pot fi grupate înregistrările după aceeași valoare a unui câmp sau a unui grup de câmpuri. Clauza este însoțită de identificatorul câmpului sau de lista de identificatori ai câmpurilor folosite pentru gruparea înregistrărilor. Grupul de înregistrări este format din înregistrări pentru care câmpul sau câmpurile folosite pentru grupare au aceeași valoare. în locul grupului de înregistrări este afișată o singură înregistrare. Pentru câmpurile numerice din grup se pot folosi funcțiile statistice care se vor aplica pe valorile câmpului din înregistrările fiecărui grup. Precizează ce grup de înregistrări va fi afișat. Clauza poate completa clauza Group By, limitând înregistrările care vor fi afișate. Este însoțită de o expresie logică ce descrie condițiile pe care trebuie să le îndeplinească grupurile de înregistrări care vor fi afișate. Spre deosebire de clauza Where, care se aplică înainte de gruparea înregistrărilor, clauza Having By se aplică după gruparea lor. Asociază datele din două tabele. Asocierea se face pe baza a câte unui câmp din fiecare tabel, între cele două câmpuri trebuind să existe o anumită relație: câmp_tabel1 R câmp_tabel2 (unde R este un operator relațional: >, <, >=, <=, = sau <>). Operatorul de asociere poate fi folosit într-o clauză For și va furniza ca sursă de date pentru o interogare rezultatul unei interogări. Combină numai acele înregistrări din cele două tabele care îndeplinesc condiția relațională dintre două câmpuri ale fiecărui tabel. Combină toate înregistrările din primul tabel numai cu înregistrările din al doilea tabel care îndeplinesc condiția relațională dintre cele două câmpuri; în cazul în care unei înregistrări din primul tabel nu i se poate asocia, prin condiția relațională, o înregistrare din al doilea tabel, în locul acesteia se vor afișa spații. Combină toate înregistrările din al doilea tabel numai cu înregistrările din primul tabel care îndeplinesc condiția relațională dintre cele două câmpuri; în cazul în care unei înregistrări din al doilea tabel nu i se poate asocia, prin condiția relațională, o înregistrare din primul tabel, în locul acesteia se vor afișa spații. Creează o interogare combinând un tabel sau o interogare creată anterior cu rezultatul unei interogări. Sursa de date nu mai este o interogare creată anterior, ci rezultatul unei interogări generat de o comandă Select. Sisteme de gestiune a bazelor de date Asociază un pseudonim (alias) unui câmp sau rezultatului unei funcții statistice aplicate pe valorile unui câmp; Atribuie un nume tabelului care se creează sau la care sunt adăugate înregistrările; Este folosită în operatorii lnner|Left|Right Join și precede condiția relațională dintre cele două câmpuri din cele două tabele. clauza From lista de selecție clauza Where J clauza Order By , ,... [ ] [ [ | ]] Exemplul 1. Două (între care nu s-a stabilit o relație). O co Definiția pentru această interogare de selecție este: J, ’ Select [Tabel1].[A], [Tabel1].[C], [Tabel1].[D], [Tabel2].[E], [Tabel2].[G] g From Tabell, Tabel2 ® Where ([Tabel 1].[A]=a2 or [Tabel1].[A]=a3 or [Tabell ].[A]=a5) and ([Tabel2].[G]=g2 or [Tabel2].[G]=g4) Exemplul 2. Sursa de date este formată din (de exemplu tabelul Materiale și tabelul Mișcări), adică între cele două tabele s-a stabilit o relație prin câmpurile cheie primară și cheie secundară (de exemplu Tabell este tabelul conducător și are cheie primară câmpul B, iar Tabel2 este tabelul condus și are cheie secundară câmpul F). Cele două surse de date trebuie asociate prin operatorul Inner Join. Definiția pentru această interogare de selecție este: Select [Tabell],[A], [Tabell].[C],’ [Tabel1].[D], [Tabel2].[E], [Tabel2].[G] From Tabell Inner Join (Tabel2 On [Tabel1].[B]= [Tabel2].[F]) Informatică Câmpurile selectate din primul tabel din primul tabel Tabel 1 înregistrările A B C D a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3 a4 b4 c4 d4 a5 b5 c5 d5 Câmpurile selectate din al doilea tabel Tabel 2 E F G înregistrările-------> e1 f1 gi selectate X. e2 f2 g2 din al doilea e3 f3 g3 tabel e4 f4 g4 Câmpurile selectate din primul tabel Câmpurile selectate din al doilea tabel legate de primul tabel Tabel 2 E F G e1 b1 gi e2 b1 g2 e3 b3 g3 e4 b4 g4 Rezultatul interogării A C D E G a2 c2 d2 e2 g2 a2 c2 d2 e4 g4 a3 c3 d3 e2 g2 a3 c3 d3 e4 g4 a5 c5 d5 e2 g2 a5 c5 d5 e4 g4 tabel Rezultatul interogării A C D E G a1 c1 d1 e1 gi a1 c1 d1 e2 g2 a3 c3 d3 e4 g4 Cerințe: -> Fiecare articol din magazie este identificat unic printr-un cod. Articolul mai are următoarele atribute: denumire, unitate de măsură, preț, stoc de siguranță (stocul minim necesar desfășurării procesului de producție). în funcție de tipul articolelor se mai pot adăuga și alte atribute (model, culoare, mărime etc.). -> în magazie are loc o continuă mișcare de articole: unele articole intră în magazie, altele ies din magazie. Fiecare mișcare este caracterizată de data mișcării, cantitate și Sisteme de gestiune a bazelor de date valoare. în urma unei mișcări, stocul de articole se modifică și poate să ajungă sub stocul de siguranță. -> Trebuie să se cunoască în orice moment situația stocurilor din magazie și graficul mișcărilor de articole. Tabelul Materiale va trebui să conțină următoarele date (sub formă de câmpuri): -> Identificatorul materialului (cod_mat, I). Va fi folosit pentru cheia primară. - > Numele materialului (den_mat, C, 30). Deoarece pot fi cerute liste ordonate după numele materialului, acest câmp va fi cheie de indexare. - > Unitatea de măsură (um, C, 4). - > Prețul (preț, S). Reprezintă prețul de cumpărare al articolului. - > Stocul de siguranță (stoc_s, I). Tabelul Mișcări va trebui să conțină următoarele date (sub formă de câmpuri): - > Identificatorul materialului (cod_mat, I). Este un număr care identifică unic articolul și este folosit pentru cheia secundară. - > Tipul mișcării (tip_m, C, 1). Pot fi doar două tipuri de mișcări: intrarea unui material (I) și ieșirea unui material (E). - > Cantitatea intrată (cantj, I). Reprezintă cantitatea de articole intrate. - > Cantitatea ieșită (cant_e, I). Reprezintă cantitatea de articole ieșite. - > Data mișcării (data_m, D). între tabelul Materiale și tabelul Mișcări se stabilește o relație în care tabelul conducător este tabelul Materiale, tabelul condus este tabelul Mișcări, iar câmpul de legătură este codul materialului. Se construiește baza de date Magazia care va conține cele două tabele legate. Se adaugă 5 înregistrări în tabelul Materiale (articolele pixuri, creioane, mape, hârtie și scotch). Se adaugă în tabelul mișcări 15 înregistrări (câte trei mișcări de materiale pentru fiecare articol). Comenzile SQL se vor scrie în fereastra de comenzi. 1. Să se afișeze, din tabelul Materiale, stocul de siguranță pentru pixuri și mape. Se construiește o interogare de selecție în care sursa de date este tabelul Materiale, câmpurile afișate sunt den_mat și stoc_s, iar înregistrările din sursa de date sunt cele care au denumirea materialului: pixuri sau mape. . Materiale.den_mat, Materiale.stoc_s । Materiale iu . (Materiale.denmat Like ”Mape”) or (Materiale.den_mat Like ”Pixuri”); 2. Să se afișeze, din baza de date Materiale, toate materialele care au intrat în magazie în ultima jumătate de an. Se construiește o interogare de selecție în care sursa de date este formată din două tabele legate {Materiale și Mișcări), câmpurile afișate sunt den_mat, cant_i și data_m, iar înregis- trările din sursa de date sunt cele pentru care câmpul cant_i este strict pozitiv și care au data mișcării în ultimele 180 de zile. Select Materiale.den mat, Miscari.cantJ, Mișcări.data m ilciîi Materiale i r ai' c?: Mișcări cn Materiale.cod_mat=Miscari.cod_mat Wnere (Miscari.cantJ >0) and (Miscari.data_m>=date()-180); Informatică 3. Să se afișeze, din baza de date Materiale, în ordine cronologică, toate mișcările de materiale. Se construiește o interogare de selecție în care sursa de date este formată din două tabele legate (Materiale și Mișcări), câmpurile afișate sunt den_mat, canțj, cant_e și data_m, și se afișează toate înregistrările, în ordine crescătoare a câmpului data_m. Materiale.den mat. Mișcări.canti, Miscari.cant_e, Mișcări.data m Materiale : Mișcări Materiale.cod_mat=Miscari.cod_mat Mișcări.datam; Crearea unui tabel Adăugarea unei înregistrări la tabel. Modificarea valorii câmpurilor dintr-o înregistrare Ștergerea unei înregistrări din tabel. Instrucțiunile SQL pentru crearea interogărilor acțiune sunt: J aol [iras] ( [/ ul | ia.uj [mm- , , c ;| d.n ] [aiiaia ia ., [ur i ]], [nuli | not nuli] —) Create Table Materiale (cod_mat I not nuli, den_mat C(30), um C(4), preț S, stoc_s I) _____________________________________Creează tabelul Materiale__________________ | / li jr f .aa . J: Alter Table Materiale Add sfs I Adaugă la tabelul Materiale câmpul sfs de tip Integer. unde: free - tabelul care se creează nu se adaugă la baza de date deschisă (este tabel liber) nuli | not nuli - se acceptă, repectiv nu se acceptă, valoarea nulă în câmp primary key | unique - câmpul este cheie primară, respectiv cheie unică references [tag ] - stabilește o legătură între tabelul care se creează și tabelul părinte, prin intermediul etichetei care reprezintă cheia primară în tabelul părinte. Instrucțiunea - adaugă o singură înregistrare, prin precizarea valorilor care se atribuie câmpurilor: (, ,...) . (, ,...) create table alter table insert-SQL Sisteme de gestiune a bazelor de date Instrucțiunea - șterge logic o înregistrare sau mai multe înregistrări, precizate prin condiția clauzei where [ ] Instrucțiunea - modifică valoarea câmpurilor dintr-o înregistrare sau mai multe înregistrări, precizate prin condiția clauzei where = [,=,...] [ ] 1. Se creează un tabel cu structura: un câmp de tip întreg și un câmp de tip șir de caractere. tabel (campl I, camp2 C(30)); 2. In tabelul Materiale se modifică stocul de siguranță pentru materialul care are codul 3. Noul stoc de siguranță este 300. Materiale Materiale.stoc_s=300 Materiale. cod_mat=3; 3. In tabelul Materiale se șterge înregistrarea materialului care are codul 5. Materiale Materiale.cod_mat=5; 4. In tabelul Materiale se adaugă înregistrarea care a fost ștearsă. Materiale cod_mat 5, den_mat "Pixuri”, um ; : ”buc.”, preț 1, stoc_s 50; Peⁿ^ru ^aza de ^a^e C°mPaⁿia’ folosiți limbajul SQL pentru a realiza următoarele: ' fOBi $$ se afi§eze' fo ordinea alfabetică a numelui, toți clienții care au fost «IgE înregistrați înainte de 01/01/2007. 2. Să se afișeze în ordinea alfabetică a numelui toți clienții din București. 3. Să se afișeze în ordinea alfabetică a numelui toți clienții angajatului cu codul 200 în perioada 01/01/2000 și 31/12/2001. 4. Să se creeze un tabel liber Prieteni, cu următoarea structură: un câmp pentru identificatorul persoanei, un câmp pentru nume, un câmp pentru prenume, un câmp pentru data nașterii, un câmp pentru localitatea de domiciliu și un câmp pentru numărul de telefon. 5. Să se adauge la acest tabel 10 înregistrări care să permită rezolvarea următoarelor cerințe. 6. Să se afișeze toți prietenii dintr-o localitate precizată. 7. Să se afișeze toți prietenii care își serbează ziua de naștere în primul semestru al anului. 8. Să se modifice numărul de telefon al unui prieten. 9. Să se șteargă toți prietenii dintr-o anumită localitate. Informatică Metode de programare Metoda programării structurate Metoda progra- mării orientate pe obiecte Metoda programării vizuale Metoda progra- mării conduse de evenimente Programul sursă se scrie într-un fișier de tip text, cu ajutorul editorului de texte încorporat. Editorul de texte se activează cu comanda modify command (care creează un fișier program sursă, cu extensia implicită .prg) sau modify file (care creează un fișier text, cu extensia implicită .txt). Prin această comandă se deschide fereastra de editare, în care se vor scrie comenzile și instrucțiunile programului. Fereastra editorului de texte poate fi deschisă cu ajutorul acestor comenzi fie din fereastra Command (folosind limbajul de comandă), fie din interiorul unui program (folosind una dintre aceste comenzi ca instrucțiune într-un program sursă). Sintaxa celor două comenzi este: | [ | <șablon> | ] [ ] Forma implicită a comenzii este modify command | modify file care deschide fereastra de editare pentru a crea un fișier de tip text al cărui nume se va comunica ulterior prin operația Save as și care va avea extensia implicită comenzii. Dacă se comunică și numele fișierului prin adverbul , în fereastra de editare va fi încărcat conținutul fișierului pentru a fi editat (la creare, conținutul fișierului este vid). Și în acest caz, comanda va avea în vedere fișierele care au extensia implicită. Dacă se dorește încărcarea unui fișier cu o altă extensie, trebuie să se precizeze și extensia. Dacă nu se cunoaște numele fișierului, se folosește adverbul ? care va deschide caseta de dialog Open prin intermediul căreia se poate alege numele fișierului. Pentru numele fișierului se poate folosi un șablon pentru nume de fișiere (adverbul <șablon>). în acest caz se vor deschide mai multe ferestre de editare și în fiecare fereastră va fi încărcat câte un fișier care corespunde șablonului. Implicit, se pot face modificări în text. Explicit, textul poate fi numai vizualizat, dacă se folosește clauza noedit. Sisteme de gestiune a bazelor de date Folosind facilitatea de autodocumentare aflați ordinea în care comanda do alege programul pe care îl lansează în execuție în funcție de extensia fișierului în care este memorat. Programul sursă poate fi compilat cu comanda compile ce pune în evidență erorile de sintaxă ale programului. în urma compilării se obține un fișier cu extensia .fxp care conține codul obiect al programului. Comanda are sintaxa: | <șablon> Comanda poate acționa asupra unui singur fișier sursă precizat prin adverbul sau asupra unui grup de fișiere sursă care poate fi identificat prin adverbul <șablon>. Pentru a produce rezultate programul trebuie încărcat în memoria internă și lansat în execuție cu comanda do care are sintaxa: [ . ] [ ] Comanda lansează în execuție programul care se află în fișierul . Acest fișier poate să aibă extensia implicită .prg (fișier program sursă FoxPro), .fxp (fișier cod obiect FoxPro), .exe (fișier exe- cutabil) sau .app (fișier de aplicații FoxPro). Implicit se execută programul din acest fișier care este căutat pe disc în directorul curent sau în directorul specificat în identificatorul fișierului. în acest caz directorul specificat devine director curent. Explicit, se execută proce- dura cu numele care se găsește în fișierul de programe precizat în clauza in. Observatii: 1. Dacă se dorește execuția unui fișier care conține comenzi pentru meniuri, formate de ecran sau interogări trebuie precizată extensia fișierului (.mpr, .spr, qpr). 2. Execuția unui program apelat prin comanda do se termină atunci când se întâlnește una dintre următoarele situații: — o comandă - care redă controlul unui alt modul; — o comandă - care abandonează execuția programului și redă controlul ferestrei de comenzi (comanda eliberează toate variabilele de memorie); — o comandă - care întrerupe execuția programului și redă controlul sistemului de operare; — o comandă . . - care redă controlul modulului apelat; — sfârșitul fișierului care conține programul (eof()=.T.) Variabilele de memorie și tablourile de memorie pot fi definite oriunde în interiorul programului, astfel: — variabilele de memorie simple (corespunzând datelor elementare) se creează prin atribuirea unei valori unui identificator, tipul valorii atribuite determinând tipul datei. — tablourile de memorie se creează cu comanda dimension sau declare. De exemplu, următoarele comenzi creează (și implicit definesc) variabile de memorie de tip numeric prin atribuirea de valori numerice unui identificator: Informatică 113 a=100 {atribuie variabilei de memorie a valoarea 100} store 1000 to b {atribuie variabilei de memorie b valoarea 1000} input 'n= ' to n {atribuie variabilei de memorie n valoarea introdusă de la tastatură} sum campl to c {atribuie variabilei de memorie c valoarea obținută prin însumarea valorilor din câmpul numeric campl al tabelului activ} count to d {atribuie variabilei de memorie d valoarea obținută prin numărarea înregistrărilor din tabelul activ} Pe parcursul unui program, același identificator de dată poate să definească tipuri diferite de date. De exemplu, în același program se pot întâlni comenzile: store 0 to a {se creează variabila de memorie a de tip numeric prin atribuirea unei valori numerice} a=date() {se creează variabila de memorie a de tip dată calendaristică prin atribuirea valorii unei funcții de tip dată calendaristică} accept 'a=' to a {se creează variabila de memorie a de tip șir de caractere prin atribuirea șirului de caractere introdus de la tastatură} în general, pentru marea majoritate a comenzilor nu este necesar ca variabilele de me- morie să fie definite anterior comenzii (de exemplu comenzile de atribuire sau comenzile care permit redirectarea unor valori de pe ecran într-o variabilă de memorie folosind clauza to: accept, input, sum, count etc. creează ele însele variabila de memorie). Limbajul gazdă Visual FoxPro poate fi folosit la fel ca orice limbaj de programare structurată. La construirea unui program, prezentate anterior pot fi folosite ca instrucțiuni, iar pentru schimbarea ordinii secvențiale de execuție se pot folosi . . . . : . Programul sursă devine astfel o colecție de comenzi și instrucțiuni de control scrise în ordinea în care trebuie să fie executate. Instrucțiunile de control sunt instrucțiuni bloc deoarece pot conține mai multe instrucțiuni. De aceea ele trebuie delimitate de cuvinte cheie care marchează începutul și sfârșitul structurii de control. Instrucțiunile de control nu pot fi folosite în modul comandă. Compilatorul FoxPro trebuie să poată iden- tifica fiecare instrucțiune a programului sursă. El consideră ca separator între instrucțiuni codul ASCII generat la acționarea tastei enter. Se numește EOL (End Of Line) și este format din două coduri ASCII: EOL = LF (Line Feed = salt la linia următoare) + CR (Carriage Return = retur la începutul liniei) = ODh + OAh. Din această cauză, în fereastra de editare fiecare comandă se va scrie pe câte un rând: < adverb1> r < adverb2> 1 < adverb3> următoarele linii ale comenzii nu se scriu din prima coloană. Dacă se dorește scrierea unei comenzi pe mai multe rânduri, pentru a arăta că ea continuă pe rândul următor, la sfârșitul liniei, înainte de a acționa tasta enter, se scrie caracterul punct și virgulă ( ) - ca în exemplul alăturat: 114 Sisteme de gestiune a bazelor de date îrîsî! ucțiui'itie ci conți oi implementate în limbajul gazdă FoxPro sunt: Observații: 1. Spre deosebire de limbajele clasice de programare, în limbajul gazdă FoxPro este imple- mentată o structură repetitivă specifică acestui gen de aplicație (scan ... endscan), care facilitează scrierea unui program ce exploatează secvențial un tabel al bazei de date. 2. Nu este implementată structura repetitivă cu număr necunoscut de pași condiționată posterior (de tip repeat... until sau do... while). Structura liniară sau secvențială este structura în care comenzile se execută în ordinea în care au fost scrise. Comentariile. Sunt șiruri de caractere inserate în program care nu reprezintă comenzi executate de sistem. Ele se folosesc pentru a ușura urmărirea logicii unui program. Se pot folosi două tipuri de comentarii: 1. Lin! ? remontanu Este un text care se scrie pe o linie sau pe mai multe linii. Pentru a nu fi interpretată de către sistem ca instrucțiune, textul este precedat de caracterele **Q sau de cuvântul cheie note. La fel ca și la o comandă, pentru a arăta că ea continuă și pe rândui unWu, e scrie la sfârșitul liniei de comentarii caracterul;. 2. Comemori: ’r'sera'r în comand?. Este un text care se scrie pe aceeași linie cu comanda, dar la sfârșitul ei. Pentru a nu fi interpretată de către sistem ca adverb al comenzii, textul este precedat de caracterele M. Comentariul poate eroare fi continuat pe rândul următor dacă se scrie la sfârșitul liniei caracterul;. Nu se adaugă un comentariu la sfârșitul unei linii de comandă care se continuă pe rândul următor. |input ’ x= ’ to; &&Se introduce x I X i----------------------------------------- Jl Informatică 115 Exemplu. Să se genereze aleator un număr cu valoarea cuprinsă între două numere precizate, a căror valoare se introduce de la tastatură: note Programul este un exemplu pentru modul in care pot fi; folosite comentariile set talk off clear && Se șterge ecranul store 0 to x,y && Nu este obligatoriu sa se inițializeze; aceste variabile de memorie ? 'Programul va furnizează un număr aleator intre x si y’ ? 'Numerele x si y pot lua orice valoare între 0 si 999’ * Se introduc de la tastatura valorile pentru x si y input ¹x= ¹ to x input ¹y= ’ to y note Se inițializează generatorul de numere aleatoare =rand(-l) && Comanda = evalueaza una sau mai multe expresii preci-; zate printr-o lista scrisa în dreapta caracterului =; în exemplu se evalueaza funcția rand(-l)) z=x+(y-x)*rand() && se calculează valoarea z (număr aleator) ? 'Numărul este: ’+str(z,8,4) wait ’Acționați orice tasta pentru continuare’ clear return .. l-n Prin această structură se execută condiționat o anumită secvență de instrucțiuni, în funcție de valoarea unei condiții logice. Limbajul gazdă FoxPro permite folosirea a două tipuri de structuri alternative: a. afematîvă ssmplă Structura alternativă simplă permite executarea unei acțiuni (descrisă printr-o secvență de instrucțiuni: sau ) din două acțiuni posibile, în funcție de valoarea unei condiții exprimate printr-o expresie logică (): Observatii: 1. Cuvintele cheie if și endif delimitează structura, iar cuvântul else marchează începutul secvenței de instrucțiuni care descrie activitatea ce se execută dacă expresia logică are valoarea „fals”. 2. Cuvântul cheie if împreună cu condiția și cuvintele cheie else și endif se scriu fiecare pe câte un rând. 3. Se pot construi și structuri alternative simple cu o ramură vidă. 4. Sunt permise structuri if ... endif imbricate. Dacă sunt mai multe structuri alternative simple imbricate, else se referă la primul if care îl precede. Exemplu. Să se scrie un program pentru rezolvarea ecuației de gradul I cu coeficienți numere reale. Coeficienții a și b se introduc de la tastatură. if else endif Sisteme de gestiune a bazelor de date Metoda 1 set talk off clear store 0 to a,b ? ’Programul va furnizează; soluția ecuației de gradul I¹ ? 'de forma a*x+b=0v input ’a= ’ to a input ’b= ’ to b if a=0 if b=0 ? 'Ecuația are o infinitate; de soluții’ Metoda 2 (care folosește structuri if...endif imbricate) set talk off clear store 0 to a,b ? 'Programul va furnizează; soluția ecuației de gradul I' ? 'de forma a*x+b=0' input 'a= ' to a input ’b= ' to b if a=0 and b=0 ? 'Ecuația are o infinitate; de soluții' else Metoda 3 (care folosește funcția iif()) set talk off clear store 0 to a,b ? 'Programul va furnizează solu-; tia ecuației de gradul I’ ? 'de forma a*x+b=0' input 'a= ' to a input ’b= ' to b else ? 'Ecuația este imposibila' endif else x=-b/a ? 'x= ',x endif wait 'Acționați orice tasta; pentru continuare' clear return if a=0 and b<>0 ? 'Ecuația este imposibila else x=-b/a ? ’x= ' , x endif endif wait 'Acționați orice tasta; pentru continuare' clear return ? iif(a<>0, -b/a,iif(b<>0, 'Ecuația este imposibila',; 'Ecuația are o infinitate de; soluții’)) wait 'Acționați orice tasta; pentru continuare’ clear return 0) w DC U ? lî; Q t U fes 2 010 iT ii 12 'C li X? 2 g & H © i 2" ? i ă Structura alternativă generalizată permite exe- cutarea unei singure acțiuni din mai multe acți- uni posibile (descrise prin secvențele de in- strucțiuni: , , ). Stabilirea acțiunii care urmează să se execute se face în urma evaluării unei condiții care poate lua mai multe valori exprimate prin expresiile logice (, , ): Observații: 1. Cuvintele cheie do case și endcase delimi- tează structura, iar cuvintele cheie case marchează începutul unui caz care urmează case case case [otherwise ] endcase Informatică 117 să fie tratat (condiția logică ce trebuie evaluată și secvența de instrucțiuni care descrie activitatea ce se va executa atunci când condiția logică are valoarea „adevărat”). Cuvântul cheie otherwise împreună cu secvența de instrucțiuni sunt opționale și reprezintă acțiunea care se va executa atunci când nici una dintre expresiile logice din cazurile prezentate nu au avut valoarea „adevărat”. 2. Cuvântul cheie case împreună cu condiția și cuvintele cheie do case, otherwise și endcase se scriu fiecare pe câte un rând. 3. Se acceptă într-o structură do case ... endcase structuri alternative sau structuri repetitive cu condiția ca aceste structuri să fie incluse complet în interiorul unui case sau otherwise. 4. Structura alternativă generalizată do case ... endcase poate fi echivalată cu mai multe structuri alternative simple if ... endif imbricate. 1. Se evaluează pe rând expresiile logice , , , ... și . Când se întâlnește prima expresie care are valoarea „adevărat”, se execută secvența de instrucțiuni cuprinsă între condiția logică și apariția unuia dintre cuvintele cheie case, otherwise sau endcase. 2. După ce s-a întâlnit un caz adevărat și s-au executat instrucțiunile corespunzătoare cazului, celelalte cazuri nu vor mai fi tratate și se va trece la executarea primei instrucțiuni aflate după cuvântul cheie endcase. 3. Dacă niciuna dintre expresiile logice evaluate nu a avut valoarea „adevărat”, se execută secvența de instrucțiuni delimitată de cuvintele cheie otherwise și endcase, dacă există, sau, în caz contrar, prima instrucțiune aflată după cuvântul cheie endcase. R<-- Se recomandă folosirea instrucțiunii do case ... endcase în locul instrucțiunii if ... endif în următoarele cazuri: — Din mai multe cazuri unul singur poate fi adevărat. — Din mai multe condiții numai prima găsită adevărată trebuie executată. — Există un număr mic de excepții la o anumită condiție. în acest caz, excepțiile vor fi puse în evidență prin case , iar situația obișnuită prin otherwise. Exemplu. Să se scrie un program pentru rezolvarea ecuației de gradul I folosind structura repetitivă generalizată - pornind de la metoda folosirii structurilor alternative simple imbricate: set talk off clear ? 'Programul furnizează soluția; ecuației de gradul I: a*x+b=0' input 'a= ' to a input 'b= ' to b do case case a=0 and b=0 ? 'Ecuația are o infinitate; de soluții' case a=0 and b<>0 ? 'Ecuația este imposibila' otherwise x=-b/a ? 'x= ',x endcase wait 'Acționați orice tasta; pentru continuare' clear return Structura repetitivă Prin această structură se execută repetat o acțiune (exprimată printr-o secvență de in- strucțiuni - ) atât timp cât este îndeplinită o condiție pentru execuția repetată. Toate structurile repetitive acceptă în corpul lor instrucțiunile loop și exit: -> aoop - forțează reevaluarea condiției de terminare a structurii repetitive printr-un salt la începutul structurii (în cazul unei structuri repetitive cu număr cunoscut de pași, înainte de evaluarea condiției, produce și incrementarea contorului). 118 Sisteme de gestiune a bazelor de date -> Exit - forțează abandonarea structurii repetitive, indiferent de rezultatul evaluării condiției de terminare, printr-un salt la prima instrucțiune care urmează după structura repetitivă. -> Instrucțiunile loop și exit se vor folosi într-o structură alternativă din interiorul struc- turii repetitive. a. Structura repetitivă cu număr cunosc; cps-i Permite executarea repetată a unei secvențe de instrucțiuni de un număr specificat de ori. Pentru a număra de câte ori s-a executat secvența de instrucțiuni, se folosește variabila de memorie care va avea valoarea inițială precizată prin la începerea executării repetate a secvenței de instrucțiuni. Această variabilă va trebui să aibă valoarea precizată prin pentru a se termina executarea repetată a secvenței de instrucțiuni. După fiecare executare a secvenței de instrucțiuni, variabila contor este incrementată implicit cu valoarea 1 sau, dacă se precizează clauza step, cu valoarea . for = to [stsp ] endfor | next Observatii: 1. Cuvântul cheie for marchează începutul structurii, iar cuvântul cheie endfor (sau cuvântul cheie next) marchează sfârșitul structurii. Cuvin- tele cheie for și to delimitează operația de atri- buire prin care se face inițializarea contorului, cuvântul to precede valoarea finală a contorului, iar cuvântul step precede valorea cu care se incrementează contorul. 2. Cuvântul cheie for împreună cu expresiile și cuvintele cheie to și step se scriu pe același rând. Cuvântul cheie endfor, respectiv next, se scrie pe un singur rând. 3. Variabila de memorie trebuie definită înaintea structurii for ... endfor, ca variabilă de tip numeric întreg, printr-o operație de atribuire. Exemplu. Să se calculeze suma a n numere introduse de la tastatură. Valoarea lui n se citește de la tastatură. set talk off clear store 0 to suma,i ? 'Programul calculează suma a n; numere introduse de la tastatura' input ’n= ' to n for i=l to n input 'a= ’ to a suma=suma+a endfor ? 'Suma = ', suma wait 'Acționați orice tasta; pentru continuare' clear return Informatică b. L.njjj,c’.i!sra ‘•epetîtivă cu număr necunos: ut ur og';’ cognieucr Permite executarea repetată a unei secvențe de instrucțiuni, atât timp cât o condiție exprimată printr-o expresie logică are valoarea „adevărat”. do while enddo o Observații: 1. Cuvântul cheie while marchează începutul structurii, iar cuvântul cheie enddo sfârșitul ei. 2. Cuvântul cheie while împreună cu expresia logică și cuvântul cheie enddo se scriu fiecare pe câte un rând. Exemplu. Să se calculeze media aritmetică a unor nu- mere introduse de la tastatură. Utilizatorul programului este întrebat de fiecare dată dacă mai dorește să introducă un număr. Operația se termină atunci când acesta răspunde că nu mai dorește continuarea operației de introducere a numerelor. set talk off § clear store 0 to suma,i ? ’Programul calculează media aritmetica a numerelor ’ ? ’introduse de la tastatura’ accept ’Doriti sa introduceți primul număr? (d/n) ’ to rasp do while . T. do case case rasp$’Dd’ input ’a= ’ to a suma=suma+a i=i+l accept ’Mai doriti sa introduceți un număr? (d/n) ' to rasp case rasp$’Nn’ exit otherwise ? ’Ati răspuns greșit’ accept ’Mai doriti sa introduceți un număr? (d/n) ’ to rasp endcase enddo if i<>0 media=suma/i ? ’Media = ’, media else ? ’Nu ati introdus niciun număr si nu se poate calcula media’ endif wait ’Acționați orice tasta pentru continuare’ clear return Exemplu. în tabelul Ședințe din baza de date Compania să se numere ședințele care au avut o valoare mai mare decât o valoare precizată, care se va introduce de la tastatură. Să se afișeze numărul acestor ședințe și ce procent reprezintă ele din totalul ședințelor. to 3 4> d o (0 set talk off clear store 0 to k ? 'Programul evalueaza valoarea; ședințelor’ input 'Introduceți valoarea de; referința: ’ to val open database compania use ședințe do while .T. if eof () exit endif if cost s sau numai asupra înregistrărilor care îndeplinesc condiția precizată prin expresia logică , respectiv din clauza for, respectiv while. Observatii: 1. Cuvântul cheie scan marchează începutul structurii, iar cuvântul cheie endscan sfârșitul structurii. 2. Cuvântul cheie scan (împreună cu adverbele care precizează înregistrările ce vor fi prelucrate) și cuvântul cheie endscan se scriu fiecare pe câte un rând. 3. Forma implicită a instrucțiunii scan ... endscan este echivalentă cu următoarea instrucțiune do while ... enddo: goto top . . not eof () skip [] [ ] [ ] Forma implicită a instrucțiunii scan ... endscan este echivalentă cu următoarea instruc- țiune for... endfor: goto top fox i=l rx. reccount() skip Informatică Exemplu; Să se afișeze informații despre ședințele ținute de un angajat al firmei de consultanță. Identificatorul angajatului se introduce de la tastatură. set talk off clear store 0 to tot cost, tot timp,k ? fProgramul furnizează informatii despre ședințele de ; consultanta ale unui angajat’ input ’Introduceți identificatorul angajatului: ’ to cod open database compania use ședințe ? ’Lista ședințelor angajatului ’+str(cod,4) scan for id ang=cod ? id cont, data s, timp s, cost s tot cost=tot cost+cost s tot timp=tot timp+timp s k=k+l. endscan ? ’Total ședințe = ’+str(k,3) ? ’Total valoare ședințe = ’+str(tot cost,9) ? ’Total timp ședințe = ’+str(tot timp,9) wait ’Acționați orice tasta pentru continuare’ clear use close databases în Visual FoxPro există două metode de a descompune o problemă în subprobleme (module): 1. Se construiesc modulele sub formă de programe independente. Fiecare program va fi scris într-un fișier separat. Aceste programe se pot apela unele pe altele folosind comanda do. Se obțin astfel comenzi do imbricate. Comanda do acceptă 128 de niveluri de imbricare. 2. Se construiesc modulele sub formă de subprograme. Aceste subprograme pot fi grupate în biblioteci de subprograme. Folosind comanda return se poate controla modul în care se redă controlul altui modul. Comanda are sintaxa: [ | | ] Implicit controlul este redat modulului apelant. Explicit controlul poate fi redat modulului principal (nivel 0 pentru comanda do) dacă se precizează clauza to mașter, unui alt modul identificat prin dacă se precizează clauza to sau se poate returna către modulul apelant o valoare precizată prin dacă modulul apelat este un subprogram de tip funcție. c s Executarea unui modul poate fi controlată prin comenzile , , și: -> Comanda - care întrerupe execuția unui program. în timpul suspendării execuției se pot executa alte comenzi, se pot vizualiza variabile de memorie etc. Variabilele de memorie create în timpul suspendării sunt variabile private (locale). Comanda este utilă în depanarea programelor. Execuția programului poate fi reluată din punctul în care a fost întreruptă cu comanda resume. regional private I local public Sisteme de gestiune a bazelor de date -> Comandă 4??®- care reia execuția unui program suspendat începând cu linia care a fost întreruptă (comenzile resume și suspend lucrează împreună). -> Comandă Uuî: > - care reexecută comanda anterioară. Ea redă controlul modulului apelant și este utilă în rutinele de tratare a erorilor sau în cazul în care se dorește executarea repetată a unei comenzi până când este îndeplinită o condiție. ¹ v '■') -4 ■■ o fi r IU.SH; A, A îl “ .:-îj ,7- 4 îl «Sr 4. |3 OCMiHies aatH O®; V SÎE LOi! în Visual FoxPro, în funcție de domeniul de vizibilitate, variabilele de memorie se clasifică în: -» - „ sau ,<.. c . . Ele sunt vizibile atât în modulul în care au fost declarate, cât și în modulele activate de acesta, din momentul în care au fost declarate și până când modulul își termină execuția. Se recomandă folosirea lor atunci când unele date sunt folosite în comun de mai multe module ale aplicației. Declararea lor se face cu instrucțiunea Public care are următoarea sintaxă: ■ ic pentru variabilele de memorie și [, ] ([,]) [ ( [, ]) ] ... pentru tablourile de memorie. . .. Sunt vizibile numai în modulul în care au fost create. La terminarea execuției modulului, ele vor fi distruse, eliberându-se zona de memorie pe care o ocupau. Folosirea lor este utilă pentru a se elimina confuziile care apar atunci când se folosesc variabile cu același nume în două module diferite. Ele pot fi create cu instrucțiunea Local care are următoarea sintaxă: ¹ c । pentru variabilele de memorie și locc 1 [c. c ..ₛ ] ([ ,]) [ ( [ ,]) ] ... pentru tablourile de memorie. -> Sunt ascunse de modulele superioare. Se recomandă folosirea lor atunci când se dorește memorarea de valori diferite, în module diferite, folosind același identificator. Ascunzând o variabilă sau un tablou de memorie, operațiile de modificare a valorilor executate în modulul curent nu vor fi percepute de modulele superioare. Declararea lor se face cu instrucțiunea Private care are următoarea sintaxă: "i.c pentru un grup de variabile și tablouri de memorie care nu poate fi descris cu ajutorul unui șablon și p. | <șablon>] pentru un grup de variabile și tablouri de memorie care poate fi descris cu un șablon. -> Reo,x Sunt vizibile într-o anumită regiune a modulului. Se recomandă folosirea lor atunci când se dorește memorarea de valori diferite, în regiuni diferite ale modulului, folosind același identificator. Pentru aceasta, trebuie create mai întâi regiunile modulului, folosind directiva de compilare #Region astfel: f. ' ' ' Se pot crea maxim 32 de regiuni numerotate de la 0 la 31. După declararea regiunii se pot declara și variabilele din acea regiune cu instrucțiunea Regional care are sintaxa: Informatică Observații: 1. Instrucțiunile public, local și regional creează variabile de memorie. O variabilă de memorie trebuie declarată globală, locală respectiv regională înainte de a i se atribui valori și de a fi folosită în cadrul modulului. 2. Comanda private nu creează variabile de memorie; ea schimbă numai statutul variabilelor de memorie precizate. 3. Variabilele și tablourile de memorie create în fereastra de comenzi sunt publice. Limbajul gazdă Visual FoxPro permite folosirea parametrilor de comunicare. Pentru transmiterea datelor se pot folosi maxim 27 de parametri. Ei pot fi variabile de memorie locale sau globale. Transmiterea valorilor prin intermediul parametrilor se face astfel: 1. în modulul apelat, pentru fiecare parametru trebuie să se precizeze denumirea sim- bolică folosită în interiorul modulului, adică trebuie precizată lista de parametri for- mali. Pentru declararea parametrilor formali se folosește instrucțiunea Parameters sau Lparameters care trebuie scrisă ca primă instrucțiune în modulul apelat. Deosebirea dintre cele două instrucțiuni constă în tipul de vizibilitate al variabilelor de memorie declarate ca parametri: cu Lparameters variabilele de memorie vor fi locale, iar cu parameters vor fi private. Instrucțiunile au următoarea sintaxă , - | . ■ arametri_formali> 2. La activarea modulului apelat, parametrilor de comunicare li se atribuie valori concrete cu care se va executa modulul la acel apel, adică se comunică lista de parametri actuali. Lista se comunică prin clauza ■ a comenzii Atribuirea valorilor se face respectând regula de corespondență. De aceea, în cele două liste de parametri trebuie să se respecte aceeași succesiune a parametrilor și același tip de date pentru fiecare pereche de parametri. Se acceptă însă ca lista de parametri actuali să conțină mai puțini parametri decât lista de parametri formali (dar nu mai mulți parametri), în acest caz, parametrii formali cărora nu li s-a atribuit o valoare folosind regula de corespondență vor fi inițializați cu valoarea logică .F.. Se poate afla numărul de parametri transmiși unui modul folosind funcția । 1 - Pentru transmiterea datelor între module se pot folosi două metode: 1. >nsmitemg urin Valoarea transmisă este afectată de eventualele modificări aduse în modulul apelat. La sfârșitul executării modulului apelat, conținutul variabilelor de memorie folosite ca parametri este trecut în variabilele de memorie din modulul apelant. 2. Transmiterea psin valoare. Valoarea transmisă nu este afectată de eventualele modificări aduse în modulul apelat. La sfârșitul executării modulului apelat, conținutul variabilelor de memorie din modulul apelant, folosite ca parametri, nu este actualizat cu conținutul variabilelor de memorie din modulul apelat. în cazul modulelor de tip program, transmiterea se face implicit prin referință. Pentru a schimba modul de transmitere, numele parametrului trebuie scris între paranteze rotunde: }. Sisteme de gestiune a bazelor de date set procedare do ... with procedare | function Subprogramele pot fi proceduri (returnează un rezultat, nici un rezultat sau mai multe rezultate prin intermediul listei de parametri) și funcții (returnează un singur rezultat prin numele său). Tipul subprogramului determină și modul în care este activat (lansat în execuție): procedura printr-o instrucțiune de apel și funcția în cadrul unei expresii unde este folosită ca operand. Din punct de vedere al constructorului, subprogramele se clasifică în subprograme de sistem și subprograme utilizator. Limbajul gazdă Visual FoxPro permite lucrul cu: Proceduri utilizator Funcții de sistem utilizator (UDF - User Defined Functions) Construirea unei proceduri sau a unei funcții utilizator se face astfel: | rocedură> | | [ []] Prin instrucțiunea , respectiv , se definește antetul subprogramului (tipul și numele). Dacă la sfârșitul subprogramului nu se scrie instrucțiunea return (care semnifică terminarea subprogramului), acesta se consideră terminat atunci când se întâlnește un alt antet de subprogram sau sfârșitul fișierului. Adverbul din comanda return reprezintă valoarea întoarsă de funcție sau procedură prin numele său. Dacă nu se precizează valoarea returnată aceasta va fi .T.. Activarea unei proceduri se face cu instrucțiunea: iar a unei funcții se face fie prin instrucțiunea do, fie ca operand într-o expresie, fie folosind comanda =. Dacă o procedură furnizează un singur rezultat, returnat printr-o variabilă de memorie căreia i se atribuie valoarea expresiei din comanda return, ea poate fi activată la fel ca o funcție, ca operand într-o expresie. Subprogramele pot fi scrise: 1. în Subprogramele se vor scrie după in- strucțiunile programului principal. 2. într-o . Biblioteca de programe din Visual FoxPro se numește fișier de proceduri. Pentru a putea folosi un subprogram din bibliotecă, înainte de a-1 activa trebuie deschisă biblioteca, iar după ce s-a terminat lucrul cu subprogramele din bibliotecă, ea trebuie închisă. Starea unei biblioteci poate fi controlată cu parametrul de sistem a cărui valoare se stabilește cu comanda: / [] unde este numele bibliotecii care se deschide. Comanda fără parametru închide biblioteca deschisă. set procedure to Transmiterea parametrilor se va face implicit prin referință, dacă se activează subprogramul cu comanda do, și prin valoare, dacă se activează subprogramul ca un operand. Modul de Folosind facilitatea de autodocumentare aflați ordinea în care comanda do alege subprogra- mul pe care îl lansează în execuție în funcție de fișierul în care este memorat. Informatică transmitere a parametrilor poate fi controlat cu parametrul sistemului care are valoarea reference, pentru transmiterea prin referință, și valoarea value pentru transmite- rea prin valoare. Valoarea parametrului se stabilește cu comanda set Observație: Se mai poate stabili modul de transfer pentru fiecare parametru astfel: dacă numele este scris între paranteze, transferul se face prin valoare, iar dacă este precedat de caracterul transferul se face prin referință. a. Se creează fișierul sursă, se compilează și se lansează în execuție folosind meniul aplicației: ■ Se deschide o fereastră a editorului de texte încorporat, astfel: se deschide caseta de dialog New cu opțiunea de meniu File->New...; se alege, din grupul de butoane radio File Type, opțiunea Program și apoi se acționează declanșatorul New File. ■ Se deschide fereastra de editare. Folosind operația Save As se atribuie fișierului numele testl.prg. ■ Se scrie în fereastra de editare textul programului din exemplul prezentat la structura liniară. ■ Se compilează fișierul sursă cu opțiunea de meniu Program->Compile. ■ Se salvează fișierul sursă și se închide fereastra de editare fie cu opțiunea de meniu, fie folosind butonul de închidere al ferestrei, fie apăsând tastele Ctrl+W. ■ Se lansează în execuție programul cu opțiunea de meniu Program->_Do.... b. Se creează fișierul sursă, se compilează și se lansează în execuție folosind limbajul de comandă: ■ Se deschide o fereastră a editorului de texte cu comanda: modify command test2 ■ Se deschide fereastra de editare care are titlul test2.prg. Se scrie în această fereastră textul programului din exemplul prezentat la structura alternativă simplă. Se salvează și se închide fereastra de editare. ■ Se compilează fișierul sursă cu comanda: compile test2 ■ Se lansează în execuție programul cu comanda: do test2 Se creează fișierele sursă, se compilează și se lansează în execuție pentru toate exemplele prezentate la secțiunea Structuri de control. Se scrie următorul program sursă în fișierul exl.prg și se lanseaza in execuție: set talk off al = 10 a2 = 20 do ascunde ? 'Afiseaza variabilele din; program după revenire din; procedura' ? al, a2 && Afiseaza 10, 200 procedure ascunde private al al = 100 a2 = 200 ? 'Afiseaza variabilele din; procedura' ? 'al= ' ?? al && Afiseaza 100 ? ¹a2= ' ?? a2 && Afiseaza 200 return Sisteme de gestiune a bazelor de date Se scrie următorul program sursă în fișierul ex2.prg și se lansează in execuție. Se observă valorile afișate și comportamentul variabilelor publice. Se compară acest exemplu de program (în care variabilele de memorie a1 și a2 au fost declarate publice) cu exemplul anterior în care nu au fost declarate publice. Se observă că prin comanda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2 sunt eliberate variabilele de memorie specificate set talk off public al,a2 al = 10 a2 = 20 do ascunde ? ’Afiseaza variabilele din; program după revenire din; procedura’ ? al, a2 && Afiseaza 10, 200 release all display memory like a? release al,a2 display memory like a? în listă, chiar dacă sunt publice. procedure ascunde private al al = 100 a2 = 200 ? ’Afiseaza variabilele din; procedura’ ? ’al = ' ?? al && Afiseaza 100 ? ’ a2 = ’ ?? a2 && Afiseaza 200 return Se scrie următorul program sursă în fișierul ex3.prg și se lansează în execuție: * Se creeaza doua regiuni * In prima regiune se creeaza variabilele al,a2,a3,a4 * In a doua regiune se creeaza variabilele a2,a3,a4,a5 ★ Variabilele a2,a3,a4 sunt comune celor doua regiuni # region 1 regional al,a2,a3,a4 store 10 to al,a2,a3,a4 # region 2 regional a2,a3,a4,a5 store 20 to a2,a3,a4,a5 ? 'Observați modul in care sunt afișate variabilele’ ? 'regionale care folosesc același identificator’ display memory like a* # region 1 ? a2, a3, a4 # region 2 ? a2, a3, a4 return Să se calculeze C„. Pentru calculul factorialului se va folosi un subprogram. Se scrie următorul program sursă în fișierul ex4.prg și se lansează în execuție. Subprogramul folosit este de tip procedură și va fi scris după instrucțiunile din programul apelant clear input 'm= ’ to m set talk off do fact with n,fl public n,m,fl,f2,f3 do fact with m, f2 ? 'Programul calculează; do fact with n-m,f3 combinări de n luate cate m' c=fl/(f2*f3) input ’n= ' to n ? 'Combinări = ', c Informatică .-_- ᵣeturn procedure fact parameters j,p store 1 to i,p for i=l to j p=p*i endfor return Se scrie următorul program sursă in fișierul exo.prg și se lanseaza in execuție. Subprogramul folosit este de tip funcție. Se compară modul în care a fost rezolvată aceeași problemă folosind cele două tipuri de subprograme clear set talk off public n,m ? ¹ Programul calculează; combinări de n luate cate m’ input ’n= ¹ ton input 'm= ¹ to m c=fact(n)/(fact(m)*fact(n-m)) ? ¹ Combinări = ’ᵣc 6. ' f C . ' C ~ ( 'ir r Se scrie următorul program sursă în fișierul clear if set(’talk’)=fon’ set talk off endif set udfparms to value n=10 ?test(n),n && Afiseaza 70f 10 set udfparms to reference 7= Se wnstohsfe el s® fofesesto S return function fact parameters j fact=l for i=l to j fact=fact*i endfor return fact ex7.prg și se lansează în execuție. n=10 ?test(n),n && Afiseaza 70, 70 return function test parameters y y=2*y+50 return y Se construiește in fișierul vectori.prg o biblioteca cu operații pentru vectori, care sa conțină: proceduri pentru citirea unui vector, pentru afișarea unui vector, pentru concatenarea a doi vectori, pentru interclasarea a doi vectori, pentru divizarea unui vector, o funcție pentru căutarea unui element cu o valoare precizată într-un vector (funcția va furniza un rezultat numeric: prima poziție în care a fost găsit elementul în vector sau -1 dacă nu a fost găsit) și o procedură de căutare care va comunica toate pozițiile în care a fost găsit un element cu o valoare precizată (se va folosi dacă există mai multe elemente cu aceeși valoare în vector). După ce s-a scris fișierul sursă, se compilează ca să nu conțină erori de sintaxă. procedure creare parameters a,n local i ? ’Creati un vector cu n elemente¹ input ’n= ’ to n dimension a(n) for i=l to n input ’a(¹+str(i,2)+’)= ’ to; a (i) endfor return procedure afișare parameters a ,n local i,j ? ’Se afiseaza un vector cu str(n,2)+’ elemente’ i=l do while i<=n-l for j=l to 10 ?? str(a(i),6)+’, ’ i=i + l if i=n exit endif endfor if i<=n-l ? endif enddo ?? str(a(n)ₜ 6) return procedure concatenare parameters a,b,c,n,m dimension c(n+m) ?acopy(a, c,1, n,1) ?acopy(b,c,1,m,n+1) procedure divizare parameters a,b,c,n,m dimension b(m) dimension c(n-m) ?acopy(a,b,1, m,1) ?acopy(a, c,m+1,n-m,1) return procedure interclasare parameters a,b,c,n,m dimension c(n+m) ?acopy(a,c,1,n,1) ?acopy(b,c,1,m,n+1) ?asort(c) return Sisteme de gestiune a bazelor de date function caut parameters a, n, x local i k=-l for i=l to n if a (i)=x k=i exit endif endfor return k procedure cautv parameters a,n,x,t,k local i,j k=-l j = 0 for i=l to n if a(i)=x j=j + l dimension t(j) t(j)=i k=j endif endfor return Se testează biblioteca folosind următoarele programe: testl.prg pentru verificarea operației de căutare, test2.prg pentru verificarea operației de concatenare, test3.prg pentru verificarea operației de interclasare și test4.prg pentru verificarea operației de divizare. testl.prg set talk off ? ’Cu acest program lucrati cu; vectori cu elemente numerice’ public m,p,x,v(1),u(1) clear note Se deschide biblioteca set procedure to vectori do creare with v,m do afișare with v,m ? ’Puteti cauta o valoare; numerica x in vector’ input ’x= ’ to x ?? ’Veti afla prima poziție in; care a fost găsită’ if caut(v,m,x)=-l ? ’Nu exista elementul cautat’ test2.prg set talk off public p,q,x(l),y(l),z(l) clear else ? 'Prima poziție in care se; gaseste valoarea este ’; +str(caut(v,m,x),2) do cautv with v,m,x,u,p if p>l ? 'Valoarea apare in mai; multe poziții ? 'Pozițiile găsite sunt:’ do afișare with u,p endif endif note Se închide biblioteca set procedure to return set procedure to vectori ? 'Programul concateneaza doi; vectori numerici’ Informatică ? 'Comunicati primul vector' do creare with x,p ? 'Comunicati al doilea vector’ do creare with y,q test3.prg - La fel ca la test2.prg numai că în loc de do with x, y, z f p, q se scrie dc interclasare test4.prg set talk off public p,q,x(l),y(l),z(l) clear set procedure to vectori ? ’Programul divizează un; vector numeric in doi vectori’ ? ’Comunicati vectorul care se; divizează’ do creare with x,p 129 do concatenare with x,y,z,p,q do afișare with z,p+q set procedure to return concatenare with x,y,z Ap,q input ’Numărul de elemente; preluate de primul vector = ’; to q do divizare with x,y,z,p,q ?’Primul vector obtinut' do afișare with y,q ?’Al doilea vector obtinut’ do afișare with z,p-q set procedure to return 1. Să se scrie un program care creează o matrice cu 2 linii și 5 coloane în care se memorează în ordine primele 10 numere naturale: 1 2 3 4 5 6 7 8 9 10 Să se afișeze apoi aceste numere pe ecran, în ordine, pe cinci linii și două coloane: 1 2 9 10 și apoi sub forma unui triunghi: 1 2 3 4 5 6 7 8 9 10 2. Să se scrie un program prin care se caută un element într-o matrice. Dimensiunea matricei, elementele matricei și valoarea căutată se introduc de la tastatură. Pro- gramul va afișa numărul de ordine al elementului, numărul liniei și numărul coloanei, în cazul în care se găsește elementul, și un mesaj, dacă nu se găsește. 3. Să se scrie un program pentru rezolvarea ecuației de gradul II cu coeficienți numere reale. Coeficienții a,b,c se introduc de la tastatură. Programul trebuie să permită reluarea rezolvării problemei pentru mai multe seturi de date de intrare (seturi de coeficienți) și să calculeze atât rădăcinile reale, cât și cele complexe. 4. Să se scrie un program care să șteargă înregistrările dintr-un tabel pentru care un câmp de tip șir de caractere este vid. Se presupune că tabelul are cel puțin un câmp de tip șir de caractere care poate fi vid. Numele tabelului și numele câmpului se introduc de la tastatură (se folosesc tabele din baza de date Compania pentru a testa programul). 5. Să se scrie un program care să realizeze următoarele prelucrări asupra unui șir de caractere introdus de la tastatură: — Să se numere cuvintele din text în următoarele două variante: a1) cuvintele sunt separate printr-un singur spațiu; a2) cuvintele sunt separate prin două sau mai multe spații. 130 Sisteme de gestiune a bazelor de date — Să se numere caracterele din text și să se precizeze: b1) câte consoane sunt; b2) câte vocale sunt; b3) câte cifre sunt; b4) câte semne speciale sunt. — Să se înlocuiască în text un șir de caractere cu un alt șir de caractere. Cele două șiruri de caractere se introduc de la tastatură. Se vor înlocui toate aparițiile șirului de caractere precizat în următoarele cazuri: c1) nu contează diferența dintre literele mari și mici; c2) contează diferența dintre literele mari și mici; c3) nu contează dacă șirul de caractere este un cuvânt + cerința c2; c4) șirul de caractere este un cuvânt + cerința c2. — Să se afișeze în ordine alfabetică cuvintele din text. — Să se numere cuvintele care au m caractere. Valoarea lui m se introduce de la tastatură. — Să se afișeze frecvența de apariție a literelor în text. Afișarea se va face pe ecran sub forma: Literea a sau A .................... 20 Literea b sau B ............ 5 Lista se va afișa sortat în două moduri: în ordinea alfabetică a literelor și în ordinea descrescătoare a frecvenței de apariție. — Să se afișeze litera care are cea mai mare frecvență de apariție în text. — Să se afișeze media aparițiilor și abaterea medie pătratică. Ce informații obțineți comparând cele două valori obținute. 6. Să se realizeze un tabel în care să se memoreze evoluția cursului leu-euro din luna precedentă. Pentru fiecare zi din lună se vor memora următoarele informații: data, valoarea cursului, indicele cu bază fixă (raportul dintre cursul zilei și cursul din ziua de început a perioadei de analiză), indicele cu bază în lanț (raportul dintre cursul zilei și cursul din ziua precedentă), sporul cu bază fixă (diferența dintre cursul zilei și cursul din ziua de început a perioadei de analiză), sporul cu bază în lanț (diferența dintre cursul zilei și cursul din ziua precedentă). Crearea structurii tabelului și încărcarea câmpurilor pentru dată și curs se va face la nivel de limbaj de comandă. Pentru calcularea celorlalte câmpuri se va folosi un program. Să se afișeze următoarele informații folosind datele din tabel: ziua cu cel mai mare curs, ziua cu cel mai mic curs, media aritmetică a cursului și abaterea medie pătratică a cursului. Aceste informații se vor furniza în două moduri: cu ajutorul limbajului de comandă și cu ajutorul unui program. 7. Să se realizeze un tabel în care să se memoreze situația notelor și a mediilor, la disciplina Informatică, a elevilor dintr-o clasă. Tabelul va conține următoarele informații: numele și prenumele elevului, poziția lui din catalog, cinci note pentru primul semestru, cinci note pentru cel de al doilea semestru, două note pentru tezele de pe cele două semestre, mediile de pe cele două semestre și media anuală. Crearea structurii tabelului și încărcarea câmpurilor cu numele și prenumele elevului, poziția lui din catalog și notele se va face la nivel de limbaj de comandă. Pentru calcularea mediilor se va folosi un program. La calcularea mediilor trebuie să se țină cont de următoarele: — este posibil ca un elev să primească mai puțin de cinci note; — teza are ponderea de 25% din media semestrială. Să se scrie un program care să afișeze următoarele informații: Informatică 131 — corigenții de pe fiecare semestru și corigenții anuali; — o listă ordonată alfabetic după numele și prenumele elevilor, care să conțină numele, prenumele, mediile semestriale și media anuală; — o listă ordonată descrescător după media anuală care să conțină numele, prenu- mele, mediile semestriale și media anuală; — numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 și res- pectiv pe an; — media generală a clasei și abaterea medie pătratică a mediilor pe fiecare semes- tru și pe an (ce concluzie trageți prin compararea acestor medii?). 8. Să se completeze biblioteca vectori cu următoarele subprograme pentru operații cu vectori: proceduri pentru adunarea și produsul vectorial a doi vectori și funcții pentru produsul scalar a doi vectori și pentru suma și produsul elementelor unui vector. Să se testeze noile subprograme adăugate la bibliotecă. 9. Să se construiască o bibliotecă pentru operații cu mulțimi care să permită executarea următoarelor operații: citirea și afișarea unei mulțimi, reuniunea, intersecția, diferența, diferența simetrică, produsul cartezian a două mulțimi, cardinalul unei mulțimi (numărul de elemente), apartenența unui element (a cărui valoare o veți comunica de la tastatură) la o mulțime. Pentru mulțimi se va folosi tipul de date vector. Spre deosebire de un vector oarecare, într-un vector care păstrează elementele unei mulțimi nu pot exista două elemente cu aceeași valoare. 1O. Să se construiască o bibliotecă cu operații cu șiruri de caractere în care să păstrați subprograme pentru rezolvarea cerințelor de la problema 5. Construiți programe pentru testarea acestei biblioteci. 11. Folosind editorul de texte Notepad se vizualizează conținutul fișierelor clienți.dbf și clienți.fpt. Orice persoană care vrea să citească datele din tabelele bazei de date poate face acest lucru cu un simplu editor de texte. Cu puțin efort poate identifica ce reprezintă fiecare dată și poate obține anumite informații care pot fi secrete. Pentru a evita acest lucru se pot codifica datele de tip alfanumeric (câmpurile de tip șir de caractere aflate în fișierul cu extensia .dbfși câmpurile memo aflate în fișierul cu extensia .fpt). Se va crea un cod simplu: se translatează cu o valoare stabilită (de exemplu 15) codurile ASCII ale caracterelor. Se construiesc două subprograme: unul pentru codificare (care va fi folosit înainte de închiderea bazei de date) și unul pentru decodificare (care va fi folosit la deschiderea bazei de date). Șirurile de caractere pot conține numai cifre, litere și anumite semne speciale. Pentru a evita afișarea în șirurile de caractere codificate a altor caractere, se poate complica codul folosind pentru același tip de caractere (cifre, litere sau semne speciale) o translatare circulară. De exemplu, pentru literele mici se consideră că după litera z urmează litera a; în acest mod, pentru o translatare cu 15, în locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII 97+15=112), iar în locul literei z (cod ASCII: 122) se va folosi litera o (cod ASCII 97-1+15=111). - 2.7 i'rj. pe obiecte Conceptele cu care operează programarea orientată pe obiecte sunt: î" ' (object) reprezintă un ansamblu de date (un număr fix de variabile) și subprograme (proceduri și funcții) necesare pentru prelucrarea datelor. Datele poartă numele de proprietăți, iar subprogramele numele de metode sau evenimente. Proprie- 13/ Sisteme de gestiune a bazelor de date tățile, metodele și evenimentele sunt membrii unui obiect. Interfața de acces la obiect este realizată numai prin intermediul metodelor. în acest mod, subprogramele membre ale unui obiect prelucrează datele membre ale obiectului care apelează metoda. - . ■-> (property) reprezintă un atribut al unui obiect care definește una dintre caracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate avea proprietatea visible care determină dacă obiectul este vizibil la un moment dat. 7 c. 7 c (method) reprezintă acțiunea pe care o poate executa un obiect. Utilizatorul unui obiect are acces la date numai prin intermediul metodelor obiectului, iar metoda are acces implicit la membrii unui obiect. Metodele ascund celui care utilizează obiectul amănunte despre modul în care a fost implementat. De exemplu, un obiect vizual de tip listă are implementate metode necesare pentru întreținerea listei: adăugarea unui articol la listă, ștergerea unui articol din listă etc. \ > . (event) reprezintă o acțiune recunoscută de obiect pentru care se poate scrie un subprogram ca răspuns. Evenimentele pot fi externe, adică generate de acțiuni ale utilizatorului (un clic cu mouse-ul, mișcarea mouse-ului, apăsarea unei taste) sau interne, adică generate printr-un cod de program sau de sistem. Clasa (class) reprezintă definiția unui anumit tip de obiect. Definiția cuprinde descrierea proprietăților și a metodelor obiectului. Folosirea claselor permite gestionarea mai multor obiecte de același tip. Clasa este însă doar un termen abstract, un șablon care definește caracteristicile unui obiect (cum arată și cum se comportă). instențu (instance) reprezintă un obiect creat pornind de la definiția unei clase. Spre deosebire de clasă, care este doar o definiție, o instanță există ca un obiect care poate fi folosit pentru a executa anumite acțiuni. De exemplu, o casetă de text dintr-un formular este o instanță a clasei TextBox care descrie acest tip de obiecte vizuale. ¹'.eUh'Jic ,„bjLușjje (multiple instances) reprezintă mai multe obiecte create de aceeași clasă. Obiectele au propriile proprietăți și date private, dar folosesc împreună codul de program. (encapsulation) reprezintă un mecanism prin care folosind o singură definiție sunt incluse în obiect datele și metodele. Datele membre ale unui obiect nu pot fi modificate decât prin intermediul metodelor proprii obiectului respectiv. încapsularea izolează complexitatea internă a unui obiect de restul aplicației. (inheritance) este o facilitate oferită de programarea pe obiecte prin care o clasă nouă numită clasă copil (child class) se poate construi pornind de la o clasă existentă numită clasă părinte (parent class) prin preluarea caracteristicilor clasei părinte. Clasa copil se mai numește și clasă derivată (subclass), iar clasa părinte clasă de bază (base class). Folosind această facilitate se poate crea o ierarhie de clase și se poate dezvolta ușor un software existent. Clasa copil moștenește accesul la datele și metodele strămoșilor. La acestea, programatorul poate adăuga proprietăți și metode noi, definite explicit în noua clasă. Orice modificare într-un strămoș se reflectă și la urmași. De exemplu, dacă o clasă Text are proprietatea ca textul să fie scris îngroșat, orice urmaș al acestei clase va avea această proprietate. Fiecare clasă se identifică printr-un nume. O clasă se poate crea cu instrucțiunea bloc define class care are sintaxa: Informatică_____ ________ _____________ ______________________________ dr r c ar [[protected. , ,... ] = ...] [ otpr <. [p. o-o o* a] as [ J ( 1 ] [[ ea] Faceri 7^ | procedee ' ' ; Ja i.i.. Lxx ș | A CO - O X ] e. Prin această instrucțiune se definește clasa identificată prin . Definiția noii clase se bazează pe clasa părinte precizată prin din clauza as de la care moștenește proprietățile, metodele și evenimentele. Clasa părinte poate fi o clasă predefinită sau o clasă definită de utilizator. La noua clasă pot fi adăugate: — Axaăîi noL Ele vor fi precizate printr-o listă de operații de atribuire = , unde este numele proprietății, iar este valoarea cu care se inițializează proprietatea. Proprietățile pot fi protejate, adică se poate împiedica acce- sul la proprietate și se poate împiedica modificarea ei din afara definiției clasei. Prote- jarea unor proprietăți se precizează cu clauza protected însoțită de lista de proprietăți care vor fi protejate: , ,.... — . ■ - Le x . Fiecare obiect nou care va fi adăugat la definiția clasei este precizat printr-o clauză add object. Obiectul va fi identificat prin și va fi adăugat dintr-o clasă precizată prin din clauza as. Obiectul adăugat poate fi protejat, adică se poate împiedica accesul și modificarea lui din afara clasei, dacă se precizează clauza protected. Metodele și evenimentele clasei vor avea însă acces la proprietate. Implicit, se execută metoda de inițializare a obiectului la adăugarea obiectului. Explicit nu se face inițializarea dacă este precizată clauza noinit. Explicit se pot preciza cu clauza with lista proprietăților și valorile proprietăților care se adaugă obiectului adăugat la clasă. — e-fcdh și evenfoj&nte rol Ele sunt create ca un set de subprograme (proceduri și funcții). Fiecare funcție și procedură este delimitată de cuvintele cheie function și endfunc și respectiv procedure și endproc. între cuvintele cheie se scrie secvența de instrucțiuni care formează corpul subprogramului. Se pot folosi parametri de comunicație între subprogram și obiect sau între subprogramele aceleiași clase. Parametrii se declară la începutul fiecărui subprogram cu instrucțiunea parameters sau Lparameters. Metodele pot fi protejate (este împiedicat accesul la ele din afara obiectului) dacă se precizează clauza protected înainte de a scrie subprogramul asociat. Metoda va fi un subprogram care va acționa asupra obiectului creat pe baza clasei și care poate fi apelat indiferent de îndeplinirea unor condiții, iar evenimentul va fi un subprogram care se va executa numai atunci când se produce o acțiune (de exemplu un clic cu mouse-ul) recunoscută de obiectul creat pe baza clasei. Observatii: 1. Define class este instrucțiune deoarece nu poate fi folosită în modul interactiv, ci numai în programe. Instrucțiunea are o sintaxă de bloc, deoarece este formată dintr-un ansamblu de instrucțiuni. Blocul de instrucțiuni începe cu comanda define class și se termină cu cuvântul cheie enddefine. Instrucțiunile componente sunt scrise în sintaxa blocului fiecare pe câte un rând și trebuie scrise pe un singur rând și în cadrul unui program (la fel ca orice instrucțiune independentă). 2. Clauza as precede numele clasei părinte pe care se bazează definiția noii clase sau a unui obiect adăugat la o clasă container. 134 Sisteme de gestiune a bazelor de date Mecanismele programării orientate pe obiecte sunt implementate astfel: 1. încapsularea. Prin folosirea comenzii define class sunt incluse în aceeași clasă definițiile pentru proprietățile, metodele și evenimentele unui obiect. 2. Moștenirea. O clasă poate fi definită pe baza definiției altei clase folosind clauza as . Proprietățile clasei părinte nu vor mai fi definite în clasa derivată, în care vor fi definite numai proprietățile și metodele noi. Visual FoxPro are implementate mai multe f-irs* ⁱr- care permit crearea unor obiecte cu care poate fi construită interfața unei aplicații, cum sunt de exemplu casetele de text, comutatoarele, butoanele radio, listele, formularele etc. Folosind facilitatea de moștenire, se pot defini două categorii de clase: 1. Clase vizuale care permit crearea obiectelor vizuale ce pot fi folosite la realizarea interfeței. Definiția acestor clase se bazează pe una dintre clasele predefinite vizuale. Altfel spus, clasele vor avea ca strămoș una dintre clasele predefinite. De exemplu, pornind de la clasa predefinită form, care descrie obiecte vizuale de tip formular, se poate crea o nouă clasă, care să descrie tot un obiect de tip formular, dar cu proprietăți modificate și eventual cu metode noi față de formularul predefinit. 2. Clase nevizuale care permit crearea unor obiecte nevizuale. Definiția acestor clase se bazează pe clasa custom sau pe clasele predefinite nevizuale (de exemplu clasele timer sau cursor). Clasele derivate din clasa custom se mai numesc și clase definite de utilizator. De exemplu, pornind de la clasa custom se poate crea o nouă clasă, care să descrie comportamentul unui număr complex. Clasa container este formată dintr-un grup de clase similare (clase predefinite sau deri- vate din acestea) care pot fi tratate ca o unitate. De exemplu, clasa predefinită form (a formularelor) este un grup de clase de controale predefinite tratate ca o unitate, iar clasa form set (a setului de formulare) este și ea o clasă container care conține unul sau mai multe formulare legate între ele. Instanța unei clase container este un obiect container. Obiectul container este un obiect care conține pe lângă proprietăți, metode și evenimente și alte obiecte. El permite accesul la obiectele pe care le conține. Obiectul container este foarte util la construirea interfețelor. De exemplu, un formular de tip casetă de dialog este un obiect container care poate conține alte obiecte cu care se poate asigura un dialog interactiv cu utilizatorul: liste, comutatoare, butoane radio, casete de text etc. Clasele predefinite au implementate următoarele evenimente: — init (se produce la crearea obiectului), — Destroy (se produce la eliberarea obiectului), — Error (se produce la apariția unei erori în timpul execuției unei metode) și metode: — AddObject (adaugă un obiect la un container în timpul execuției), — cioneObject (creează o copie a obiectului), — RemoveOb ject (înlătură un obiect dintr-un container în timpul execuției). Exemplu. Se creează o clasă cu numele formular pe baza clasei vizuale form (clasa predefinită a formularelor). Obiectele din această clasă vor fi obiecte container, deoarece obiectul formular conține alte trei obiecte: două care se bazează pe clasa CommandButton (adică vor fi butoane de comandă), iar unul care se bazează pe clasa ListBox (adică va fi o listă). Clasa formular va conține pe lângă proprietățile, metodele și evenimentele clasei form proprietățile nume și versiune și metoda click. Informatică 135 define class formular as form * Se definesc proprietățile nume si versiune. Ele sunt * inițializate cu 20 de spații, respectiv cu un șir de caractere. * Proprietatea versiune va fi protejată. protected versiune nume=space(20) versiune=’1.0’ * Se precizează obiectele care vor fi adăugate. * Pentru obiectele cbl si cb2 se vor modifica valorile proprietă- * ților caption (legenda) și backcolor (culoarea fundalului). add object cbl as CommandButton; with Caption=’Da’, BackColor = 2 add object cb2 as CommandButton; with Caption=’Nu’, BackColor = 2 add object lista as ListBox * Se scrie metoda Click cu ajutorul unei proceduri. procedure Click = messagebox(’Ati executat un clic în formular’) endproc enddefine Observație: Clasele pot fi definite și modificate interactiv prin intermediul constructorului de clase - Class Designer care poate fi activat cu comanda create dass. 2.7,3.3. Obiectele Obiectele se creează pe baza claselor definite. Obiectul este instanța unei clase. Pen- tru crearea unui obiect se folosește funcția createobjectț) care are sintaxa: createobject('' [,, , ...]) Rezultatul furnizat de funcție este de tip referință către un obiect. Obiectul se creează pe baza clasei identificate prin , iar pentru crearea sa se poate face transfer prin parametrii din lista , ,.... Numele clasei va fi scris nu ca un identificator, ci ca un șir de caractere. Pentru a putea folosi obiectul, trebuie să se atribuie referința către obiect unei variabile de memorie. în acest mod, numele variabilei de memorie va putea fi folosit pentru a referi obiectul. Exemplu: Se creează un obiect pe baza clasei clasa definite anterior. Variabilei de memorie obiect i se atribuie referința către acest obiect obiect = createobject('clasa') în lucrul cu clase și obiecte se folosesc următorii operatori specifici: -> Operatorul punct . - se folosește pentru a separa numele obiectului de numele părintelui sau pentru a separa numele unui membru al obiectului (proprietate, metodă sau eveniment) de numele obiectului. Astfel, pentru a avea acces la unul din membrii unui obiect se folosește construcția: . unde este numele unei proprietăți, al unei metode sau al unui eveni- ment al obiectului. -> Operatorul delimitarea domeniului : : - se folosește atunci când dintr-o clasă trebuie să se apeleze o metodă din clasa părinte. addobjec-tU, removeobject () This, ThisForm 136 Sisteme de gestiune a bazelor de date în cadrul definiției unei clase se pot folosi următoarele la membrii unui obiect sau la alte clase: Parent - obiectul container al obiectului curent. - > This - obiectul curent. - > ThisForm-formularul care conține obiectul curent (formularul curent). - > ThisFormSet - setul de formulare curent care conține formularul curent. Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost create încă (ele au fost definite în cadrul clasei) și implicit nu li s-au atribuit nume pentru a fi referite, în timpul execuției unui program se pot adăuga sau înlătura obiecte dintr-un obiect container folosind metodele obiectului container: ' ;'n-j \ -: pentru adăugarea și RemoveObject() pentru înlăturarea unu: obiect. Aceste metode sunt implementate implicit în marea majoritate a claselor predefinite și în clasa custom. Sintaxa lor este: . addob ject (’ ’ , ’ ’) unde este numele obiectului container la care se adaugă obiectul cu numele ce se creează pe baza clasei și . > (’’) unde este numele obiectului container din care se înlătură obiectul cu numele . Obiectul înlăturat nu va mai fi afișat pe ecran. Observații: în sintaxa celor două funcții numele obiectului container a fost separat prin operatorul punct de numele metodei membru al obiectului container. Exemplu. Se folosește operatorul :: pentru a apela o metodă din clasa părinte (în clasa F2 este apelată metoda click definită în clasa F1 - care este clasa părinte a clasei F2) și referința This pentru a preciza că este vorba de obiectul curent, adică obiectul creat pe baza clasei F2 (This.Backcolor se referă la proprietatea Backcolor a obiectului curent - culoarea fundalului): * Se creează clasa FI care are ca părinte clasa Form define class FI as Form procedure click wait window 'S-a executat clic in formular’ endproc enddefine * Se creează clasa F2 care are ca părinte clasa FI define class F2 as FI procedure click FI: : click This.BackColor=This.BackColor+1 endproc enddefine Exemplu. Se folosesc metodele proprii ale obiectului, se modifică proprietățile unui obiect și se fac referiri la proprietățile și metodele unui obiect folosind operatorul punct: Fl=createobject(’form') && se creează un obiect formular * Se modifică valoarea proprietăților caption (legenda) și * closable (dacă formularul poate fi închis folosind meniul de * control - .T. sau nu - .F.) FI.caption=’Exemplu’ && Numele obiectului este separat de nume- F1.closable=.F. && le proprietății prin operatorul punct. * Se adaugă la formular o linie și două butoane de comandă Informatică 137 * folosind metoda proprie a obiectului pi. '' ¹ (’Li’, ’Line ¹) Fi.addobject(’Bl’,’CommandButton’) Fi.addobject(’B2’,’CommandButton’) * Se modifică unele proprietăți ale obiectelor adăugate Fi.Bl.caption^’Da’ && Operatorul punct a fost folosit pentru a Fi.B2.caption=’Nu’ && separa proprietatea de obiect și Fi.Bl.visible=.T. && obiectul de obiectul container. Fi.B2.visible=.T. Fi.Li.visible=.T. Fi. ’ && Se apelează metoda obiectului prin care; este afișat obiectul Dacă se adaugă un obiect la un obiect container el nu va fi vizibil. Pentru a-1 face vizibil trebuie să i se atribuie proprietății visible valoarea .T. Observație: Se pot specifica proprietăți multiple pentru un obiect cu instrucțiunea with ... endwith. Instrucțiunea nu poate fi folosită în instrucțiunea bloc pentru definirea clasei. Ea are sintaxa: Astfel, în exemplul precedent se pot modifica proprietățile obiectelor adăugate, astfel: with FI with B2 with Bl caption=’Da’ visible=.T. caption=’Nu’ visible=.T. endwith endwith LI. visible=.T . endwith în tratarea accesului la membrii unui obiect pot să apară următoarele cazuri: - > Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. în timpul acestor prelucrări pot să fie necesare diferite variabile temporare. Acestea trebuie definite ca proprietăți ale obiectului, pentru a putea fi folosite în interiorul obiectului, dar trebuie izolate de exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrările din interior. - > Unele dintre subprograme sunt folosite intern de metodele obiectului și nu trebuie să fie folosite și din exterior. Din aceste două cazuri se observă că este necesar să fie controlat accesul la membrii unui obiect. De aceea, membrii unui obiect pot fi: - > uhhcl Accesul la acești membri este posibil din interiorul clasei, dar și din exteriorul ei. - > ^ejațL Accesul la acești membri este posibil din interiorul clasei și din interiorul unei clase derivate din ea. Acești membri vor fi declarați protejați prin intermediul clauzei protected din definiția clasei. Exemplu define class ang as Custom protected data n nume=space(20) pren=space(20) adresa=space(30) data n={ / / } procedure data ns return this.data n endproc enddefine Sisteme de gestiune a bazelor de date Proprietatea data_n este protejată și nu poate fi modificată din exteriorul clasei, în schimb metoda data_ns nu este protejată și poate furniza valoarea proprietății data_n Observatii: 1. După eliberarea unui obiect (de exemplu prin închiderea formularului container), variabila de memorie care a fost folosită pentru referirea lui va conține valoarea nuli. Ștergerea ei din memorie se va face printr-o comandă explicită (release): 2. Atunci când se creează o instanță a unei clase, se păstrează în memorie definiția clasei. Această definiție rămâne în memorie și după ce obiectul a fost eliberat. Ea trebuie ștearsă explicit cu comanda: Pentru a crea și a folosi obiecte se vor scrie următoarele linii de program într-un fișier sursă, la fel ca și în cazul programelor care au fost scrise folosind limbajul gazdă. Blocul instrucțiunii define class se scrie la sfârșit, după instrucțiunile din program, la fel ca și subprogramele. - K'¹::. . Se creează un obiect care descrie comportamentul unui număr complex. Obiectul are proprietățile re (partea reală a numărului), im (partea imaginară a numărului) și modul (modulul unui număr complex) și metoda m pentru calculul modulului. Prin instrucțiunile input se atribuie valori proprietăților re și im. Varianta 1 - Pentru metoda modul se folosește un subprogram de tip procedură. Prin instrucțiunea z.m se apelează metoda m pentru a calcula modulul, iar prin instrucțiunea ?z .modul se afișează valoarea proprietății modul. clear set talk off z=CreateObject('Complex') input 're (partea reală a numărului)= ' to z.re input 'im (partea imaginară a numărului)= ' to z.im z .m ?z.modul define class complex as custom re=0 im=0 modul=0 procedure m this.modul=sqrt(this.re**2 +this.im**2) endproc enddefine Varianta 2 - Pentru construirea metodei modul se folosește un subprogram de tip funcție. Prin instrucțiunea ?z .m() se afișează valoarea furnizată de metoda m. Pentru metodele care returnează valori folosite în expresii trebuie să se scrie între paranteze lista parametrilor actuali (în acest caz lista este vidă; nu există parametri pentru transferul datelor). clear set talk off z=CreateObject('Complex') Informatică input ’re (partea reală a numărului)= ’ to z.re input ’im (partea imaginară a numărului)= ' to z. im ?z.modul() define class complex as ev re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine r . Pe baza clasei complex se definește o clasă nouă complexl care va conține în plus o metodă pentru afișarea numărului complex. Pentru definirea acestei metode se va folosi o metodă internă a clasei nrc (metodă protejată) pentru calcularea cifrelor unui număr și proprietatea nc care are ca valoare numărul de cifre ale părții întregi sau imaginare a numărului complex. Această proprietate este folosită numai intern și de aceea este protejată. Ea este necesară pentru a stabili numărul de poziții afișabile ale unui număr pentru funcția str(). Prin instrucțiunea z. afișare se apelează metoda afișare pentru afișarea unui număr complex. Clasa complexl a moștenit toate proprietățile și metodele clasei complex. clear set talk off z=CreateObject(’Complexl’) input ’re (partea reală a numărului)= ’ to z.re input ’im (partea imaginară a numărului)= ’ to z.im ?z.modul() z.afișare define class complex as custom re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine define class complexl as complex protected nr nr=0 procedure afișare ? ’Numărul complex este: ’+str(this.re,this.nrc(this.re)) do case case this.im>0 ?? । ₊ i*’+str(this.im,this.nrc(this.im)) case this.im<0 ?? ’ - i*’+str(abs(this.im),this.nrc(this.im)) endcase endproc protected function nrc parameter v this.nr=l Sisteme de gestiune a bazelor de date do while v<>0 v=int(v/10) this.nr=this.nr+1 enddo return this.nr endfunc enddefine Exemplul 3. Se creează un obiect care conține proprietățile nume, prenume, adresa, data_n (data nașterii), varsta și metoda pentru calcularea vârstei. Metoda poate fi descrisă fie folosind o procedură, fie folosind o funcție. Varianta 1 - metoda descrisă cu procedură ang = createobject(’angajati’) with ang .nume = ’Popa’ .pren = ’Ion’ .adresa = ’str. Zorilor nr. 34’ .data n = {02/07/83} endwith clear ? ang.nume + ’ ’ + ang.pren ? ang.adresa ? ang.data n ang. v Varianta 2 - metoda descrisă cu funcție *Scrieti secvența corespunza- *toare de instrucțiuni clear display object like ang ? ang.nume + ’ ’ + ang.pren ? ang.adresa ? ang.data n ? ang.v() ??’ ani’ define class angajati as custom nume = space(20) ? ang.varsta define class angajati AS custom nume = space(20) pren = space (20) adresa = space (30) data n = { \ \ } varsta = 0 procedure v this.vărsta=int((date() this.data n)/365) endproc enddefine pren = space (20) adresa = space (30) data n = { \ \ } varsta = 0 function v this.vărsta=int((date()-; this.data n)/365) return this.varsta endfunc enddefine cf "vu'? al- Programarea orientată pe obiecte a dus la dezvoltarea programării conduse de eve- nimente. Dacă în cazul programării clasice aplicația era o colecție de instrucțiuni care se executau în ordinea în care au fost scrise, în cazul programării conduse de evenimente aplicația este un ansamblu de subprograme care nu se execută într-o ordine prestabilită, ci în funcție de producerea unor evenimente (deplasarea mouse-ului, executarea unui clic cu mouse-ul, glisarea unui obiect, apăsarea unei taste sau a unei combinații de taste etc). Apariția evenimentului este aleatorie și de aceea programul trebuie să știe cum să răspundă la un anumit eveniment. Acest lucru se realizează prin asocierea la fiecare eveniment a unei secvențe de cod prin care se descriu operațiile care trebuie executate. Informatică programarea condusă de evenimente se bazează pe adică un mediu interactiv în execuție care poate fi: — activat, cu comanda - care pornește procesorul de evenimente care va sesiza apariția unui eveniment și — dezactivat, cu comanda -careîl oprește. După oprirea procesorului de evenimente programul va continua cu prima instrucțiune care urmează după comanda read event. în programarea vizuală aplicația este o colecție de obiecte create pe baza unor clase predefinite, care știu să răspundă la evenimente. Programarea vizuală este folosită pentru realizarea interfețelor. Sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziția utilizatorului mai multe clase vizuale predefinite: Numele clasei Clasa predefinită Semnificația obiectului vizual Comutator Control care indică dacă o opțiune este activă (on) sau nu (off). if :i Coloană într-o grilă Container care conține antetul de coloană și alte obiecte care pot să apară într-o coloană a unei grile; nu poate fi folosit independent, ci numai într-un container de tip grilă. Corn jobox Listă combinată Control similar unei combinații dintre o casetă de text (TextBox) și o listă (ListBox) în care se poate introduce o valoare sau se poate alege dintr-o listă. Buton de comandă Control asociat unei acțiuni: dacă la un moment dat se execută clic pe un buton, se execută acțiunea asociată butonului. Command Grup de butoane Container care poate conține numai un grup de butoane de Gmop de comandă comandă care pot fi tratate ca o unitate. Container Obiect container Container care conține alte obiecte neprotejate (este permis accesul la obiectele conținute). Contrai Obiect container Container care poate include și obiecte ale utilizatorului, obiectele incluse fiind protejate (nu este permis accesul la obiectele conținute). EditBox Zonă de editare text Control care furnizează o zonă pentru introducerea sau vizualizarea unui text într-un formular (permite afișarea pe mai multe linii). Form Formular Container care poate conține o colecție de mai multe pagini (care se pot comporta ca o casetă de dialog sau ca o fereastră standard), controale și containere pentru afișarea și editarea datelor și controale utilizator (custom). FarmSet Set de formulare Container care poate conține unul sau mai multe formulare legate între ele sau bare cu instrumente. Grid Grilă Container care creează o grilă pentru prezentarea datelor pe rânduri și coloane, sub formă de tabel; poate conține numai controale de tip coloană într-o grilă. Header Antet de coloană Obiect care conține antetul cdoanei și care nu poate fi folosit independent, ci numai într-un container de tip coloană într-o grilă. Sisteme de gestiune a bazelor de date Numele clasei Clasa predefinită Semnificația obiectului vizual . Imagine Control care permite introducerea unei imagini într-un formular; imaginea este memorată într-un fișier bitmap. Etichetă Control care conține un text ce descrie o zonă de formular sau un control. Linie Control care desenează într-un formular o linie pe verticală, pe orizontală sau pe diagonală. : , j Listă Control care furnizează o listă de articole din care utiliza- torul poate alege unul dintre ele. j , Control de Container cu controale OLE (fișiere .ocx; au propriul set de tip OLE evenimente) și obiecte OLE inserabile (obiecte OLE create cu o altă aplicație - Word, Excel etc.; ele nu au propriul set de evenimente). , ,' ;; 7 . ; ț Control container de Controale folosite în formulare sau rapoarte care permit ? tip OLE afișarea conținutului unui obiect OLE într-un câmp General al unui tabel. V? Ln p Lij!: Buton de opțiuni Obiect care nu poate fi folosit independent, ci într-un con- (radio) tainer de tip grup de butoane de opțiuni pentru a repre- zenta o opțiune. , , Grup cu butoane de Container folosit pentru a grupa numai controale de tip , , . ) opțiuni (radio) butoane de opțiuni; se poate folosi un buton pentru a alege o opțiune dintr-un set de opțiuni. * Pagină Container folosit pentru crearea casetelor de dialog cu mai multe secțiuni (tabs); nu poate fi folosit independent, ci într-un container de tip set de pagini și poate conține orice controale și containere. , '1 r, Set de pagini Container care conține una sau mai multe pagini. Separator pe bara Obiect care nu poate fi folosit independent, ci într-un con- de utilități tainer de tip bară cu instrumente; este folosit pentru a introduce spații între controale, cu scopul de a crea grupuri de butoane. t!;Formă Control care creează o formă care poate fi afișată ca o com- binație de dreptunghiuri, cercuri și elipse. Casetă de text cu Control care permite incrementarea sau decrementarea derulor unei valori fie prin scrierea valorii noi, fie executând clic pe săgeata de incrementare sau pe săgeata de decre- mentare. Casetă de text Control care furnizează o zonă pentru introducerea sau vizualizarea unui text într-un formular; permite afișarea pe o singură linie. Timar Obiect de tip ceas Control invizibil folosit pentru a executa secvențe de cod la intervale de timp egale (controlează evenimentele recurente din aplicație). Toodgar &ara cu instrumente Container care poate conține orice controale; este for- mat dintr-un set de butoane pe care se poate executa clic pentru a cere excutarea unei anumite sarcini. Obiectele vizuale care pot fi create sunt simple sau containere. în general, obiectele container nu pot conține orice obiecte. De exemplu: Informatică Container Conținut grup de butoane de comandă butoane de comandă grup cu butoane de opțiuni butoane de opțiuni set de pagini pagini pagină controale, containere, obiecte utilizator set de formulare formulare, bare de instrumente formular set de pagini, controale, containere, obiecte utilizator grilă coloane într-o grilă coloană într-o grilă antet de coloană și orice obiect cu excepția formulare- lor, a seturilor de formulare, a coloanelor într-o grilă și a barelor cu instrumente bară de instrumente controale, seturi de pagină, containere Unele obiecte nu pot fi definite independent, ci numai în interiorul unui container. De exemplu: Obiect_________________Container___________________ antet de coloană coloană într-o grilă buton pentru opțiune grup de butoane pentru opțiuni coloană într-o grilă grilă pag i nă set de pagini separator bară de instrumente Pe lângă aceste obiecte predefinite care creează obiecte vizuale într-o aplicație, se mai pot folosi următoarele obiecte predefinite: Numele clasei Clasa predefinită Semnificația obiectului vizual Cursor Cursor Obiect creat atunci când se adaugă un tabel sau o vi- zualizare la mediul de date dintr-un tabel, dintr-un formular sau dintr-un set de formulare; permite specificarea proprietăților tabelului sau ale vizualizării atunci când este lansat în execuție formularul sau raportul. Reiation Relație Obiect creat atunci când se stabilește o relație între două tabele într-un raport, formular sau set de formulare; permite determinarea modului în care sunt legate cele două tabele. Data Environmont Mediu de date Obiect container pentru obiectele cursor și relație asociate unui formular, raport sau set de formulare; se creează o dată cu raportul, formularul sau setul de formulare. Exemplu: Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conține o etichetă și două butoane de comandă, care dacă vor fi acționate vor deschide fiecare câte un alt formular cu o etichetă și un buton de comandă. Fiecare buton reacționează diferit la evenimentul clic cu mouse-ul, și de aceea a fost scrisă câte o procedură pentru fiecare eveniment: bl. click, b2. click, b3. click și b4. click. Metoda release se folosește pentru a șterge din memorie obiectul de tip formular. formal=createobject(’Forml') forma2=createobject(T Form2’) forma3=createobject(’Form3¹) * Afișează primul formular: formal.show read events define class forml as Form ★ Se definesc proprietățile * formularului forml: caption=’întrebare’ closable=.F. height=143 width=386 Ii 4C ★ Se adaugă obiecte la * formular add object text as Labei add object bl as CommandButton add object b2 as CommandButton ★ Se definesc proprietățile * obiectului text: text.caption='Ati rezolvat; testul din capitolul; precedent?’ text.height=16 text.left=4 5 text.top=34 text.width=37 6 text.visible=.T. * Se definesc proprietățile * obiectului bl: bl.caption=’Da ¹ bl.height=33 bl.left=40 b1.top= 9 6 bl.width=114 bl.visible=.T. * se definesc proprietățile * obiectului b2: b2.caption=’Nu’ b2.height=33 b2.1eft=222 b2.top=96 b2.width=114 b2.visible=.T. * Se definește codul evenimen- * tului click pe obiectul bl: procedure bl.click this form.release * Afișează al doilea formular: forma2.show endproc * Se definește codul evenimen- * tului click pe obiectul b2: procedure b2.click this form.release * Afișează al treilea formular: ,forma3.show endproc enddefine define class form2 as Form caption=¹ Răspuns’ closable=.F. height=143 width=346 Sisteme de gestiune a bazelor de date add object textl as Labei add object b3 as CommandButton textl.caption= f Felicitări; i i i i i i i i i i i i ' textl.height=16 textl.left=110 textl.top=34 textl.width=376 textl.visible=.T. b3.caption=’Terminare ¹ b3.height=33 b3.1eft=110 b3.top=86 b3.widthl14 b3.visible=.T. procedure b3.click * Eliberează formularul și * dezactivează procesorul de * evenimente: thisform.release clear events endproc enddefine define class form3 as form caption=’Răspuns’ closable-.F. height=143 width=34 6 add object text2 as Labei add object b4 as CommandButton text2.caption=’????????????; i i i i » text2.height=16 text2.left=110 text2.top=34 text2.width=376 text2.visible .T. b4 . caption.- ? 'b : l r o • b4.visible .r. b4.height=33 b4.left=110 b4.top=86 b4.width=114 procedure b4.click * Eliberează formularul și * dezactivează procesorul de * evenimente: this form.release clear events endproc enddefine Informatică 145 întrebare □: Ati rezolvat testul din capitolul precedent? Da 1. Să se adauge obiectului complex metoda pentru citirea numărului: procedure citire input ’re= ’ to this.re input ’im= ¹ to this.im endproc Să se modifice corespunzător programul astfel încât citirea numărului complex să se facă prin intermediul acestei metode. 2. Se consideră următorul program: clear set talk off punct=CreateObject("puncte”) punct.generare ?’Distanta fata de origine: ’ ??punct.distanta() ?’Unghiul fata de sistemul de; axe: ’ ??punct.argument() define class puncte as custom x=0 y=o d=0 a=0 procedure generare ? ¹ Coordonatele punctului:’ input ’x= ' to this.x input 'y= ’ to this.y endproc function distanta this.d=sqrt(this. x * * 2 + ; this.y**2) return this.d endfunc function argument if this.x=0 if this.y=0 this.a=0 else this. a=pi ()/2 endif else this.a=atan(abs(this.x/; this. y)) if this.xCO if this.y<=0 this.a=this.a+pi() else this.a=-this.a+pi() endif else if this.y<0 this.a=-a+2*pi() endif endif endif 146 Sisteme de gestiune a bazelor de date this.a=this.a*180/pi() endfunc return this.a enddefine a. Identificați clasele și obiectele, proprietățile și metodele obiectului. b. Explicați ce realizează programul. c. Pe baza acestui program definiți obiectul dreaptă cu metodele generare și calculul lungimii și obiectul dreptunghi cu metodele generare și calculul ariei și al perimetrului. 3. Identificați și corectați erorile din următorul program: clear set talk off z=CreateObject("Complex”) z.citire ?z.modul() define class complex as custom dimension c(2) m=0 input ’x= ¹ to z.c (1) input ’y= ’ to z.c(2) endproc function modul this.m=sqrt(this.c (1)**2 + ; this.c(2)**2) return this.m endfunc procedure citire enddefine 4. Comparați următoarea variantă de program cu cea prezentată anterior. Verificați dacă această variantă este corectă. Ce concluzie trageți din compararea celor două versiuni? clear im=0 set talk off z=CreateObject("Complex”) input ’re= ’ to z.re input ¹im= ¹ to z.im ?z.m(z.re,z.im) define class complex as custom re=0 m=0 function modul parameter re, im this.modul=sqrt(re**2 + im**2) return this.m endfunc enddefine 5. Să se adauge obiectului complex o metodă pentru calculul conjugatului numărului complex și pentru calculul argumentului numărului complex. Să se scrie un program în care să se folosească aceste metode. 6. Să se definească o clasă de obiecte pentru adunarea și înmulțirea a două numere complexe. Să se scrie un program în care să se folosească obiecte din această clasă. 7. Să se definească o clasă de obiecte pentru o listă de numere care să conțină o metodă pentru adăugarea unui element la listă, ștergerea ultimului element din listă, afișarea elementelor listei, căutarea unui element în listă și afișarea elementului cu valoarea maximă. Să se scrie un program în care să se folosească obiecte din această clasă. 8. Să se definească o clasă de obiecte pentru fracții care să conțină metode pentru citirea numitorului și a numărătorului fracției, pentru simplificarea fracției, pentru afișarea fracției simplificate, pentru calculul fracției ca număr zecimal, pentru afișarea fracției ca număr zecimal. Să se scrie un program în care să se folosească obiecte din această clasă. 9. Să se definească o clasă de obiecte prin care să se administreze mulțimi de numere. Clasa trebuie să conțină metode pentru citirea și afișarea mulțimii, pentru reuniunea, intersecția și diferența a două mulțimi și pentru determinarea apartenenței unui element la mulțime. Mulțimile vor fi descrise prin vectori cu elemente cu valori distincte. Să se scrie un program în care să se folosească obiecte din această clasă. 1O. Să se definească o clasă de obiecte prin care să se administreze polinoame. Clasa trebuie să conțină metode pentru citirea și afișarea polinoamelor, pentru adunarea și înmulțirea a două polinoame și pentru calcularea valorii unui polinom pentru o valoare x precizată. Polinoamele vor fi descrise prin vectori în care în prima poziție se va scrie gradul polinomului, iar în următoarele n+1 poziții, coeficienții polinomului. Să se —— scrie un program în care să se folosească obiecte din această clasă. v Informatică 147 Sunt obiecte vizuale folosite pentru a realiza interacțiunea între utilizator și aplicație. Formulare Sunt obiecte container care grupează alte obiecte vizuale. Fiecare tip de control are propriul său set de proprietăți, metode și evenimente care îl fac potrivit unui anumit scop. Unele dintre cotroalele care se pot folosi în aplicații sunt cele mai potrivite pentru introducerea și afișarea datelor. Altele permit utilizatorului să ceară executarea unui proces în cadrul aplicației sau îi permit accesul la alte aplicații. într-o interfață pot fi folosite următoarele tipuri de controale: — controalele pentru executarea acțiunilor: butonul de comandă; — controalele pentru introducerea și afișarea datelor: eticheta, caseta de text, zona de editare, caseta de text cu derulor, grila; — controalele care îi permit utilizatorului să aleagă: comutatorul, lista, lista combi- nată, grupul cu butoane de opțiuni; — controalele grafice: linia, chenarul, imaginea, forma. Formularele pot fi de tip: — Fereastră (window). Utilizatorul interacționează cu fereastra atunci când lansează în execuție aplicația. Ferestrele pot fi redimensionate și pot fi deplasate pe ecran. în fereastra de aplicație pot fi deschise alte formulare de tip fereastră numite ferestre document în care utilizatorul poate prelucra diferite colecții de date ale aplicației (în aplicația Visual FoxPro, fereastra care se deschide atunci când prelucrați un fișier sursă este o fereastră document). Ferestrele asociate unei aplicații pot avea sub bara de titlu o bară de meniu cu titlurile meniurilor pe care aplicația le pune la dispoziția utilizatorului. Ferestrele document nu au bară de meniuri. — Casetă de dialog (dialog box). Se deschide în urma unei comenzi prin care se cere declanșarea unui proces. Prin intermediul ei utilizatorul poate să furnizeze datele nece- sare executării unui proces pe care l-a activat fie prin acționarea unui buton de coman- dă, fie prin alegerea unei opțiuni de meniu. Mai poate fi folosită pentru ca aplicația să afișeze pentru utilizator informații despre desfășurarea unui proces. Spre deosebire de formularul fereastră, caseta de dialog nu are buton de minimizare sau de maximizare, poate fi deplasată pe ecran, dar nu poate fi redimensionată. Cele mai folosite controale 148 Sisteme de gestiune a bazelor de date într-o casetă de dialog sunt casetele de text, etichetele și butoanele de comandă. Casetele de dialog pot fi simple sau cu secțiuni. O casetă de dialog cu secțiuni (tabs) poate afișa în aceeași zonă a formularului mai multe seturi de obiecte. Fiecare set de obiecte formează o secțiune. La un moment dat este afișată o singură secțiune. Se recomandă acest tip de casetă atunci când într-o casetă trebuie create foarte multe controale și ele nu încap în spațiul formularului. Controalele se vor grupa după anumite criterii și fiecare grup va fi afișat într-o secțiune a casetei. Un exemplu de casetă de dialog cu secțiuni este caseta Option a interfeței Visual FoxPro. — Bare cu instrumente (toolbar). Este o casetă de dialog mai specială care conține numai butoane de comandă reprezentate în general prin pictograme. Ea poate fi mobilă (float), adică poate fi afișată oriunde în interiorul ferestrei de aplicație sau fixă (dock), adică poate fi lipită de una dintre marginile ferestrei de aplicație. Bara de titlu este afișată numai în barele cu instrumente flotante. Pentru implementarea acestor obiecte pentru interfață, Visual FoxPro pune la dispoziția programatorului următoarele obiecte vizuale predefinite: — Pentru formulare: FormSet, Form, Page, PageFrame și ToolBar. — Pentru controale: EditBox, TextBox, Labei, Spinner, Grid, OptionButtonGroup, ListBox, ComboBox, CheckBox, CommandButton. Programarea vizuală constă în folosirea unor instrumente interactive care ajută programatorul să precizeze diferite opțiuni și să contruiască diferite elemente ale aplicației, pe baza cărora sistemul generează apoi codul programului. Programarea vizuală se bazează pe programarea orientată pe obiecte (codul de program este generat folosind programarea orientată pe obiecte). Ea pune la dispoziția programatorului două instrumente interactive: constructori și proceduri asistent. Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elementelor unei aplicații: baza de date, formularele, meniurile, rapoartele, interogările, vizualizările etc. în cazul obiectelor de interfață, în procesul de creare a formularului prin intermediul acestor instrumente vizuale, proiectantul trebuie să comunice proprietățile formularului și ale obiectelor componente și procedurile asociate evenimentelor și metodelor care vor fi folosite de formulare și controale. Aceste caracteristici se memorează într-un fișier care are o structură de tabel și extensia .sex. Crearea obiectelor de interfață se poate face în două moduri: — Folosind programarea orientată pe obiecte. în acest caz, se creează programul sursă care conține obiectele vizuale ale interfeței create prin derivarea claselor predefinite de obiecte vizuale. După crearea programului sursă, pentru a realiza interfața, trebuie lansat în execuție programul cu comanda do . — Folosind programarea vizuală. în acest caz, caracteristicile formularelor sunt înre- gistrate sub forma unui tabel într-un fișier de date care are extensia .sex. Aceste date sunt interpretate de un modul al sistemului. Lansarea în execuție a acestui modul, împreună cu fișierul care conține tabelul () se face cu comanda: do form with Comanda de lansare în execuție va crea formularul. Ea poate fi scrisă într-un modul de program (modulul apelant al formularului). Adverbul reprezintă o listă de variabile și/sau constante de tipuri diferite care se transmit formularului la lansarea în execuție. Informatică 149 Recomandare. Pentru construirea elementelor aplicației, se recomandă folosirea metodei vizuale, iar acolo unde nu se obține efectul dorit folosind această metodă, se va folosi metoda clasică a programării structurate pentru a scrie programul. 2111 Proprietățile, metodele și evenimentele obiectelor vizuale Proprietățile generale ate obiectelor vizuale Obiectele vizuale au proprietăți fizice prin care se descrie aspectul lor, cum sunt culoa- rea, dimensiunea și poziția pe ecran, dar și proprietăți care caracterizează modui în care se comportă, cum sunt vizibilitatea, disponibilitatea sau numărul de linii dintr-o ca- setă de text (o linie sau mai multe). Orice obiect vizual are proprietăți standard care sunt comune tuturor obiectelor, cum sunt dimensiunea, poziția și vizibilitatea. Pe lângă aceste proprietăți ele mai au și proprietăți specifice, caracteristice obiectului respectiv. Proprietățile sunt descrise printr-un set de date asociate, de un anumit tip. Proprietățile standard (proprietățile comune majorității obiectelor) sunt: Numele obiectului - Name . Se folo- sește pentru a referi obiectul în program. Legenda - Caption . Este un text prin care utilizatorul poate identifica rolul obiectului. în cazul formularelor, legenda este afișată în bara de titlu. în cazul controalelor, este afișată în interiorul lui sau lângă el. Au legendă următoarele î ----------------------------------------------- Proprietatea Mame se folosește pentru identificarea obiectului în interior (la nivel de program, de către programator), iar proprietatea Caption se folosește pentru identificarea lui în exterior (la nivel de interfață, de către utilizator). controale: butonul de comandă, comutatorul, butoanele de opțiuni, cadrele, eticheta, meniul. Proprietatea este de tip șir de caractere. - > Dimensiunea obiectului. Pentru stabilirea dimensiunii se folosesc proprietățile de tip numeric, exprimate în pixeli: Height - înălțimea (dimensiunea pe verticală) și Width - lățimea (dimensiunea pe orizontală). - > Poziția obiectului. Este dată de un sistem de două coordonate [x,y] prin care se stabilește poziția obiectului față de colțul din stânga sus al reperului (ecranul sau formularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprietățile de tip numeric, exprimate în pixeli : Left - poziția pe orizontală, față de marginea stângă a reperului (x) și Top - poziția pe verticală, față de marginea de sus a reperului (y). - > Caracteristicile caracterelor folosite în texte. Sunt trei proprietăți prin care se caracterizează textele: Caracteristica Tip proprietate Proprietate numele FontName - de tip: Arial, CourierNew, Times fontului șir de caractere New Roman etc. dimensiunea numeric (exprimată în pixeli) FontSize FontBold - îngroșat, Fontltalic - aplecat, stilul FontUnderline - subliniat, FontCondense caracterelor logic condensat, FontExtend - extins, FontOutline-cu contur, FontStrikethrough - tăiat, FontShadow - cu umbră. 150 Sisteme de gestiune a bazelor de date -> Culoarea folosită la afișarea textului este specificată prin proprietățile de tip nume- ric ce reprezintă codul culorii, astfel: _ culoarea fundalului obiectului în care este afișat textul și Fnn=O»i«r - culoarea prim-planului, adică a textului sau a imaginii din obiect. -> Chenarul (Border) este folosit la unele obiecte (formularul, eticheta, caseta de text, grila, imaginea, caseta de imagine, linia, forma) ca un delimitator. Chenarul poate fi fix sau dimensionabil, trasat cu linie simplă sau dublă. Este caracterizat de următoarele proprietăți: BorderStyîe - stilul chenarului este de tip numeric și exprimă codul chenarului. BorderOolor - culoarea liniei cu care este trasat chenarul; BorderWidth - grosimea liniei cu care este trasat chenarul este de tip numeric și este exprimată în puncte: 1 punct, 3 puncte etc.; LineSIant - modul de trasare este de tip caracter și exprimă codul direcției de trasare a dreptunghiului care formează chenarul: \ (trasarea se face începând de la colțul din stânga sus spre colțul din dreapta jos) și / (trasarea se face începând de la colțul din dreapta jos spre colțul din stânga sus); Curvature - curbura colțurilor chenarului stabilește gradul de rotunjire al colțurilor și este de tip numeric. Poate lua valori de la 0 la 99 determinând aspectul chenarului. Astfel, pentru valoarea 0 chenarul va fi un Cod | Semnificație cod chenar 0 Transparent (invizibil) 1 Solid (implicit; linie continuă) 2 Dash (linie întreruptă) 3 Dot (linie punctată) 4 Dash - Dot (linie formată din grupuri de o linie urmată de un punct) 5 Dash - Dot - Dot (linie formată din gru- puri de o linie urmată de două puncte) 6 Inside Solid (linie continuă în interior) 0 No border (fără chenar) 1 Fixed Single (chenar simplu) 2 Fixed Dialog (chenar de tip casetă de dialog, care nu permite redimensionarea formularului) 3 Sizable (implicit; chenar de tip fereastră, care permite redimen- sionarea formularului) dreptunghi sau un pătrat, pentru valoarea 99 chenarul se va transforma într-un cerc, respectiv o elipsă, iar pentru o valoare cuprinsă între cele două limite, de exemplu 30, se va transforma într-un dreptunghi, respectiv într-un pătrat cu colțurile rotunjite. -> Pictograma de glisare - Draglcon. Este de tip șir de caractere și reprezintă identifi- catorul fișierului (calea de director și numele) care conține pictograma ce va fi afișată în lo- cul cursorului de mouse atunci când se execută operația de glisare și plasare a obiectului. Cursorul de mouse - MousePointer. Este de tip numeric și reprezintă codul asociat for- mei cursorului de mouse afișat atunci când este indicată o zonă a obiectului. Disponibilitatea - Enabied. Este o propri- etate de tip logic. Dacă are valoarea .T., Folosind autodocumentarea aflați care sunt valorile asociate proprietății controlul este disponibil, adică utilizatorul îl poate acționa, iar dacă are valoarea .F, nu este disponibil, adică nu poate fi acționat. Un control nu este disponibil atunci când nu sunt îndeplinite condițiile necesare pentru a putea fi folosit. Reprezentarea grafică și legenda controalelor care nu sunt disponibile sunt afișate estompat. -> Vizibilitatea - Visible. Este o proprietate de tip logic. Dacă are valoarea .T. obiectul este vizibil, iar când are valoarea .F. nu este vizibil. Pentru precizarea codului unei culori se folosește schema de culori RGB prin care precizați prin trei numere cuprinse între 0 și 255 intensitatea pentru fiecare din cele trei culori de bază: Informatică 151 roșu, verde și albastru. Pentru a afla codul culorii folosiți funcția RGB() care are sintaxa rgb(, ,), unde cei trei parametri reprezintă intensitățile celor trei culori: Culoare Parametri RGB() Număr Culoare_______ Parametri RGB() Număr Alb 255, 255, 255 16777215 Verde_________ 0, 255, 0 65280 Negru 0, 0, 0 0 Verde închis 0, 128, 0 32768 Gri 192, 192, 192 12632256 Cian___________ 0, 255, 255 16776960 Gri închis 128, 128, 128 8421504 Cian închis 0, 128, 128 8421376 Roșu 255, 0, 0 255 Albastru________ 0, 0, 255 16711680 Roșu închis 128, 0, 0 128 Albastru închis 0, 0, 128 8388608 Galben 255, 255, 0 65535 Magenta______ 255, 0 ,255 16711935 Galben închis 128, 128, 0 32896 Magenta închis 128, 0, 128 8388736 2.8.1.2. Evenimente recunoscute de obiectele vizuale Atât formularele, cât și marea majoritate a controalelor sunt capabile să primească din partea sistemului semnale prin care sunt informate de producerea unui eveniment. La proiectarea formularului programatorul poate specifica secvențe de instrucțiuni prin care obiectul trebuie să răspundă la diferite evenimente. De exemplu, evenimentele recunos- cute de majoritatea obiectelor (formulare și controale) sunt: 1. Evenimente declanșate de acțiunile mouse-ului: MouseMove - deplasarea mouse-ului pe obiect; Click - clic cu mouse-ul pe obiect cu butonul din stânga (are ca efect focalizarea obiectului). RightCIick - clic cu mouse-ul pe obiect cu butonul din dreapta (are ca efect în general deschiderea unui meniu de comenzi rapide); DbiClick - dublu clic cu mouse-ul pe obiect; MouseDown - apăsarea butonului de mouse; Mousellp - eliberarea butonului de mouse; DragOver - glisarea obiectului cu mouse-ul; DragDrop - glisarea și plasarea obiectului cu mouse-ul. 2. Evenimentul declanșat la acționarea unei Poziție 2 1 0 taste (apăsarea și eliberarea ei) - KeyPress. 22 21 2° Procedurii care se va executa la apariția acestui Apăsați Alt Ctrl Shift Cod eveniment i se pot transmite ca parametri Shift 0 0 1 1 numărul asociat tastei apăsate și un cod numeric Ctrl 0 1 0 2 prin care se definește combinația de taste reci Ctrl +Shift 0 1 1 3 care însoțește tasta apăsată. Fiecărei taste reci îi Alt 1 0 0 4 corespunde un bit poziționat pe 1 din codul AIHShift 1 0 1 5 numeric. Astfel, pentru tasta Shift este bitul 0 Alt^Ctrl 1 1 0 6 (rezultă codul=1), pentru tasta Ctrl bitul 1 (rezultă AIHCWShift 1 1 1 7 codul=2) și pentru tasta Alt bitul 2 (rezultă codul=4). Se pot combina mai multe taste reci. 3. Evenimente declanșate de crearea și eliberarea obiectului: Init - inițializarea obiectului declanșată de crearea lui; Destroy - eliberarea obiectului declanșată de metoda de eliberare a zonei de memorie alocate obiectului. 152 Sisteme de gestiune a bazelor de date 2.8.1.3. Focahiares Focafearea (focus) este capacitatea aplicației de a primi datele de intrare ale utilizatorului prin intermediul tastaturii sau al mouse-ului. Ea se manifestă în cadrul interfeței prin prezența selectorului. Când selectorul este pozi- ționat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o par- te, sistemul de operare Windows permite lansarea în execuție a mai multor aplicații la un moment dat, dar numai una dintre aplicații are capacitatea de focalizare. Aceasta este aplicația activă, adică aplicația care va primi datele de intrare furnizate de utilizator. Pe de altă parte, în cadrul unei aplicații, la un moment dat, pot fi deschise mai multe formu- lare, însă un singur formular are capacitatea de focalizare și se numește formular activ, iar în cadrul formularului activ un singur control poate primi focalizarea și se numește control activ. Transferul controlului focalizării de la un obiect (formular sau control) se poate face folosind metoda -.rn ,.. ~ care poate fi apelată din diferite metode. Obiectul focalizat este evidențiat prin diferite metode. De exemplu, un buton declanșator focalizat este evidențiat printr-o bordură care înconjoară butonul. Un obiect poate fi focalizat numai dacă are proprietatea de a fi disponibil (de a răspunde la acționări de la tastatură sau mouse) și proprietatea de a fi vizibil pe ecran. Nu pot fi focalizate următoarele obiecte: eticheta, linia, forma, imaginea și caseta de imagine. Evenimentele declanșate în timpul unui proces de focalizare sunt: Evenimentul Declanșat de: Activarea containerului se declanșează înainte de a-l focaliza: interactiv: utilizatorul execută clic pe obiectul container. Activate Din program: se apelează metoda ... . j (afișarea) a obiectului container. Evenimentul Activate se declanșează în ordinea de incluziune a formularelor: mai întâi pentru obiectul FormSet, apoi pentru obiectele Form conținute de acesta și în final pentru obiectele Page din obiectele Form. Primirea focalizării de către un obiect se poate declanșa după activarea containerului: GotFocus -> Interactiv: utilizatorul execută clic pe obiect sau apasă repetat tasta Tab până focalizează obiectul dorit. Din program: se apelează metoda > u .j 3 a controlului pe care vreți să-l focalizați. Pierderea focalizării de către un obiect se poate declanșa: LostFocus -> Interactiv: utilizatorul focalizează alt obiect executând clic pe acel obiect. -> Din program: se apelează metoda : ca controlului pe care-l doriți să preia focalizarea. Dezactivarea containerului se declanșează atunci când containerul nu mai conține nici un obiect focalizat: Deactivate Interactiv: se mută focalizarea din obiectul container într-un alt obiect container sau într-o altă aplicație. -> Din program: se creează un nou obiect care declanșează evenimentul Activate pentru noul obiect și evenimentul Deactivate pentru vechiul obiect. Programatorul poate scrie metode de răspuns la aceste evenimente (proceduri), la nivelul fiecărui control. De exemplu, atunci când un control primește focalizarea (evenimentul GotFocus), prin intermediul metodei asociate evenimentului pot fi afișate în casete instrucțiuni referitoare la control sau în bara de stare mesaje de informare despre control. Informatică Proprietățile specifice procesului de focalizare sunt: 'proprietatea | Caracteristici: ^Referirea la obiectul activ - aceste proprietăți sunt specifice formularelor; sunt protejate la scriere (read-only) și nu pot fi modificate de programator: Prin proprietatea formular activ se face referirea la formularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit în obiectele container: Form, FormSet, Screen. Folosind această referință se poate modifica valoarea unei proprietăți a formularului activ sau se poate apela o metodă a formularului activ o .= . . Prin proprietatea control activ se face referirea la controlul activ dintr-un obiect container. Poate fi folosit în obiectele container: Form, Page, ToolBar, Screen Folosind această referință se poate modifica valoarea unei proprietăți a controlului activ: . ,= Ordinea tabulării reprezintă ordinea în care utilizatorul se poate deplasa de la un control la altul pentru a-l focaliza, folosind tasta Tab. Pentru a stabili această ordine, fiecare control din formular are două proprietăți: Proprietatea controlul tabulării are valoare logică și este folosită pentru a determina dacă utilizatorul poate focaliza controlul folosind tasta Tab. Dacă valoarea este .F., controlul nu va putea fi focalizat decât executând clic pe el. Proprietatea indexul tabulării reprezintă numărul de ordine al controlului în cadrul formularului atunci când se folosește tasta Tab pentru a focaliza un control. în aplicațiile create în Visual FoxPro se pot folosi două stiluri de interfețe: ( - single-document interface) permite la un moment dat deschiderea unui singur document (de exemplu, aplicația Notepad). -> ( - multiple-document interface) permite deschiderea mai multor documente (de exemplu, aplicația Word). La un moment dat pot fi deschise mai multe documente, fiecare document în fereastra sa. Unul singur dintre documente este activ, adică documentul care primește datele introduse de la tastatură de către utilizator. Formularul documentului activ este obiectul focalizat din interfața aplicației. Stilul MDI permite crearea unei interfețe care administrează mai multe formulare într-un singur formular container. Formularul container se mai numește și fereastră părinte (parent window), iar formularele din interiorul său se numesc ferestre copil (child Windows). O aplicație MDI poate avea un singur formular părinte și mai multe formulare copil. Formularul părinte nu poate fi un formular modal. Ferestrele copil pot fi de același tip sau de tipuri diferite. Fereastra părinte furnizează un spațiu de lucru (workspace) pentru toate ferestrele copil ale aplicației. Spațiul de lucru este delimitat de bordura formularului părinte și este situat sub bara de meniu. Formularele interfeței MDI au următoarele caracteristici: — Formularele copil pot fi afișate numai în spațiul de lucru al formularului părinte. Utilizatorul poate muta sau redimensiona formularele copil ca pe orice alt formular, cu deosebirea că operațiile sunt limitate de spațiul de lucru al formularului părinte. Sisteme de gestiune a bazelor de date — Când un formular copil este minimizat, pictograma sa apare în formularul părinte și nu pe bara de aplicații. Când un formular părinte este minimizat, formularul părinte și toate formularele copil care îi aparțin vor fi reprezentate printr-o singură pictogramă. Când formularul părinte este restaurat, sunt restaurate împreună cu el și formularele copil care vor fi afișate în aceeași stare în care erau înainte de minimizare. — Când un formular copil este maximizat, legenda sa este combinată cu legenda formularului părinte și afișată în bara de titlu a formularului părinte. — Meniurile care pot fi folosite în formularul copil activ sunt afișate în bara de meniu a formularului părinte și nu în formularul copil. Formularele pot fi: - > . Un astfel de formular cere utilizatorului să execute anumite acțiuni prin care să închidă formularul activ pentru a putea continua execuția aplicației și pentru a putea focaliza un alt formular. Astfel, o casetă de dialog modală trebuie închisă prin acționarea declanșatoarelor OK sau Cancel ca să se poată continua lucrul cu restul aplicației (de exemplu, în Visual FoxPro casetele de dialog Open sau Save As sunt modale). Se recomandă folosirea acestui tip de formular în cazul în care prin intermediul lui se solicită utilizatorului un răspuns sau anumite date necesare pentru continuarea unui proces de prelucrare. - > - . Acest tip de formular nu trebuie închis pentru a ceda focalizarea altui formular. De exemplu, ferestrele document din aplicația Visual FoxPro sunt ferestre nemodale. Barele cu instrumente sunt și ele formulare nemodale. Se recomandă folosirea acestui tip de formular în cazul în care el conține date care trebuie vizualizate pentru a fi comparate cu date din alte formulare. Proprietățile pr n care se controlează tipul formularului sunt: Proprietatea Caracteristici: Controlează tipul interfeței. Este de tip logic (are valoarea ,T. pentru un formular MDI și valoarea .F. pentru un formular SDI). Controlează filiația formularului (dacă un formular este formular copil sau formular părinte). Este de tip numeric: - > 0 - Screen - formularul este creat în fereastra principală Visual FoxPro (implicit). - > 1 - In Top Level Form - formularul este copilul formularului activ de cel mai înalt nivel și este afișat în acest formular. Atunci când este minimizat nu ShcwWindou este afișat în bara de aplicații Windows (TaskBar). Se recomandă pentru ferestrele document ale unei ferestre de aplicație. - > 2 - As Top Level Form - este un formular independent nemodal în care pot fi plasate formulare copil. Nu are părinte și poate fi folosit fie ca fereastră într-o interfață SDI, fie ca fereastră părinte într-o interfață MDI. Atunci când este minimizată este afișată în bara de aplicații Windows. Se recomandă să o folosiți pentru fereastra aplicației. Controlează locul în care va fi creat formularul. Este de tip logic: dacă are Desktoo valoarea .T., se creează oriunde pe ecran, iar dacă are valoarea .F., se creează în fereastra aplicației Visual FoxPro (implicit) it'in'OcvvsType Controlează tipul formularului. Este de tip numeric: 0 (nemodal) sau 1 (modal). Variabila de memorie de sistem poate fi folosită pentru a referi fereastra implicită a aplicației Visual FoxPro, astfel încât să poată fi manipulată această fereastră ca un obiect: i se pot modifica proprietățile, i se pot apela metodele, dar nu pot fi create metode de răspuns la evenimente. Informatică Suprafața de afișare a formularelor este împărțită în două zone: — bara de titlu (title bar) împreună cu butoanele de manipulare ale formularului și — spațiul de lucru (workspace) în care pot fi afișate diferite controale cu care poate interacționa utilizatorul. Formularele pot executa acțiuni (au asociate metode) și pot răspunde la evenimente. Evenimentele la care pot răspunde formularele sunt: Evenimentul Caracteristici și metode de răspuns: Inițializarea obiectului este declanșată de crearea obiectului; procedura asociată acestui eveniment se execută automat la crearea formularului și are ca scop preluarea parametrilor transmiși de modulul apelant (în cazul unui apel cu parametri, prima instrucțiune din metoda init va fi: ) Este declanșată de încărcarea formularului. Metoda asociată acestui eveniment se apelează înaintea metodei asociate evenimentului de inițializare și poate conține instrucțiuni care trebuie să se execute înainte de a inițializa obiectele din formular (de exemplu inițializarea unor variabile de memorie, deschiderea unor tabele etc.). Evenimentele Load sunt sesizate în ordinea incluziunii obiectelor. De exemplu, este sesizat evenimentul Load al unui set de formulare și apoi cele ale formularelor conținute. Metoda de răspuns la activarea formularului oferă posibilitatea de a interacționa cu obiectele din formular, ca de exemplu, evidențierea unui text dintr-o casetă de editare. Dezactivarea formularului se declanșează atunci când este activat un alt formular. Distrugerea formularului are ca efect ștergerea din memoria internă a tuturor informațiilor despre formular și eliminarea formularului de pe ecran. Descărcarea formularului este ultimul eveniment care se execută înainte de eliberarea formularului; prin metoda asociată, formularul poate returna o valoare modulului apelant (cel care l-a lansat în execuție). Observatii: 1. Procedura asociată evenimentului Load se execută înainte de cele asociate eveni- mentelor Init, Activate și GotFocus. 2. într-un formular pot fi create mai multe obiecte, fiecare dintre ele având propriul eveniment Init. Ordinea de execuție a procedurilor de inițializare este: mai întâi se execută inițializarea obiectelor din formular (controalele) în ordinea în care au fost definite și apoi inițializarea formularului. în acest mod se asigură accesul la controalele din procedura asociată evenimentului Init al formularului. Pentru a împiedica crearea unui control, procedura Init asociată controlului trebuie să întoarcă valoarea .F.. 3. Dacă datele preluate de formular prin intermediul parametrilor actuali ai procedurii asociate evenimentului Init sunt necesare și în alte metode și evenimente, parametrii vor fi transmiși ca variabile globale. 4. Metoda de răspuns a evenimentului Unload se execută după metoda de răspuns a evenimentului Destroy și după ce au fost eliberate toate obiectele conținute. De exemplu, dacă un formular este creat într-un set de formulare și conține o casetă de text și un buton de comandă, la eliberarea unui formular evenimentele sunt tratate în următoarea ordine: Destroy pentru setul de formulare, Destroy pentru formular, Sisteme de gestiune a bazelor de date Destroy pentru caseta de text și butonul de comandă, Unload pentru formular și Unload pentru setul de formulare. Metodele pe care le pot executa formularele sunt: Metoda Realizează: Metoda de afișare are ca efect afișarea pe ecran a formularului care a fost creat sau care a fost ascuns anterior. Metoda de ascundere are ca efect îndepărtarea formularului de pe ecran, fără ca informațiile referitoare la el să fie șterse din memoria internă; se pot executa chiar diferite operații cu formularul ascuns, ca de exemplu crearea în formular a unor noi controale care vor fi afișate atunci când formularul va fi reafișat. Metoda de reactualizare are ca efect reîmprospătarea formularului și a obiectelor din formular, astfel încât ele să afișeze valorile actuale; în această metodă vor fi scrise instrucțiunile prin care se pot actualiza valorile unor proprietăți ale formularului sau ale obiectului, sau valorile unor variabile de memorie folosite pentru calcularea unor date. Metoda de ștergere a formularului din memorie are ca efect eliberarea zonei de memorie alocate formularului. Formularele sunt folosite pentru a permite accesul utilizatorului la datele din tabelele sau vizualizările bazei de date. De aceea, odată cu crearea formularului se creează și obiec- tul container nevizual ' . : care conține obiectele 1.. (păstrează evi- dența tabelelor și a vizualizărilor asociate) și - ; (păstrează legăturile dintre tabele). Prin intermediul acestui control container se deschid tabelele și vizualizările asociate și se stabilesc legăturile dintre tabele și se închid tabelele și vizualizările atunci când se în- chide și formularul. Proprietatea ji, ! dut a formularului conține referința către obiectul Data- Environment asociat formularului. Dacă nu se folosește obiectul DataEnvironment, comenzile pentru deschiderea tabelelor și a vizualizărilor se pot scrie în metoda de răspuns la evenimentul Load, iar comenzile pentru închiderea lor în metoda de răspuns la evenimentul Unload. Mediul de date poate conține tabele ale bazei de date sau tabele libere. Dacă tabelele fac parte dintr-o bază de date, mediul de date preia și legăturile permanente dintre tabele. Se pot păstra aceste legături, se pot modifica sau pot fi înlocuite cu altele noi. Dacă tabelele sunt libere, trebuie precizate legăturile dintre ele. Obiectul DataEnvironment are următoarele proprietăți, metode și evenimente specifice: 1. Proprietățile de tip logic se recomandă numai dacă localizarea pe disc a tabelelor și a vizualizărilor este cunoscută de către programator la proiectarea formularului, altfel se vor folosi metodele asociate obiectului: MutoCLt - Dacă are valoarea .T. tabelele și vizualizările din mediul de date sunt deschise automat o dată cu crearea formularului. — Dacă are valoarea .T. tabelele și vizualizările din mediul de date sunt închise automat o dată cu eliberarea formularului. 2. Evenimentele la care poate răspunde mediul de date sunt: Informatică 157 rafc':e& - Evenimentul este declanșat înaintea deschiderii tabelelor și a vizualizărilor din mediul de date. Se declanșează înaintea evenimentului Load al for- mularului pentru că tabelele trebuie să fie deschise înainte de inițializarea formularului (în formular trebuie afișate date din aceste tabele și vizualizări). în metoda de răspuns se pot stabili numele tabelelor și vizualizărilor care se vor deschide și locul în care sunt memorate pe disc. ihfâ! t - Evenimentul este declanșat după închiderea tabelelor și a vizua- lizărilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se declanșează după descărcarea formularului (după evenimentul Unload al formularului). 3. Metodele pe care le poate executa mediul de date sunt: - deschiderea tabelelor și vizualizărilor din mediul de date; în această metodă se scriu instrucțiunile pentru deschiderea tabelelor în diferite zone de lucru. - închiderea tabelelor și vizualizărilor din mediul de date; în această metodă se scriu instrucțiunile pentru închiderea tabelelor deschise în diferite zone de lucru. ; (session) este intervalul de timp în care o aplicație primește date și le prelucrează. 7 < -* ¹- ' (data session) este mediul de date asociat sesiunii (parametrii sistemului, variabile de memorie, fișiere de date). în Visual FoxPro un formular poate rula în: — sesiunea de date implicită care preia configurările implicite ale mediului Visual FoxPro; — sesiunea de date privată (proprie formularului) în care toate configurările mediului trebuie făcute la crearea formularului; acest tip de sesiune creează o mai mare independență a formularului față de mediu. Principiul folosit de constructorii de formulare este următorul: constructorul pune la dispo- ziția proiectantului de interfață un formular care are proprietăți, metode și evenimente implicite, iar obiectele care vor fi create în formular vor primi și ele valori implicite pentru proprietăți (conform clasei de bază a obiectului respectiv). Rolul proiectantului constă în modificarea interactivă a valorii unor proprietăți ale obiectelor create și scrierea unor pro- ceduri asociate metodelor și evenimentelor, în conformitate cu configurația pe care vrea să o realizeze pentru interfață. Constructorii de formulare care pot fi folosiți sunt: 1. Form Buiîder - Constructorul rapid - care permite o proiectare rapidă a formularelor simple. Prin intermediul unei casete de dialog cu mai multe secțiuni, proiectantul furnizează constructorului valoarea unor proprietăți. El nu are cunoștință de numele acestor proprietăți, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poate stabili decât valoarea proprietăților asociate acestor caracteristici, fără să poată scrie proceduri asociate evenimentelor și metodelor. Sunt implementați mai mulți constructori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfață. Fiecare constructor rapid afișează anumite secțiuni, în funcție de obiect. Fiecare secțiune grupează anumite caracteristici ale obiectului care corespund unei categorii de proprietăți. Există constructori rapizi pentru formulare (Form Builder) și pentru controale (Combo Box Builder, Command Group Builder, Edit Box Builder, Text Box Builder, List Box Builder, Option Group Builder). Sisteme de gestiune a bazelor de date 2. ■ - - J - construiește ea însăși formularul pe baza unor informații furnizate de proiectant prin intermediul unui dialog desfășurat în mai mulți pași. Proiectantul nu modifică proprietățile și nu scrie codurile procedurilor. 3. - . • - care permite construirea unor formulare complexe. Constructorul pune la dispoziția proiectantului diferite instrumente: bara cu obiectele care pot fi inserate în formular, bara cu instrumente ale aplicației constructor, fereastra pentru stabilirea proprietăților, fereastra pentru stabilirea procedurilor asociate evenimentelor și metodelor etc. Prin intermediul lor proiectantul atribuie valori proprietăților (identificate prin numele lor) și scrie procedurile asociate metodelor și evenimentelor. Pentru lansarea în execuție a constructorului se folosește comanda: ; . : unde este numele fișierului în care se salvează formularul. Pentru modificarea formularului cu ajutorul constructorului folosiți comanda: ■ , unde este numele fișierului în care se salvează formularul. Observație. Deoarece fișierul în care este memorat formularul are o structură de tabel, el poate fi deschis cu comanda use și vizualizat apoi cu comanda browse. Caracteristicile unui obiect al formularului sunt memorate în câte o înregistrare fiecare, iar în fiecare coloană câte o caracteristică. De exemplu, coloana Properties conține câmpuri de tip memo în care sunt memorate proprietățile care au valori diferite de cele implicite, iar coloana Methods conține câmpuri de tip memo în care sunt memorate procedurile asociate metodelor și evenimentelor obiectului. Pentru a afișa formularul creat pe ecran și pentru a permite utilizatorului să interacționeze cu obiectele de interfață pe care le conține, formularul trebuie lansat în execuție prin comanda: [ ] [ < parametru_ieșire>] Transferul parametrilor se face astfel: Informatică [L©Lb©!7SîQ©© Se creează tabelul Agenda 1 cu următoarea structură de câmpuri: nume (C,15), prenume (C,15) și telefon (C,10). Se adaugă trei înregistrări de date la tabel. Nu se închide tabelul. 1. Se creează un formular folosind procedura asistent: ■ Se alege opțiunea Țools^Wizard ► ->Form. Se deschide caseta de dialog Wizard Selec- tion. Din caseta de dialog se alege opțiunea Form Wizard (opțiunea One-to-Many Form Wizard se folosește atunci când se creează un formular cu câmpuri din două tabele). Se acționează butonul OK pentru a începe construirea formularului. Procedura asistent afișea- ză mai multe casete de dialog prin intermediul cărora utilizatorul îi va furniza informațiile necesare. Se circulă de la o casetă de dialog la alta cu butoanele Next (caseta de dialog următoare) și Back (caseta de dialog anterioară). Se termină dia- logul cu butonul Finish. ■ Se deschide caseta de dialog corespunzătoare primului pas (Stepl) în care se aleg câmpu- rile din tabel pentru care se vor crea obiecte în formular. în acest exemplu se vor alege toate câmpurile. Pentru aceste câm- puri, asistentul va crea controale de tip TextBox asociate cu controale Labei. După ce au fost selectate toate câmpurile din tabel, se trece la următoarea Form Wizard Databases / T ables: Step 1 - Field Selection Free Tables □ Which fields do you want in your form? 1. Select a database or the Free Tables item. 2. Select a table or view. 3. Select the fields. Available Fields: Nume Selected Fields: J casetă de dialog Step2. ■ în caseta de dialog Step2 se alege stilul formularului. Din grupul de butoane radio Button Type se activează butonul Text Button, iar din lista Ștyle se alege stilul Chiseled. în acest pas sunt adăugate controalele pentru editarea câmpurilor din tabel și, suplimentar, butoane pentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prin stilul ales. Se trece la următoarea casetă de dialog. ■ în caseta de dialog Step3 se alege criteriul de ordonare a datelor din tabel: ordinea de sortare și câmpul cheie pentru sortare, care poate fi format dintr-un câmp sau mai multe câmpuri din tabel. Se alege pentru criteriul de ordonare cheia formată din câmpurile nume și prenume. Se trece la dialogul următor. ■ în caseta de dialog Step4 se scrie legenda formularului în caseta de text Type a tifle for Cancel || Next | Finish Butoanele adăugate la formular Top Mută pointerul de înregistrare pe prima înregistrare. Prev Mută pointerul de înregistrare pe înregistrarea precedentă. Next Mută pointerul de înregistrare pe înregistrarea următoare. Bottom Mută pointerul de înregistrare pe ultima înregistrare. Fînd Afișeză caseta de dialog Search prin intermediul căreia construiți un criteriu de căutare a unei înregistrări. Prinț Tipărește un raport cu datele din tabel. Add Adaugă o înregistrare la sfârșitul tabelului. Edit Permite modificarea valorilor din câmpurile înregistrării curente. Delete Șterge înregistrarea curentă. Exit închide formularul form.____ Sisteme de gestiune a bazelor de date your form. Din grupul de butoane radio se alege opțiunea Save and run form. Se acționează apoi butonul Finish pentru terminare. Se deschide caseta de dialog Save As în care se scrie numele formularului - Agendal. ■ După închiderea casetei Save as este lansat în execuție formularul. ■ Se testează butoanele formularului executând operații de vizualizare a înregistrărilor, de adăugare, de ștergere și de căutare a unei înregistrări. ■ Se închide formularul. ■ Se deschide tabelul asociat formularului cu comanda use Agendal.sex. Se vizualizează cu comanda list stru structura de câmpuri a tabelului asociată formularului. Se vizualizează conținutul tabelului cu comanda browse. Se identifică proprietățile și metodele asociate formularului și obiectelor din formular. Se închide fereastra Browse. Se închide fișierul cu comanda use. ■ Se deschide tabelul cu comanda use Agendal. ■ Se lansează în execuție constructorul de formulare, fie cu comanda: create form agenda2 fie cu opțiunea de meniu File->New.... Se deschide caseta de dialog New din care se alege din grupul de butoane radio File Type opțiunea Form și apoi se execută clic pe butonul New File. ■ Se deschide fereastra aplicației Form Designer în care este deschisă fereastra document Forml. în această fereastră se vor crea obiectele care aparțin formularului. Suprafața formularului este divizată printr-o grilă care ajută utilizatorul la aranjarea Form: | ZI Page: | _] Informatică obiectelor în cadrul formularului (prin alinierea obiectelor la liniile grilei). în bara de meniu a fost adăugat un titlu de meniu (Form) cu opțiuni specifice constructorului de formulare. în partea inferioară a ferestrei sunt afișate două liste ascunse: Form care este disponibilă numai dacă s-a creat un set de formulare și permite alegerea unui formular din set și Page care este disponi- bilă numai dacă s-a creat un set de pagini și permite alegerea unei pagini din set. ■ Se alege opțiunea Form->Quick Form.... Se deschide caseta de dialog Form Builder. Caseta de dialog conține două secțiuni. în secțiunea Field Section se aleg o Q Form Buildet 1. Field Selection 2. Style Which fields do you want on your form? Each field you select will become a new control on your form. Datdbases / Tables: Available Fields: Șelected Fields: Lancel Help câmpurile din baza de date pentru care se vor crea controale în formular pentru editarea datelor. Pentru acest exemplu se aleg toate câmpurile din tabel, astfel: din lista Available Fields se selectează câmpul și se execută clic pe butonul Q- în secțiunea Style se alege stilul formularului (se alege opțiunea Embosed din lista Ștyle). Se închide caseta de dialog executând clic pe butonul OK. ■ în proiectul de formular vor fi inserate automat casete de text pentru editarea câmpurilor din tabel și etichete asociate acestor câmpuri pentru identificarea lor. «țț Form Designer - agendaZ.scx W Forml Nunie: |numei prenume: | PRENUME1 Telefon: |telefoni Form: | ZJ Page: [ M Se închide aplicația executând clic pe butonul de închidere al ferestrei constructorului. ■ Se deschide tabelul asociat formularului cu comanda use Agenda2.scx. Se vizualizează conținutul tabelului cu comanda browse. Se identifică obiectele create în formular (coloana câmpurilor Objectname) și proprietățile asociate acestor obiecte (coloana câmpurilor Properties). Se închide fișierul cu comanda use. Obiectul vizual - formularul Cu ajutorul acestui tip de obiect vizual se pot crea formulare de tip fereastră sau casetă de dialog. Formularele au proprietăți, metode și evenimente cu care le este controlat aspectul și comportamentul. Sisteme de gestiune a bazelor de date Pe lângă proprietățile standard, formularele mai au următoarele proprietăți specifice: Proprietatea Reprezintă Proprietăți legate de aspect Starea ferestrei este o proprietate de tip numeric care controlează starea în WmdowSîatas care se găsește fereastra: normală (0), minimizată (1) sau maximizată (2). Fereastra minimizată va fi redusă fie la o dimensiune minimă, fie la o picto- gramă. Fereastra maximizată va fi mărită astfel încât să ocupe tot ecranul. MinHeight Dimensiunile ferestrei minimizate sunt specificate prin proprietățile, de tip WlnWidth numeric, înălțimea ferestrei minimizate, respectiv lățimea ferestrei minimizate. Pictograma ferestrei minimizate este de tip șir de caractere și reprezintă toon identificatorul fișierului care conține pictograma asociată ferestrei minimizate. Fișierul trebuie să fie de tip fișier de pictograme (.ico). Pictograma meniului de control este de tip șir de caractere și reprezintă Pîcture identificatorul fișierului sau numele unui câmp de tip General care conține pictograma asociată butonului meniului de control. Fișierul trebuie să fie de tip bitmap (»bmp) sau de pictograme (.ico). Scara de poziționare este de tip numeric și reprezintă un cod pentru unitatea de măsură folosită pentru coordonatele obiectului. Are valoarea 0 pentru unitatea de măsură Foxels (unitate specifică mediului Visual FoxPro, echivalentă cu înălțimea maximă și lățimea medie a unui caracter din fontul curent, și 3 pentru pixeli). CuFontX Coordonatele poziției în care se poate începe scrierea unui text sau CurentY desenarea unui obiect grafic într-un formular sunt specificate prin proprietățile de tip numeric coordonata ; respectiv coordonata . Centrarea formularului este o proprietate de tip logic. Dacă are valoarea .T., AutoCenter formularul este afișat automat în centrul reperului (ecran sau alt formular) fără să se țină cont de valorile proprietăților Left și Top. Acoperirea formularului este o proprietate de tip logic. Dacă are valoarea ,T., formularul nu poate fi acoperit de alte formulare. 'HiJiStyh Umplerea fundalului formularului este specificată prin proprietățile de tip FilICofor numeric: modelul afișat, respectiv culoarea modelului afișat. MimBunon Butoanele specifice unui formular sunt precizate prin proprietățile de tip itoxBuîfon logic care controlează dacă formularul are sau nu are buton de minimizare, Conxroisîox buton de maximizare, respectiv buton pentru meniul de control. Proprietăți iegate de comportament - sunt de tip logic Controlează dacă formularul poate fi închis folosind meniul de control (opțiunea Ctose a meniului sau dublu clic pe butonul meniului) sau nu. Controlează dacă formularul poate fi mutat sau nu. Controlează afișarea casetelor cu informații despre controalele din țybvownps formular: dacă are valoarea ,T. (implicit în ToolBar), se afișează caseta cu informații despre controlul indicat cu mouse-ul (ToolTip), iar dacă are valoarea .F. (implicit în Form), nu se afișează caseta. Evenimentele la care pot răspunde formularele sunt: Evenimentul Declanșat de: Redimensionarea formularului este declanșată fie prin schimbarea interactivă a y-' dimensiunii formularului, fie prin modificarea din program a dimensiunii sale (proprietățile Height și Width). hi a d Mutarea formularului este declanșată fie prin mutarea interactivă a formularului, fie prin modificarea din program a poziției sale (proprietățile Top și Left). Informatică 163 Metodele pe care le pot executa formularele sunt: Metoda Realizează Mutarea formularului pe ecran. Desenarea unei linii în formular. Prin intermediul parametrilor se vor preciza coordonatele primului punct (x1 ,y1) și coordonatele celui de al doilea punct (x2,y2). Parametrii se vor scrie între paranteze rotunde, după numele metodei. După desenare, coordonatele poziției de desenare vor fi (x2,y2). Desenarea unui dreptunghi în formular. Prin intermediul parametrilor se vor preciza coordonatele colțului din stânga sus (x1,y1) și coordonatele colțului din dreapta jos (x2,y2). După desenare, coordonatele poziției de desenare vor fi (x2,y2). Desenarea unui cerc în formular. Prin intermediul parametrilor se vor preciza raza cercului și coordonatele centrului cercului (x,y). După desenare, coordonatele poziției de desenare vor fi (x,y). Scrierea unui text în formular. Prin intermediul parametrului se precizează șirul de caractere ce va fi scris. După scriere, coordonatele poziției de desenare vor fi cele de la sfârșitul textului. Ștergerea textului și a desenelor din formular. După ștergere, coordonatele poziției de desenare vor fi (0,0). Obiectul vizual - setul de formulare Este un container care conține un grup de formulare. Este caracterizat de proprietățile care pot fi folosite pentru parcurgerea ciclică a formularelor din set: Proprietatea Reprezintă ! IV-'- Q > i 11 j L Numărul de formulare din set. Este de tip numeric. i H H : Formularele. Este de tip vector. în elementele vectorului se păstrează referințele către formularele din grup. , l Vi < / v Conține o referință către formularul activ Stabilește cum este eliberat setul de formulare. Este de tip logic: dacă are valoarea .T. (implicit, atunci când setul de formulare este creat pe baza metodei vizuale), setul : \ • K P'; ■ {li de formulare va fi eliberat după ce este eliberat și ultimul formular din set, iar dacă are valoarea ,F. (implicit, atunci când setul de formulare este creat prin program), setul de formulare nu va fi eliberat după ce este eliberat și ultimul formular din set. Obiectul vizual - setul de pagini Obiectul vizual - pagina Setul de pagini este un container care conține un grup de pagini. Pentru a fi vizibil, setul de pagini trebuie creat într-un formular (form). El se folosește pentru a obține un obiect de interfață de tipul casetă de dialog cu secțiuni (tabs). Setul de pagini va reprezenta caseta de dialog, iar paginile - secțiunile casetei. La un moment dat, o singură pagină (secțiune a casetei) este activă. Paginile nu pot fi create decât într-un set de pagini, și nu ca formulare independente. Dacă este mutat setul de pagini, se mută automat cu el și paginile. Eticheta paginii este afișată în partea superioară a paginii. Ea este folosită ca un identificator al paginii, dar și ca un element care poate fi acționat cu mouse-ul (clic) pentru a activa pagina. Ca identificator al etichetei paginii se folosește textul din proprie- tatea Caption a paginii. FoxinSet PageFrame Page 164 Sisteme de gestiune a bazelor de date Setul de formulare are următoarele proprietăți specifice care determină caracteristicile paginilor din set: Proprietatea Reprezintă ActîvePage Pagina activă. Este de tip numeric și reprezintă numărul paginii active. PageHeight Proprietățile de tip numeric care pot fi folosite pentru dimensiunea paginilor din PageWidth set: înălțimea paginii (fără etichetă), respectiv lățimea paginii. Pro prietăți folosite pentru parcurgerea ciclică a paginilor din set PageCount Numărul de pagini din set. Este de tip numeric. Paginile. Este de tip vector. în elementele vectorului se păstrează referințele Pages către paginile din set. Numărul de ordine al paginii. Este de tip numeric. El este diferit de indexul paginii din vectorul Pages. Modificarea unui număr de ordine al unei pagini duce la rearan- PageOrder jarea tuturor paginilor. De exemplu, dacă există patru pagini și se dorește ca pagina a patra să devină a doua, i se atribuie acesteia numărul de ordine 2. Automat pagina a doua va primi numărul de ordine 3, iar pagina a treia numărul de ordine 4. Proprietăți care caracterizează jrvnr din set Prezența etichetelor. Este de tip logic și determină dacă vor fi afișate etichetele. Tabs Dacă are valoarea ,T. (implicit), etichetele paginilor vor fi afișate, altfel zona etichetei va fi ocupată de pagină. Lățimea etichetelor. Este de tip numeric. Dacă are valoarea 0 - (Justified), TabStyle eticheta este dimensionată după lungimea textului. Dacă are valoarea 1 - (Nonjustified), etichetele paginilor sunt dimensionate astfel încât să ocupe toată lățimea setului de pagină. Aranjarea etichetelor. Este de tip numeric și determină modul în care vor fi aranjate etichetele în cadrul setului de pagini, atunci când lungimea textului eti- TabsStretch chetelor depășește lățimea setului de pagini. Dacă are valoarea 0 - (Multiple Rows), etichetele vor fi scrise pe mai multe rânduri. Dacă are valoarea 1 - (Single Row), etichetele sunt afișate pe o singură linie și textul etichetelor este secționat astfel încât să încapă în etichetă. Valoarea implicită este 1. Identificarea unei pagini se poate face în două moduri: . sau / unde Pages este numele proprietății care păstrează într-un vector referințele fiecărei pagini a setului, iar indexul paginii din acest vector. Se identifică instrumentele constructoraM de formulare: Se va realiza un formular pentru testarea metodelor folosite într-o fereastră. ■ Se deschide fereastra constructorului de formulare fie cu opțiunea de meniu File-»_New... (în caseta de dialog New Fi'e se alege butonul Form din grupul de butoane radio File Type și apoi se execută clic pe butonul New File), fie cu comanda create form formal. ■ Pentru crearea formularului și a obiectelor din formular Constructorul de formulare pune la dispoziția programatorului următoarele instrumente: — Ferestre: Fereastra aplicației. Are titlul 1,0. urmat de numele fișierului în care se creează formularul. Fereastra conține spațiul formularului în care se creează obiectele. Informatică 165 Fereastra de proprietăți. Are titlul ?roj»eri-je& și conține mai multe secțiuni. Fereastra pentru secvențele de cod asociate metodelor și evenimentelor. Are titlul ., unde este numele obiectului pentru care se scrie procedura (se poate alege din lista ascunsă Object), iar este numele metodei sau evenimentului pentru care se scrie procedura (se poate alege din lista ascunsă Procedure). Fereastra mediului de date al formularului. Are titlul i mvi și poate fi folosită pentru precizarea tabelelor, a vizualizărilor și a relațiilor dintre ele. Tabelele vor fi deschise automat la definirea formularului. Bara pentru obiectele din formular - ' ' < n Afișează butoane pentru a selecta obiectul care se creează în cadrul formularului. Bara pentru aspectul formularului - Lnvouî Afișează controale cu ajutorul cărora se stabilește modul în care sunt aranjate obiectele create în formular. Bara constructorului - Afișează controale cu ajutorul cărora se stabilesc instrumentele afișate de aplicația constructor. Bara pentru controlul culorilor - C v⁵ ’ Jeiv;. Afișează controale cu ajutorul cărora se pot alege culorile. — DoVbof nodc Meniul este vizibil numai dacă este deschisă fereastra constructorului de formulare și conține opțiuni specifice acestei aplicații. Prin intermediul opțiunilor sale se pot administra clasele definite de utilizator (crearea și modificarea unor proprietăți și metode, includerea unui fișier de constante), se pot administra seturi de formulare (crearea setului de formulare, adăugarea sau înlăturarea formularelor din set etc.), se poate administra formularul care se creează (deschiderea constructorului rapid pentru crearea lui, lansarea lui în execuție, modificarea lui). în meniul Vfev? devin vizibile opțiuni prin care se pot stabili instrumentele Constructorului de formulare care se vor afișa. în meniul devin vizibile opțiuni prin care se pot stabili caracteristicile grilei folosite pentru alinierea obiectelor în formular. Opțiunile de meniu: Opțiunea Semnificația Meniul view Data Opțiune de tip comutator. Controlează afișarea ferestrei mediului de date. Environment Properties Opțiune de tip comutator. Controlează afișarea ferestrei de proprietăți. Code Opțiune de tip comutator. Controlează afișarea ferestrei pentru secvențele de cod. Form Controls Opțiune de tip comutator. Controlează afișarea barei cu instrumente pentru Toolbar crearea obiectelor în formular. Layout Toolbar Opțiune de tip comutator. Controlează afișarea barei cu instrumente pentru administrarea obiectelor în formular. Color Palette Opțiune de tip comutator. Controlează afișarea barei cu instrumente pentru Toolbar stabilirea culorilor. Tab Order Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular. Ordinea implicită este cea în care au fost proiectate (adăugate la formular). Grid Lines Opțiune de tip comutator. Afișează/ascunde grila pentru alinierea obiectelor. 166 Sisteme de gestiune a bazelor de date Opțiunea Semnificația Show Position Opțiune de tip comutator. Controlează afișarea în bara de stare a poziției și dimensiunii obiectului selectat. Meniu! Snap To Grid Opțiune de tip comutator. Controlează alinierea automată a obiectelor nou create la liniile grilei. Set Grid Scale Permite modificarea distanțelor (în pixeli) dintre liniile grilei. Meniul New Property... Creează o proprietate nouă pentru o clasă definită de utilizator. Se deschide caseta de dialog New Property prin intermediul căreia stabiliți numele și descrierea proprietății. New Method... Creează o metodă nouă pentru o clasă definită de utilizator. Se deschide caseta de dialog New Method prin intermediul căreia stabiliți numele și descrierea metodei. Edit Property/ Permite modificarea sau ștergerea unei proprietăți sau metode definite de utiliza- Method... tor. Se deschide caseta de dialog Modify Property/Method prin intermediul căreia administrați proprietățile și metodele definite. Include Fille... Permite specificarea numelui fișierului cu constante predefinite ale clasei definite de utilizator. Create Form Creează un set de formulare care va conține formularul curent. Dacă există deja Set un set de formulare, opțiunea nu este disponibilă. Remove Form înlătură setul de formulare. Opțiunea este disponibilă numai dacă există un set de Set formulare, iar acesta conține numai un formular. Add New Form Adaugă un formular la setul de formulare. Opțiunea este disponibilă numai dacă a fost creat un set de formulare. Remove Form înlătură formularul curent din set. Opțiunea este disponibilă numai dacă a fost creat un set de formulare, iar acesta conține mai mult de un formular. Quîck Form... Deschide fereastra Constructorului rapid de formulare. Run Form Lansează în execuție formularul. ■ Se identifică instrumentele specifice constructorului de formulare: butoanele din barele de instrumente, ferestrele și opțiunile de meniu specifice acestei aplicații. ■ Se afișează barele cu instrumente și se identifică pe fiecare bară controalele care pot fi folosite. Form Controls P 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Buton Buton Buton 1 Select Object 9 CheckBox 17 OLE Container Control 2 View Classes 10 ComboBox 18 OLE Bound Control 3 Labei 11 List 18 Line 4 TextBox 12 Spinner 20 Shape 5 EditBox 13 Grid 21 Container 6 CommandButton 14 Image 22 Separator 7 CommandGroup 15 Timer 23 BuildLock 8 OptionButton 16 PageFrame 24 ButtonLock Marea majoritate a butoanelor din bara Form Controls se pot folosi pentru a crea obiecte vizuale în formulare (Labei, TextBox etc.). Butonul Select Object se poate folosi pentru a Informatică selecta un grup de obiecte din formular. Butonul BuildLock se poate folosi pentru a lansa în execuție Constructorul rapid pentru formulare, iar butonul ButtonLock se poate folosi pentru a crea mai multe instanțe ale aceluiași obiect. Form Desîgner_____________________________P Ui EMî5y4*l EF ^|IpI ^1^1 123456789 Buton Buton Buton 1 Set Tab Order 4 Code Window 7 Layout Toolbar 2 Data Environment 5 Form Control Toolbar 8 Form Builder 3 Properties Windows 6 Color Palette Toolbar 9 Auto Format Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce instrumente ale aplicației vor fi afișate (fereastra de proprietăți, fereastra de cod etc). Butonul FormBuilder se poate folosi pentru a lansa în execuție Constructorul rapid pentru formulare. Butonul AutoFormat se poate folosi pentru a aplica un anumit stil de formatare asupra obiectelor de același tip, selectate. Stilul de formatare se referă la aspectul chenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor și la efectul 3D al obiectelor. La acționarea acestui buton se deschide fereastra aplicației Constructorului de format: AutoFormat Builder. Se identifică opțiunile de meniu pentru care butoanele din această bară sunt scurtături. 1 2 3 4 5 6 7 8 9 10 11 12 ' 13 Buton Buton Buton 1 Align Left Sides 5 Align Vertical Centers 10 Center Horizontally 2 Align Right Sides 6 Align Horizontal Centers 11 Center Vertically 3 Align Top Edges 7 Same Width 12 Bring to Front 4 Align Bottom Edges 8 Same Height 13 Send to Back 9 Same Size Butoanele din bara Layout sunt disponibile numai dacă au fost selectate mai multe controale și se folosesc pentru a stabili alinierea grupului de controale, modul în care se uniformizează dimensiunea lor și stratul din formular în care vor fi afișate (obiectele pot fi afișate în două straturi). Butoanele Align Left Sides, Align Right Sides, Align Top Edges și Align Bottom Edges se folosesc pentru alinierea controalelor față de marginea grupului selectat. Butoanele Align Vertical Centers și Align Horizontal Centers se folosesc pentru alinierea centrată față de axa verticală, respectiv orizontală a grupului selectat, iar Center Horizontally și Center Vertically se folosesc pentru alinierea centrată față de axa verticală, respectiv orizontală a grupului selectat, în mijlocul formularului. Butoanele Same Width, Same Height și Same Size se folosesc pentru a uniformiza dimensiunea controalelor din grupul selectat: la cel mai lat, la cel mai înalt și la cel mai mare. Butoanele Bring to Front și Send to Back stabilesc stratul în care va fi afișat grupul de controale: deasupra celorlalte sau dedesubt. Sisteme de gestiune a bazelor de date Paleta de culori conține controale prin care se poate stabili elementul pentru care se alege culoarea (hârtia sau cerneala), controale pentru o paletă standard de culori și controlul pentru deschiderea unui constructor de culori. ■ în fereastra de proprietăți se pot stabili și vizua- liza proprietățile formularului și ale fiecărui obiect din formular. Din lista ascunsă se alege formu- larul sau obiectul pentru care se stabilesc proprietățile. Dacă se deschide această listă, se poate vedea ierarhia de obiecte a formularului. Prin intermediul ei se identifică relația de filiație a obiectelor în formular. Există următoarele convenții în scrierea proprietăților în listă: Normal - proprietatea are valoarea implicită și nu este protejată la scriere (este de tip Read-Write). Bold - proprietatea are valoarea modificată față de cea implicită. Italic - proprietatea are valoarea implicită și nu este protejată la scriere (este de tip Read-Only). ||fi Properties - FormDocI BRE Lista ascunsă din care se alege obiectul r pentru care se stabilesc proprietățile și procedurile pentru metode și evenimente. Activate Ev^nt ActiveControl ActiveForm AddObject AlwaysOnT cp AutoCenter BackColor BaseClass BorderStyle Box BufferMode Caption Circle Class ClassLibrary Click Event ClipControls Closable [Default] |IHI Fotml IȘ AII | Data | Metho] Layout| Other .F. - Fal^ (Defai efai .F. - False /iw 3 - Sizable (Defc [Default] 0 ■ None (Defau exemplu [Default] ^97? [Default]" .T. - True (Defai .F. - False Cls | ColorSource [Default] Secțiunea AII Data Conține Toate proprietățile Method Layout Other Numai proprietățile care carac- terizează data memorată în control. Numai metodele și evenimentele asociate obiectului. Numai proprietățile care caracterizează aspectul controlului. Alte proprietăți decât cele care caracterizează datele și aspectul. Se activează constructorul de expresii Expression Builder pentru construirea interactivă a unei expresii. Proprietate pentru care s-a modificat valoarea implicită Proprietate protejată la scriere Proprietate sau metodă sau eveniment selectat Fiecare proprietate are un meniu rapid care conține opțiunea Reset to Default prin care se atribuie proprietății valoarea implicită și Help... care deschide fereastra cu informații despre proprietate (help dependent de context). Informatică ■ Se definesc în fereastră două obiecte, o etichetă și o casetă de text astfel: se execută clic pe butonul Labei din bara cu controale și apoi se indică în formular colțul din stânga sus al etichetei și se glisează mouse-ul până când se obține dimensiunea dorită pentru obiect. Se repetă operația pentru caseta de text (butonul TextBox). Se identifică pentru aceste controale valorile implicite pentru proprietățile, evenimentele și metodele asociate. ■ Formularul și obiectele din formular au fiecare câte un meniu rapid de comenzi care se deschide executând pe formular sau pe obiect clic cu butonul din dreapta al mouse-ului. în tabel, opțiunile disponibile pentru formular sunt marcate cu F, iar cele disponibile pentru obiecte sunt marcate cu O.__________________________________________________________________ Opțiunea Semnificație Run F Lansează în execuție formularul. Copy 0 Copiază în Clipboard obiectul selectat. Cut 0 Mută în Clipboard obiectul selectat. Paste F Inserează în formular, în poziția indicată, obiectul care fost copiat anterior în Clipboard. Data F Deschide fereastra Data Environment Environment Properties F,0 Afișează în fereastra de proprietăți formularul sau obiectul selectat. Builder F,0 Deschide fereastra Constructorului rapid de formulare corespunzătoare obiectului selectat. Code F,0 Deschide fereastra pentru scrierea secvenței de cod asociate unei metode sau eveniment al obiectului selectat. Help F,0 Deschide fereastra cu informații despre obiect (help dependent de context). ■ Se identifică, pentru formular și obiectele definite în formular, opțiunile meniului cu comenzi rapide. ■ Cu obiectele din formular se pot executa mai multe operații: -> Selectare obiect - se execută clic pe suprafața obiectului. -> Selectare grup de obiecte - se execută clic pe butonul Select Object din bara Form Controls și se glisează apoi mouse-ul peste obiectele pe care trebuie selectate. -> Mutarea obiectului - fie se glisează obiectul cu mouse-ul, fie se selectează obiectul și apoi se folosesc operațiile Cut și Paste (din meniul Edit sau din meniul de comenzi rapide). -> Copierea obiectului - se se- lectează obiectul și apoi se folosesc operațiile Copy și Paste (din meniul Edit sau din meniul de comenzi rapide). -> Ștergerea obiectului - se selectează obiectul și apoi se apasă tasta Delete. Se creează instanțe multiple ale unui obiect - se execută clic pe butonul ButtonLock din bara Form Controls, se execută apoi clic în această bară pe obiectul WlForm Designer - FormDpcI_____________________________________HIIbI E $ exemplu __________________________________ LabeH I Textl [Text? Sisteme de gestiune a bazelor de date pentru care se creează instanțe multiple, se creează obiectul în formular și apoi se execută clic în locul în care trebuie creată o copie a acestui obiect. Se execută clic pentru fiecare copie ce trebuie creată. După ce au fost create copiile obiectului, se dezactivează această funcție executând clic pe butonul ButtonLock. ■ Folosind funcția de creare de instanțe multiple, se mai ada- ugă la formular două casete de text. Se selectează grupul de casete de text și se aplică un anumit stil acestor casete (cu AutoFormat Builder). Se alinia- ză grupul în diferite maniere folosind butoanele de pe bara Layout. ■ Se schimbă ordinea de parcur- gere a formularului fie folosind opțiunea de meniu, fie cu buto- nul Sel Tab Order din bara Form Noua ordine de parcurgere a formularului cu tasta Tab. Designer. Se stabilește ordinea executând clic în formular, pe obiecte, în ordinea în care trebuie să fie parcurse: ■ Se închide constructorul de formulare fără a salva modificările făcute. Se creează un formular în care textul și desenele sunt afișate numai dacă se indică formularul cu mouse-ul și se apasă butonul stâng. La eliberarea butonului de mouse textul și desenele afișate se șterg. ■ Se deschide fereastra constructorului de formulare. ■ în fereastra de proprietăți se atribuie următoarele valori proprietăților (care determină aspectul și comportarea formularului): W Exemplu Name = "Forml" ForeColor = 0,0,0 FillStyle = 7 ScaleMode = 3 BorderStyle = 2 Closable = .T. Top = 13 Caption = "Exemplu” Enabled = .T. Left =14 FontName = "Courier New” Visible = .T. Height = 300 FontSize =16 ShowTips = .F. Width = 450 FontBold = .T. Tablndex = 1 Desktop = .F. DrawWidth = 5 TabStop = .T. BackColor = FillColor = Windowstate = 0 220,220,220 150,150,150 WindowType = 0 ■ Pentru afișarea textului și a desenelor, la apăsarea butonului de mouse, se scrie procedura asociată evenimentului MouseDown în care s-au apelat metodele spe- cifice formularelor - Prinț (scrierea textului), Line (desenarea liniei), Circle (desena- rea cercului). Pentru a avea acces la fereastra de cod, se deschide în fereastra de Informatică proprietăți secțiunea Method și din evenimentul MouseDown. procedure MouseDown Lparameters nButton, nShift, ; nXCoord, nYCoord ThisForm.CurrentX=10 ThisForm.CurrentY=10 for i=l to 25 ThisForm.Prinț(’Exemplu’) ThisForm.CurrentX=; ThisForm.CurrentX+10 ThisForm.CurrentY=; ThisForm.CurrentY+10 endfor lista de metode și evenimente se alege xl=25 yl = 10 x2 = 65 y2 = 50 for i=l to 8 ThisForm.Line(xl,yl,x2,y2) ThisForm.Line(x2,y2,xl,y2+50) xl=xl+50 x2=x2+50 endfor ThisForm.Circle(75,225,225) Endproc H Forml .MouseDown Object: |Eș| Forml Procedure: | MouseDown T| LPARAMETERS nButtonX nShift, nXCoord, nYCoord / ThisForm.Cur Din lista ascunsă Din lista ascunsă ThisForm.Cur Object puteți alege Procedure puteți for i=l to 2 obiectul pentru alege evenimentul ThisForm.Pr care scrieți codul sau metoda pentru ThisForm.Cu procedurii. care scrieți ThisForm.Cu i. CurrentX+10 secvența de cod. endfor i. CurrentY+10 ■ Pentru ștergerea textului și a desenelor, la eliberarea butonului de mouse se scrie procedura asociată evenimentului MouseUp în care se apelează metoda Cls (ștergerea): Procedure MouseUp Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Cls Endproc ■ Se salvează formularul și apoi se lansează în execuție - executând clic pe butonul Run din bara standard. Observație: Procedurile asociate evenimentelor MouseMove, MouseUp și MouseDown primesc din partea sistemului următoarele informații prin intermediul parametrilor: - > - reprezintă butonul de mouse acționat: 1 - butonul stâng, 2 - butonul drept și 4 -butonul din mijloc. - este un cod numeric (modul în care se calculează a fost prezentat la eve- nimentul PressKey) prin care se poate determina dacă mouse-ul a fost acționat împreună cu o tastă rece Shift, Alt și Ctrl. - > , - reprezintă coordonatele cursorului de mouse, relative la formular. Sisteme de gestiune a bazelor de date 1. Se creează un set de formulare ce conține două formulare. Legendele celor două formulare sunt Formular 1 și Formular 2. Pentru fundalul lor se aleg două culori diferite. ■ Se creează setul de formulare cu opțiunea de meniu Form-»Create Form Set. Inițial setul va conține un singur formular. Se adaugă al doilea formular cu opțiunea de me- niu FornwAdd New Form. ■ Proprietățile setului de formulare și ale formularelor se stabilesc prin inter- mediul ferestrei de proprietăți, astfel: * Proprietățile setului AutoRelease = .T. Name = "Formsetl" * Proprietățile formularului 1 Name = "Forml" Top = 8 Left = 44 Height = 250 Width = 375 BackColor = 128,128,128 BorderStyle = 1 Caption = "Formularul 1" AlwaysOnTop = .T. * Proprietățile formularului 2 Name = "Form2" Top = 32 Left = 113 Height = 250 Width = 375 BackColor = 192,192,192 BorderStyle = 2 Caption = "Formularul 2" ■ Pentru fiecare formular, se scrie câte o procedură asociată evenimentului Click. La producerea acestui eveniment, se parcurg ciclic cele două formulare, și se afișează în bara de titlu a fiecărui formular numărul său. Procedure Click for n=l to thisformset.formcount thisformSet.Forms(n).Caption= thisformSet.Forms(n).Caption+str(n,2) endfor Endproc ■ Salvați setul de formulare și îl testați lansându-l în execuție. 2. Setului de formulare i se mai adaugă un formular. Formularul Formular 7 va fi afișat întotdeauna deasupra celorlalte. Formularele pot fi mutate pe ecran, dar niciun formular nu poate fi adus dea- supra formularului Formular 7. Se im- plementează, prin intermediul proce- durilor, răspunsuri la evenimentul Click. ■ Se deschide formularul anterior și se salvează sub un alt nume. Se adaugă la setul de formulare cel de al treilea formular. & JOjAll Formularul IFormularul ^Formularul "^Formularul ^Formulai ul 1Fo - !□! X| ularul Formularul 1 Formularul 2Formularul 3Formularul 3Formula Formu ul IFormularul IFormularul 3Formularul IFormularul 3Forn| ularul _____________________________________________- iDl-X] FormuFormularul IFormularul 2Formularul 3Formularul 3Formuk ul IFormularul IFormularul 3Formularul IFormularul 3Forn ularul IFormularul 3Formularul 2Formularul 3Formularul 3 Formularul 1 Informatică ■ Se stabilesc proprietățile pentru cel de al treilea formular: * Proprietățile formularului 3 Left = 132 Name = "Form3” Caption = "Formularul 3" Top = 54 ■ Pentru fiecare formular se scrie câte o procedură asociată evenimentului Click. La producerea acestui eveniment, se parcurg ciclic cele trei formulare și se scrie în fiecare formular eticheta formularului în care s-a produs evenimentul Click: * Procedura pentru formularul 1 Procedure Click for n=l to thisformset.formcount thisformSet.Forms(n).Prinț(’Formularul 1’) endfor Endproc * Procedura pentru formularul 2 Procedure Click for n=l to thisformset.formcount thisformSet.Forms(n).Prinț(’Formularul 2') endfor Endproc * Procedura pentru formularul 3 Procedure Click for n=l to thisformset.formcount thisformSet.Forms(n).Prinț(’Formularul 3’) endfor Endproc Se construiește un set de pagini care conține 8 pagini: ■ Se lansează în execuție constructorul de formulare și se creează un formular nou. ■ Se execută clic pe butonul PageFrame din bara Form Controls. Se glisează apoi mouse-ul în fereastra formularului, peste suprafața care va fi ocupată de setul de pagini. Se va crea inițial un set de pagini cu două pagini. ■ în fereastra Properties se alege din lista de obiecte obiectul PageFramel și se scrie pentru proprietatea PageCount (număr de pagini) valoarea 8. ■ Se stabilesc apoi și celelalte proprietăți ale obiectelor. Valorile proprietăților formularului, setului de pagini și paginilor sunt: * Formularul Caption = "Forml" Name = "Forml" * Setul de pagini Name = "Pageframei" PageCount = 8 PageHeight=2 0 3 PageWedth=345 TabStretch = 0 Top = 12 Left =12 Width =349 Height =252 Tabs = .T. * Paginile Pagei.Caption = "Pagina 1" Pagei.Name = "PI" Pagei.PageOrder = 1 Page2.Caption = "Pagina 2" Page2.Name = "P2" Page2.PageOrder = 2 Page8.Caption = "Pagina 8" Page8.Name = "P8" Page8.PageOrder = 8 Sisteme de gestiune a bazelor de date ■ în fereastra Properties, se deschide lista cu obiectele din pagină și se observă structura ierarhizată a obiectelor din formular. ■ Cele două moduri în care sunt afișate paginile sunt controlate cu proprietatea TabStretch. Se testează efectul acestei proprietăți. Pagina 1 | Pagina 2 | Pagina 3 | Pagina 4 j Pagina 5 j Pagina 6 j Pagina 7 | Pagina 8 1 j TabStretch=O TabStretch=1 Paginj] Pagin Accesul condiționat . Se declanșează înaintea primirii focalizării. Metoda de răspuns la eveniment poate fi folosită pentru a focaliza condiționat controlul: dacă nu sunt Sisteme de gestiune a bazelor de date îndeplinite anumite condiții (precizate în procedură), controlul nu va putea fi focalizat. Procedura va întoarce un rezultat de tip logic: valoarea .T. va permite primirea focalizării, iar valoarea .F. - nu. -> Validarea . Se declanșează înainte de pier- derea focalizării. Metoda de răspuns la eveniment poate fi folosită pentru a ceda focalizarea condiționat: de exemplu, în cazul unei casete de text, dacă valoarea introdusă în câmp nu îndeplinește o anumită condiție, nu se va putea focaliza următorul control. Procedura va întoarce fie un rezultat de tip logic (valoarea .T. va permite transferarea focalizării, iar valoarea .F. va păstra focalizarea), fie un rezultat numeric (0 - controlul păstrează focalizarea, diferită de 0- focalizarea va avansa peste n controale, n fiind valoarea furnizată; avansarea se va face în sensul acționării tastei Tab, dacă valoarea este pozitivă, și în sens invers, dacă valoarea este negativă). Astfel, dacă procedura întoarce valoarea 1, focalizarea este trecută controlului următor, iar dacă întoarce valoarea -1, focalizarea este trecută controlului anterior. Control Tipuri de date permise CheckBox Integer, Numeric, Logical Command Character, Group Integer, Numeric EditBox Character, Memo TextBox Orice tip Grîd Character, Numeric ListBox Character, Integer, Numeric Combo Character, Box Integer, Numeric Spinner Currency, Integer, Numeric Option Integer, Numeric, Button Logical Option Character, Group Integer, Numeric Cea mai simplă cale prin care i se permite unui utilizator să interacționeze cu o aplicație este executarea unui clic pe un buton de pe ecran. Aceste controale pot fi de tip sau buton de comandă (command button) sau (menu option). Controlul - butonul de comandă Este folosit pentru a începe, a întrerupe sau a termina un anumit proces în cadrul aplicației. De exemplu, în timpul executării unui proces poate fi afișat un buton de comandă de tip Pause care prin acționare oprește temporar executarea procesului. în timpul opririi temporare a unui proces, butonul de pauză este înlocuit cu butonul Resume pentru reluarea execuției procesului din punctul în care a fost întrerupt. Mai poate fi afișat și un buton Stop care poate opri execuția procesului. în general, acestui control nu i se asociază valori, ci acțiuni descrise prin procedura asociată evenimentului Click. Butonul de comandă nu are proprietatea BackColor, iar proprietatea Style poate avea valorile: 0 - standard (implicit) și 7 - invizibil. Are proprietățile WordWrap și Autosize (care vor fi prezentate ulterior). în funcție de modul în care este informat utilizatorul despre acțiunea butonului există: -> Butoane în care acțiunea este descrisă printr-un text. în acest caz, textul care descrie acțiunea va fi păstrat de proprietatea Caption a controlului. -> Butoane în care acțiunea este descrisă printr-o imagine. în acest caz, identificatorul fișierului care conține imaginea care va fi afișată va fi păstrat de proprietatea a controlului (identificatorul fișierului în care este păstrată imaginea). în cazul în care se folosește imaginea pentru descrierea acțiunii, trebuie folosite și următoarele proprietăți: - imaginea afișată când butonul este focalizat și imaginea afișată când butonul nu este disponibil. Informatică 177 Declanșatorul poate fi acționat în mai multe moduri: — Se execută clic pe buton. — Se focalizează butonul apăsând repetat tasta Tab și apoi se apasă tasta Enter sau Spațiu. — Se apasă tasta Alt împreună cu tasta de acces (tasta literei de identificare). — Dacă butonul de comandă este butonul implicit al formularului, se apasă tasta Enter, indiferent de poziția selectorului. Dacă butonul de comandă este butonul de anulare al formularului, se apasă tasta Esc, indiferent de poziția selectorului. Indiferent de modul ales, evenimentul este același (evenimentul Click): prin acționarea butonului se declanșează operația atribuită lui. Un formular nu poate conține decât un buton implicit și un buton de anulare. Tipul butonului este controlat cu proprietățile specifice unui buton de comandă: Implicit- Default. Este de tip logic. Dacă are valoarea .T., butonul de comandă este butonul implicit. Valoarea implicită pentru această proprietate este .F. - > Anulare - Cancel. Este de tip logic. Dacă are valoarea .T., butonul de comandă este butonul de anulare. Valoarea implicită pentru această proprietate este .F. 1. Se construiește un formular cu butoane de comandă folosind metoda programării: Se realizează un formular care să prezinte panta unei linii. Formularul este de tip casetă de dialog, are titlul Test linie și culoarea fundalului gri. Pentru testarea liniei se vor folosi trei butoane de comandă: Crescător, Normal, Descrescător. Cel de al pa- || Crescător j| Normal [ Descrescător trulea buton, Terminare, se folosește pentru a închide formularul. Toate Terminare I butoanele au taste de acces. —⁼----------¹ Acțiunile realizate la acționarea butonului sunt descrise în procedurile pentru evenimentele Click ale fiecărui buton. ■ Se scrie programul sursă într-un fișier forma_p.prg.. public h FI = CreateObject(' Form') FI,Caption='Test linie' Fl.Closable = .F. FI.Width=400 FI.Height=200 FI.BackColor=RGB(220,220, 220) FI.Addobject(' L', 'Line') FI.Addobject('Bl', 'Butonl') FI.AddObject('B2', 'Buton2') FI.Addobject('B3', 'Buton3') FI.AddObject('B4', 'Buton4') FI.L.Visible = .T. FI.L.Top = 20 FI.L.Left = 150 h=Fl.L.Height FI.Bl.Visible =.T. FI,B2.Visible =.T. FI. B3.Visible =.T. FI.B4.Visible =.T. FI.Show Read events Define class Butonl as; CommandButton Caption = ' \ Autodimensionarea - j s. Este de tip logic și stabilește dacă eticheta va fi re- dimensionată automat pe orizontală (textul va fi scris pe un singur rând), păstrându-i-se înălțimea, astfel încât să încapă textul: .T. - eticheta este redimensionată automat, iar .F. (implicit) - eticheta nu este redimensionată (în acest caz textul care nu încape în etichetă este tăiat și nu mai este afișat). - > Trunchierea textului - WordWra-p . Este de tip logic și stabilește cum va fi expandată eticheta (pe orizontală sau pe verticală) pentru a încăpea textul atunci când controlul este redimensionat: .T. - textul este trunchiat, adică se mărește dimensiunea etichetei pe verticală, păstrându-i-se lățimea (textul va fi scris pe mai multe rânduri, separarea textului pe rânduri făcându-se la nivel de cuvânt), iar .F. (implicit) - textul nu se trunchiază, nu i se modifică înălțimea, dar este mărită lățimea. Dacă are valoarea .T., proprietatea AutoSize este ignorată. i- 'j- Pentru toate laboratoarele care urmează se salvează formularul creat, se lansează în execuție și se testează. : > . ■■.■•-'<''1'- nare canține etichete: Caseta de dialog Test mouse conține două secțiuni pentru testarea mouse-ului: secțiu- nea Deplasare mouse - pentru testarea deplasării mouse-ului (coordonate, buton apăsat și taste apăsate) și Apăsare buton - pentru testarea butonului apăsat (coordonate, buton apăsat și taste apăsate). T est mouse Deplasare mouse Apasare buton Coordonatele cursorului de mouse sunt: x= 275 y= 198 Buton a pasat Stanga Tasta apasta Shift Alt T est mouse Deplasare mouse Apasare buton Coordonate x= Butonul apasat este: împreuna cu tasta: 227 165 Dreapta Terminare Terminare Controalele folosite pentru afișare sunt de tip etichetă (labei). în fiecare secțiune se creează 11 etichete. De exemplu, în prima secțiune se definesc 5 etichete cu text fix: Coordonatele cursorului de mouse sunt:, x=, y=, Buton apasat, Tasta apasata și 6 etichete cu legende dependente de acțiunile mouse-ului: două pentru coordonate, una pentru butonul apăsat și trei pentru tastele apăsate 180 Sisteme de gestiune a bazelor de date 1. Se creează un formular nou. Se creează în formular un set de pagini cu două pagini. Se creează în fiecare secțiune etichetele astfel: se execută clic pe butonul Labei de pe bara Form Controls și se glisează apoi mouse-ul în formular pentru a trasa eticheta. 2. Folosind fereastra Properties se stabilesc proprietățile formularului, ale setului de pagini, ale paginilor și ale obiectelor folosite: * Formular 1 Name = "Formular" Top = 11 Left =33 Height =296 Width = 375 BackColor = 200,200,200 Caption = HTest mouse” Windowstate = 0 * Setul de pagini Name = "Caseta" PageCount = 2 TabStretch = 1 ActivePage = 1 Top = 0 Left = -12 Width = 408 Height =253 * Secțiunea 1 Pagei.Name = "Sectl" Pagei.Caption=”Deplasare mouse * Secțiunea 2 Page2.Name = KSect2” Page2.Caption = "Apasare buton * Etichetele * proprietăți comune: Name = .... AutoSize = .T. BackStyle = 0 Caption = .... Height = ... Left = ... Top = ... Width = ... *Exemplu: Name = ”L2” AutoSize = .T. BackStyle = 0 Caption = ”x= ” Height =18 Left =47 Top = 72 Width =20 * Butonul de comanda Name = "Buton" Caption = "\ Barele de derulare - ScrollBars . Este de tip numeric. Se afișează barele de derulare atunci când dimensiunea textului depășește capacitatea de afișare a casetei. în general, proprietatea precizează dacă nu există bară de derulare, dacă există bară de derulare pe verticală, dacă există bară de derulare pe orizontală sau dacă există ambele tipuri de bare. în cazul zonei de editare, dacă are valoarea 0, bara de derulare este ascunsă și derularea textului în zona de editare se face numai cu ajutorul tastelor de editare, iar dacă are valoarea 2, este afișată bara de derulare pe verticală, care va permite și folosirea mouse-ului. Valoarea implicită este 2. - > Folosirea tabulării în text - AlowTabs . Este de tip logic; dacă are valoarea .F, nu este voie să se folosească tasta Tab pentru editarea textului (ea va fi folosită pentru ieșirea din zona de editare și predarea focalizării următorului control), iar dacă are valoarea .T., se poate folosi tasta Tab pentru editarea textului (pentru ieșirea din zona de editare se vor folosi tastele Ctrl+Tab). Valoarea implicită este F. Controlul Spinner- caseta de text cu derulor Caseta de text cu derulor este un control care combină un control casetă de text cu un control derulor. Derulorul facilitează utilizatorului modificarea unei valori numerice prin incrementare sau decrementare. Este reprezentat printr-un buton cu două săgeți (sus/jos sau dreapta/stânga) ce poate fi acționat executând clic cu mouse-ul pe una dintre săgeți. Evenimentul declanșat este incrementarea/decrementarea cu un pas a valorii asociate controlului. Derulorul nu are proprietatea de legendă și din această cauză trebuie asociat cu o etichetă care să precizeze parametrul căruia i se atribuie valoarea. Pe lângă proprietățile standard și specifice unei casete de text, derulorul mai are și următoarele proprietăți specifice: - > Pasul - Increment. Este de tip numeric și reprezintă cu cât se incrementează/decre- mentează valoarea. De exemplu, valorile numerice întregi pot fi incrementate cu o unitate, iar cele reale cu o zecime de unitate. Pasul implicit este 1. - > Proprietățile folosite pentru a preciza domeniul care poate fi parcurs (limitele valorii asociate controlului) sunt de tip numeric: Pentru valorile introduse de la tastatură în caseta de text: KeyboardHighVaiue - valoarea maximă și KeyboardLowValue - valoarea minimă. Domeniul implicit este ±2.147.483.647. Dacă se introduce un număr care depășește această valoare, se afișează un mesaj de eroare. Pentru valorile incrementate/decrementate în derulor: SpinnerHighValue - va- loarea maximă și SpinnerLowValue - valoarea minimă. Dacă se incrementează/ decrementează peste limite, nu se afișează un mesaj de eroare, dar valoarea contro- lului nu va mai fi modificată peste limitele admise. Pentru a controla comportamentul controlului au fost adăugate următoarele evenimente specifice: - > Evenimentele declanșate la pierderea focalizării controlului și care permit validarea valorii introduse (de la tastatură sau cu mouse-ul). Astfel, dacă metoda de răspuns la evenimentul RangeLow întoarce un număr mai mare decât cel introdus în control, con- rolul va păstra focalizarea, iar dacă metoda de răspuns la evenimentul RangeHight întoarce un număr mai mic decât cel introdus în control, controlul va păstra focalizarea. - > Evenimentele declanșate de acționarea derulorului cu mouse-ul: UpCIick - când este acționat butonul de incrementare și DownClick - când este acționat butonul de decrementare. Informatică 185 Se construiește un formular cu casete de text folosind metoda programării: 1. Se construiește o casetă de dialog care simulează un calculator. Vor fi trei casete de text: a, b - operanzii și c - rezultatul. Rezultatul trebuie să fie protejat la scrie- re. Pentru cele patru operații se vor folosi declanșatoarele +, *, /. Pentru operația de împărțire se va testa dacă împărțitorul este 0; dacă are valoarea 0, se va afișa un mesaj de atenționare, iar focalizarea va fi mutată pe operandul b. Cel de al cincilea buton Terminare se folosește pentru a închide caseta de dialog. ■ Se scrie programul sursă Calc_p.prg: FI = Createobject('Form') FI.Caption='Operatii ' Fl.Closable = .F. FI.Width=400 FI.Height=250 FI.BackColor=RGB(220,220,220) FI.AddObject('LI', 'Labei') FI.AddObject('CI','TextBox') FI.AddObject('L2','Labei') FI.AddObject('C2', 'TextBox') FI.AddObject('L3','Labei') FI.AddObject(' L4 ', 'Labei') FI.AddObject('C3','TextBox') FI.AddObject('Bl', 'Butonl') FI.AddObject('B2', 'Buton2') FI.AddObject('B3', 'Buton3') Fi.AddObject(' B4 ','Buton4') FI.AddObject('B5', 'Buton5') FI.LI.AutoSize = .T. FI.LI.BackColor=RGB(220,220,220) FI .LI.Caption = "a" FI.LI.Height =18 FI.LI.Left = 48 FI.LI.Top = 36 FI.LI.Width = 8 FI.LI.Visible = .T. FI.L2.AutoSize = .T. F1.L2.BackColor=RGB(220,220,220) FI.L2.Caption = "b" FI.L2.Height =18 FI. L2.Left =48 Fl.L2.Top =96 FI.L2.Width = 8 FI.L2.Visible =.T. FI.L3.BackColor=RGB(220,220,220) Operații Terminare FI.L3.Caption = "c" FI.L3.Height =18 FI.L3.Left =48 Fl.L3.Top = 144 FI.L3.Width = 7 FI.L3.Visible =.T. FI. L4.BackColor=RGB(220,220,220) FI. L4.Caption = "Imposibil!!!; împărțire la zero" FI. L4.Height =25 FI.L4.Left =36 FI,L4.Top = 204 FI.L4.Visible = .F. FI.L4.Width = 181 FI.CI.Value=0 FI.CI.InputMask = "999999" FI.CI.Left = 85 FI.Ci.Top = 36 FI.CI.Height =25 FI.CI.Width = 108 FI.CI.Visible =.T. FI.C2.Value=0 FI,C2.InputMask = "999999" FI.C2.Left =85 Fl.C2.Top = 84 FI.C2.Height =25 FI.C2.Width = 108 FI.C2.Visible = .T. FI. C3.Value=0 FI.C3.BackColor=RGB(220,220,220) FI.C3.Height =25 FI.C3.Left = 85 FI.C3.ReadOnly = .T. Fl.C3.Top = 144 FI.C3.Width = 108 c | 0 FI. C3.Style = 1 FI.C3.Visible = .T. FI.Bl.Visible = .T. FI.B2.Visible = .T. FI.B3.Visible = .T. FI.B4.Visible = .T. FI.B5.Visible =.T. FI.Show Read events Define class Butonl as; CommandButton Top = 24 Left =276 Height =25 Width = 61 Caption = ”+” Procedure Click ThisForm.C3.Value=; ThisForm.CI.Value+; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine Define class Buton2 as; CommandButton Top = 60 Left =276 Height =25 Width = 61 Caption = Procedure Click ThisForm.C3.Value=; ThisForm.CI.Value-; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine Define class Buton3 as; CommandButton Top = 96 Left = 276 Height =25 Width =61 Sisteme de gestiune a bazelor de date Caption = Procedure Click ThisForm.C3.Value=; ThisForm.CI.Value*; This Form.C2.Value ThisForm.C3.Refresh Enddefine Define class Buton4 as; CommandButton Top =132 Left = 276 Height = 25 Width =61 Caption = ”/" Procedure Click ThisForm.B4.StatusBarText='’ ThisForm.L4.Visible=.F. if ThisForm.C2.Value=0 ThisForm.B4.StatusBarText=; ’Imposibil!!! -; împărțire la 0’ ThisForm.L4.Visible=.T. ThisForm.C2.SetFocus else ThisForm.C3.Value=; ThisForm.CI.Value/; ThisForm.C2.Value ThisForm.C3.Refresh endif Enddefine Define class Buton5 as; CommandButton Top = 204 Left =264 Height = 25 Width =84 Caption = ”\ r ¹ dc ’ex. 'o'osâid constmctora! normal: 2. Se construiește caseta de dialog din exemplul precedent folosind constructorul. ■ Se creează un formular nou cu următoarele controale: patru etichete, trei casete de text și cinci butoane de comandă. ■ Pentru formular și controale se stabilesc următoarele proprietăți: * Formularul Left = 0 Name = ”Forml" BackColor = 220,220,220 Top = 0 Caption = "Operații” Informatică * Casetele de text Caption = ”Imposi b i1! i i • • < Name = "Textl” && Textl împărțire i Ia zero” InputMask = ”999999” Visible = .F. Name = ”Text2" && Text2 * pentru toate etichetele InputMask = ”999999” AutoSize = .T. Name = ”Text3” && Text3 BackStyle = 0 BackColor = 220,220,220 * Butoanele ReadOnly = .T. Name = "Commandl" && Butonl Style = 1 Caption = " + ” * Etichetele Name = "Command2” && Buton2 Name = ”Labell" && Etichetai Caption = ”-” Caption = "\0 ThisForm.Textl.Enabled=.T. Return .T. else ThisForm.Textl.Enabled=.F. Informatică Return .F. endif endproc H Pentru casetele de text se scriu proceduri asociate evenimentelor GotFocus și LostFocus: procedure GotFocus &&Textl ThisForm.Text2.Enabled=.F. ThisForm.Commandgroupl.Commandl.Enabled=.F. ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endproc procedure LostFocus &&Textl if Len(ThisForm.Textl.Value)<>0 ThisForm.Commandgroupl.Commandl.Enabled=.T. if Len(ThisForm.Text2.Value)<>0 ThisForm.Commandgroupl.Command2.Enabled=.T. ThisForm.Commandgroupl.Command3.Enabled=.T. endif else ThisForm.Commandgroupl.Commandl.Enabled=.F. ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endif endproc procedure GotFocus &&Text2 ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endproc procedure LostFocus &&Text2 if Len(ThisForm.Text2.Value)<>0 ThisForm.Commandgroupl.Command2.Enabled=.T. ThisForm.Commandgroupl.Command3.Enabled=.T. else ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endif endproc ■ Pentru butoanele din grup și pentru butonul Terminare se scriu proceduri asociate evenimentului Click procedure Commandl.Click && Grup.Butonl x=at(alltrim(ThisForm.Textl.Value), ThisForm.Editl.Value) if x<>0 ThisForm.Text2.Enabled=.T. ThisForm.Editl.SelStart=at(alltrim( ThisForm.Textl.Value)ᵣ ; ThisForm.Editl.Value)-1 ThisForm.Editl.SelLength=Len(alltrim(ThisForm.Textl.Value)) n=n+l else ThisForm.Commandgroupl.Commandl.Enabled=.F. ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. ThisForm.Text2.Enabled=.F. endif 194 Sisteme de gestiune a bazelor de date endproc procedure Command2.Click && Grup.Butonl ThisForm.Editl.SelText=alltrim(ThisForm.Text2.Value) ThisForm.Text2.Value=’’ ThisForm.Text2.Enabled=.F. ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endproc procedure Command3.Click && Grup.Butonl ThisForm.Editl.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Textl.Value),ThisForm.Editl.Value) do while x<>0 ThisForm.Editl.SelStart=at(alltrim(ThisForm.Textl.Value),; ThisForm.Editl.Value)-1 ThisForm.Editl.SelLangth=Len(alltrimf ThisForm.Textl.Value)) ThisForm.Editl.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Textl.Value) , ThisForm.Editl.Value) enddo ThisForm.Text2.Value=’' ThisForm.Text2.Enabled=.F. ThisForm.Commandgroupl.Commandl.Enabled=.F. ThisForm.Commandgroupl.Command2.Enabled=.F. ThisForm.Commandgroupl.Command3.Enabled=.F. endproc procedure Click && Buton1 ThisForm.Release endproc structură: nt/me(C,15), prenume(CA5), adresa (C,40), telefon(C,W) și data_n(D). Se construiește o casetă de dialog care să permită următoarele operații cu datele din tabel: parcurgerea tabelului pentru vizuali- Agenda Numele Preumele I Andrei zare (nu se pot modifica datele din Adᵣₑₛₐ i_, ₇ ,D-----— i ' r . Aureșa str. Zorilor nr 9 sector 2 Bucurați _I câmpuri) și adăugarea de noi înregistrări. Butoanele »> și «< se folosesc pentru parcurgerea tabelului înainte și înapoi, iar butonul Adăugă pentru adăugarea de noi înregistrări. Telefon 01-8765432 ■ Se creează formularul și se adaugă la Data nașterii 02 04.56 Terminare formular cinci etichete, o casetă de editare (pentru câmpul adresa), patru casete de text (pentru restul câmpurilor) și patru butoane de comandă. Pentru formular și controale se stabilesc următoarele proprietăți: * Formular Name = "Forml" BackColor = 220,220,220 Caption = "Agenda” Closable = .F. * Casetele de text Name = "Textl" ControlSource = "agenda.nume" Name = "Text2” ControlSource=”agenda.prenume" Name = "Text3" ControlSource="agenda.telefon" Informatică Name = "Text4" ControlSource=”agenda.data n" Format = "E" * Zona de editare Name = "Editl" ControlSource="agenda.adresa" ^Etichetele Name = "Labei1” Caption = "\. Apelul metodei se face cu DoScroll(). Parametrul determină modul în care se face derularea și poate avea următoarele valori: 0 - derulare cu un rând în sus, 1 - derulare cu un rând în jos, 2 - derulare cu o pagină în sus, 3 - derulare cu o pagină în jos, 4 - derulare cu o coloană la stânga, 5 - derulare cu o coloană la dreapta, 6 - derulare cu o pagină la stânga, 7 - derulare cu câte o pagină la dreapta. Informatică - > Activarea celulei - . Se schimbă celula activă. Metoda trebuie să primească doi parametri: - numărul rândului și - numărul coloanei. Apelul metodei se face cu ActivateCell(,). - > Adăugarea unei coloane la grilă - . Se adaugă un nou obiect Column la grilă. Metoda trebuie să primească un parametru - poziția coloanei în grilă; coloanele care urmează după ea sunt deplasate cu o poziție spre dreapta. Apelul metodei se face cu AddColumn(). - > Ștergerea unei coloane din grilă - . Se șterge un obiect Column din grilă. Metoda poate primi un parametru - poziția coloanei care se șterge din grilă, altfel se șterge coloana activă (cea care conține celula activă); coloanele care urmează după ea sunt deplasate cu o poziție spre stânga. Apelul metodei se face cu DeleteColumn([]). grilei sunt declanșate de: - > Manipularea barelor de derulare - . Este declanșat fie de acționarea interactivă a barei de derulare, fie prin acționarea ei din program cu metoda DoScroll. Procedura asociată evenimentului primește din partea acestuia parametrul care îi comunică modul în care a fost acționată bara de derulare: 0 - derulare cu un rând în sus (butonul sau tasta T), 1 - derulare cu un rând în jos (butonul sau tasta i), 2 - derulare cu o pagină în sus (clic pe bara verticală, deasupra casetei), 3 - derulare cu o pagină în jos (clic pe bara verticală, sub casetă), 4 - derulare cu o coloană la stânga (butonul sau tasta <-), 5 - derulare cu o coloană la dreapta (butonul sau tasta ->), 6 - derulare cu o pagină la stânga (clic pe bara orizontală, la stânga casetei), 7 - derulare cu o pagină la dreapta (clic pe bara orizontală, la dreapta casetei). Marcarea pentru ștergere a unei înregistrări - . Este declanșat fie de marcarea interactivă în grilă a înregistrării pentru ștergere sau refacerea ei, fie prin marcarea pentru ștergere cu comanda Delete. Procedura asociată evenimentului primește din partea acestuia parametrul care îi comunică numărul înregistrării marcate pentru ștergere. Schimbarea celulei focalizate (fie interactiv prin deplasarea selectorului de celulă cu mouse-ul sau cu tastatura, fie din program cu metoda ActivateCell): După mutarea focalizării - . Se produce atunci când utilizatorul mută focalizarea într-o celulă dintr-o altă coloană sau un alt rând al grilei, după ce a fost focalizată noua celulă și numai dacă procedura asociată evenimentului When a obiectului din celula nou focalizată furnizează un rezultat .T.. Evenimentul furnizează un parametru care corespunde indexului coloanei sau rândului în care a fost mutată focalizarea. înaintea mutării focalizării - . Se produce atunci când utilizatorul mută focalizarea într-o celulă dintr-o altă coloană sau un alt rând al grilei, înainte ca noua celulă să primească focalizarea și înainte de evenimentul Valid al obiectului din celula din care se mută focalizarea. Se creează un formular nou. în acest formular se va construi rapid o grilă pentru câmpurile din tabelul agenda cu ajutorul obiectului Data Environment. Sisteme de gestiune a bazelor de date ■ Se execută clic pe butonul Data Environment din bara Form Designer. Se deschide caseta de dialog Open din care se alege tabelul agenda. în fereastra Data Environment va fi afișat tabelul. Se indică titlul tabelului și se glisează în formular. După ce se eliberează butonul mouse-ului, în formular se va crea o grilă cu o structură de coloane care corespunde câmpurilor din tabel. Legendele din anteturile coloanelor vor fi numele câmpurilor. Se fac următoarele modificări de propri- etăți în fereastra Properties: Pentru obiectul Gridl se modifică proprietatea AIlowAddNew = .T., pentru obiectul Headerl al coloanei a cincea (controlul Column5) se modifică proprietatea Caption= 'Data nașterii'. Se adaugă o coloană la grilă: în obiectul Gridl se modifică proprietatea ColumnCount=6. în coloana a șasea se va afișa un câmp calculat și anume vârsta persoanei. Se te? -Ini I ■ ZData Environment - Fol.. BSQ nume prenume adresa telefon data n stabilesc pentru această coloană următoarele proprietăți: pentru obiectul Column6 proprietățile ControlSource=int((date()-agenda.data_n)/365) și ReadOnly=.T.(este protejat la scriere fiind un câmp calculat), iar pentru controlul Header al acestei coloane proprietatea Caption-Varsta'. ■ Se salvează formularul sub numele agenda_t și se închide constructorul de formulare. ■ Prin această metodă fiecărei coloane i se atribuie implicit un control de tip casetă de text. Se schimbă tipul controlului din coloana a treia (pentru adresa), cu o casetă de editare, astfel: se deschide tabelul asociat formularului cu comanda: use agenda_t.scx ■ Se deschide fereastra Browse cu comanda browse. Se caută în acest tabel înregis- trarea care corespunde obiectului Gridl.Column3.Textl (caseta de text din coloana a treia a grilei). în această înregistrare se fac următoarele modificări: în coloanele class și baseclass se înlocuiește textbox cu editbox, în coloana objname se înlocuiește Textl cu Editl. Se deschide câmpul Properties și se șterge conținutul. Se închide fereastra Browse. Se închide tabelul cu comanda use. ■ Se deschide fișierul pentru modificare cu comanda modi form agenda_t. Se adaugă la formular un buton pentru terminare. Se fac modificările ncesare pentru proprietăți, astfel încât ele să corespundă cu cele prezentate mai jos. * Mediul de date Name = "Dataenvironment" Name = "Cursori" Alias = "agenda" CursorSource = agenda.dbf * Formular Name = "Forml" Caption = "Agenda" Closable = .F. * Grila Name = "Gridl" ColumnCount = 6 AIlowAddNew = .T. AllowRowSizing = .T. Panel = 1 ReadOnly = . T. RecordSource = "agenda" RecordSourceType = 1 RowHeight = 30 * coloanele grilei Columnl.Name = "Columnl" Informatică Columnl.ControlSource = ; "agenda. nume’¹ Columnl.ReadOnly = .F. Column2.Name = ”Column2” Column2.ControlSource =; "agenda.prenume" Column2.ReadOnly = . F. Column3.Name = "Column4" Column3.ControlSource =; "agenda.telefon" Column3.ReadOnly = .F. Column4.Name = "Column5" Column4.ControlSource =; "agenda.data n" Column4.ReadOnly = .F. Column5.Name = "Column6" Column5.ControlSource =; "int((date()-agenda.data n)/365)" Column5.ReadOnly = . T. Column6.Name = ”Column3" Column6.Bound = .T. Column 6.ControlSource =; "agenda.adresa" Column6.ReadOnly = .F. Column6.Sparse = .F. * Antetul coloanelor + control Name = "Headerl" Caption = "nume" Name = "Textl" ReadOnly = .F. Name = "Headerl" Caption = "prenume" Name = "Textl" ReadOnly = .F. Name = "Headerl" Caption = "telefon" Name = "Textl" ReadOnly = .F. Name = "Headerl" Caption = "data nașterii" Name = "Textl" ReadOnly = .F. Name = "Headerl" Caption = "varsta" Name = "Textl" ReadOnly = .T. Name = "Headerl" Caption = "adresa" Name = "Editl" ReadOnly = .F. * pentru toate controalele * caseta de text: BorderStyle = 0 Margin = 0 ForeColor = 0,0,0 BackColor = 255,255,255 * Butonul de comanda Name = "Commandl" Caption = "\ Dacă proprietatea ControlSource este o variabilă de memorie sau un câmp de tip numeric, se memorează poziția în grup a butonului selectat. -> Dacă proprietatea ControlSource este o variabilă de memorie sau un câmp de tip șir de caractere, se memorează textul explicativ (Caption) asociat butonului selectat. Butonul radio poate fi selectat prin mai multe metode: — Se execută clic cu mouse-ul pe buton. — Se mută selectorul în grupul de butoane radio apăsând repetat tasta Tab și apoi se selectează butonul activ din grup folosind tastele cu săgeți. — Se apasă tastele de acces la buton (tasta Alt împreună cu tasta literei de identificare). Pentru administrarea butoanelor din grup se pot folosi proprietățile specifice grupului de butoane radio: -> Numărul de butoane din grup - . Este de tip numeric. -> Butoanele - . Această proprietate este de tip vector și poate fi folosită pentru referirea butoanelor din grup. Se poate folosi metoda pentru a atribui aceeași valoare a unei proprietăți tuturor butoanelor din grup. Sintaxa de apelare a metodei este: (’',). Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociată butonului selectat. In caseta de dialog Test se folosește comutatorul Afișare patrat pentru a controla afișarea unei forme de tip pătrat. ■ Se scrie programul sursă: FI = CreateObject('Form') Fl.Closable = .F. FI.Caption='Test' FI.Height=200 FI.BackColor = RGB(200,200,200) FI.AddObject('Bl', 'Buton') FI.AddObject('CI','Comutator') Fi.AddObject(¹ PI', 'Patrat') FI.Bl.Visible =.T. FI.CI.Value=.F. FI.CI.Visible = .T. FI.CI.BackStyle = 0 FI.CI.Click FI.Show Read events Define class Comutator asB; CheckBox Alignment=l Top = 40 Left =10 Height = 25 Width = 130 FontSize=12 Caption = "\0 endproc j=j+l ■ Se scrie procedura asociată evenimentului Click al listei: procedure Click && Lista ThisForm.Shapel.BackColor =; ThisForm.Culoarea(ThisForm.Combol.Listlndex) endproc ti știai multe coloane: Lista va avea două coloane corespunzătoare câmpurilor nume și prenume din tabelul agenda. La alegerea unui articol din listă, în formular se va afișa numărul de telefon (se alege ca obiect eticheta) și adresa persoanei (se alege ca obiect caseta de editare). Se creează un fișier index (după câmpurile nume și prenume) pentru tabelul agenda. Informatică ■ Se creează un formular nou. Se T est adaugă la formular patru etichete, o casetă de editare, un buton declan- șator și o listă (butonul ListBox de pe bara Form Controls). ■ Se stabilesc proprietățile formularului și ale obiectelor din formular: * formularul Name = ”Forml” BackColor = 200,200,200 Caption = "Test" Closable = .F. FontSize = 14 * eticheta folosita pentru * legenda listei Name = "Labei1" Caption = "Alegeți:" * etichete folosite pentru * informare Name = "Labe12" Caption = "Telefon" Name = "Labei4" Caption = "Adresa" * eticheta folosita pentru afi- * sarea numărului de telefon Name = "Labei3" Caption = "" * pentru toate etichetele: AutoSize = . T. BackStyle = 0 * zona de editare Alegeți: Aron Petre ion Andrei Ion Ion Morarii Ana Maria Telefon 038345345 Adresa Str. Noua nr. 10 _±l Buzău . Terminare BackStyle = 0 Enabled = .T. ReadOnly = . T. * buton de comanda Name = "Commandl" Cancel = .T. Caption = "\>: << Meniul sistem - este pus la dispoziție de mediul Visual FoxPro pentru a realiza acți- uni corespunzătoare limbajului de comandă. -> Meniul utilizator - este creat de programatorul unei aplicații ca element al aplicației construite de el. Tipul de meniu disponibil (modul în care este afișată bara de meniu Visual FoxPro în c timpul execuției programului) este controlat de parametrul zys.x¹ ,-,cv cu comanda g :,:* îv' c¹ • 1s j। rc h 2, unde: 2 on - bara de meniu Visual FoxPro este disponibilă în timpul execuției programului. « off - bara de meniu Visual FoxPro nu este disponibilă în timpul execuției programului. _] automatic - bara de meniu Visual FoxPro este vizibilă în timpul execuției programului, iar opțiunile sunt disponibile în funcție de comanda care se execută în program. to default - se revine la afișarea meniului Visual FoxPro după ce programul și-a ter- minat execuția. în funcție de modul în care este dispusă lista cu opțiuni, meniurile sunt de două tipuri: -> ' - afișează lista de opțiuni pe un rând, pe orizontală. Meniul ori- zontal se mai numește și bară de meniu (menu bar), iar opțiunile sale se mai numesc și titluri de meniuri (menu titles). Ele pot fi reprezentate prin cuvinte, expresii sau pictograme. în terminologia Visual FoxPro, meniul orizontal se numește ¹ , iar opțiunile sale se numesc < . r,' - afișează lista de opțiuni într-o coloană, pe verticală. Ele se mai numesc și submeniuri. în terminologia Visual FoxPro, meniul vertical se numește r.iar opțiunile sale se numesc bar. ', ial unei aplicații este o combinație de bară de meniuri, titluri de meniuri, submeniuri și opțiuni de meniu. Un sistem de meniuri standard este format din: -> Meniul principal (main menu) este reprezentat printr-o bară de meniu afișată sub bara de titlu a unui formular de tip fereastră, în care rulează aplicația. Atunci când se execută clic pe un titlu de meniu se deschide un meniu pe verticală. -> Meniurile pe verticală afișează o listă cu opțiuni. Opțiunile pot fi comenzi de operații de prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare se folosesc pentru a împărți în grupuri opțiunile din lista meniului. Submeniul este un alt meniu care afișează o altă listă de opțiuni. în acest mod se poate crea o structură arborescentă de submeniuri. Unele opțiuni de meniu execută direct o acțiune. Alte opțiuni afișează o casetă de dia- log, un formular prin care aplicația cere utilizatorului să-i furnizeze informații suplimentare Informatică 225 ca să poată executa acțiunea cerută. în marea majoritate a aplicațiilor aceste opțiuni de meniu sunt urmate de trei puncte. Este bine ca în interfața care se construiește să se respecte acest standard. Fiecărei opțiuni de meniu îi corespunde un control de meniu. Controlul meniului este și el un obiect vizual. La fel ca orice obiect, și el are proprietăți standard prin care i se poate stabili aspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare în titlu sau în opțiunea de meniu. Controlul meniu are asociat un singur eveniment care este declanșat atunci când opțiunea de meniu este selectată de la tastatură sau cu mouse-ul. Evenimentele specifice unui obiect meniu sunt:________________________________________________ Inițializarea este declanșată de crearea meniului. în procedura asociată acestui meniu se pot defini variabilele de memorie, se pot deschide fișiere, se poate Setup salva sau restaura un sistem de meniuri. Meniurile pot fi salvate în stiva meniurilor. Pentru operațiile cu stiva se pot folosi comenzile push menu pentru salvarea meniului în stivă și pop menu pentru extragerea meniului din stivă. Ștergerea este declanșată de activarea meniului. în procedura asociată acestui meniu se pot scrie secvențe de cod prin care se șterg informațiile care au fost afișate pe ecran și prin care se stabilesc opțiunile de meniu disponibile. Dacă Cleanup meniul este programul principal al aplicației, în această procedură se poate activa procesorul de evenimente cu comanda read events. Comanda prin care se dezactivează acest procesor clear events se va scrie în procedura asociată opțiunii de meniu prin care se termină aplicația. Proprietățile specifice unui obiect meniu sunt: Prompt Legenda opțiunii este textul explicativ afișat de titlul meniului sau de opțiunea de meniu. Tasta de acces este tasta care se apasă pentru a selecta direct titlul sau opțiunea Access respectivă atunci când meniul este activat. Litera tastei de acces este subliniată în key legendă. Pentru a stabili o tastă de acces, înaintea literei respective din legendă, se scriu caracterele \<. Scurtătura este combinația de taste asociată opțiunii de meniu care permite Shortcut executarea unei comenzi dintr-un meniu fără să se mai activeze bara de meniu și să key se selecteze comanda. Lângă opțiune, în partea dreaptă este afișat un text cu combinația respectivă de taste. Mesajul informativ este un mesaj afișat în bara de stare atunci când se selectează Message opțiunea. Disponibilitatea este determinată de o condiție prin care se controlează dacă opțiu- Skip for nea de meniu este disponibilă sau nu: dacă expresia logică are valoarea adevărat, opțiunea de meniu este disponibilă. Marcajul de verificare este un simbol care se afișează în partea stângă a opțiunii de meniu în funcție de o condiție: dacă valoarea condiției este adevărat, în fața opțiunii este afișat marcajul de verificare (<✓), iar dacă este fals, marcajul nu este afișat. Această proprietate permite folosirea opțiunilor de meniu pentru stabilirea valorii unui parametru. Dacă parametrul poate lua valoarea adevărat sau fals, se folosește o singură opțiune care Mark poate fi marcată sau nu. Numele opțiunii este numele parametrului. Deoarece această character opțiune se comportă la fel ca un control comutator, ea se mai numește și opțiune comutator. Dacă parametrul poate lua mai multe valori, se folosesc mai multe opțiuni de meniu, numele fiecărei opțiuni reprezentând o valoare posibilă a parametrului. 0 singură opțiune din grupul de opțiuni poate fi marcată și ea reprezintă valoarea aleasă pentru parametru. La alegerea unei noi opțiuni din grup, va fi șters marcajul vechii opțiuni și va fi marcată noua opțiune. Deoarece grupul de opțiuni de meniu se comportă la fel ca un control de tip butoane radio, el se mai numește și grup de opțiuni butoane radio. modify menu create menu 226 Sisteme de gestiune a bazelor de date Pentru a controla afișarea marcajului în fața unei opțiuni se folosește comanda: 30;. 'urii L of pcp-p tei unde este numele atribuit opțiunii (diferit de legendă) folosit pentru iden- tificarea sa, iar exprimă condiția care determină afișarea marcajului. Pentru construirea unui meniu se poate folosi limbajul de comandă care pune la dispoziție comenzi și funcții pentru realizarea acestei operații. Calea mai rapidă și mai puțin laborioa- să este folosirea Constructorului de meniuri care permite crearea interactivă a unui sistem de meniuri prin stabilirea componentelor (submeniuri și opțiuni de meniu), a proprietăților componentelor (legenda, tastele de acces, scurtătura) și a acțiunilor asociate unei opțiuni de meniu: declanșarea unei acțiuni sau deschiderea unui nou submeniu. Pentru realizarea unui sistem de meniuri trebuie să se parcurgă următorii pași: 1. Se proiectează sistemul de meniuri. în această fază se stabilește structura siste- mului de meniuri (titlurile din meniul principal, submeniurile, opțiunile din submeniuri). Pentru fiecare element se stabilesc proprietățile specifice, iar pentru fiecare opțiune de meniu se stabilește acțiunea ce va fi declanșată în urma selectării. 2. Se creează meniurile și submeniurile și se stabilesc sarcinile pe care trebuie să le execute sistemul. Pentru aceasta se lansează în execuție constructorul de meniuri cu comanda: create Se va preciza structura arborescentă a meniului și se vor specifica acțiunile pe care trebuie să le execute fiecare opțiune de meniu ca de exemplu, afișarea unei casete de dialog, a unei ferestre sau a unui alt sistem de meniuri. Cererea de executare a unei acțiuni trebuie să se facă numai printr-o singură comandă. Dacă acțiunea declanșată de selectarea unei opțiuni se descrie printr-un grup de instrucțiuni, acestea vor fi scrise într-un fișier de tip program sursă și vor fi lansate în execuție printr-o singură comandă: do . în urma acestor acțiuni constructorul de meniuri va crea un fișier cu numele meniului și extensia .mnx în care se găsesc, sub forma unui tabel, componentele unui meniu și caracteristicile lor. Se poate modifica meniul cu comanda: 3. Se generează programul executabil al meniului. Pentru a se putea folosi meniul, trebuie generat un program care, în urma execuției sale, să activeze meniul. Programul va fi memorat într-un fișier cu extensia .mpr. După orice modificare a meniului va trebui să se execute din nou operația de generare. 4. Se lansează în execuție și se testează meniul. Meniul va fi activat prin lansarea în execuție a pogramului generat cu comanda: do ,mpr Se un siîsiem de inerâjvi; Sistemul de meniuri care se va crea reprezintă programul principal al aplicației în care, în funcție de opțiunile alese, se vor lansa în execuție diferite module de program, construite anterior sub formă de formulare. Se va folosi pentru meniul principal un meniu sub forma unei bare pe orizontală, la fel ca și meniul aplicației Visual FoxPro. Sistemul de meniuri va afișa o bară de meniuri pe orizontală cu titlurile Afiseaza figuri, Utilitati și Terminare. Titlul Afiseaza figuri va deschide un meniu pe verticală care Informatică 227 conține două opțiuni de tip submeniu: Patrat ► și Figuri ► . Submeniul Patrat ► conține două opțiuni de tip comandă: Afiseaza... care va lansa în execuție formularul în care este controlată afișarea unui pătrat cu ajutorul unui control de tip comutator și Colorează... | Afiseaza figuri Ufilitati Terminare I Patrat ► I G rup 1... ALT +1 ------------------ Grup2.... ALT+2 care va lansa în execuție formularul în care este controlată afișarea culorii de umplere a unui pătrat cu ajutorul unui control de tip listă. Submeniul Figuri ► conține două opțiuni de tip comandă: Grup 1... care va lansa în execuție formularul în care este controlată afișarea unei anumite figuri geometrice cu ajutorul unui control de tip grup de butoane radio și Grup 2... care va lansa în execuție formularul în care este controlată afișarea unei anumite figuri geomtrice cu ajutorul unui control de tip listă. Titlul Utilități va deschide un meniu pe verticală care conține o opțiune de tip comandă: Calculator... care va lansa în execuție formularul în care este simulat lucrul cu un calculator de buzunar. Titlul Terminare va avea asociată o comandă pentru terminarea aplicației. ■ Se lansează în execuție constructorul de meniuri fie cu opțiunea de meniu File-» New... (din caseta de dialog New se alege butonul radio Menu și se execută apoi clic pe bufonul New File), fie cu comanda: create menu menu_test ■ Se deschide caseta de dialog New Menu care conține două butoane: Menu pentru crearea unui sistem de meniuri sub formă de bară orizontală pe primul rând al formularului în locul sau împreună cu titlurile meniului Visual FoxPro și Shortcut pentru New Menu crearea unui meniu derulant pe verticală în interiorul ferestrei de aplicație. Se va alege butonul Shortcut atunci când va trebui să se creeze un meniu de comenzi rapide asociat unui anumit element de interfață. Comanda de lansare în execuție a acestui meniu se va scrie în procedura asociată evenimentului RightCIick al elementului respectiv. Deoarece se construiește un meniu sub formă de bară orizontală, se execută clic pe butonul Menu. ■ Se deschide fereastra constructorului de meniuri Menu Designer, iar în bara de meniuri este afișat un titlu de meniu care conține opțiuni specifice constructorului de meniuri: Menu. Se deschide acest meniu și se observă opțiunile pe care le conține. Se identifică opțiunile pentru care există butoane în fereastra Menu Designer. Opțiunea Quick menu permite crearea rapidă a unui sistem de meniuri pornind de la meniul Visual FoPro (generează automat structura acestui sistem de meniuri, după care se vor șterge, adăuga sau modifica opțiunile sau meniurile Visual FoxPro). Sistemul de meniuri se va construi fără să se folosească această facilitate. ■ înainte de a specifica structura sistemului de meniuri, se vor stabili caracteristicile gene- rale prin intermediul casetei de dialog General Option care se deschide cu opțiunea de meniu View-»_General Options... Ea conține următoarele controale: - > Grupul de butoane radio Location prin intermediul cărora se stabilește poziția meniului față de meniul sistemului Visual FoxPro: Replace - în locul acestuia, Append - la dreapta acestuia, Before - înaintea unui titlu de meniu și After - după un titlu de meniu din meniul sistemului. Dacă se alege una dintre ultimele două opțiuni, se va deschide o listă derulantă cu titlurile de meniuri, din care se poate alege titlul meniului față de care va fi adăugat meniul care se creează în meniul sistemului. - > Grupul de comutatoare Menu code prin intermediul cărora se stabilește dacă trebuie să se scrie o secvență de cod asociată evenimentului Setup (comutatorul x| Procedure: ^General Options | OK rMenu code--- Cancel | Ediț | -Location---- (* Repiace C Append C Before C After R Cleanup.., ■ Sisteme de gestiune a bazelor de date Setup...) și evenimentului Cleanup (comutatorul Cleanup...). Dacă se acti- vează comutatorul, se va deschide o fereastră de editare în care se va scrie secvența de instrucțiuni. - > Caseta de editare Procedure și comutatorul Edit se folosesc dacă trebuie să se definească o procedură globală care va fi folosită implicit în întregul sistem de meniuri. Ea va fi lansată în execuție de fiecare dată când se va alege o opțiune căreia nu i s-a atribuit o procedură proprie. Pentru meniul care se construiește trebuie să fie activat butonul Repiace. Se închide caseta de dialog executând clic pe butonul Ok. ■ Se revine în fereastra Menu Designer în care se definesc titlurile din meniul principal: în fereastra Menu Designer se pot folosi următoarele controale: -> Zona de lucru afișează sub forma unui tabel mai multe controale: pe un rând sunt afișate controalele corespunzătoare definirii caracteristicilor unei opțiuni de meniu, iar pe o coloană controalele corespunzătoare unei caracteristici a opțiunii de meniu. Coloanele sunt următoarele: I⁻’ T op-Level Form Este prima coloană și conține un buton cu săgeată dublăt. Se folosește pentru a schimba locul opțiunilor în listă (prin glisarea opțiunii în noua poziție). în această coloană se scrie textul legendei opțiunii de meniu. Dacă în legendă Prompt se scrie înaintea textului caracterul \, opțiunea nu va fi disponibilă. Dacă în legendă se scriu numai caracterele opțiunea respectivă va fi o linie de demarcare între grupurile de opțiuni. în această coloană este afișat un control de tip listă ascunsă din care se poate alege tipul acțiunii declanșate de selectarea opțiunii de meniu (tipul rezultatului). Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (se execută o comandă) sau Procedure (se execută o procedură). Pentru opțiunile de submeniu Afiseaza, Colorează, Grup 1, Grup 2 și Calculator se alege un rezultat de tip Command, pentru titlul Terminare - rezultatul Procedure, pentru restul opțiunilor - rezultatul Submenu. Zona de creare sau editare a rezultatului. Este coloana următoare rezultatului (coloana a patra). Conține un buton la creare și un buton la editare. Dacă tipul rezultatului este Submenu, la acționarea butonului se deschide o nouă zonă de lucru în care se pot defini opțiunile submeniului și caracteristicile lor. Dacă tipul rezultatului este Command, la acționarea butonului se activează în coloana a patra o casetă de text în care scrieți comanda. Dacă tipul rezultatului este Procedure, la acționarea butonului se deschide o zonă de editare în care se scrie secvența de instrucțiuni a procedurii. Pentru opțiunile de meniu pentru care s-a ales rezultatul de tip Command, se scrie comanda do form , unde este numele fișierului în care s-a salvat formularul. Pentru titlul Terminare pentru care s-a ales rezultatul Procedure, se scrie în caseta de editare următoarea secvență de instrucțiuni: . i menu test && dezactivează meniul re-■ menu test && eliberează zona de ; memorie alocata meniului la creare Informatică set sysmenu to default clear memory clear afMenu Designer -menu_test.mnx BEE| Prompt \ Lista ascunsă Menu level afișează ierarhic meniurile din care s-a dezvoltat meniul pentru care se precizează opțiunile în zona de lucru a ferestrei (filiația meniului). Alegând o opțiune din această listă se poate reveni într-unul din meniurile superioare lui. De 230 Sisteme de gestiune a bazelor de date exemplu, folosind această listă se poate reveni din zona de lucru a meniului Patrat, în zona de lucru a meniului părinte Afișează figuri sau a meniului principal Menu Bar. -> Secțiunea de butoane Kem conține butoane pentru: inserarea unei opțiuni de meniu între cele existente (Insert - o opțiune definită de utilizator și Insert Bar... - o opțiune preluată din meniul sistemului Visual FoxPro) și pentru ștergerea unei opțiuni Delete. -> Butonul Preview. Prin acționarea lui se poate previzualiza Previewing: menujestm meniul care se construiește: meniul sistemului este înlocuit Prompt is: Calculator.... de acesta și se deschide o casetă de dialog Preview în care Command is: do form form3 sunt prezentate informații despre opțiunea selectată din me- [.......OK | niu (numele fișierului, legenda opțiunii și comanda asociată). ■ După ce s-a terminat construirea meniului, se previzua- lizează folosind butonul Preview. ■ Se generează meniul executabil cu opțiunea Menu->_Generate.... ■ Se lansează în execuție meniul cu comanda: do menu_test. Se testează meniul. ■ Structura meniului este memorată într-un fișier de tip tabel, care are numele meniului (menu_tesf) și extensia .mnx. Se deschide acest fișier cu comanda use menu_test.mnx. Se afișează conținutul său cu comanda browse. Se identifică în acest tabel semnificația fiecărei coloane. Se identifică ce element din structura meniului este înregistrat în fiecare rând al tabelului. Se testează modu^ în s-.-, ... ; evenimentelor Setup și Clepn’jp: Se adaugă sistemului de meniuri o procedură globală: ■ Se deschide meniul anterior și se salvează sub numele menu_1. în noul meniu se fac următoarele modificări: ■ în caseta de dialog General Option se scrie în zona de editare a procedurii globale instrucțiunea: ? "Test procedura globala" ■ Se activează comutatorul Setup și în fereastra de editare a procedurii se scrie: ? "Test eveniment Setup" ■ în fereastra Form Designer în meniul principal se adaugă titlul Scrie înainte de titlul de meniu Terminare. Acestui titlu de meniu i se atribuie un rezultat de tip Command, dar nu i se asociază nicio comandă. în meniul Utilitati se adaugă la sfârșit două opțiuni: Scrie 1 și Scrie 2. Ambelor li se atribuie un rezultat de tip comandă. Opțiunii Scrie 1 nu i se asociază nicio comandă, iar opțiunii Scrie 2 i se asociază comanda: ? "Test opțiune Scrie 2" ■ în procedura asociată titlului Terminare din meniul principal se șterge instrucțiunea clear. ■ Se salvează modificările făcute și se generează meniul executabil. Se lansează în execuție meniul. Se testează meniul Scrie și opțiunile Scrie 1 și Scrie 2. Ce concluzii trageți? ■ Se deschide meniul menu_T și se salvează sub numele menu_2. în noul meniu se deschide caseta de dialog General Option, se activează comutatorul Cleanup și în fereastra de editare a procedurii se scrie: clear ? "Test eveniment Cleanup" ■ Se salvează modificările făcute și se generează meniul executabil. Se lansează . „ în execuție meniul. testează meniul Scrie și opțiunile Scrie 1 și Scrie 2. Ce î concluzii trageți? Când se execută procedura asociată evenimentului Cleanup? ! - Informatică " Construiți o bază de date în care profesorul de informatică va ține evidența notelor elevilor din clasele la care predă. Baza de date va fi formată din _____________. două tabele: elevi cu structura: identificatorul elevului (/d_e/ev,N,3), clasa (c/s,C,3), numele (nume;C,15), prenume (pren,C,15), teza pe semestrul 1 (tf,N,2), media pe semestrul 1 (m1,N,2), teza pe semestrul 2 (t7,N,2), media pe semestrul 2 (m2,N,2) și media generală (mg,N,5,2) în care țineți evidența elevilor și note cu structura identificatorul elevului (id_elev,N,3), nota (nota,N,2) și data notării (data,D) în care țineți evidența notelor la informatică. Când definiți baza de date aveți grijă să asigurați integritatea referențială a datelor. Separat creați tabelul liber Clase în care profesorul ține evidența claselor la care predă. Tabelul va avea un singur câmp pentru clase (c/s,C,3). Acest tabel va fi folosit ca sursă de date pentru un control de tip listă. Construiți un sistem de meniuri care să-i permită profesorului întreținerea și exploatarea acestor date. Sistemul va avea următoarele titluri: 1. Titlurile din meniul principal vor fi: Actualizare, Prelucrare, Listare, Terminare. 2. Meniul Actualizare va deschide un meniu pe verticală cu opțiunile Note, Teze, Elevi, Clase. Selectarea uneia dintre aceste opțiuni va deschide un formular pentru actualizarea datelor din tabelul respectiv. Formularele Elevi și Clase vor avea următoarele butoane: buton pentru adăugarea unei înregistrări, buton pentru ștergerea unei înregistrări, buton pentru refacerea unei înregistrări șterse accidental în timpul lucrului cu formularul, două butoane pentru parcurgere înregistrărilor din tabel înainte și înapoi și butonul de terminare. în formularul pentru elevi, se vor actualiza numai următoarele date din tabelul Elevi: numele, prenumele și clasa. Clasa se va alege dintr- o listă a cărei sursă de date va fi tabelul Clase. Tabelul Note va conține o casetă de text pentru dată și o casetă de text cu derulor pentru notă, un control de tip clasă din care veți alege clasa și un control de tip listă cu două coloane din care veți alege numele și prenumele elevului pentru care înregistrați nota. Formularul va avea butoane de adăugare, ștergere, refacere a unei înregistrări șterse accidental în timpul lucrului cu formularul, două butoane pentru parcurgerea înregistrărilor din tabel înainte și înapoi și butonul de terminare. Formularul pentru teze va permite alegerea elevului cu ajutorul celor două liste, la fel ca și în cazul notelor. Se vor crea două casete de text cu derulor pentru cele două note la tezele de pe primul semestru, respectiv al doilea semestru. 3. Meniul Prelucrarea va deschide un meniu pe verticală cu opțiunile Situație elev, Primii 10, Ultimii 10, Corigentii. Opțiunea Situație elev va afișa un formular cu situația unui elev. Formularul va conține două liste din care veți alege elevul și clasa, un control de tip grilă în care vor fi afișate nota și data și cinci casete de text pentru cele două teze, cele două medii semestriale și media anuală. Valorile din toate aceste controale vor fi protejate la scriere. Opțiunile Primii 10 și Ultimii 10 vor afișa formulare care vor conține un control de tip listă din care veți alege perioada (Semestrul 1, Semestrul 2 sau An) și un control de tip grilă în care vor fi afișați primii 10 elevi care au cele mai mari medii, respectiv ultimii 10 elevi care au cele mai mici medii. Grila va avea coloane pentru nume, prenume, clasă și medie. Opțiunea Corigenții va afișa un formular în care, dintr-o listă, veți putea alege perioada (Semestrul 1, Semestrul 2 sau An) și o listă din care veți alege clasa, după care se va crea o listă dinamică cu numele elevilor corigenți din clasa respectivă, în perioada aleasă. Toate aceste formulare vor avea un buton de terminare. 4. Meniul Listare va deschide un meniu pe verticală cu opțiunile Lista 1, Lista 2, Lista 3, Lista 4, Lista 5 și Lista 6. Aceste opțiuni vor fi grupate logic în două grupuri de opțiuni (fiecare grupă va conține 3 opțiuni) separate printr-o bară separatoare. Toate aceste opțiuni de meniu vor afișa rapoarte, în care înregistrările vor fi grupate după criteriul clasei. Lista 1 232 Sisteme de gestiune a bazelor de date (Lista 4) și Lista 2 (Lista 5) vor afișa rapoarte cu numele și prenumele elevului, notele și media pe primul semestru, respectiv al doilea semestru, iar Lista 3 ((Lista 6)) va afișa un raport cu numele și prenumele elevului, mediile semestriale și media generală. în primul grup de rapoarte, în cadrul grupului clasa, înregistrările vor fi afișate în ordine alfabetică, iar al doilea grup de rapoarte în ordinea descrescătoare a mediilor. Utilizatorul programului va cunoaște semnificația fiecărei opțiuni din mesajul afișat în bara de stare. 5. Stabiliți scurtături și mesaje pentru toate opțiunile de meniu. 6. înainte de a se activa meniul, afișați pe ecran o casetă de dialog pentru introducerea parolei. Stabiliți ce parolă doriți. Se vor accepta numai cinci încercări de comunicare a parolei pentru a avea acces la datele din baza de date. 2.8.5. Aplicația 2.8.5.1. Programul monitor O aplicație cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea lor sau pentru afișarea unor rapoarte pe ecran sau la imprimantă. Toate aceste module trebuie asamblate într-o aplicație, în care un modul de program trebuie să le administreze și să le coordoneze. Programul monitor al unei aplicații are rolul de a coordona executarea modulelor aplicației și a asigura colaborarea între ele. Sarcinile unui program monitor sunt: 1. Să configureze mediul de lucru. Sistemul de gestiune a bazelor de date poate fi configurat prin intermediul unor parametri a căror valoare se stabilește cu comanda set. Acești parametri au valori implicite, iar în unele aplicații aceste valori implicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebuie să aibă valoarea off, iar parametrului date, care stabilește formatul datelor calendaristice, i se poate atribui un anumit format (set date to british). Se mai poate stabili directorul curent din care se vor prelua baza de date și alte fișiere necesare aplicației cu parametrul default (set default to ). Alți parametri pentru care se stabilesc de obicei valorile sunt century, confirm, console, deleted și safety. 2. Să personalizeze fereastra de aplicație. Aplicația rulează în fereastra sistemului Visual FoxPro, care va deveni fereastra aplicației. De aceea trebuie să se schimbe anumite proprietăți ale acestei ferestre. Obiectul fereastra aplicației Visual FoxPro se identifică prin variabila de memorie sistem _screen. De exemplu, dacă se dorește schimbarea legendei ferestrei de aplicație, se va folosi comanda de atribuire: _screen.caption= înainte de a se modifica proprietățile ferestrei, se salvează valorile care au fost modi- ficate în variabile de memorie (de exemplu: nume_f=_screen.caption) 3. Să activeze meniul principal al aplicației. Din meniul principal se vor lansa în execuție modulele de program pentru prelucrarea datelor, formularele pentru editarea datelor, comenzile pentru afișarea rapoartele etc. 4. Să activeze procesorul de evenimente. Deoarece programul generat de construc- torul de meniuri nu conține propriul procesor de evenimente, este necesar ca, după ce a fost lansat în execuție programul care creează meniul, să se activeze procesorul de evenimente care la rândul său va activa meniul și va permite tratarea evenimentelor. Informatică 233 5. Să dezactiveze procesorul de evenimente și să refacă starea anterioară mediuim de lucru la terminarea execuției aplicației. Exemplu. Pentru salvarea și restaurarea parametrilor care caracterizează starea sistemului, se pot folosi două tabele (câte unul pentru fiecare tip de comandă set): — starel (comenzi set pentru parametrii cu două valori - on și off; de exemplu talk century, confirm, console, deleted și safety) cu structura nume C(15), valoarea s C(3), valoarea_a C(3); — stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exemplu default și date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30); unde valoarea_s este valoarea parametrului în sistemul Visual FoxPro, iar valoarea__a este valoarea parametrului în aplicație. Se încarcă inițial tabelul cu numele parametrilor care vor fi modificați (câmpul nume) și cu valorile pe care le vor avea în aplicație. Pentru salvarea configurației sistemului, la începutul sesiunii de lucru se va folosi procedura intrare: procedure intrare * se salveaza valorile parametrilor sistemului * se atribuie parametrilor valorile aplicației use starel scan replace valoare s with set(alltrim(starel.nume)) alfa=alltrim(starel.nume) beta=alltrim(starel.valoare a) set &alfa &beta endscan use use stare2 scan replace valoare s with set(alltrim(stare2.nume)) alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare a) set &alfa to &beta endscan use endproc Pentru restaurarea stării sistemului, la sfârșitul sesiunii de lucru se va folosi procedura ieșire: procedure ieșire * se restaurează valorile parametrilor sistemului use starel scan alfa=alltrim(starel.nume) beta=alltrim(starel.valoare s) set &alfa &beta endscan use use stare2 scan alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare s) set &alfa to &beta endscan Sisteme de gestiune a bazelor de date use endproc La realizarea unei aplicații concură mai multe componente: module de program - programs (programe independente care pot coține proceduri și funcții sau subprograme organizate în fișiere de proceduri), baze de date - Database, tabele libere - Free Tables, formulare - Forms, meniuri - Menus, rapoarte - Reports, interogări - Queries, biblioteci de clase - Class Libraries, fișiere text - Text Files, alte tipuri de fișiere - Other Files. Pentru a manipula ușor componentele aplicației, ele pot fi organizate într-un proiect. . . .. (project) este o facilitate prin care proiectantul unei aplicații poate ține evidența componentelor aplicației și le poate administra. El este un fișier care conține o colecție de fișiere cu structuri specifice sistemului care le-a creat. Se recomandă ca, înainte de a crea componentele unei aplicații, să se creeze proiectul și să se adauge la proiect fiecare nouă componentă. Orice modificare a unei componente se va face în interiorul proiectului. Proiectul se memorează într-un fișier cu extensia Acest fișier are structura unui tabel. într-o înregistrare se memorează informații despre o componentă a proiectului. Practic proiectul nu conține componentele propriu-zise, ci informații despre ele, cum este de exemplu locul în care se găsesc pe disc. Pentru construirea și modificarea unui proiect, Visual FoxPro pune la dispoziția programatorului ■ . ' • ; - - care se lansează în execuție pentru crearea, respectiv modificarea unui proiect cu comanda: < | : - Proiectul conține două categorii de componente: -> Componente care nu se modifică în timpul execuției: programele, meniurile, ra- poartele, formularele etc. -> Componente care se modifică în timpul execuției: bazele de date, tabelele etc. (application) este un fișier care conține componentele unui proiect care nu se modifică în timpul execuției. Fișierul aplicației are extensia - , >. Pentru a crea o aplicație se parcurg următoarele etape: 1. Se creează proiectul aplicației. Nu se poate crea o aplicație dacă nu au fost incluse componentele ei într-un proiect. 2. Se stabilește programul principal - : < Orice aplicație trebuie să aibă un program principal. Programul principal este programul care se va executa atunci când se lansează în execuție aplicația și din care vor fi apelate celelalte componente ale aplicației: modulele de program, meniurile, formularele etc. 3. Se generează aplicația. Aplicația se lansează în execuție cu comanda: Aplicația este dependentă de mediul Visual FoxPro. Pentru a crea un program independent de acest mediu, acesta trebuie să fie un program executabil (fișier cu extensia .exe) care se Informatică obține la fel ca o aplicație, cu deosebirea că în caseta Build Options se activează butonul Build Executable. Pentru a putea rula aplicația pe un calculator pe care nu este instalat Visual FoxPro se pot folosi două metode: 1. Se creează fișierul aplicației (.app) și se distribuie utilizatorului împreună cu versiunea „pentru rulare” a sistemului Visual FoxPro care conține numai acele elemente care asigură execuția programelor, nu și modificarea lor. 2. Se creează programul executabil al aplicației. Acesta nu are nevoie de varianta pentru rulare, ci îi sunt necesare numai bibliotecile de rulare (fișiere care conțin proceduri pentru rularea programelor). Proiectul va cuprinde meniul definit anterior menu_test și formularele care sunt activate de opțiunile acestui meniu. La aceste componente trebuie să se adauge programul monitor. ■ Se creează în rădăcina discului C directorul Aplicație. în acest director se va crea proiectul. ■ Se lansează în execuție generatorul de proiecte fie cu opțiunea de meniu File-» New... (din caseta de dialog New se alege butonul radio Project și se execută apoi clic pe butonul New File, după care în caseta de dialog Create se alege directorul Aplicație și se atribuie proiectului numele Proiect), fie cu comanda: create project \aplicatie\proiect ■ Se deschide fereastra Pro- ject Manager care este îm- părțită în mai multe secțiuni, fiecare secțiune reprezentând o categorie de componente: All - toate componentele, Date - componentele care conțin date (Database, Free Table, Queries), Documents - componentele utile pentru introducerea și afișarea date- lor (formularele Forms și rapoartele Reports), Class Libraries - bibliotecile de clase, Code - componente care conțin module de pro- gram (Programs și Appli- cations) și Other - alte componente (meniurile Menus, fișierele de texte Text Files și alte fișiere Other Files). în Butonul de restrângere/expandare al ferestrei. în urma operației de restrângere, fereastra va fi redusă la zona etichetelor secțiunilor și va putea fi ancorată la fel ca orice bară de instrumente. Executând apoi clic pe o etichetă se va expanda numai secțiunea corespunzătoare etichetei. zona de lucru a ferestrei vor fi afișate componentele specifice secțiunii. Sisteme de gestiune a bazelor de date Cu ajutorul Gestionarului de proiecte se pot executa următoarele operații: — ' (butonul New...). Se va deschide fereastra construc- torului corespunzător componentei selectate: Menu Designer - pentru meniuri, Query Designer - pentru interogări, Report Designer - pentru rapoarte, Form Designer - pentru formulare și fereastra de editare texte pentru Programs și Files. — , .. ⁷ ' . (butonul Add...). Dacă obiectul a fost creat în afara proiectului, după ce se acționează acest buton se pot alege dintr-o listă componentele care trebuie adăugate la proiect. — “-ciiu c; v', - , (butonul Modify). Se selectează componenta din secțiunea corespunzătoare a ferestrei și se acționează butonul. Se va deschide fereastra constructorului cu care a fost creată componenta și se pot face modificările. — i i t-.a (butonul Run). Se selectează componenta și se acționează butonul. Va fi lansată în execuție componenta (programul, interogarea, formularul etc.). — r” (butonul Remove...). Se selectează componenta din secțiunea corespunzătoare a ferestrei și se acționează butonul. în caseta de dialog care se deschide, se cere să se confirme dacă se va înlătura componenta din proiect (Remove) sau va fi înlăturată și ștearsă de pe disc (Delete). — . . . (butonul Build...). După ce se apasă butonul, se va deschide o casetă de dialog în care se precizează ce se va construi (proiect, aplicație, fișier executabil sau se recompilează toate fișierele). ■ Se deschide secțiunea Documents în care se vor adăuga la proiect formularele. Se selectează obiectul Form și se acționează butonul Add..., Se deschide caseta de dialog Open în care se caută directorul în care se găsește formularul și se selectează primul formular apelat în meniu. Se acționează apoi butonul Ok. Se repetă această operație pentru fiecare formular care va fi adăugat la proiect. ■ Se deschide secțiunea Other în care se va adăuga la proiect meniul. Se selectează obiectul Menus și se acționează butonul Add.... Se deschide caseta de dialog Open din care selectați meniul menu_test și se acționează apoi butonul Ok. ■ Se fac modificări în meniu. Se selectează obiectul Menus și se dezvoltă executând clic pe butonul v. în lista afișată se selectează meniul Menu_test și apoi se execută clic pe butonul Modify. Se deschide fereastra constructorului de meniuri. Se execută clic pe butonul Edit al meniului Terminare. în fereastra de editare a procedurii asociate titlului de meniu se șterg instrucțiunile: set sysmenu to default clear memory și se adaugă instrucțiunea: clear events Se închide fereastra de editare. ■ Se deschide secțiunea code pentru a crea programul monitor, astfel: se selectează obiec- tul Programs și se acționează butonul New.... Se deschide fereastra de editare. Se scriu instrucțiunile programului monitor și apoi se salvează sub numele monitor. * se salveaza configurația salv=set(¹talk¹) screen.Caption = 'Test' _screen.BackColor=Rgb(120,120,120) * se stabilește noua configurație set talk off nume f = screen.Caption culoare f=_screen.BackColor * se creeaza meniul do menu test.mpr * se activeaza procesorul de; evenimente Informatică ____________________ read events screen.Caption=nume f * se restaurează configurația _screen.BackColor=culoare f set talk &salv set sysmenu to default Se acționează butonul Build.... în caseta de dialog Build Options se activează butonul Rebuild Project și apoi butonul OK. Se închide fereastra aplicației executând clic pe bu- tonul de închidere. Informațiile proiectului sunt memorate sub forma unui tabel. Se deschide acest tabel cu comanda: use \aplicatie\proiect.pjx.. Se vizualizează conținutul tabelului cu comanda browse. Se identifică semnificația informațiilor me- morate în fiecare rând și în fiecare coloană a Build Options - Action--------------- C Rebuild Project (* țBuild Applicatiorj C Build Executable C Build OLE DLL - Options------------- P RecompileAII Files n Display Errors I” RunAfter Build tabelului. Se închide fereastra de vizualizare. Se închide tabelul cu comanda use. OK Cancel Help 'ții Project Manager ■ Proiect _______________________________________P All | Data | Docurnents | Classes i...............Code...g^ₑᵣ | JT B-S Programs TJ Nₑw... [c] API Libraries Add... Applications ■ ' I MnHifn Project Manager ■ Proiect P All | Data | Docurnents | Classes | Code =................. B-> Menus 3 New... | = •“Uf IHHSMSS R Text Files Add... | EL® Other Files .--------------। ] ® faceOl.ico | Modify | face03.ico । Run | Project Manager ■ Proiect P AII | Data i.........Pscumerii?...;| Classes | Code | Other | Ej Aplicația se va construi pornind de la proiectul creat anterior. ■ Se deschide proiectul fie cu opțiunea de meniu File->Open... (din lista ascunsă Files of type se alege Project, se selectează fișierul Proiect din directorul Aplicație și se execută apoi clic pe butonul Open), fie cu comanda: Sisteme de gestiune a bazelor de date modify project \aplicatie\proiect ■ în secțiunea Code a ferestrei Project Manager se selectează programul monitor care va fi programul principal. Se selectează apoi opțiunea Project->Șet Main. Numele programului principal va fi scris cu stilul bold. ■ Pentru a genera aplicația, se acționează butonul Build... din fereastra Project Manager. Se deschide caseta de dialog Build Options în care din grupul de butoane radio Action se activează butonul Build Application. Se acționează apoi comutatorul OK și în fereastra Save As se scrie numele aplicației: test. ■ Se lansează în execuție aplicația cu comanda: do \aplicatie\test.app. Se deschide proiectul, se modifică programul monitor, apoi se creează aplicația. Crearea obiectului program monitor se va face pornind de la clasa Custom. Programul monitor este: * se creeaza un obiect program monitor monitor=CreateObject(”clasa m",”menu test") monitor.proc ev Define class clasa m as custom protected salv, nume f, culoare f procedure init && Evenimentul init declanșat de creare obiect pm parameters meniu This.salv=set(’talk¹) This.nume f= screen.Caption This.culoare f=screen.BackColor set talk off screen.Caption = ’Test’ screen.BackColor=Rgb(120,120,120) nume m=meniu+’.mpr' do &nume m endproc procedure proc ev && Metoda activeaza procesorul de evenimente read events endproc procedure destroy && Evenimentul destroy declanșat de terminarea; programului monitor val=This.salv set talk &val screen.Caption=This.nume f screen.BackColor= This.culoare f set sysmenu to default endproc enddefine 1. Să se creeze proiectul și aplicația pentru sistemul de meniuri definit anterior, care este folosit de un profesor pentru a ține evidența notelor și a mediilor la disciplina Informatică. 2. Folosind modelul sistemului de meniuri definit anterior pentru a ține evidența notelor și a mediilor la disciplina Informatică, construiți un sistem de meniuri și apoi proiectul și aplicația prin care să exploatați baza de date Compania. Informatică Cuprins 2. Sisteme de gestiune a bazelor de date..............................................................3 2.1. Mediul de programare Microsoft Visual FoxPro...................................................4 2.1.1. Moduri de lucru în Visual FoxPro.........................................................6 2.1.1.1. Modul de lucru interactive.......................................................6 2.1.1.2. Modul de lucru programat.........................................................11 2.1.1.3. Sintaxa comenzilor de configurare a mediului Visual FoxPro..............................................................................12 2.1.1.3. Configurarea mediului Visual FoxPro pentru tipuri de date....................................................................................13 2.1.1.4. Redirectarea ieșirii în mediul Visual FoxPro.....................................13 2.1.1.5. Configurarea interactivă a mediului Visual FoxPro...........................13 2.1.1.6. Comenzi pentru gestionarea fișierelor în Visual FoxPro...........................................................................14 2.2. Tipuri de date............................................................................... 20 2.2.1. Tipuri numerice.........................................................................21 2.2.2. Tipuri alfanumerice.....................................................................22 2.2.3. Tipul logic.............................................................................23 2.2.3. Tipuri pentru gestionarea timpului......................................................25 2.2.4. Tipul special...........................................................................25 2.2.5. Crearea variabilelor de memorie.........................................................25 2.2.6. Funcții pentru date de tip numeric......................................................28 2.2.7. Funcții pentru date de tip șir de caractere.............................................30 2.2.8. Funcții pentru date folosite pentru gestionarea timpului................................36 2.2.9. Funcții pentru conversii între tipuri de date...........................................38 2.2.10. Funcții de uz general..................................................................40 2.2.11. Comenzi pentru variabile de memorie....................................................42 2.2.12. Tablourile de memorie..................................................................44 2.3. Tabele........................................................................................50 2.3.1. Crearea tabelului.......................................................................53 2.3.1.1. Crearea structurii tabelului....................................................54 2.3.1.2. Manipularea structurii tabelului................................................54 2.3.1.4. Manipularea câmpurilor dintr-un table...........................................56 2.3.1.4. Câmpurile memo..................................................................56 2.3.2. Poziționarea pe o înregistrare din tabel................................................63 2.3.2.1. Poziționarea după numărul înregistrării.........................................63 2.3.2.2. Poziționarea după un criteriu logic de căutare..................................64 2.3.2.3. Controlarea poziționării în table...............................................64 2.3.3. Actualizarea tabelului..................................................................66 2.3.3.1. Adăugarea de noi înregistrări...................................................67 2.3.3.2. Ștergerea înregistrărilor.......................................................67 2.3.3.4. Modificarea înregistrărilor.....................................................68 2.3.3.5. Controlarea accesului la înregistrări...........................................70 2.3.4. Consultarea tabelului...................................................................72 2.3.5. Sortarea tabelului......................................................................75 2.3.6 . Indexarea tabelului....................................................................76 2.3.6.1. Crearea unui index..............................................................76 2.3.6.2. Deschiderea unui index..........................................................77 2.3.6.3. Alte operații cu indecși........................................................77 2.3.6.4. Exploatarea unui tabel împreună cu indexul......................................77 2.4. Baza de date..................................................................................80 2.4.1. Crearea bazei de date...................................................................81 240 Sisteme de gestiune a bazelor de date 2.4.1.1. Crearea bazei de date vide.....................................................81 2.4.1.2. Adăugarea la baza de date a tabelelor vide.....................................81 2.4.1.3. Adăugarea la baza de date a tabelelor noi......................................81 2.4.1.4. Obținerea informațiilor despre baza de date....................................81 2.4.1.5. Alte operații cu baza de date..................................................82 2.4.2. Exploatarea bazei de date..............................................................82 2.4.2.1. Deschiderea și închiderea bazei de date........................................82 2.4.2.2. Deschiderea și închiderea tabelelor............................................82 2.5. Obținerea informațiilor din baza de date.....................................................90 2.5.1. Interogările...........................................................................90 2.5.2. Vizualizările..........................................................................91 2.5.3. Rapoartele.............................................................................92 2.5.4. Etichetele.............................................................................94 2.6. Limbajul SQL................................................................................103 2.6.1. Interogarea de selecție...............................................................106 2.6.2. Interogarea acțiune...................................................................109 2.7. Elemente de programare......................................................................111 2.7.1. Construirea programului...............................................................111 2.7.1.1. Crearea programului sursă.....................................................111 2.7.1.2. Compilarea programului sursă..................................................112 2.7.1.3. Lansarea în execuție a programului............................................112 2.7.2. Programare structurată................................................................112 2.7.2.1. Declararea datelor............................................................112 2.7.2.2. Structurile de control........................................................113 2.7.3. Modularizarea aplicațiilor............................................................121 2.7.3.1. Controlul execuției modulelor.................................................121 2.7.3.2. Domeniul de vizibilitate al identificatorilor.................................122 2.7.3.3. Parametrii de comunicație.....................................................123 2.7.3.4. Modul de transmitere a parameterilor..........................................123 2.7.3.5. Subprogramele.................................................................124 2.7.3. Programare orientată pe obiecte.......................................................131 2.7.3.1. Principiile programării orientate pe obiecte..................................131 2.7.3.2. Clasele.......................................................................132 2.7.3.3. Obiectele.....................................................................135 2.7.3.4. Accesul la membrii unui obiect................................................137 2.7.4. Programare condusă de evenimente......................................................140 2.7.5. Programarea vizuală...................................................................141 2.8. Interfața aplicației........................................................................147 2.8.1. Proprietățile, metodele și evenimentele obiectelor vizuale............................149 2.8.1.1. Proprietățile generale ale obiectelor vizuale.................................149 2.8.1.2. Evenimente recunoscute de obiectelor vizuale..................................151 2.8.1.3. Focalizarea...................................................................152 2.8.2. Formularele...........................................................................153 2.8.2.1. Proprietățile generale ale obiectelor vizuale.................................153 2.8.2.2. Metode și evenimente specifice formularului...................................155 2.8.2.4. Mediul de date al formularelor................................................156 2.8.2.4. Metode de construire a formularelor...........................................157 2.8.2.5. Obiecte vizuale folosite pentru construirea formularelor.................................................................161 2.8.3. Controalele...........................................................................175 2.8.3.1. Proprietățile și evenimentele specifice controalelor..........................175 2.8.3.2. Controale pentru executarea acțiunilor........................................176 2.8.3.3. Controale pentru introducerea și afișarea datelor.............................178 2.8.3.4. Controale care permit utilizatorului să aleagă................................206 2.8.4. Sistemul de meniuri...................................................................224 2.8.5. Aplicația.............................................................................232 2.8.5.1. Programul monitor.............................................................232 2.8.5.2. Gestionarea componentelor unei aplicații......................................234