Curs 1- Visual Foxpro - sgbd relational
Ce este Visual Foxpro? Este un SGBD modern , din generatia a 4 de limbaje, folosit pentru manipularea bazelor de date relationale sub sistemele de operare din familia Microsoft Windows (95/98/2000/NT ). Este o versiune pentru Windows, ce continua variantele mai vechi de Foxpro, permitând manipularea bazelor de date , inclusiv baze de date client -server. El face parte dintr-un pachet de instrumente de programare numit Visual Studio ( din pachet mai fac parte Visual C, Visual Basic). Permite programarea bazata pe obiecte si ofera instrumente visuale ( ce pot fi "trase" pe aplicatie) pentru construierea suprafetei (interfatei ) grafice de accesare a bazelor de date.
I. LUCRUL CU DATELE
1. Definirea si crearea bazelor de date relationale. Definirea tabelelor .
Ce este o baza de date relationala ? O baza de date relationala relationala reprezinta o structura complexa folosita la memorarea si gestionarea datelor ce descriu un anumit tip de obiecte. Concret, în Visual Foxpro o baza de date este un container în care sunt puse la un loc mai multe tabele cu date între care pot sa existe legaturi . Baza de date are asociat un fisier cu extensia DBC în care sunt memorate date referitoare la baza de date : tabelele componente, relatiile dintre tabele , dictionarul de date asociate. Tabelele sunt structuri în care se pot memora date descriind un anumit tip de elemente. Fiecare caracteristica a elementelor alcatuieste un câmp, iar elementele propriu-zise sunt memorate în inregistrari. Din punct de vedere fizic, tabele sunt stocate în fisiere cu extensia dbf :
Exemplu de structura tabelara în care sunt stocate datele:
TABELA.DBF |
|||||
Câmp1 |
Câmp2 |
Câmp m |
|||
Inregistrarea 1 | |||||
Inregistrarea 2 | |||||
Inregistrarea n | |||||
|
|
Nume |
Prenume |
DataN |
Studii |
Venit |
||
|
Ion |
SUPERIOARE | ||||
Georgescu |
Mihai |
SUPERIOARE | ||||
| ||||||
| ||||||
Avrom |
Mihai |
MEDII |
Acest tabel formeaza un fisier de date, fisier ce se salveaza sub numele de cursanti.dbf (acesta va fi fisierul fizic care va contine efectiv datel 737m1219h e ), tabel ce se depune în containerul baza de date.
Dupa cum se observa definirea unei tabele implica specificarea numelui de tabel,a câmpurilor componente, împreuna cu caracteristicile acestora si eventual a indexilor.
Fiecare câmp al unei tabele este caracterizat prin mai multe caracteristici ce se precizeaza la definirea tabelului :
numele sau folosit la identificare ( de fapt numele coloanei ). Numele este format din caractere ( de obicei litere , cifre si liniuta de subliniere) . Daca tabelul este inclus în baza de date , numele câmpului poate fi de lungime maxima 128 de caractere. Daca tabelul este liber, nefiind legat de o anumita baza de date , numele este format din maxim 10 caractere ( prima litera), tabelul fiind de fapt un fel de baza de date din versiunile mai vechi de Foxpro
tipul câmpului - precizeaza tipul datelor , valorilor ce vor fi stocate în câmpul (coloana) respectiva. Tipurile de date puse la dispozitie de Visual Foxpro sunt urmatoarele :
Character- folosit pentru stocarea datelor de tip sir de caractere (cum ar fi nume de persoane, nume de obiecte, adrese, denumiri, etc) . Câmpurile de tip caracter pot pastra pâna la 254 de caractere ( de obicei litere, cifre , semne de pe tastatura, semne tiparibile).
Curency - folosit pentru a stoca valori în dolari (i se mai spune tipul monetar ) . Valoarea maxima permisa este de $922 000 de miliarde si permite patru zecimale.( valorile sunt stocate pe 8 octeti în memorie).
Numeric si Float - folosite pentru pastrarea valorilor numerice , permitând panp la 20 de cifre semnificative, cu maxim 19 cifre zecimale. Valorile inime si maxim între care se poate lucra sunt 0.9999999999 x10-19 si 0.9999999999 x1020 .
Date si DateTime - sunt folosite pentru pastrarea datelor calendaristice în memorie sub forma YYYYMMDD, iar DateTime pastreaza si data calendaristica si timpul în formatul HHMMSS . Datele variaza între limitele 01-01-100 si 12-31-9999, iar timpul de la 12:00:00 AM la 11:59:59 PM. Trebuie precizat faptul ca în tabel data calendaristica este afisata implicit în formatul american MMDDYY. Pentru a schimab acest format se poate tasta ( în fereastra de comanda) comanda SET DATE TO DMY, iar pentru a avea anul cu 4 cifre trebuie tastata comanda SET CENTURY ON .
Logical - se foloseste pentru pastrarea a doua valori : adevarat ( notata cu .T. ) si fals ( notata cu .F.) . În general , este folosit pentru marimi cu doua stari, cum ar fi : taxabil/netaxabil, bursier/nebursier, scutit/nescutit, etc.
Memo - se foloseste pentru stocarea sirurilor mari de caractere , care depasesc 254. De exemplu, un câmp Observatie sau un câmp Cv (curriculum vitae) pot fi declarate de tip memo. Trebuie sa atentionam faptul ca daca se folosesc câmpuri memo , sistemul va ma atasa un fisier la baza de date , fisier ce are extensia FPT si stocheaza textul cel lung al cmpului ( câmpurilor ) memo . De aceea , daca se doreste copierea unei baze de date , trebuiesc copiate mai multe fisiere : fisierul DBC (containerul b.d.) , DBF-urile ( tabelele cu date ), FPT-urile ( fisierele cu textul câmpurilor memo) .
General - folosit pentru stocarea de referinte la anumite obiecte cum ar fi grafice. De asemenea , se foloseste pentru adaugarea de obiecte OLE (imagini, sunete, documente Windows). si el este stocat în fisierul cu extensia FPT asociat.
lungimea câmpului - adica numarul de pozitii necesare pentru pastrarea datelor acelui câmp ( numarul maxim estimat a se ocupa ) .
numarul de zecimale - se refera la câmpurile numerice si precizeaza câte pozitii pentru zecimale se vor aloca.
fanionul (indicatorul) de indexare - acesta stabileste daca se foloseste un index pe baza câmpului respectiv .
Observatie : Indecsii reprezinta o tehnologie cu ajutorul careia datele din tabel sunt vazute într-o anumita ordine , dupa un anume criteriu . Îi vom discuta la subiectul de ordonare a datelor .
fanionul (indicatorul) de valoare nula (NULL) - arata daca în câmpul respectiv poate fi memorata sau nu o valoare nula. Acest lucru permite diferentierea unui câmp lasat necompletat de utilizator si unul completat cu valoarea 0.
Pe lânga tabele cu date si ( vom vedea mai târziu) relatiile dintre aceste tabele , o baza de date relationala în Visual Foxpro mai poate contine si alte elemente . De asemenea, fata de versiunile mai vechi, în Visual Foxpro avem câteva caracteristici noi :
nume lungi ale tabelelor si a câmpurilor acestora , pentru a obtine o lizibilitate mai buna.
diferente secvente de cod ( proceduri si functii) care sa fie executate automat la aparitia anumitor evenimente ( cum ar fi completarea de cître utlizator a unui câmp de date , adaugarea de înregistrari, modificarea unei anumite valori din câmp.
restrictii de integritate sau conditii ce trebuie respectate la modificarea bazei de date.
vederi ale bazei de date
conexiuni cu alte surse de date , cu alte tipuri de baze de date.
Trebuie precizat faptul ca exista de fapt doua tipuri de tabele : cele stocate si legate în baza de date ( ele permit caracteristicile de mai sus) si cele libere , nelegate de o baza de date ( cu restrictiile anterioare, nume scurte , etc.) folosite pentru aplicatii mai vechi din vechile versiuni .
Crearea bazei de date si a tabelelor componente :
Practic, pentru crearea bazei de date si (eventual) a tabelelor , utilizatorul are la dispozitie cel putine doua metode : folosind comenzile din meniurile mediului Visual Foxpro, fie tastând comenzi dedicate în fereastra de comanda .
Prima metoda consta în alegerea optiunii New din meniul File , dupa
care , în fereastra deschisa pe ecran, se alege butonul Database
(în felul acesta se indica sistemului ca se doreste
construirea unui container baza de date ). În final , fie se
actioneaza butonul New file ,
fie se alege asistentul Wizard pentru a construi baza de date .
Se alege o
noua
baza de date Se
alege un nou fisier
pentru baza de date.
Daca se alege varianta New File, sistemul va cere
directorul unde se stocheaza baza de date si numele bazei de date.
Dupa specificarea numelui b.d. , pe ecran se va deschide fereastra
Constructorului de baze de date, ca în figura de mai jos. .
Zona în care se vor
afisa tabelele si relatiile
![]() |
|||
![]() |
|||
Dupa crearea containerului, se poate trece la crearea tabelelor bazei de date sau adaugarea în container a unor tabele cu date existente . Pentru a crea un tabel, se poate apasa butonul dreapta pentru a obtine meniul rapid cu comenzi si a alege comanda New Table. De aseamenea, se poate apasa primul buton ( New Table) din fereastra de comenzi Database Designer sau se poate realege din meniul File , comanda New cu optiunea Table. Îndiferent de metoda aleasa , mediul va cere sa precizati modul de lucru : fisier nou sau cu ajutorul asistentului . Apoi, se alege numele directorului în care se stocheaza tabelul si numelele tabelului ce se creaza. În final, va aparea Constructorul de table prin intermediul caruia se va preciza structura logica a tabelului :
![]() |
Câmpurile
Tipul de date
ce se poate alege
pentru fiecare câmp
În final, se poate confirma salvarea structurii cu
butonul OK si eventual introduce date în tabel, revenind apoi în constructorul bazei de date :
Daca se apasa butonul dreapta în zona tabelului (vezi figura anterioara), va aparea un alt meniu rapid din care se poate alege Modify - pentru a modifica structura bazei de date sau Browse -pentru a afisa si eventual a modifica datele din tabel. Cu ajutorul comenzii Modify se poate reveni în structura tabelului, se pot adauga noi câmpuri, se pot sterge câmpuri sau se pot modifica caracteristicile celor vechi.
Tabelele create anterior sunt tabele legate de baza de date . Aceste tabele permit nume lungi pentru denumirea tabelului si pentru denumirile câmpurilor (maxim 128 de caractere) . De asemenea , pentru câmpurile unei tabele legate se pot preciza formate implicite de afisare a datelor, machete de introducere a datelor în câmp, reguli de validare la nivel de câmp, etc. Exista si alte elemente noi cum ar fi posibilitatea de a incorpora în baza de date elemente speciale cum ar fi conexiunile , vederile , etc.
Pe lâna aceste tabele legate, se pot crea tabele libere , care sa nu apartina unei baze de date . Aceste tabele libere nu ofera toate facilitatile de mai sus , existente la tabelel legate (nume lungi, etc). Ele se pot crea separat în scopul folosirii lor în programe mai vechi din vechile versiuni de Foxpro, fie pentru adaugarea ulterioara în baza de date . Crearea tabelelor libere este similara crearii tabelelor legate . Pentru aceasta , în ipoteza ca nu exista nici o baza de date deschisa, se alege comanda File, optiunea New si tipul Table, dupa care se parcurge acelasi dialog de creare a tabelului (prezentat anterior ).
Un tabel liber poate fi adaugat ulterior unei baze de date deschise , cu ajutorul comenzii Add Table ca în figura de mai jos.
Toate operatiile anterioare legate de crearea bazei de date si a tabelelor legate sau libere se mai pot realiza si cu ajutorul comenzilor echivalente ce se tasteaza în fereastra de comanda:
pentru crearea containerului baza de date folosim CREATE DATABASES nume, unde nume va reprezenta numele noii baze de date sau CREATE DATABASES , caz în care aparea o fereastra de dialog pentru introducerea numelui .
pentru deschiderea constructorului si afisarea acestuia se foloseste MODIFY DATABASE .
crearea tabelelor se face cu comanda CREATE TABLE nume sau CREATE TABLE ( se poate omite numele TABLE ).
adaugarea de date în tabelul curent se face cu comanda APPEND .
Observatii:
Orice comanda ce se foloseste în fereastra de comanda poate fi scrisa prescurtat folosind doar primele patru litere din nume . De exemplu, puteti tasta doar CREA DATA.
De asemenea se poate lucra combinat, fie tastând comenzi în fereastra de comanda fie folosind comenzile din meniuri sau din ferestrele Constructorilor de tabele sau baze de date.
Daca un tabel poate fi adaugat într-o baza de date, de asemenea el poate fi sters din baza de date. Lucrul acesta se realizeaza fie cu ajutorul comenzii REMOVE din meniul DATABASE, fie cu ajutorul butonului Remove Table din bara de instrumente Database , fie cu ajutorul comenzii Delete din meniul rapid ce se obtine prin apasarea butonului dreapta al mouselui pe simbolul tabeleului .
Indexarea tabelelor .
Nimeni nu se asteapta ca utlizatorii sa introduca datele gata sortate, gata aranjate. Din acest motiv, de multe ori avem nevoie sa vedem datele într-o anumita ordine. Lucrul acesta este posibil de realizat în mai multe moduri în Visual Foxpro. Unul din aceste moduri poate fi folosit chiar din momentul crearii tabelei prin intermdiul unei tehnologii numita indexare. Indecsii servesc pentru doua scopuri principale. Întâi , folosim indecsii pentru a forma realtii între tabele . Al doilea scop este de a ajuta la regasirea datelor si de a îmbunatati performantele interogorilor si ale rapoartelor.
În momentul crearii tabelului, utilizatorul poate sa-si defineasca si indecsi. De fapt, indexarea reprezinta o tehnica de ordonarea logica a datelor dintr-o tabela , dupa diferite criterii, operatie care însa nu afecteaza ordinea fizica a datelor din tabela, ci doar modul în care sunt vazute de utilizator. Ordonarea tabelei presupune stabilirea unui criteriu dupa care sa fie parcurse înregistrarile. Criteriul este de obicei un câmp sau o combinatie de câmpuri. De exemplu, pentru tabelul cursanti ne intereseaza sa avem , sa vedem cursanti fie în ordinea alfabetica a numelui, fie în ordinea anului de studiu. Câmpul dupa care se face ordonarea se mai cheama cheie de ordonare. De fapt indexul, este un fisier separat atasat tabelului , ce îi spune sistemului cum sa parcurga baza de date pentru ca utlizatorul sa o vada ordonata .
De exemplu :
Carti.cdx Carti.dbf
Titlu |
Pozitie |
Nr. înreg |
Titlu |
Autor |
Nr. pag. |
|
Amintiri din copil. |
Ion |
Liviu. R. | ||||
Ion |
Amintiri din copilarie |
Ion Creanga |
|
|||
Insula misterioasa |
Morometii |
Marin Preda | ||||
Morometii |
Insula misterioasa |
Jules Verne |
Daca se doreste afisarea datelor, sistemul se uita în fisierul index si de acolo afiseaza mai întâi inregistrarea de pe pozitia 2 (ce o gaseste în tabelul carti.dbf), apoi înregistrarea 1,4 si în final 3.
În Visual Foxpro, indecsii sunt memorati într-un fisier cu extensia CDX.. Indecsii pot fi de doua feluri :
normali (Regular - acestia construiesc pentru fiecare înregistrare a tabelei câte o înregistrare în fisierul index respectiv, indiferent de duplicarea valorii câmpului de indexare. Prin urmare, într-o tabela indexata care contine doua persoane cu acelati nume, ambele înregistrari vor fi "vazute" de utilizator.
unici (Unique) , care permit o unica valoare a cheii de indexare . În varianta aceasta , daca exista mai multe persoane cu aceast nume, doar prima înregistrare va fi accesibila.
Totusi, pentru a putea face legaturi între tabelel bazei de date exista înca doua tipuri de indecsii :
indexul candidat (Candidate) - reprezinta un index asemanator cu cel unic , dar interzice încarcarea de înregistrari care dubleaza valoarea cheii de indexare. În cazul indecsilor unici se permitea încarcarea acestora, dar înregistrarile respective erau ascunse utilizatorului.
indexul de tip cheie primara (Primary) - Exista situatii în care în tabela s-au creat mai multe criterii unice de ordonare . Dintre acestea , se poate stabili unul care sa fie folosit drept cheie primara a tabelei, pentru a putea stabili relatii între tabela respectiva si alte tabele ale unei baze de date .
Observatie: De obicei proiectantul bazei de date si a tabelelor , îsi stabileste un câmp ca si cheie primara unica . De exemplu, cod matricol , cod numeric personal , cod produs, cod carte , marca persoana , etc. Crearea indecsilor se poate face la creare tabelelor, folosind pagina Fields , asa cum se vede din figura de mai jos :
Ordinea Câmpul Tipul de index Cheia de indexare Filtru
crescatoare/descrescatoare
![]() |
Dupa cum se oberva în figura anterioara , cu ajutorul paginii Index se poate defini unul sau mai multi indecsi. Pentru aceasta trebuie precizate câteva informatii :
cum se ordoneaza : crescator sau descrescator;
numele simbolic al indexului;
tipul idexului ( unul din cele patru tipuri prezentate anterior);
expresia de indexare folosita ca si criteriu de ordonare, expresie formata dintr-un singur câmp al tabelei sau dintr-o combinatie de câmpuri legate prin operatori. Expresia se construieste cu ajutorul Constructorului de expresii.
un filtru care sa restrânga accesul la înregistrarile tabelei , pe baza unor conditii pe care le precizeaza utlizatorul . Conditia de filtrare se poate tasta manual sau construi cu ajutorul Constructorului de expresii aflat în dreapta coloanei Filter.
Indecsii , pentru a putea avea efect , trebuie deschisi. Vom vedea la subiectul de ordonarea datelor cum se folosesc , cum se deschid, etc.
Formatul de afisare si de citire. Validarea datelor.
În momentul crearii tabelului, utlizatorul are posibilitatea de a introduce formate de afisare si formate pentru citirea datelor . De asemenea, un lucru foarte util în practica, utilizatorul poate impune conditii de validare a datelor pentru a preveni introducerea de date inconsistente. Optiunile respective se pot vedea în figura de mai jos:
![]() |
![]() |
![]() | ![]() |
||
Formatul de afisare si masca de
intrare al unui câmp se refera
la modul cum vor fi afisate datele într-o fereastra de editare a
tabelei (de exmplu cu comanda Browse )
sau într-o lista afisata cu comanda List sau Display sau într-un raport si la modul cum vor fi
citite datele (inclusiv într-un formular). Formatul de afisare si
masca de citire sunt de fapt un sir de caractere, un fel de
sablon, alcatuit din mai multe coduri , în functie de
care se decide afisarea si citirea datelor. De exemplu, se poate
folosi caracterul 9 pentru a preciza fiecare pozitie a unei cifre dintr-un
numar ( de exemplu 99.99 - precizeaza afisarea pe 5 pozitii
cu 2 zecimale . De asemenea se poate folosi caracterul A pentru a preciza
caractere de tip litera sau se poate folosi caracterul ! pentru a preciza
majuscule ( de exemplu !Axxx precizeaza ca avem numai majuscule,
prima obligatoriu litera ) . Mai multe amânunte legate de sabloanele
de afisare si citire la realizarea rapoartelor de afisare si a formularelor de citire.
Conditiile de validare a datelor sunt expresii pe care le putem introduce în ideea de a face verificari ale datelor introduse. Acest lucru este util pentru a preveni introducerea datelor inconsistente . Pentru aceasta se foloseste caseta Rule si , eventual, Constructorul de expresii aflat în dreapta casetei Rule (vezi figura anterioara) . De aici se poate construi o expresie logica ce foloseste operatori relationali (<, >, =, <>, <=, >=), operatori logici (AND, OR, NOT sau !).
Regulile acestea sunt verificate în momentul în care se încearca mutarea câmpului sau modificarea valorilor acestuia cu ajutorul unei comenzi .
Valorile implicite pentru câmpuri se refera la posibilitatea de a preciza de la început cu ce valoare va fi initializat un anumit câmp . În felul acesta , daca utilizatorul nu introduce o valoare , câmpul va avea o valoare initiala . O alta situatie este aceea în care o anumita valoare se repeta la mai multe înregistrari , este mai simplu sa initializam câmpul si sa modificam doar acele înregistrari care nu se portivesc.
Valorile titlurilor de figura (proprietatea Caption pe figura ) se refera la titlurile coloanelor, de exemplu la comenzile Browse sau Edit titlurile coloanelor sunt denumirile câmpurilor . de multe ori aceste denumiri nu sunt suficient de sugestive fiind de fapt prescurtari . Cu acesta proprietate, acele titluri pot fi schimbate.
Comentariile câmpurilor se refera la mesaje explicative ce le pune programatorul pentru a stii mai târziu la ce folosea acel câmp ( dupa un timp , programul va trebui depanat , actualizat si programatorul uita la folosea acel câmp) .
![]() |
|