Sunteți pe pagina 1din 24

NSTRUCTIUNI SI STRUCTURI DE PROGRAMARE IN FOXPRO 1.1.

Crearea bazei de date Crearea unei baze de date se poate face cu comanda Create database, care are urmatoarea sintaxa: CREATE DATABASE [<nume_baza_de_date>l?] unde:
nume_baza_de_date specifica numele bazei de date care va fi creata. Fisierul

corespunzator bazei de date are extensia .DBC;


? afiseaza o fereastrade dialog In care se poate specifica numele bazei de date care

va fi creata. La crearea bazei de date se face automat si deschiderea ei. Pentru modificarea bazei de date comanda este MODIFY DATABASE 1.2.Crearea tabelelor Pentru deschiderea si utilizarea unei tabele se utilizeaza comanda: USE [nume_tabela] Pentru inchiderea tuturor tabelelor: USE sau CLOSE ALL Crearea tabelelor se poate realiza utilizand comanda CREATE, submeniul File, optiunea New sau prin intermediul comenzii CREATE TABLE din nucleul SQL. Sintaxa comenzii este: CREATE [<nume-tabela> I?] Alte comenzi utilizate in crearea tabelelor Pentru crearea unei tabele se pot utiliza si comenzile COPY STRUCTURE TO si CREATEFROM Comanda COPY STRUCTURE EXTENDED TO permite crearea unei noi tabele, prin copierea structurii sau a anumitor campuri dintr-o tabela activa din zona de lucru curenta. Sintaxa comenzii este: COPY STRUCTURE TO <nume-tabela> [FIELDS<lista-campuri> [WITH] CDX I[WITH] PRODUCTION] DATABASES <nume-baza de date> [NAME]<nume-tabeIa> unde;
<nume-tabela> este numele tabelei nou create; <lista-campuri> specifica campurile din noua tabela; <nume-baza-de-date> este numele bazei de date; [NAME<nume tabela>] este numele tabelei;

1.3. Modificarea structurii de date a tabelelor, deschiderea si Inchider 232f54c ea unei tabele Deschiderea si Inchider 232f54c ea unei tabele a) Deschiderea unei tabele se face cu comanda USE,care are urmatoarea sintaxa: USE [[Database Name !]table] SOLViewname I?] [INnWerkArea I CTableAlias] Ion lina][Admin][Again][NOREOUERYInData Session Number]][NODATA] [INDEX IndexFilelist] ?[ORDER [nlndexNumber I idx FileName]I [TAG] TagName (Of CDX FileName][ASC I DES][ALIAS CTable-Alias][Exclusive][SHARED][Noupdate] unde:
.<nume-tabela> I ? este numele tabelei ce se va deschide. Daca se specifica (1), va

aparea fereastra de dialog Open file cu o lista de tabele din care se alege tabela dorita. Daca se foloseste USE fara alte argumente si tabela e deschisa in aria de lucru selectata, tabela va fi inchisa. O tabela este inchisa daca in aceeasi zona de lucru se deschide o alta tabela;

IN <zona-de-Iucru> specifica numele zonei de lucru in care dorim sa deschidem

tabela. Dad se foloseste USE fara alte argumente, dar incluzand IN <zona-de-Iucru>, tabela din zona de lucru specificata va fi inchisa;
AGAIN permite redeschiderea tabelei specificate, In alta zona de lucru; ORDER <expN> se refera la fisierele index ce apar In <lista-fis-index>. Cu ajutorul acestei optiuni se stabileste fisierul index principal dupa care se face indexarea (altul decat primul din <lista-fis-index>i sau cheia principala; ORDER [<fis.idx>] specifica numele fisierului index principal; ORDER [[TAG<nume cheie] [OF<fis.cdx>] specifica numele cheii principale; ASCENDING/DESCENDING specifica daca Inregistrarile tabelei vor fi afisate in

ordine crescatoare sau descrescatoare;


ALIAS <alias> este un sinonim pentru tabela deschisa cu USE. Un sinonim poate

contine maxim10 caracteresi trebuie sa inceapa cu o litera;


EXCLUSSIVE specifica (pentru retea) folosirea de catre un singur utilizator a tabelei. SHARED permite accesul concurential pe o retea la informatiile stocate de o tabela; NOUPDATE impiedica modificari In tabela.

Exemplu Sa se deschida tabela PRODU In zona A si tabela BENEF In zona B si apoi sa se verifice. SELECT A USE PRODU SELECT B USE BENEF ? USED (A) ? USED (B)

USE PRODU USE BENEF in 3 USE ? USE PRODU ALIAS P USE PRODU && se deschide tabela BENEF zona de lucru 3 && se atribuie tabelei PRODU alias-ul 'P' d) Inchiderea unei tabele se face si cu comanda CLOSE. Comanda CLOSE Inchide diferite tipuri de fisiere. Ea are urmatoarea sintaxa: CLOSE ALL CLOSE ALTERNATE CLOSE DATABASE CLOSE FORMAT CLOSE INDEX CLOSE PROCEDURE unde:
ClOSE All Inchide toate tipurile de fisiere din toate zonele de iucru si selecteaza

zona de iucru (1);


ClaSE ALTERNATE Inchide fisierele de tip ALTERNATE (deschise prin comanda de redirectionare SET ALTERNATE la fisier). CLOSE DATABASES Inchide toate tabelele de date deschise, precum si toate fisierele de tip index aferente si selecteaza zona de iucru (1). ClOSE FORMAT inchide fisierele de tip format din zona de lucru curenta. Utilizatorul poate deschide un alt fisier format pentru aceeasi tabela de date. Instructiunea este folosita pentru a reduce numarul de fisiere deschise simultan.

CLOSE INDEX Inchide fisierele index deschise pentru zona de lucru curenta.
ClOSE PROCEDURE Inchide un fisier de proceduri deschis prin comanda SET

PROCEDURETa <nume.fisier>. Modificarea structurii logice a unei tabele se poate face cu ajutorul comenzii MODIFY STRUCTURE. MODIFY STRUCTURE Vizualizarea structurii logice se poate realiza utilizand comanda DISPLAY STRUCTURE sau LIST STRUCTURE

2. Accesul la date 2.1. Adaugarea de noi inregistrari in tabele Utilizarea comenzilor de tip APPEND Adaugarea de noi inregistrari in tabele se poate face prin tastarea directa a datelor sau preluarea lor din tabele, fisiere, masive si variabile de memorie. Aceasta se realizeaza cu ajutorul comenzilor APPEND, APPEND FROM si APPEND FROM ARRAY. Comanda APPEND Comanda APPEND permite adaugarea la sfarsitul tabelei selectate a unei inregistrari vide fara posibilitati de editare. De asemenea, permite deschiderea unei ferestre pentru introducerea de inregistrari la sfarsitul tabelei. Sintaxa comenzii este: APPEND [BLANK][IN nWorkArea I CTableAlias] Sintaxa comenzii este: APPEND FROM <nume-fis> I? [FIELDS <lista-campuri>]I [FOR<expr-log>][TYPE][DELIMITED][WITH TABIWITHBLANKIWIDTH <delimitator> unde:
<nume-fis este numele fisierului de unde se importa date; <lista-campuri> reprezinta campurile ale caror valori vor fi adaugate In tabela nou creata; [TYPE] defineste extensia fisierului sursa, daca nu este de tip (DBF). DELlMITED [WITH TAB I WITH BlANK I WITH <delimitator>] permite stabilirea, pentru fisierul definit, a delimitatorului dintre campurile structurii Inregistrarii. Delimitatorul implicit este virgula.

Exemple 1) Sa se adauge la sfarsitul tabelei CONTR datele din campul CODP al tabelei PRODU. La sfarsit sa se afiseze tabela CONTR. USE CONTR APPEND FROM PRODU FIELDS CodP BROWSE 21Sa se adauge la sfarsitul tabelei CONTR datele din campul CODP al tabelei PRODU care satisfac conditia CODP <> 1. USE CONTR : APPEND FROM PRODU FIELDS CODP FOR CODS <> 1 BROWSE 2.2 Modificarea inregistrarilor dintr-o tabela Modificarea datelor se face cu ajutorul comenzilor si ferestrelor CHANGE. BROWSE si REPLACE.

Comanda CHANGE permite modificarea datelor unei tabele ptin intermediul ferestrei de editareChange. Comanda BROWSE este una dintre cele mai utilizate comenzi pentru afisarea si editarea inregistrarilor dintr-o tabela. Comanda REPLACEmodifica inregistrarile tabelei curente prin inlocuirea datelor in <campl >, <camp2> cu cele din expresia <expr1>, <expr2> REPLACE ctioneaza asupra inregistrarii curente din zona de lucru selectata. Comanda REPLACEare urmaoarea sintaxa: REPLACE <camp1> WITH <expr1> [ADDITIVE][<camp2> WITH] [<scape>] [FOR <expL 1>][WHILE <expL2> IN nWorkArea I CTableAlias] INOOPTIMIZE] [,<camp2> WITH<expr2> [ADDITIVE]]. Unde: <scope>, FOR<expL1>, WHILE<expL2> definesc conditiile de selectie ale inregistrarilor ce se actualizeaza. Vor fi actualizate inregistrarile care indeplinesc conditia <scope> si pentru care expresiile logice <expL1> si <expL2> din optiunile WHILE si FOR sunt adevarate. Absenta acestor clauze permite actualizarea tuturor inregistrarilor. <camp1> WITH<expr!> inlocuieste datele din <campl > cu datele din <exprl >. In cazul campurilor numerice pentru care valoarea expresiei din clauza WITH depaseste lungimea campului, partea zecimala va fi trunchiata, dupa care este rotunjita. Daca in continuare valoare expresiei depaseste lungimea campului, in locul continutului campului vor fi introduse notatiile stiinlifice. Daca nici prin aceasta operatie problema nu a fsot rezolvata, continutul campului va fi inlocuit cu (*). ADDITIVE infiuenteaza inlocuirile numai in campurile memo. Folosirea optiunii
NOOPTIMIZE dezactiveaza tehnologia Rushmore.Pentru o dezactivare globala

permite adaugarea informatiilor in continuarea celor existente in campul memo. (privind toate comenzile ce beneficiaza de tehnologia Rushmore) se foloseste comanda SETOPTIMIZE. Exemple USE PRODU REPLACE ALL CODP WITH 1 2.3. Stergerea inregistrarilor dintr-o tabela Stergerea inregistrarilor unei tabele se poate face logic sau fizic. Realizarea operatiei de stergere se face cu ajutorul comenzilor sau al meniului sistem. Comanda DELETE marcheaza logic articolele pentru stergere. Inregistrarile marcate pentru stergere pot fi recuperate folosind comanda RECALL. Comanda DELETE are urmatoarea sintaxa: DELETE [<scope>][FOR<expI1>][WHILE<expI2>] [NOOPTIMIZE] unde:

<scope>, prin clauzele ALL,NEXT,REST,SKIP, stabileste articolele care vor fi sterse. <expI1>si<expI2>sunt expresii logice care permit selectare articolelor atata timp

cat sunt adevarate aceste expresii. Absenta acestor clauze marcheaza implicit pentru stergere articolul curent.
NOOPTIMIZE dezactiveaza tehnologia de optimizare.

1) Sa se stearga logic si fizic inregistrarile ce indeplinesc conditia CODB = 100, din tabela CONTR. USE CONTR DELETE FOR CODB = 100 BROWSE PACK BROWSE Utilizarea comenzii PACK Comanda Pack se foloseste pentru stergerea fizica a inregistrarilor care anterior au fost marcate logic. Dupa executarea unei comenzi PACK inregistrarile sterse nu mai pot fi recuperate. Este folosita si pentru reducerea dimensiunii unui fisier memo asociat tabelei. Cand se executa comanda PACK, toate inregistrarile care nu sunt marcate pentru stergere sunt copiate intr-un fisier temporar. Executarea comenzii PACK este completa, daca tabela originala este stearsa de pe disc, iar tabela temporara este redenumita cu numele original Prin apasarea tastei Esc se intrerupe executia comenzii PACK. In acest caz, tabela temporara este stearsa, iar tabela originala ramane neschimbata. Comanda PACK are urmatoarea sintaxa: PACK[MEMO] [DBF] unde:
MEMO permite stergerea fisieruiui memo atasat tabeiei curent seiectate, dar nu si a inregistrariior din tabeia selectata, marcate pentru stergere (un fisier memo are aceiasi nume ca si tabela, dar cu extensia (.FPT)); DBF sterge inregistrarile marcate din tabela, dar nu actioneaza asupra fisierului memo.

Dupa executarea instructiunii PACK,utilizatorul este informat asupra numarului de articole ce se recopiaza in tabela activa. Exemple Sa se stearga fizic primele trei inregistrari din tabela BENEF. USE BENEF GO TOP DELETE NEXT 3 PACK Comanda ZAP sterge fizic toate articolele din labela curenta. Eaeste echivalenta cu comanda DELETE ALL,urmata de comanda PACK, dar este mult mai rapida.

In cazul in care comanda SET SAFETY este ON, tabela este protejata, utilizatorul fiind avertizat inaintea executarii unor comenzi care ar putea distruge sau rescrie inregistrarile din tabela. Pentru aplicatiile testate, care functioneaza corect, se recomanda utilizarea optiunii (OFF).Articolele sterse cu ZAP nu pot fi reactivate cu RECALL. Comanda are urmatoarea sintaxa: ZAP [IN nWorkArea I CtableAlias] Exemplu Sa se stearga fizic continutul tabelei BENEF. USE BENEF ZAP

3.2. Ordonarea datelor Exploatarea unei tabele implica ordonarea datelor continute de aceasta dupa diferite criterii. In general, incarcarea datelor se realizeaza intr-o maniera aleatorie, iar actualizarea se face dupa necesitati obiective, ce nu coincid intotdeauna cu ordinea din tabele, necesara la exploatare. Ordonarea inregistrarilor in tabele se realizeaza prin comenzile SORT si INDEX. Rezultatele sunt aceleasi, dar procesul sortarii prezinta o serie de dezavantaje. Sortarea si indexarea se executa la nivel de comanda si mai putin prin intermediul meniului sistem, datorita vitezei de executie si a faptului ca la sortarile si indexarile complexe este mai comoda utilizarea comenzilor. 3.2.1. Sortarea tabelelor Cand sistemul FoxPro sorteaza inregistrarile unei tabele va fi creata pe disc o tabela noua cu nume diferit. Aceasta va contine aceleasi inregistrari cu ale tabelei originale, ordonate dupa un criteriu specificat. Pentru a efectua sortarea este necesar un spatiu disponibil pe disc de minim trei ori dimensiunea tabelei ce va fi sortata. Sortarea se realizeaza prin intermediul comenzii SORT, a) Sortarea dupa un camp prin intermediul comenzilor Secventa de comenzi folosita In mod normal pentru sortare este: USE <nume_tab.> SORT ON <nume-camp> [D/A/C] TO <nume-tab-noua> Daca se specifica optiunea A, fisierul este ordonat ascendent, iar cu optiunea D descenslent. Modul de ordonare implicit este cel ascendent. Campurile de tip memo nu pot fi sortate. Pentru a nu se face diferentiere la sortare Intre literele mari si cele mici se va include optiunea [/C], Dupa sortare, In zona de lucru curenta ramane deschisa tabela initiala, Pentru utilizarea tabelei noi se tasteaza comanda: USE <nume-tab-noua> b) Sortarea dupa mai multe campuri cu ajutorul comenzilor De cele mai multe ori in practica este necesara sortarea dupa valorile mai multor campuri. De exemplu, In tabela CONTR se face o sortare dupa CODB si CODP, Sortarea se poate efectua pentru campuri de natura diferita, In acelasi timp, Sistemul FoxPro are posibilitatea sa efectueze sortarea dupa mai multe campuri cu ajutorul comenzii SORT sau prin intermediul meniului sistem, campul dupa care se face in mod prioritar sortarea va fi introdus pe prima pozitie in lista. Sintaxa comenziiSORTIn cazul sortarii dupa mai multe campuri este: SORT ON <nume-camp1> [A/C/D], <nume-camp2> [A/C/D], '' <nume campn> [A/C/D] To <nume-tab-sortata> unde:
<nume-camp1> este campul principal pentru sortare; <nume-campl> este campul secundar pentru sortare; <nume-campn> este ultimul camp dupa care se efectueaza sortarea;

<nume-tab-sortata> este numele tabelei rezultate in urma sortarii, In cazul In are numele specificat este identic cu al unei tabele existente va aparea un dialog ce avertizeaza asupra acestei probleme, In cazul In care se alege specificatia <Overwrite>, se executa sortarea, iar continutul vechii tabele sortate este Inlocuit cu cel al noii tabele.

3.2.2. Indexarea tabelelor unei baze de date Sortarea nu este cel mai indicat procedeu pentru ordonarea Inregistrarilor unei tabele. Aceasta deoarece procesul dureaza mult (mai ales In cazul tabelelor mari) si ocupa mult spatiu pe disc. Un alt dezavantaj este acela ca In momentul actualizarii altor Inregistrari este necesara efectuarea unei noi sortari. De asemenea, In cazul sortarii multiple timpul se mareste considerabil. Din aceste considerente este mult mai eficient sa se execute ordonarea prin intermediul indexarii. Indexarea tabelelor ce compun bazele de date se face prin intermediul comenzilor INDEX si REINDEXsau cu ajutorul meniului sistem. Un fisier de index se rezuma la cel putin un camp al tabelei de date. Campul va fi indexat dupa un criteriu alfabetic, numeric sau cronologic. Ca efect, un fisier index este o sortare virtuala a unei tabele. In timp ce inregistrarile tabelei raman nesortate. Principiul pe baza caruia functioneazi; indexarea tabelelor este asemanator cu indexul unei carti (contine informatii de localizare a Inregistrarilor Intr-o tabela). Cand tabela este deschisa impreuna cu un fisier index aferent ei, inregistrarea ce va fi luata In considerare este prima din fisierul index. Numarul de fisiere index care se pot deschide este limitat de memoria calculatorului si de numarul total de fisiere care se pot deschide simultan. Sunt doua modalitati de a realiza o indexare fisierelor. Prima utilizeaza un fisier index compus (pe baza unor chei multiple) cu extensia (.CDX)(compound index file). Acest fisier va contine informatii privind diferite indexari definite de utilizatori. Sistemul FoxPro permite deschiderea simultana a mai multor fisiere (.CDX) odata cu tabela la care se refera, Insa numai unul singur (cel activ) va controla ordonarea Inregistrarilor. Optiunea Tag a unei comenzi INDEX Inmagazineaza Intr-un fisier (.CDX) informatiile privind indexarea. Acest fisier (.CDX) este cunoscut sub numele de fisier index structural (structural CDXfile). A doua metoda este aceea de a crea un fisier individual (.IDX) pentru fiecare indexare executata. De exemplu, indexarea tabelei BENEFse poate executa dupa valorile campurilor CODB sau DENB, ceea ce implica crearea a doua fisiere (.IDX) separate. Larandul lor, fisierele(.IDX)pot fi de tipul compact sau necompact. Fata de fisierul compact, cel necompact ocupa mai mult spatiu pe disc. Orice modificare In tabela va fi urmata de actualizarea corespunzatoare a fisierelor index active. Crearea unui fisier index se face cu ajutorul comenzii INDEXsau la crearea tabelei cu ajutorul comenzii CREATE pt. indecsi de tip .CDX. Daca comanda SETTALK este ON, sistemul FoxPro afiseaza pe ecran cate Inregislrari au fost indexate In urma executarii comenzii.

Sinlaxa comenzii este: INDEX ON <expr> TO <.IDX file> ITAG <tag-name> [OF<.CDX file>] [FOR <expL>][COMPACT][ASCENDINGIDESCENDING] [UNIQUE/CANDIDATE] [ADDITIVE] unde:
<expr> este expresia index ce include campuri din tabela selectata. Tipurile de

expresii admise sunt de tip numeric, caracter, data calendaristica. Pentru indecsii de tip (.CDX) lungimea expresiei index plus lungimea clauzei FOR nu poate depasi 254 caractere. Pentrufisierele de tip (.IDX) lungimea expresiei index nu poate depasi 100 caractere. In cazul In care <expr> este numele unui camp, fisierul index creat va fi construit pe baza valorilor campului specificat;
TO <.IDX file> permite crearea unui fisier cu extensia (.IDX) al carui nume este

specificat;
TAG <Iag name> [OF <.CDX file>] permite crearea unui fisier cu extensia (.CDXI. Un fisier index cu extensia (.CDX) este un fisier ce contine mai multe intrari (tag) al caror numar este limitat doar de spatiul disponibil pe disc; Fisierele index cu extensia (.CDX) sunt Intotdeauna compacte, deci includerea

clauzei COMPACT In comanda INDEXeste inutila.


Fisierele cu extensia (.CDX) pot fi structurale sau nestructurale. Un fisier (.CDX)

structural este deschis automat ori de cate ori se deschide tabela si are acelasi nume ca si aceasta. In cazul In care se alege optiunea <Ignore>, tabela va fi deschisa fara fisierul index structural asociat ei.
Pentru a se crea un fisier index nestructural, se indica un nume la clauza OF <.CDXfile> Spre deosebire de fisierul struclural, un fisier nestructural se deschide fie cu comanda SETINDEX, fie adaugand clauza INDEXla comanda USE. FOR<expL> permite ca indexul astfel creat sa actioneze ca un filtru asupra tabelei

existente.
COMPACT creeaza un fisier cu extensia (.IDX) compact. ADDITIVE permite crearea unui fisier index pentru o tabela, In conditiile In care

fisierele index deschise anterior raman deschise. O comanda cu sintaxa: INDEX ON <expr> TO <fis-index> [FOR conditie] [UNIQUE] [COMPACT] va produce un singur fisier index.de tip (.IDX). Indexarea dupa mai multe campuri este similara sortarii multiple (se utilizeaza operatorul (+) pentru a concatena campurile utilizate pentru indexare). Nu se poate face indexare multipla pe diferite tipuri de campuri (caracter, numeric etc). Pentru a depasi aceasta situatie exista o serie de functii: STR,VAL,SUSSTR, STRTRAN,STUFF,AT, LEFT,RIGHT, RAT, DTOS, DTO, CTOD.

De exemplu, comanda: INDEX ON (camp-caracter) + STR (camp-numeric) + DTOS (camp-data) TO <fis-index> permite indexarea dupa trei campuri de tipuri diferite. Pentru deschiderea simultana a tabelei si fisierelor index aferente se utilizeaza sintaxele: USE <nume-tabela> INDEX <fis-index1>. [<fis-index2>] USE <nume-tabela> TAG <fis-index> 1) Sa se indexeze tabela BENEF dupa campul DENB (cheie simpla alfanumerica), permitand existenta valorilor duble ale campului. SELECT 1 USE BENEF INDEX ON DENB TO B. IDX CLOSE ALL Activarea fisierelor index ale tabelei active se face cu ajutorul comenzii SET INDEX TO Comanda SET INDEX TO fara argumente Inchide fisierele index deschise In zona de lucru curenta (care se Inchid o data cu Inchiderea tabelei). Exceptie fac fisierele index structurale, care se Inchid cu tabela. Sintaxa comenzii este: SET INDEX TO [<lista-fisiere-index> I ? [ORDER <expN>I<.IDX file> ITAG <tag name>] [OF<_CDX file>] [ASCENDINGIDESCENDING] [ADDITIVE] unde: <lista-fisiere-index>I! permite deschidereaunui fisier IDX) incluzand numele lui .SET INDEX TO! determina afisarea ferestrei de dialog Open File In care sunt prezentate toate fisierele index existente si se permite alegerea celui dorit;
<expN> este expresia numerica ce se refera la pozitiile fisierelor index asa cum apar ele In <lista-fisiere-index> ASCENDINGI/DESCENDINGdetermina ordinea Inregistrarilor tabelei active. Fisierele

index sau cheile nu se schimba, ci numai ordinea In care se face accesul la Inregistrari;

ADDITIVE permite deschiderea unui fisier index pentru o tabela In conditiile In care fisierele index deschise anterior raman deschise.

Exemple 1) Sa se deschida In zona de lucru (C) fisierul index IDCB.CDX pentru tabela BENEF.fara a Inchide alte fisiere index deschise In zona de lucru curenta, iar cheia principala (Master Tag) sa fie CODB. SELECT C USE BENEF SET INDEX TO IDCB ADDITIVE ORDER TAG CODB OF IDCB CLOSE ALL Un fisierindex poate fi deschis si prin intermediulcomenzii USE,cu sintaxa:

USE <nume-tab> INDEX<lista-fisiere-index> Este indicata utilizarea comenzii USE pentru a deschide toate fisierele index dorite, apoi activarea unuia dintre acestea se face prin comanda SET INDEX. De exemplu: USE BENEF INDEX IDCB, IDENB LIST SET INDEX TO IDCB LIST Refacerea fisierului index curent, devenit inactiv datorita alterarii campurilor cheie din tabela corespunzatoare, se face prin intermediul comenzii REINDEX.De asemenea, actiunea se rasfrange asupra tuturor fisierelor index deschise In zona de lucru curenta. Sintaxa comenzii este: REINDEX [COMPACT] Orice index creat initial cu comanda SETUNIQUEON sau cu optiunea UNIQUE din comanda INDEX,va fi refacut In acelasi mod. Pentru reindexare se utilizeaza urmatoarea succesiune de comenzi: USE <nume tab> INDEX <lista-fisiere-index> REINDEX Daca tabela selectata are unul sau mai multe fisiere index activate, comanda PACK va efectua In mod automat reindexarea lor. Comanda CLOSEINDEX inchide toate fisierele index deschise ia un mument dat In zona de lucru curenta latat cele de tip .lDX), cat si cele de tip .CDXI nestructurale. Un fisier index structural nu va fi inchis cu aceasta comanda.

4.1. Modurile de acces Comenzile utilizate pentru accesul la date sunt: GO, SKIP,LOCATE, CONTINUE, FIND, SEEK. Comenzile GO, SKIP,LOCATE si CONTINUE permit accesul secventiala date si lucreaza pe o tabela indexata sau nu. Comenzile FIND si SEEKsunt mult mai rapide si lucreaza numai pe tabele indexate. Comanda GO Comanda pozitioneaza pointerul pe inregistrarea fizica cu numarul <expN> din tabela curenta si are urmatoarea sintaxa: GO [RECORD]<expN1> [IN<expN2>I <expC> IGO TOP IBOTTOM[IN<expN2> I <expC>] unde: . [RECORD] <expNl> pozitioneaza pointerul pe inregistrarea fizica cu numarul <expN1>; .TOPI BOTTOM pozitioneaza pointerul pe prima/ultima inregistrare din tabela selectata. Daca tabela este indexata, prima inregistrare are cea mai mica valoare a cheii de indexare; . IN <expN2> l<expC> pozitioneaza pointerul in tabela deschisa intr-o alta zona de lucru decat cea curenta. Daca numarul specificat este mai mare decat cel al ultimei inregistrari, se returneaza mesajul 'Record is out of range' Comanda mai poate fi folosita si in sintaxa GOTO sau numai <expNl >. De exemplu, urmatoarele comenzi sunt echivalente: GOTO 3 GO 3 Functia RECNOO returneaza numarul inregistrarii curente (o valoare ce este mai mare decat numarul de inregistrari din tabela, daca pointerul este pozitionat dupa ultima inregistrare din tabela si 1 daca pointerul e pozitionat inaintea primei inregistrari din tabela). Daca tabela este vida RECNOO returneaza 1. Sintaxa functiei este: RECNO ([<expN> I <expC>]) unde: .<expN/<expC> reprezinta zona de lucru in care este activa tabela, numele sau sinonimul ei. Atunci cand <expN> =A:('sof! seek') permite returnarea numarului de inregistrare cu cea mai apropiata valoare de cea cautata printr-o comanda SEEKesuata. b) Comanda SKIP Pozitionarea pointerului pe o anumita inregistrare fata de cea curenta se realizeaza prin intermediul comenzii SKIP. Sintaxa comenzii este: SKIP [<expNl>] [IN<expN2>I <expC>] unde: . <expN1> poate fi un numar pozitiv sau negativ. Daca este pozitiv, se deplaseaza pointerul peste atatea inregistrari cate specifica <expNl >. Daca este negativ, pointeru! se pozitioneaza inapoi (deplasarea se face se face catre prima inregistrare

din tabela). . IN <expN2> I <expC> este modalitatea prin care se specifica o tabela din alta zona de lucru, prin numarul acesteia <expN2> sau sinonimul/numele <expC>. Exemple Sa se pozitioneze pointerul cu un numar de trei inregistrari inaintea ultimei inregistrari din tabela BENEF.Comanda se realizeaza intr-o zona diferita de cea in care este deschisa tabela. SELECT A USE BENEF GO BOTTOM ? RECNO () SELECT B USE CONTR SKIP-3 IN SELECT A ? RECNO() DISP CLOSE ALL BENEF c) comanda LOCA TE Cautarea secventiala a inregistrarii ce satisface o anumita conditie, fara a fi necesara indexarea tabelei, se face prin comanda LOCATE. Sistemul FoxPro gaseste prima inregistrare si abandoneaza cautarea altora, chiar daca acestea satisfac conditia specificata. Sintaxa comenzii este: LOCATE FOR <expL1> [<scope>] [WHILE <expL2>] [NOOPTIMIZE] unde: . FOR<expl1> este expresia logica dupa care se face cautarea. Esteselectata prima inregistrare care satisface conditia <expL1>; . <scope> este un argument optional si limiteaza numarul de inregistrari pentru care se face cautarea. Implicit este ALL.Alte optiuni posibile sunt: Next. Rest si Record; . WHlLE <exp12> efectueaza cautari ale unei inregistrari atata timp cat expresia logica <expL2> are valoarea de adevar (.T.L . NOOPTIMIZEdezactiveaza tehnica de optimizare RUSHMORE. Comanda LOCATE functioneaza impreuna cu comanda CONTINUE. Ele actioneaza in zona de lucru curent selectata. Exemple 1) Sa se execute pozitionarea In tabela BENEF pe Inregistrarile pentru care valoarea campului CODB este mai mare ca 10002. SELECT A USE BENEF LOCATE FOR CODB>10002

DISP CONTINUE DISP CLOSE ALL d) Comenzile SEEK si FIND Se utilizeaza in tabelele indexate facand o cautare rapida in acces direct. De exemplu, la o tabela mare accesul la date prin intermediul comenzii SEEKsau FIND dureaza secunde, spre deosebire de cazul In care se utilizeaza comanda LOCATE, cand timpul de acces este mult mai mare. Sintaxele celor doua comenzi sunt: SEEK<expr> [ORDER nlndex Number IIDX Indexfile name I TAG] TagName [OF CDX Filename] IASC I DES] [IN nWorkArea I cTableAlias] Si FIND<sir-de-caractere> Exemple 11 Sa se caute In tabela BENEF inregistrarea pentru care compul DENB este 'COMPUSERVE SA' SELECT A USE BENEF INDEX ON DENB TO IDBEN FIND COMPUSERVE SA sau FIND 'COMPUSERVE SA' DISP CLOSE ALL e) Comand' SET FILTER Comanda SET FILTER determina afisarea doar a inregistrarilor ce Indeplinesc conditia specificata in filtrul de selectie, Sintaxa comenzii este: SET FILTER TO [<expL>] unde <expl> este o expresie logica in functie de care se face cautarea. Comanda are acelasi efect ca si selectarea optiunii Filler din optiunea Selup a submeniului DalaBase.

4,5. Legaturi Intre tabele Legarea tabelelor prin comanda SET RELATION TO Legarea tabelelor unei baze de date se face pe baza unui camp comun. Tabelele PROOU si CONTR au In structura lor campul CODP (codul produsului). Selectarea datelor din tabele se face prin legarea lor pe baza campurilor comune CODP si CODP. Campul comun trebuie sa aiba aceeasi denumire, lungime si tip In ambele tabele, iar conditia realizarii efective a legaturii este ca una sau mai multe valori ale campului dintr-o tabela sa se regaseasca si In tabela pereche. Aceasta facilitate de realizare a legaturilor face posibila stocarea informatiilor In mai multe tabele. Astfel se reduce spatiul de memorie ocupat de informatii si se elimina erorile datorate valorilor repetate. Prin aceasta comanda se stabileste legatura Intre tabela principala si tabela secundara. Legatura este valabila numai In timpul sesiuniide lucru curente FoxPro. Sintaxa comenzii este: SET RELATIONTO <expr> INTO<expN1IexpC1> [,<expr2> INTO<sinonim>][ADDITIVE] unde: .<expr> este un camp comun pentru ambele tabele; .<expN1 I expC1> este numele tabelei secundare (tabela cu care se face legatura); . expN1 este numarul zonei de lucru. . ADDlTIVE este o clauza optionala, utilizata atunci cand se realizeaza o jonqiune pe mai multe tabele. Pasii urmati In realizarea unei legaturi sunt: 1)se deschide Intr-o zona de lucru tabela principala (evenlual, dar nu obligatoriu, indexata dupa campul comun); 2) se deschide tabela secundara In alta zona de lucru; 3) tabela secundara este indexata dupa campul comun; se activeaza fisierul index pentru tabela secundara; 4)se tasteaza si se executa comanda SET RELATION. Exemple 1) Sa se stabileasca o legatura Intre tabela CONTR si tabela PRODU. SELE 2 USE PRODU INDEX ON CODP TO IPRODU SET INDEX TO IPRODU USE CONTR SET RELATION TO CODP INTO PRODU Nu exista rezullate imediat vizibile ale legaturii create. Pentru a o evidentia, utilizatorul poate tasta comanda de afisare DISPLAY pentru cele doua tabele.

Daca o anumita valoare a campului de jonctiune nu exista In tabela referita, atunci cursorul va fi pozitionat la sfarsitul acesteia. Comanda SET RELATION OFF Prin aceasta comanda se renunta la o relatie stabilita intre doua tabele ale unei baze de date. Sintaxa ei este; SET RELATION OFF INTO <sinonim> unde <sinonim> este tabela a carei legaturacu tabela curenta va fi incheiata. Exemplu Sa se renunte la legatura dintre tabelele PRODU si CONTR. SET RELATION OFF INTO PRODU

5. Arhivarea legaturilor In fisiere VIEW Utilizatorul ce stabileste legaturi Intre tabelele bazei de date trebuie sa cunoasca si comanda: CREATE VIEW FORM ENVIRONMENT. Aceasta comanda implica cunoasterea notiunii de fisier VIEW. In acest fisier sunt continute informatii privind tabelele active, fisierele index, fisierele format, conditiile de filtru, legaturile definite, setarile DEFAULT si PATH, fisierul curent HELP, starea lui SETTALK, SETSKIP, SETBRSTATUS etc. Fisierele VIEW se creeaza prin intermediul comenzii CREATE VIEW cu sintaxa; CREATE VIEW <nume_fis> unde <nume_fip este numele fisierului 'VIEW' care va fi creat. Refacerea mediului FoxPro asa cum apare el arhivat In fisierul VIEW se realizeaza prin comanda SETVIEW. Sintaxa ei este: SET VIEWTO <nume-fisier>1 ? In care: . <numeJIaier> este numele fiaierului 'VIEW' ale carui informalii vor fi restaurate; . ? permite afisarea ferestrei Open pentru selectarea interactiva a fiaierului 'VIEW'. Sa se creeze un fisier de tip VIEW, cu numele MEDIU, In care sa se salveze starea mediului FoxPro dupa realizarea unei legaturi. Sa se afiseze continutul acestui fisier. Exemplu CLOSE ALL USE CONTR IN A INDEX ICONTR USE PRODU IN B INDEX IPRODU SELECT A SET RELATION TO CODP INTO PRODU CREATE VIEW MEDIU FORM ENVIRONMNET CLOSE ALL DISPLAY STATUS

Realizarea programelor in Visual FoxPro


Pentru realizarea de programe in Visual FoxPro se utilizeaza comanda: MODIFY COMMAND (nume-fisI ?] [NOEDIT] [NOWAIT] [RANGE expN1, expN2] [[WINDOW nume-fer1] [IN[WINDOW nume-fer21lN SCREEN]] [SAME] [SAVE] Clauzele comenzii sunt: .nume-fis- este numele fisierului care contine programul sursa (tip .PRG); . ? determina deschiderea ferestrei Open pentru selectarea fisierului sursa de editat (tip .PRG, .MPR, .QPR, .SPR); . NOEDIT fisierul sursa poate fi doar vizualizat, nu si editat (actualizat); . NOWAIT la executia programului nu se asteapta daca apare fereastrade editare; . RANGE permite selectarea pentru editare doar a unei parli (de la expNl la expN2) din programmul sursa; . WINDOW fereastra de editare va fi inclusa intr-o aha fereastra (nume-fer2) care trebuie sa fie deja activata; . IN SCREENplaseaza fereastra de editare in ecranul curent; . SAME impiedica fereastra de editare sa devina activa; . SAVE dupa parasirea ferestrei de editare aceasta ramane pe ecran. Apelul unui program sursa in VFPse face prin comanda DO, care preia fisierul sursa (.PRG), il compileaza si rezulta fisierul obiect (.FXP), apoi pe acesta il link-editeaza si rezulta fisierul executabil (.EXE), pe care iI lanseaza in executie. Comanda DO mai este folosita si pentru apelul procedurilor intr-un program apelant VFP. Sintaxa comenzii este: DO numep1 [IN numep2] [WITH param]

1. Structurile de program Structurile de programare intalnite in programarea structurala si modulara se regasesc in totalitate in sistemul VFP. Limbajul nu are comenzi de salt neconditionat in program, avand, in schimb, comenzi specifice pentru implementarea celor trei structuri fundamentale (secvenliaIa, alternativa si repetitiva). 1.1. Structura secventiala O structura seventiala (liniara) de program VFP se poate realiza printr-un grup oarecare de comenzi, dintre cele prezentate la modul de lucru cu fereastra de comanda. In general, o astfel de structura este data de o secventa de comenzi, care nu contine structurile alternative IF si CASE si structurile repetitive (WHILE, FOR, SCAN). a) Comenzile pentru atribuire Exista doua moduri de initializare: prin comanda specifica STORE sau atribuirea propriu-zisa (=), existenta in toate limbajele de programare universale. STORE <expr> TO <lista-var-mem> ! <nume-tablou> Exemplu: STORE 0 TO Xl, X2, X3 STORE 'TEST' TO X4 STORE .T. TO X_LOGIC STORE (09/10/99) TO X_DATA DISPLAY MEMORY LIKE X* <var_mem> = <expr> <nume_tablou> =<expr> Comanda = realizeaza o atribuire si totodata o evaluare. Ea are acelasi efect ca cel al comenzii STORE, cu deosebirea ca initializeaza o singura variabila si nu o lista de variabile. Variabila sau tabloul aflat in partea stanga a semnului de egalitate se initializeaza cu valoarea data de expresia din partea dreapta. b) Comenzile pentru operatii de intrare/iesire standard (vezi carte) 1.2. Structura alternativa Sunt implementate ambele forme ale structurii alternative de programarea structurata, prin urmatoarele comenzi specifice: structura alternativa cu doua ramuri (comanda IF); structura alternativa cu mai multe ramuri (comanda CASE). A) Structura alternativa cu doua ramuri: Structura alternativa cu doua ramuri este implementata prin comanda IFENDIF cu sintaxa urmatoare: IF <exprL> <secventa-de-comenzi1 > [ELSE [secventa-de-comenzi2>]]

ENDIF Se evalueaza <exprl> si in cazul in care este adevarata se executa toate comenzile ce urmeaza pana la ELSE sau la ENDIF (daca lipseste ElSE). In cazul in care<exprl>este falsa si ElSE exista, se executa toate comenzile de la ELSE la ENDlF. Fiecare IF trebuie sa se incheie cu un ENDIF, in caz contrar va fi afisat un mesaj de eroare la executie. Exemplu IF CODB>0 .AND. CODB<100000 M_bm = M_bm + 1 ELSE ? 'Cod beneficiar curent' ENDIF b) Structura alternativa cu mai mult de doua ramuri: Structura alternativa cu mai mult de doua ramuri este implementata prin comanda DO CASE ENDCASE cu urmatoarea sintaxa: DO CASE CASE <expL1> <comenzi1> [CASE <exprL2> <comenzi2>] [OTHERWISE <comenzi3>] ENDCASE Se foloseste pentru executia unui set de comenzi VFP bazat pe rezultatul unei conditii logice. La executia unei comenzi DO CASE se evalueaza succesiv expresiile logice din structura CASE. Rezultatul evaluarii determina care set de comenzi va fi executat. Exemplu DO CASE CASE UMP = 'KG' ? 'KILOGRAME' CASE UMP ='TONE' ? 'TONE' CASE UMP = 'MET' ? 'METRI_LIN' OTHERWISE ? 'UNITATE DE MASURA ERONATA'

ENDCASE 1.3. Structura repetitiva In sistemul VFP sunt implementate doua din cele trei structuri repetitive existente in programarea structurata, prin comenzi specifice si anume cele conditionate anterior. Structura repetitiva conditionata posterior, care nu are corespondent intr-o comanda VFP poate fi simulata. Sunt implementate: a) structura repetitiva conditionata anterior (DO WHllE); b) structura repetitiva conditionata anterior, cu numarator (FOR); c) structura specifica VFP, ce parcurge o tabela de date automat de la inceput pana la sfarsit, in mod conditionat (SCAN). a) Structura repetitiva conditionata anterior Structura este implementata prin comanda DO WHlLE ENDDO cu urmatoarea sintaxa: DO WHILE <expL> <secventa_de_comenzi> [LOOP] [EXIT] ENDDO Se evalueaza expresia logica <expl> si daca este adevarata, se executa setul de comenzi ce urmeaza pana la ENDDO. Fiecare DO WHILE trebuie sa se incheie cu ENDDO. Daca <expl> devine falsa, ciclul este inchis si pointerul de control se pozitioneaza la urmatoarea comanda, ce urmeaza dupa ENDDO. Clauza LOOP, va determina reluarea executarii comenzii DO WHlLE. Comenzile existente intre LOOP si ENDDO nu se vor mai executa. Daca este specificata clauza EXIT, aceasta returneaza controlul programului la urmatoarea comanda ce urmeaza lui ENDDO. Aceasta reprezinta o iesire fortata din structura repetitiva. EXIT poate apare oriunde in ciclul DO WHlLE ENDDO. Exemplu DO WHILE .NOT. EOF() ? DENB IF CODB>l05 EXIT ENDIF ENDDO b) Structura repetitiva conditionata anterior, cu numarator Structura repetitiva conditionata anterior, cu numarator, este implementata prin comanda FOR ENDFOR. Aceasta comanda va executa setul de comenzi de un numar de ori specificat. Sintaxa comenzii este: .

FOR <var>=<expl> TO <exp2> [STEP <exp3>] <secventa-de-comenzi> [EXIT] [LOOP] ENDFOR I NEXT unde: . <var> este o variabila de memorie cu rol de contor (numarator). Ea determina de cate ori se executa ciclul de la FOR la ENDFOR (sau EXIT). Contorul <var> pleaca de la o valoare initiala data de <exprl> pana la o valoare finala expr2, cu pasul dat de <expr3>. Daca pasul nu este specificat, atunci se atribuie in mod implicit valoarea 1. Variabila <var> se comporta la fiecare intrare intr-un nou ciclu cu valoare finala <exp2>. Daca este mai mica sau egala se va executa secventa de comenzi cuprinsa intre FOR si ENDFOR. Daca variabila <var> este mai mare decat valoarea finala se executa urmatoarea comanda dupa ENDFOR. . <exp1>, <exp2>, <exp3> sunt expresii numerice, variabile de memorie sau constante a caror valoare poate fi modificata in interiorul ciclului fara afectarea numarului specificat de cicluri. Variabila <var> va fi definita inainte de intrarea in ciclu. Modificarea ei in interiorul ciclului va afecta numarul de cicluri. Daca <exp3> are valoare negativa, variabila de ciclare <var> va fi decrementata cu aceasta valoare la fiecare ciclu, iar valoarea initiala <expl> trebuie sa fie mai mare decat valoarea finala <exp2>. . EXITva determina o iesire fortata din ciclul FOR. LOOP determina reluarea comenzii FOR.Comenzile existenteintre LOOP si ENDFOR nu se vor mai executa. c) Structura repetitiva SCANENDSCAN Este o structura repetitiva specifica sistemului VFPprin care este parcursa in mod automat o tabela. Este implementata prin comanda SCAN ENDSCAN care are urmatoarea sintaxa: SCAN [NOOPTIMIZE] [<scop>] [FOR<expL 1>] [WHILE<expL2] <secventa-de-comenzi> [LOOP] [EXIT] ENDSCAN Se parcurge tabela executandu-se setul de comenzi pentru fiecare inregistrare care indeplineste conditia enuntata. Comanda SCAN incrementeaza automat pointerul de inregistrare cu 1 si testeaza conditia specificata prin clauzele FOR si WHILE. Exemplu SCAN FOR CODB> 101 IF CODE = 105

LOOP ENDIF ? DENB ENDFOR ENDSCAN