Baze de date
Mecanismele programarii in Visual FoxProMecanismele programarii in Visual FoxProProgramarea in Visual FoxPro implica scrierea unor secvente de cod: instructiuni sub forma de comenzi, functii sau operatii pe care Visual FoxPro le poate interpreta. Acestea pot fi introduse in: fereastra Command fisiere de programe; ferestre de cod pentru evenimente sau metode in cadrul proiectantului de formulare (Form Designer) sau al proiectantului de clase (Class Designer); ferestre procedurale in cadrul proiectantului de meniuri (Menu Designer); ferestre procedurale in cadrul proiectantului de rapoarte (Report Designer). Crearea de programe- 1. in Project Manager se selecteaza optiunea Programs din fila Code; 2. se alege comanda New 1. se alege comanda New din meniul File 2. din caseta de dialog New se alege Program se alege New File. in fereastra Command se foloseste comanda MODIFY COMMAND MODIFY COMMAND [FileName | ?] Visual Fox Pro va deschide o noua fereastra, in care se pot edita instructiunile programului. Salvarea programelordin meniul File se alege Save daca se salveaza un program creat in Progect Manager , acesta este automat adaugat proiectului. Modificarea programelorInainte de a modifica un program, acesta trebuie redeschis prin una din urmatoarele metode: pentru programele cuprinse intr-un proiect, se selecteaza in Project Manager si se alege comanda Modify in meniul File se alege comanda Open. Din lista Files of Type se alege Program, se selecteaza fisierul de modificat si se alege comanda Open. Se foloseste comanda MODI COMM in care se specifica numele programului sau parametrul '?'. Rularea programelordaca programul este cuprins intr-un proiect, se selecteaza din Project Manager si se alege comanda Run. Din meniul Program se alege comanda Do in fereastra de comenzi se foloseste comanda DO DO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList] Conceptele de baza ale programariiStocarea datelorFiecare data cu care se lucreaza apartine unui anumit tip, care determina modul in care aceasta poate fi stocata si folosita. Containere de date Containerele de date permit executarea acelorasi operatii asupra mai multor date simultan. Principalele containere de date in Visual FoxPro sunt:
Variabile. Instructiuni si functii de lucru cu variabilele. Macrosubstitutia. Variabila reprezinta zona de memorie careia i se atribuie un nume si care poate stoca o valoare de un anumit tip. Deci elementele unei variabile sunt: - numele - folosit pentru identificare si atribuit de programator sau predefinit de proiectanti, - continutul sau valoarea variabilei - reprezinta data ce este memorata in zona de memorie a variabilei; - tipul variabilei - tipul datei ce se poate memora in zona de memorie respectiva. Variabilele tablou (masivele) trebuie declarate in prealabil si pot avea maxim 2 dimensiuni. Numarul de elemente pe o dimensiune se poate preciza si prin expresii. In plus, in limbajul Visual FoxPro caracteristica de tip este asociata elementului tablou si nu tabloului, de unde rezulta ca elementele aceluiasi tablou pot fi tipuri diferite. Crearea unei variabile sau modificarea valorii acesteia se face prin una din metodele urmatoare: <memvar> = <expr> Exemplu: msal=10000000 mnume='Deliu' mdata=date() (2) STORE <e> TO <lista var> O tehnica speciala de lucru cu variabile o reprezinta macrosubstitutia, prin care continutul unei variabile de tip sir de caractere este tratat ca numele altei variabile sau alt element FoxPro (camp al unei baze de date, denumire fisier). Macrosubstitutia functioneaza ca si in locul variabilei respective ar fi pus sirul de caractere continut de aceasta, fara apostrofurile delimitatoare. Operatorul de macrosubstitutie este &. Exemplu:1. a='var' var='Continutul variabilei var' ? a && se afisaza var ? &a && rezultatul afisarii este Continutul variabilei var ? var && rezultatul afisarii este Continutul variabilei var Obs.: Dezavantajul este ca apare o problema de performanta pentru compilator, in sensul ca linia pe care apare, trebuie compilata 'din mers' in momentul rularii. Comenzi pentru afisarea variabilelor de memorie existente la un moment dat: LIST / DISPLAY MEMORY [LIKE <skel>] [NOCONSOLE] [TO PRINTER [PROMPT] | TO FILE <file>] Manipularea datelorFolosirea operatorilor Operatorii utilizati pentru a crea expresii in Visual FoxPro sunt: operatori aritmetici: adunare, scadere, inmultire, ridicare la patrat etc, operatori relationali: <,>,=,<=,>=, <>. Ordinea lor de prioritate este aceeasi, de la stanga la dreapta. operatori logici: negatie .not.(!) , sau logic .or. , si logic .and. Ordinea lor de prioritate este: not; and; or. operatori specifici sirurilor de caractere: concatenare (+,-) apartenenta $, etc. operatori specifici datelor calendaristice: adunare sau scadere numar de zile dintr-o data calendaristica, compararea a doua date. Exemplu: Fie urmatoarele valori de tip caracter stocate in variabilele v1 si v2: v1= 'Univ. ' v2='Stefan Cel Mare' Expresia: ? v1+v2 va avea ca efect afisarea pe ecran a valorii ' Univ. Stefan Cel Mare' Daca variabilele v1 si v2 au valorile urmatoare: v1= ' Str. Univ. ' v2=21 Expresia: ? v1+v2 va avea ca efect afisarea pe ecran a unui mesaj de eroare. Nota: Un semn de intrebare (?) la inceputul unei expresii genereaza un caracter de salt la linie noua si determina afisarea rezultatului expresiei in fereastra de rezultate activa. Pentru un anumit operator trebuie folosite aceleasi tipuri de date, in caz contrar se va genera un mesaj de eroare de nepotrivire de tip. Pentru evitarea acestui tip de probleme se vor folosi functiile de conversie. Folosirea functiilor predefiniteFunctii referitoare la semnul datelor numericeABS(nExpr) SIGN(nExpr) Functii de aproximare a datelor numerice INT(nExpr) CEILING(nExpr) FLOOR(nExpr) ROUND(nExpr, nDecimalPlaces) Functii matematice elementare EXP(nExpr) LOG(nExpr) SQRT(nExpr) SIN(nExpr): COS(nExpr).. ASIN(nExpr): ACOS(nExpr).. Functii referitoare la codificarea caracterelor din siruri CHR(nExpr) ASC (cExpr)
Functii referitoare la subsirurile de caractere SUBSTR(cExpr, nStartPosition [, nCharactersReturned]) Variante: LEFT(<cExpr>,<nExpr>); RIGHT(<cExpr>,<nExpr>); Alte functii REPLICATE(<cExpr>,<nExpr>);, SPACE(<nExpr>) Functii de eliminare a blancurilor ALLTRIM(<cExpr>); LTRIM(<cExpr>) RTRIM(<cExpr>) Functii referitoare la informatii despre un sir de caractere LEN(<cExpr>); ISDIGIT(<cExpr>); ISLALPHA(<cExpr>); ISLOWER(<cExpr>); ISUPPER(<cExpr>); Functii referitoare la transformarea sirurilor de caractere LOWER(<cExpr>); UPPER(<cExpr>); PROPER(<cExpr>); Functii referitoare la date calendaristice DATE() - obtinerea datei curente a sistemului; DOW(<dExpr>) - returneaza numarul zilei din cadrul saptamanii pentru data specificata; CDOW(<dExpr>) - returneaza numele zilei din saptamana pentru data specificata; DAY(<dExpr>) - returneaza numarul zilei din cadrul lunii pentru data specificata; MONTH(<dExpr>) CMONTH(<dExpr>) - returneaza numarul/numele lunii pentru data specificata; YEAR(<dExpr>) - returneaza anul pentru data specificata; Instructiuni pentru controlul formatului datei calendaristice SET CENTURY ON/OFF SET DATE TO DMY|MDY| BRITISH|FRENCH| GERMAN . Functii pentru controlul timpului: TIME(<nExpr>) - returneaza un sir de caractere de lungime 8, in formatul HH:MM:SS ce reprezinta ora exacta a sistemului; Instructiuni pentru controlul formatului de afisare al ceasului sistem: SET CLOCK ON | OFF SET CLOCK TO [<ROW>,<COL>] SET HOURS TO [12 | 24] Functie care verifica daca o expresie evaluata este vida sau nu EMPTY(eExpression) Functii de conversie- din grade in radiani si invers DTOR(nExpr) RTOD(nExpr) transformarea unei date calendaristice intr-un sir de caractere DTOC (<dExpr>) DTOS (<dExpr>) MDY (<dExpr>); DMY (<dExpr>) transformarea unui sir de caractere in data calendaristica CTOD (<cExpr>) transformarea valorilor numerice in siruri de caractere STR(nExpr [, nLength [, nDecimalPlaces]]) transformarea sirurilor de caractere in valori numerice VAL(cExpr) Folosirea Comenzilor Sintaxa generala a unei comenzi este: Verb <clauza,>< clauza >.. Exista o serie de clauze comune tuturor comenzilor, si anume clauzele de selectie respectiv clauzele de domeniu. a) Clauzele de selectie – permit comenzilor exprimate prim verb sa se execute numai asupra acelor inregistrari care satisfac o conditie impusa. Acestea sunt : clauza FOR conditie clauza WHIILE 1. Instructiuni (comenzi) de intrare-iesire Sunt instructiuni de afisare si instructiuni pentru citirea de la tastatura. Formatul de afisare, atat la instructiunile de afisare cat si la cele de citire, este controlat de clauzele PICTURE si FUNCTION care apar la majoritatea comenzilor de intrare-iesire. Fiecare din cele doua clauze este urmata de un sir de caractere prin care este descris simbolic formatul de afisare a valorii expresiei <exp>. Diferenta dintre cele doua clauze: - clauza PICTURE controleaza modul de afisare al unui singur caracter din textul de iesire, cel de pe aceeasi pozitie; caracterele din cadrul sirului FUNCTION se refera fiecare la cate o caracteristica a intregului text de iesire. Formatele stabilite prin cele 2 clauze sunt foarte importante in comenzile de citire, pentru ca la citirea unor date utilizatorul sa fie oprit sa faca greseli. Codurile celor 2 clauze sunt date in tabelele urmatoare: Cod FUNCTION Semnificatie Converteste toate literele in majuscule; ( Afiseaza numerele negative intre paranteze; A Permite numai caractere alfabetice; B Aliniaza textul la stanga in cadrul unui camp; D Utilizeaza formatul curent de data calendaristica; E Utilizeaza formatul european de data calendaristica; I Centreaza textul in cadrul unui camp (numai SAY); J Aliniaza textul la dreapta in cadrul unui camp (numai SAY); K Selecteaza intregul camp de editare cand cursorul se muta in acest camp; L Afiseaza zerourile nesemnificative intr-un camp numeric; M Defineste,atunci cand este urmat de o lista de optiuni separate prin virgula,optiunile acceptabile pentru o variabila citita cu GET; T Elimina spatiile din fata si din spate, in cadrul unui camp; Cod PICTURE Semnificatie Permite introd. cifrelor pentru date de tip sir de caract. si a cifrelor si semnelor pentru date numerice; Permite cifre, blancuri si semne; Afiseaza simbolul monetar curent definit de SET CURRENCY; Afiseaza asteriscuri in fata valorilor numerice; Specifica pozitia punctului zecimal; Separa cifrele la stanga punctului zecimal; A Permite introducerea doar a caracterelor alfabetice; W Permite doar date de tip logic; N Permite doar litere si cifre; X Permite doar caractere; Y Permite doar caracterele Y,y,N,n trecandu-le la majuscule. Obs.: Codurile FUNCTION pot fi incluse in clauza PICTURE dar precedate de '@' Exemplu PICTURE 'abcde' FUNCTION '!' PICTURE '@!abcde' Cele 2 forme sunt echivalente !! a) Instructiuni de afisare. Aceasta categorie de comenzi cuprinde urmatoarele instructiuni: ?
| ?? Expr1 Efect: Afiseaza, pe ecran, valorile unei sau mai multor expresii Visual FoxPro valide sau le tipareste la imprimanta, daca SET PRINTER este pe ON , conform valorilor clauzelor PICTURE, FUNCTION, AT, STYLE. Obs.: - clauza AT <expN1> defineste coloana unde se afiseaza <expr1>; - clauza STYLE <expC> defineste facilitati suplimentare de afisare/tiparire,cum ar fi bold, italic, underline, sau scriere cu diferite tipuri de caractere (font) , daca monitorul sau imprimanta permit aceste optiuni, in caz contrar fiind ignorata. (2) @ <linie,coloana> SAY <expr> [FUNCTION <expC1>] [PICTURE <expC2>][SIZE <expN1>, <expN2>] [FONT <expC3> [, <expN3]][STYLE <expC4>][COLOR SCHEME <expN4> | COLOR <lista perechi culori> ] Efect: Afiseaza valoarea expresiei <expr> valide pe ecran sau o tipareste la imprimanta, daca SET DEVICE este PRINTER, pe randul <expN1> si in coloana <expN2>, conform clauzelor PICTURE, FUNCTION. b) Instructiuni de citire de la tastatura. (1) ACCEPT [<cExpr> ] TO <memvar> Efect: Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta introducerea unui sir de caractere, de la tastatura, ce se atribuie variabilei de memorie <memvar>. (2) INPUT [<cExpr> ] TO <memvar> Efect: Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta introducerea unei expresii de la tastatura, a carei valoare se atribuie variabilei de memorie <memvar>. Obs.: - comanda cere obligatoriu introducerea unei expresii; - pentru introducerea constantelor de tip sir sau data calendaristica se vor folosi delimitatorii specifici (',',[], resp. ). (3) WAIT [[<cExpr> ] TO <memvar>] Efect: Se afiseaza pe ecran valoarea <cExpr> dupa care se asteapta apasarea unei taste (fara <CR> a carei valoare se atribuie variabilei de memorie <memvar>. Se utilizeaza pentru oprirea temporara a executiei unui program pana la apasarea unei taste. (4) @ <linie, coloana> GET <var> | <field> [FUNCTION <expC1>] [PICTURE <expC2>] [FONT <expC3> [, <expN1>]][STYLE <expC4>] [DEFAULT <expr1>] [ENABLE | DISABLE] [MESSAGE <expC5>] [[OPEN] WINDOW <nume fereastra>] [RANGE [<expr2>] [, <expr3>]] [SIZE <expN2>, <expN3>] [VALID <expL1> | <expN4> [ERROR <expC6>]] [WHEN <expL2>] [COLOR SCHEME <expN5>| COLOR <lista perechi culori> ] Principiul de lucru al instructiunii de tip @GET este urmatorul: - se definesc zonele de pe ecran in care utilizatorul va completa datele de intrare, numite campuri de editare (zone de editare, casute de editare); - se da comanda de citire a datelor (READ) - este prezentata ulterior; - programul continua dupa ce au fost citite toate datele in campurile de editare definite anterior. Obs: - <var> sau <field> trebuie sa fie definite in prealabil; - WHEN - alt mod de control al accesului la un camp (cu ajutorul unei vb. logice sau a unei UDF care intoarce un rezultat de tip logic. Evaluarea expresiei <expL2> se face la intrarea in campul GET. Daca expL2=.F. campul este sarit ! DISABLE este prioritar lui WHEN !! ; - VALID - controleaza corectitudinea editarii cimpului din GET. De asemenea <expL1> poate fi o expresie logica, numerica sau o UDF. Daca expl1=.F. (sau 0 pentru expresii numerice) se ramane in editarea respectivului camp cu afisarea unui mesaj de eroare, standard sau definit de utilizator cu clauza ERROR. Revenirea in editare se face cu tasta <Space> ; - RANGE - stabileste o limita minima (<expr2>), respectiv maxima (<expr3>. Verificarea se face doar la modificarea valorii din camp si nu la simpla trecere a cursorului ; - MESSAGE - permite precizarea unui mesaj ajutator, pe ultima linie a ecranului ; - DEFAULT - valoarea initiala a unei variabile de memorie. O variabila de memorie editata cu GET trebuie fie anterior definita, fie precizata astfel ; - COLOR si COLOR SCHEME - determina culorile de afisare a campului GET. READ [CYCLE] [ACTIVATE <expL1>][DEACTIVATE <expL2>] [WITH <window title list>] [SHOW <expL3>] [VALID <expL4 | expN1>] [WHEN <expL5>] [OBJECT <expN2>] [TIMEOUT <expN3>] [SAVE] [NOMOUSE] [LOCK | NOLOCK] [COLOR <color pair list> | COLOR SCHEME <expN4>] Efect: Activeaza mecanismul de cititre pentru toate instructiunile @ GET active. Obs.: - dupa executarea instructiunii READ, toate instructiunile @GET sunt dezactivate, iar noile valori introduse se atribuie variabilelor sau campurilor specificate; Exemplu: CLEAR SET TALK OFF SET STATUS OFF SET SCOREBOARD OFF Zi=SPACE(8) @ 3,1 SAY 'Ce zi este astazi ? ' ; GET zi FUNCTION 'M Luni, Marti, Miercuri, Joi, Vineri, Simbata, Duminica' ; MESSAGE 'Spatiu sau prima litera pentru selectare si apoi Enter' READ @ 5,1 SAY 'Astazi este : ' + zi + '? - apasati o tasta' WAIT '' SET STATUS ON SET SCOREBOARD ON SET TALK ON 2. Instructiuni de cautare a inregistrarilor intr-un tabel Cautarea secventiala intr-un tabel pentru a gasi prima inregistrare care respecta conditia specificata se realizeaza cu comanda: LOCATE FOR lExpression1 In caz de reusita, indicatorul de inregistrare se va pozitiona pe inregistrarea respectiva, functia FOUND () va returna valoarea .T. iar functia EOF() va returna valoarea .F. In caz contrar, indicatorul de inregistrari va fi pozitionat dupa ultima inregistrare, FOUND () va returna valoarea .F. , iar EOF() va returna valoarea .T.. Urmatoarele inregistrari care verifica conditia data vor fi gasite folosind comanda CONTINUE. Testarea reusitei sau nereusitei cautarii se face cu functiile RECNO(), FOUND() si EOF(). Functia: FOUND([nWorkArea | cTableAlias]) Returneaza valoarea adevarat in cazul unei cautari reusite si valoarea fals in cazul unei cautari nereusite. Exemplu: Cu ajutorul urmatarei secvente de cod sunt gasiti toti clientii din Suceava si se afiseaza numarul lor: SET TALK OFF CLOSE DATABASES OPEN DATABASE Parteneri USE Clienti STORE 0 TO gnCount LOCATE FOR UPPER(localitate) = 'SUCEAVA' DO WHILE FOUND( ) gnCount = gnCount + 1 CONTINUE ENDDO WAIT WINDOW 'Total clienti din Suceava: ' ; + LTRIM(STR(gnCount)) NOWAIT 3. Extragerea informatiilor statistice din tabele Scopul principal in care sunt create bazele de date il reprezinta obtinerea in timp cat mai scurt a unor informatii cu privire la datele continute. Aceste informatii pot fi de natura diferita, mai detaliate sau mai sintetizate sub forma de liste, tabele sau simple valori, informatii statistice sau totalizatoare. In acest scop sunt folosite urmatoarele comenzi: (1) COUNT comanda numara inregistrarile dintr-un tabel care respecta conditia data. Exemplu: CLOSE DATABASES OPEN DATABASE Parteneri USE Clienti CLEAR COUNT FOR UPPER(localitate) = 'SUCEAVA' to nrcl ? nrcl (2) SUM [eExpressionList] face o insumare a campurilor numerice dintr-un tabel. Exemplu: CLOSE DATABASES OPEN DATABASE Parteneri USE Produse SUM stoc, cant_com, stoc+cant_com ; TO tstoc, tcant_com, stocf CLEAR ? ? 'Total stoc : ', tstoc ? 'Total cantitate comandata: ',tcant_com ? 'Total stoc final : ', stocf (3) AVERAGE [ExpressionList] calculeaza media aritmetica a valorilor expresiilor din lista de expresii. Exemplu: CLOSE DATABASES OPEN DATABASE Tranzactii USE comenzi CLEAR AVERAGE cant_com && calculeaza media tuturor coomenzilor AVERAGE cant_com TO gnAvg && memoreaza media in variabila de memorie ? gnAvg && Afisaza media calculata (4) CALCULATE eExpressionList utilizata pentru calcule financiare si statistice asupra campurilor unui tabel. Exemplu: CLOSE DATABASES OPEN DATABASE Tranzactii USE Comenzi SET TALK ON CLEAR CALCULATE AVG(cant_com), MIN(cant_com), MAX(cant_com) CALCULATE STD(cant_com), VAR(cant_com) TO gnStd, gnVar (5) TOTAL TO TableName ON FieldName se va crea un nou tabel, cu aceeasi structura cu tabelul activ, in care se vor incarca inregistrari totalizatoare obtinute din tabelul curent. Exemplu: : CLOSE DATABASES OPEN DATABASE Tranzactii USE Comenzi INDEX ON cod_furn tag furniz TOTAL TO furn_tot ON furniz USE furn_tot LIST Controlul fluxului programului In Visual FoxPro exista o categorie speciala de comenzi care permit determinarea modului cum vor fi executate alte comenzi. Acestea permit ramificarea conditionala a programului si structurile ciclice. Ramificarea conditionala Permite testarea unor conditii si executarea, in functie de rezultatul testului a unor operatii diferite. Pentru aceasta sunt folosite urmatoarele comenzi: IF ..ELSE . .. ENDIF ; IIF(); DO CASE ENDCASE IF lExpr
[THEN] Efect: Se executa Commands1 daca lExpr are valoarea adevarat sau Commands2 daca are valoarea fals si clauza ELSE este prezenta. Obs.: - instructiunea nu se poate folosi de la prompter (fereastra Command); - daca se utilizeaza comenzi IF imbricate, trebuie utilizat cate un ENDIF pentru fiecare IF Exemplu: Se presupune ca exista o relatie PERSONAL(codp, nume, functie,salar) SET TALK OFF CLEAR IF Salar> REPLACE Salar WITH Salar*1.03 ELSE REPLACE Salar WITH Salar*1.06 ENDIF DO CASE ENDCASE Efect: Se executa Commandsi pentru prima lExpr cu valoarea .T. sau Commandsn+1 daca toate lExpr au valoarea .F. si clauza OTHERWISE exista. Obs.: - instructiunea nu se poate folosi de la prompter; - la prima evaluare adevarata a lExpr se executa Commandsi si apoi executia comenzii se incheie; Un efect asemanator se obtine prin functia: IIF(lExpr, eExpr1, eExpr2) Efect: Returneaza valoarea obtinuta prin evaluarea expresiei eExpr1 daca lExpr este 'true' sau returneaza eExpr2 daca lExpr este 'false'. Cele 2 expresii nu trebuie sa fie (obligatoriu) de acelasi tip. b) Instructiuni de ciclare Ciclarea permite executarea uneia sau mai multor linii de cod de cate ori este nevoie. Sunt: - comenzi pentru bucle cu un numar dat de pasi; - comenzi pentru bucle cu un numar nedefinit de pasi. DO WHILE lExpr Efect: Executa Commands atita timp cat lExpr este .T. Obs.: - dupa fiecare executie a <grup instr.> se reevalueaza <eL>; - daca lExpr este .F., se executa comanda urmatoare lui ENDDO; - daca apare LOOP are loc o revenire fortata la inceputul ciclului; daca apare EXIT are loc o iesire fortata din bucla. SCAN [NOOPTIMIZE] Efect: Permite parcurgerea tabelului curent in ordinea indexului curent (daca este activat), tinind cont si de conditiile din filtru. Obs. - se refera doar la parcurgerea unui tabel; - pointerul de inregistrari inainteaza automat in tabelul care era activ in momentul intrarii in bucla; - optiunea NOOPTIMIZE inhiba mecanismul de optimizare Rushmore; - optiunea LOOP permite reluarea fortata a interatiei; - optiunea EXIT permite terminarea fortata a instructiunii. Exemplu: CLOSE DATABASES OPEN DATABASE Parteneri USE Clienti && Deschide tabelul clienti CLEAR && Sterge ecranul SCAN FOR UPPER(localitate) = 'SUCEAVA' ? cod_cli,nume, manager ENDSCAN Obs.: Exemplul determina afisarea tuturir codurilor, denumirilor si managerilor pentru toti clientii din Suceava. Nu este obligatoriu sa pun o expresie logica in SCAN, caz in care 'scanarea' tabelului se face pana la intilnirea EOF().
|