marți, 25 iunie 2013

FoxPro pentru incepători Cap. 4.


4. BAZE DE DATE

4.1 Generalităţi. Comenzi SET


Principalul domeniu al utilizării calculatorului este cel al prelucrării de date. Necesitatea de informaţie este tot mai crescută o dată cu creşterea şi dezvoltarea societăţii. Memorarea datelor şi prelucrarea lor cu o mare viteză este rezolvată de către FoxProW.
Datorită capacităţilor relativ mici ale memoriei calculatoarelor, stocarea vo!ume!or mari de date (informaţii) se face pe dispozitive de memorare externe, unităţile de disc de exemplu. Pe disc datele sunt depozitate în fişiere ca baze de date. Baza de date este un astfel de fişier ce permite accesul rapid şi complet la datele stocate.
Bazele de date sunt fişiere cu extensia .dbf create de către FOXPROW.
Sunt o colecţie organizată de date grupate împreună. Se pot imagina ca un tabel cu linii şi coloane în care !inii!e se numesc înregistrări, iar coloanele câmpuri.

Comenzi SET
Comenzile SET permit "setarea" (poziţionarea) unor caracteristici ale sistemului FOX:
SET CONFIRM ONIOFF cere confirmarea la introducere.
Cu set confirm on la fiecare introducere de date (într-un câmp get) se emite un semnal sonor şi se cere prin tastarea retur de car, confirmarea introducerii.
Cu comanda set confirm off, la intrucerea de date într-un câmp get şi umplerea sa se trece automat la câmpul următor fără a se cere vreo confirmare.
SET PRINTER ON | OFF imprimanta (on) se consideră ataşată. Cu: set printer off, imprimanta este detaşată şi ieşirile vor fi dirijate spre monitor.
SET TALK ON | OFF - OFF nu afişează variabilele automat, iar set talk on obligă sistemul să afişeze toate atribuirile de variabile.
Exemplu: set talk on
a=25;
afişează pe ecran 25, în potiţia în care se află cursorul.
SET SAFETY ONIOFF - OFF nu cere confirmarea la ştergeri de fişiere, iar cu set safety on această confirmare la ştergere este cerută. Exemplu:
Set safety on
use baza
Zap
Calculatorul va afişa: zap cale\nume.dbf ? Yes/No
şi se va executa comanda doar dacă se confirmă (cu yes).
Există o serie de comenzi SET (de setare a modului de afişare a datei calendaristice, de setare a numărului de zecimale cu care se fac calculele etc. Acestea pot fi studiate din HELP-ul sistemului.
Zone de lucru
Pentru a putea lucra cu mai multe baze de date concomitent, sistemul permite deschiderea unui număr de 225 zone de lucru (maxim). Aceasta deoarece într-o zonă de lucru se poate deschide o singură bază de date. Comanda cu care se deschide o zonă de lucru este:
SELECT expn | expc
expn - desemnează numărul zonei de lucru (între 1 şi 225) sau 0 pentru deschiderea primei zone (cea mai mică ca humăr) liberă sau literele A-J care se folosi în locul cifrelor de la 1 -10.
expc - desemnează numele sau aliasul unei baze de date ce se asociază zonei respective.
Exemplu: SELE 0
SELE A - reprezintă comenzi echivalente
SELE debite
SELE 'debite' - reprezintă de asemenea comenzi echivalente.
Pentru a afla care este zona de lucru curentă (în care ne găsim în momentul de faţă) se utilizează funcţia SELECT (). Sintaxa acestei funcţii este:
SELECT(0|1)
Forma SELE (0) se foloseşte pentru indicarea zonei curente iar cea cu parametrul 1 indică numărul ultimei zone de lucru nefolosite. Exemplu:SELECT(1) afişează 225.

4.2 Crearea bazelor de date

Când se defineşte o bază de date trebuie indicată structura şi dimensiunea câmpurilor iar acest lucru se realizează prin comanda CREATE numebază. Numele bazei de date poate să fie de maxim 8 caractere şi are extensia .dbf
Tipul câmpurilor poate fi:
C – şir de caractere – maxim 254 caractere – orice caractere fox;
N – numeric (N sau F) maxim 20 poziţii incusiv punctul zecimal şi semnul.
tipul F se foloseşte pentru calcule cu cifre foarte mari sau foarte mici (virgulă flotantă, este un tip numeric la fel ca N);
D - dată calendaristică lungime implicită 8;
L - tipul logic lungime 1 valoare .T. sau .F.;
M - tipul memo lungime 10 - pentru precizări legate de câmpurile C mai mari de 254 caractere;
P - picture pentru date de tip picture (fotografii - acest tip este valid doar pentru FOX sub WINDOWS).
Pentru a putea face operaţii asupra unei baze de date trebuie mai întâi deschisă, lucru care se realizează cu comanda USE nume bază.
Crearea bazelor de date se face cu comanda:
Format:
CREATE numeb |?
Dacă se foloseşte forma CREATE ? atunci sistemul listează (într-o fereastră) toate bazele de date existente (create) până în acel moment.
numeb - este numele bazei de date. El va fi format din opt caractere şi va avea extensia dbf. Această extensie va fi creată automat de către sistem.
După tastarea acestei comenzi se deschide o fereastră de creare a unei baze de date în mod interactiv care cere introducerea câmpurilor bazei de date(name), tipul lor (type), iungimea lor (width - în caractere), şi dacă este cazul pentru câmpurile numerice câte din aceste caractere sunt zecimale (dec - se va ţine cont de faptul că şi punctul zecima! ocupă un caracter),
Într-un antet este indicat numele bazei de date care urmează a fi creat, în subsolul ferestrei se indică anumite date referitoare la câmpurile create (câmpul, liungimea !ui şi spaţiul rămas în memorie) iar în dreapta există posibilitatea de a actiona două butoane (insert şi delete) pentru a adăuga câmpuri noi, sau a şterge câmpurile create. În mod normai după completarea unui câmp poziţia cursorului înaintează automat la câmpul următor.
În momentul în care apare pe ecran fereastra structure, cursorul se găseşte în prima poziţie NAME a structurii cerând introducerea numelui unui câmp. Se va introduce numele câmpului (maxim 10 caractere, cifre sau linia de subliniere, primul caracter fiind o literă sau linia de subliniere.
Pentru a schimba ordinea elementelor dintr-o listă, tastaţi TAB pentru poziţionare pe numele de câmp dorit, apoi CTRL/PGUP sau CTRL/PGDN pentru a muta elementul în sus sau în jos în listă.
- Type - specifică tipul datei (caracter, numeric, float, date, logical sau memo);
- Width - specifică lungimea câmpului prevăzută în tabelul de mai jos;
<insert> - permite inserarea unui câmp înaintea celui selectat;
<delete> - permite ştergerea câmpului selectat din structură.
Adăugarea/ştergerea de semnale index (Structural Compound Index Tags) – paziţionaţi cursorul în zona umbrită care precede numele câmpului; folosiţi bara de spaţiu pentru a comuta între index tag ascending, descending sau şters. Indexii sunt fişiere asociate care stabilesc ordinea de parcurgere a înregistrărilor din baza de date. Despre aceştia se va vorbi într-un alt capitol. Se va arăta cum se poate face indexari dacă baza de date a fost creată fără index aşa cum vă recomandăm noi.
Meniul Popup Structure este destinat în special utilizatorilor tastaturii. Acesta are nevoie de opţiunile corespunzătoare ale acestui meniu sau de combinaţii de taste de control pentru inserarea sau ştegerea unui câmp din structură. Opţiunile acestui meniu sunt:
Tipul datei
Lungimea în număr de caractere
Character
1 – 254
Numeric
1 – 20 incluzând semnul +,-, şi marca zecimală (opţionale)
Date
8
Logical
1
Memo
10
Float
1 – 20 incluzând semnul +,-, şi marca zecimală (opţionale)
insertfield ^I (CTRL/I)
Deletefield ^D (CTRL/D)
Pentru structura definită selectaţi OK ca s-o salvaţi (sau CTRL/W).
Se poate selecta unul din butoane folosind tastele direcţionale (săgeti) sau pot selecta cu mouse-ul pentru a adăuga sau şterge câmpuri, Se mai poate selelecta butonul OK pentru a salva baza de date creată, sau se tastează CTRL/W - sau se poate selecta butonul CANCEL sau se tastează tasta ESC pentru abandonarea creării bazei de date.
În partea de jos a ecranului pe o linie, se dau tot timpul indicaţii referitoare introducerile ce trebuie efectuate şi referitoare la eventualele introduceri eronate. De aceea, introducerea câmpurilor fiind asistată ea poate fi făcută simplu şi fară dificultăţi serioase.
La saivarea bazei de date apare un mesaj interactiv şi anume:
Input data record now? (Introduceţi inregistrări acum?). Dacă se tastează enter sau se selectează Yes atunci se deschide o nouă fereastră ce permite introducerea înregistrărilor. Dacă nu, atunci se salvează numai structura bazei de date creată, urmând ca adăugarea înregistrăriior să se facă mai târziu prin a!te metode. Din experienţă autorul recomandă ca adăugarea înregistrărilor să se facă mai târziu (prin programe de adăugare date) pentru a putea avea un control asupra datelor introduse deoarece în acest moment nu avem toate elementele necesare introducerii, ci doar putem face o introducere de test, astfel ca să corespundă valoarea introdusă în câmpuri cu tipul câmpurilor.
O altă modalitate de creare a unei baze de date este cea folosind comanda:
CREATE TABLE | DBF numeb ({nume1 tip [(prec[,scala]) [,nume2...] ]) | FROM ARRAY masiv
unde:
numeb - reprezintă numele bazei de date
nume1 - reprezintă numete câmpurilor structurii bazei de date
tip - reprezintă tipul câmpului (o literă N=număr, C=caracter...)
prec- reprezintă lungimea câmpului
scală - reprezintă numărul de zecimale
FROM ARRAY masiv - reprezintă specificarea unui nume de masiv din care se crează baza de date respectivă.

TIP
PRECIZIE
SCALA
Descriere
C
n
-
şir de caractere de lungime n
D
-
-
dată calendartistică
F
n
d
real.de lungime n, cu d zecimale
L
-
-
logic
M
-
-
memo
N
n
d
numeric, de iungime n cu d zecimaie
G
-
-
general
P
-
-
imagine

          Exemplu:
            CREATE TABLE mfixe (cod C(10), denumire C(30),;
Valoare N(10)...)
Este creată baza de date MFIXE cu structura:
COD C 10
DENUMIRE C 30
VALOARE N10
Deschiderea şi închiderea bazelor de date
Comanda cu care se face deschiderea unei baze de date este USE. Formatul general al comenzii este:
USE [baza | ?] [IN zonă de lucru] [AGAIN]
[INDEX listă fişiere index | ?]
[ORDER [expn] | fişier index .idx| [TAG] nume etichetă
[OF fişier index.cdx] [ASCENDING|DESCENDING]]]]
[ALIAS alias] [EXCLUSIVE] [SHAREj [NOUPDATE]
unde:
baza - reprezintă baza de date ce se deschide, căreia, dacă nu i se specifică nici o extensie i se va atribui extensia implicită .DBF. Dacă nu se specifică nici fişier şi nici ? atunci se închide baza de date din zona respectivă (curentă). Dacă se specifică ? vor fi afişate într-o fereastră bazele de date existente şi va putea fi selectată una pentru a fi deschisă.
IN zonă de lucru - spedfică zona de lucru în care se face deschiderea bazei de date (implicit zona curentă)
AGAIN - indică faptul că se deschide o bază de dată care este deschisă în altă zonă de lucru din nou (altfel eroare)
INDEX listă fişiere.idx - se precizează fişierele index cu care se doreşte deschiderea bazei de date
? - afişează o fereastră de dialog pentru selectarea fişieretor index cu care se doreşte deschiderea
ORDER - se referă !a schimbarea ordinii de importanţă a indexilor (având în vedere că numai un index poate fi activ la un moment dat) - expn - precizează al câtelea index din lista de indexi este activ, sau este denumit în clar acest fişier
TAG - se referă la alt tip de indexi (fişiere CDX) unde se precizează eticheta sau numele fişierului cdx
ASCENDING I DESCENDING - arată modul de sortare
ALIAS alias - precizează numele (alias-ul) fişierului bază de date
EXCLUSIVE - indică faptul că nu este permis accesul mai multor utilizaori la baza de date respectivă
SHARE - indică faptul că este permis accesul mai multor utilizatori (când se lucrează în reţea)
NOUPDATE - protejează baza de date la scriere. Nu permite modificarea continutului şi nici a structurii, ci doar vizualizarea conţinutului.
Exemplu:
USE mfixe in 2 NOUPDATE index nrc
Deschide baza de date MFIXE nepermiţând modificarea ei, cu indexul NRC, în zona 2.
Închiderea bazelor de date se face cu comenzile:
USE - fără alte argumente închide baza de date din zona curentă
CLOSE DATABASES - închide toate bazele de date deschise (din toate zonele) şi selectează zona 1 - zonă implicită
CLOSE ALL - închide toate bazele de date şi ferestrele deschise.
Funcţia USED () informează dacă zona de lucru respectivă este liberă sau este ocupată. Sintaxa funcţiei este:
USED [(expn [ expc)]
unde expn şi respectiv expc specifică zona de lucru despre care se doresc informaţii prin numărul sau aliasul corespunzător. Funcţia returnează .T. dacă zona este ocupată de o bază de date respectiv .F. dacă nu. Dacă nu se specifică zona de lucru funcţia se referă la zona curentă.
Funcţia DBF() indică ce bază de date este deschisă. Sinaxa ei:
DBF [(expn | expc)]
Funcţia returnează un şir de caractere ce contine numele (aliasul) bazei de date deschise în zona de lucru indicată, iar dacă nu există atuci returnează şirul vid. Expn şi expc au aceeaşi semnificaţie ca în funcţia USED(), iar dacă a!iasul respectiv precizat nu există, se va afişa şirul 'Alias not found' (Alias negăsit).
Aliasul bazei de date este un nume ce identifică baza de date la deschidere ei. Acest nume poate fi chiar numele bazei de date ca în expresia:
USE MISCARI inde indmisc - când aliasu! este miscari, sau poate fi ales un a!t şir de caractere care identifică baza de date de la deschiderea ei şi până la închidere ca în exemplul următor:
USE c:\mijlfix\mfix inde indm alias mf
În acest exemplu datorită faptului că se deschide o bază de date situată în alt director decât cel curent denumirea bazei de date este lungă şi greoaie şi de acea este ales un alias scurt (MF) care identifică baza de date la eventualele apelări ulterioare înaintea închiderii sale.
La următoarele apelări se va putea utiliza formula: select mf în loc de
SELECT c:\mijlfix\mfix
FoxProW atribuie automat aliasul bazei de date în felul următor:
- primele zece zone de lucru au atribuit ca alias nume de la A la J
- următoarele zone au atribuite ca alias 'W11' până la 'W225'
De asemenea în cazul unui conflict de atribuire a aliasului FoxProW realizează rezolvarea conflictului atribuind un nume de alias, cum ar fi în cazu! deschiderii aceleiaşi baze de date în două zone diferite fără a specifica vre-un nume de alias:
select a
use misc && baza de date are aliasul misc
use misc in 2 again && baza da date va avea aliasul b
sele misc
list to print
sele b
.........

4.3 Manipularea structurii unei baze de date

Deseori apare necesitatea introducerii unui câmp nou în baza de date (a unor informaţii noi) de exemplu pentru a putea face o listă după caracteristici inexistente în baza de date. De exempiu, dacă se doreşte listarea unei baze de date numite MFIXE după tipul utilajelor existente (clădiri, utilaje de productie, mijloace auto etc) acest lucru se poate face foarte greu dacă nu există un câmp (de 1-2 caractere cel puţin) care să precizeze tipul utilajelor.
În aceste cazuri este necesară modificarea structurii bazei de date şi introducerea acestui câmp. Acest lucru se realizează prin deschiderea bazei de date şi utilizarea ulterioară a comenzii
MODIFY STRUCTURE
În momentul utilizării acestei comenzi se deschide o fereastră în care apare structura bazei de date şi se pot realiza modificările dorite adică:
- introducerea de câmpuri noi în baza de date (CTRL/N)
- ştergerea unor câmpuri (CTRL/D)
- modificarea denumirii unor câmpuri (prin tastarea unei alte denumiri peste cea veche)
La selectarea declanşatorului OK (sau CTRL/W) se încheie operaţia de modificare, se copiază baza de date într-una nouă, cu structura modificată (operaţie transparentă pentru utilizator). În baza nouă de date câmpurile nou introduse trebuie completate (ele sunt vide).
Vizualizarea structurii poate fi făcută cu comenzile:
DISPLAY STRUCTURE [in expn | expc]
[TO PRINTER [PROMPT] , TO FILE fişier]
[NOCONSOLE]
sau
LIST STRUCTURE [IN EXPN | EXPC ]
[TO PRINTER [PROMPT] | TO FILE fişier]
(NOCONSOLE]
Singura deosebire între ceie două comenzi este că în cazul umplerii ecranului prima suspendează listarea (până la apăsarea unei taste) iar a doua nu.
IN expn - precizează zona de lucru în care se află baza de date a cărei structură se doreşte a fi listată. Expc precizează aceeaşi zonă dar specificând aliasul
TO PRINTER - cere ca listarea să se facă la imprimantă, iar PROMPTER precizează (în cazul folosirii sub windows a FoxPro-ului) prin deschiderea unei ferestre (print) opţiunile de imprimare.
TO FILE fişier - cere ca listarea să se execute într-un fişier
NOCONSOLE - sistează afişarea pe ecran.
Exemplu: listarea structurii MIFIX.DBF
Structure for database: C:\FOX26W\MIFIX.DBF
Number of data records; 0
Date of last up date: 20.01.99
Name of block size: 64
Field FieldName Type Width Dec
Index
1 COD Character 10
2 DENUMIRE Character 10
3 VALOARE Numeric 10 0
.....................
** TOTAL ** 81
Un ait mod de creare a unei baze de date este aceea de copiere a.structurii unei baze de date într-o bază de date nouă prin comanda:
COPY STRUCTURE TO dbase
[FIELDS Iistă câmpuri]
[ [WITH ] CDX | [WITH ] PRODUCTION] ]
Unde:
dbase - este numele bazei de date care va fi creată
FIELDS listă câmpuri - are ca efect copierea doar a acelor câmpuri precizate în lista de câmpuri
Ultima linie se referă la fişierele index care va fi analizată ulterior.
Exemplu:
USE MIFIX
COPY STRUCTURE TO MIFIX_N;
FIELDS cod, denumire
Va fi creată baza de date mifix_n care va avea două câmpuri.
Comanda următoare:
COPY STRUCTURE EXTENDED TO dbase [FIELDS LISTĂ CÂMPURI]
copiază structura bazei de date împreună cu înregistrările acesteia în baza de date al cărui nume se precizează prin "dbase". Se presupune deschisă baza de date ce va fi copiată.
Structura unei baze de date se poate crea şi cu comanda:
CREATE [dbase1] FROM [dbase2]
Dacă dbase1 şi/sau dbase2 lipseşte, sistemul va deschide ferestre de dialog pentru a chestiona utilizatorul asupra fişierelor ce trebuie folosite.
Prin acestă comandă se va crea structura basei de date dbase1 folosind ca model structura dbase2. Baza de date dbase2 nu trebuie să fie deschisă.
Funcţia AFIELDS()
realizează copierea structurii bazei de date prin intermediul unui masiv:
AFILDS (masiv)
Realizează copierea bazei de date într-un masiv şi returnează o valoare numerică precizând numărul de câmpuri ale structurii. Masivul este bidimensional şi dacă el nu există, este creat. Prima dimensiune a masivului este egală cu numărul câmpurilor, iar cea de a doua este egală cu 4 corespunzând celor patru tipuri de informatii necesare pentru codificarea unui câmp (name, type, len, dec). Baza de date se presupune deschisă.
Trecerea inversă (dintr-un tablou într-o bază de date) se face prin comanda CREATE FROM ARRAY cu sintaxa:
CREATE TABLE | DBF dbase FROM ARRAY masiv
unde:
dbase - reprezintă numele bazei de date ce se crează
masiv - reprezintă numele masivului bidimensional.

4.4 Manipularea câmpurilor unei baze de date

Modu! în care se face accesul la câmpurile unei baze de date poate fi modificat prin comanda SET FIELDS în sensul că se permite sau nu accesul. Comanda are sintaxa:
SET FIELDS ON | OFF şi
SET FIELDS TO ([câmp1 |;câmp2...] | ALL]
Dacă SET FIELDS este ON, pot fi accesate doar câmpurile prezente în lista de câmpuri din comanda SET FIELDS TO. Dacă SET FIELDS este OFF (implicit) atunci este permis accesul la toate câmpurile bazei de date.
SET FIELDS TO ALL face ca accesul să fie permis la toate câmpurile chiar dacă SET FIELDS este ON, iar SET FIELDS TO, face accesul imposibil deoarece lista de câmpuri este vidă.
Numărul de câmpuri dintr-o bază de date este dată de funcţia:
FCOUNT([expn | expc])
expn - desemnează zona de lucru în care este deschisă baza de date la care se referă funcţia, iar expc este aliasu! acestei baze (ce!e două se exclud reciproc). Dacă nu se precizează zona de lucru se presupune zona de lucru curentă. Dacă în aceastâ zonă nu se află deschisă nici o bază de date, este retumată vaioarea 0.
Exempiu:
use mfixe
? 'Baza de date MFIXE are' ,fcount().' campuri'
Afişează:
Baza de date MFIXE are 6 campuri
?fcount()=fcount(1)
.T.
? fcount(se!ect())=fcount()
.T.
?fcourt(1}=fcount('mfixe')
.T.
?fcount(11)
0
Funcţia FIELD() returnează numele unui câmp dintr-o bază de date, câmp identificat prin numărul său în cadrul structurii bazei de date. Sintaxa ei este:
FIELD(expn1[,expn2 ( expc])
expn1 - specifică numărul de ordine al câmpului (primul câmp are numărul 1), iar expn2 sau expc identifică baza de date la care se referă funcţia, prin zona de lucru sau aliasul său respectiv.
Functia are ca rezultat un şir de caractere, numele câmpului
Exemplu:
USE MISC
USE MFIXE IN 2
?FIELD(1,2)
COD
O funcţie asemănătoare este FSIZE() care retumează mărimea unui câmp al bazei de date, specificat prin numele său. Sinaxa ei este:
FSIZE(expc1[,expn | expc2])
expc1 - reprezintă numele câmpului bazei de date
expn sau expc - reprezintă zona de lucru, ca număr sau alias.
În FoxProW există o serie de comenzi care se referă nu numai la o înregistrare ci la un "domeniu" de înregistrări adică la mai multe înregistrări care au o caracteristică comună. Domeniul înregistrărilor (care va fi precizet în sintaxa comenzilor ca "domeniu") poate fi:
- ALL - adică toate înregistrările bazei de date
- NEXT expn - adică următoarele expn înregistrări unde expn este o expresie numerică evaluată ca o expresie întreagă
- RECORD expn - adică înregistrarea număru! expn, expresie numerică valuată ca o expresie întreagă
- REST - adică toate înregistrările începând cu cea curentă şi până la sfârşitul fişierului.
Acestea sunt clauze care precizează domeniul şi vor înlocui "domeniu" când acesta va fi precizat în sintaxa unor comenzi. De asemenea în cadrul comenzilor vor apărea frecvent clauzele FOR şi WHILE care vor fi explicate în continuare.
FOR expl - are semnificaţia desemnării tuturor înregistrărilor pentru care expl (expresie logică) are valoarea .T. adică este adevărată şi se traduce prin "pentru ...".
De exemplu:
... for recno() =15 se traduce prin: pentru înregistrarea cu numărul de ordine 15, deci va fi selectată o înregistrare.
... for nume='masina' se traduce prin pentru nume='masina' deci vor fi selectate toate înregistrările care au pe primele caractere din câmpul nume caracterele 'masina' (indiferent ce este pe celelalte poziţii dacă pe primele şase pozitii au aceste caractere. Atentie! pentru şirurile de caractere se face distincţie între caracterele mici şi majuscule).
Clauza WHILE expl este o clauză asemănătoare şi se traduce "cât timp". Ea este urmată de o expresie logică la fel ca în cazul clauzei FOR.
Exemplu:
... WHILE nume='maşină' selectează de asemenea înregistrările care au nume='masina' pe primele şase caractere.
Clauzele FOR şi WHILE pot fi folosite concomitent, dar cu atenţie pentru avea o acţiune logică corectă şi trebuie verificată acţiunea lor. De asemenea în cadrul acestor comenzi pot fi folosite expresii logice complexe ca:
... WHILE (nume='masina' .and. cod>123456).or. valoare > 5000

4.5 Vizualizarea conţinutului bazelor de date

După ce o bază de date a fost creată şi au fost introduse date în ea, apare necesitatea vizualizării conţinutului său, pentru a putea fi verificat sau pentru a putea furniza datele existente prin diverse liste utilizatorilor datelor respective.
Vizualizarea poate fi făcută pe ecran, la imprimantă sau într-un fişier pe disc. Sunt utilizate în acest sens comenzile DISPLAY şi LIST cu următoarea sintaxă:
DISPLAY [[FIELDS] listă câmpuri] [domeniu]
[FOR EXPL1|[WHILE EXPL2] [OFF]
[TO PRINTER] I [TO FILE file] | [NOCONSOLE]
[NOOPTIMIZE]
LIST [[FIELDS] listă câmpuri] [DOMENIU]
[FOR EXPL1 ] | [WHILE EXPL2] [OFF]
[TO PRINTER] | [TO FILE FILE] [NOCONSOLE] ;
[NOOPTIMIZE]
Afişarea se face sub forma:
- prima !inie conţine denumirea câmpurilor (structura)
- următoarele linii conţin câte o înregistrare din baza de date
Clauza FIELDS se foloseşte pentru a fi afişate doar anumite câmpuri (cele prezente în lista de câmpuri). Câmpurile memo vor fi afişate doar dacă sunt specificate explicit în lista de câmpuri, tipărirea lor fiind controlată de comanda SET MEMOWIDH.
CLAUZA OFF determină dispariţia din formatul de afişare a coloanei 0 (numărul de înregistrare).
NOCONSOLE dezafectează tipărirea şi pe ecran
TO PRINTER dirijează tipărirea la imprimantă
TO FILE file - face ca tipărirea să se facă într-un fişier
La comanda display domeniul implicit este NEXT 1, pe când la comanda LIST el este ALL.
Pentru ca să nu apară denumirea câmpurilor bazei de date (pe prima linie) se poate folosi comanda SET HEADING OFF.
Comanda SET HEADING ON determină afişarea antetuliui.
Exemplu:
USE MIFIX
LIST se && listează baza de date cu antet
De asemenea vizualizarea datelor (pe ecran) poate fi făcută prin comanda BROWSE care poate fi folosită ca atare dar forma ei este complexă şi va fi studiată la capitolul privind.modificarea datelor.
Exemplu:
USE MIFIX
BROWSE
Ca urmare a folosirii acestei comenzi este deschisă o fereastră de vizualizare în care se afişează înregistrările (câte una pe rând) şi folosind tastele direcţionale, PgUp şi PgDn, TAB, SHIFT şi TAB se poate avansa în sus şi în jos, la dreapta şi !a stânga prin baza de date.

4.6 Adăugarea de înregistrări

Pentru a putea extrage date dintr-o bază de date, trebuie ca mai întâi să fie introduse datele în baza de date. Introducerea de date înfr-o bază de date se poate face prin comanda APPEND cu sintaxa:
APPEND [BLANK]
În cazul folosirii acestei forme comanda deschide o fereastră de dialog prin care se pot introduce date, câmp cu câmp, la sfârşitul bazei de date. Când vrem să introducem un câmp memo, prin apăsarea tastei CTRL şi PgDn se deschide o fereastră de editare, Pentru terminarea introducerii se tastează CTRL şi W, în varianta utilizării opţiunii BLANK, se realizează introducerea unei înregistrări cu câmpuri vide la sfârşitul bazei de date.
O altă comandă ce poate fi utilizată pentru introducerea într-o bază de date a unor înregistrări din altă bază de date (cu câmpuri comune) este APPEND FROM, iar când introducerea datelor se face dintr-un masiv, se utilizează comanda APPEND FROM ARRAY cu sintaxa:
APPEND FROM dbase [FIELDS Iistă câmpuri]
[FOR EXPL] [[TYPE] [DELIIMITED] [WITH TAB]
          WITH DELIMITATOR | WITH BLANK]
[DIF | FW2 | MOD | PDOK | RPD | SDF | SYLK|
WK1 | WK3 | WKS | WR1 | WRK | XLS|
Unde:
dbase - reprezintă numele fişierului din care se iau date (care nu trebuie să fie deschis). în locul său se poate specifica ? când se deschide o fereastră ce afişează toate bazele de date pentru a alege pe cea necesră.
FIELDS listă câmpuri - se precizează pentru preluarea doar a unei părti din câmpuri în noua bază (care trebuie să fie deschisă). Dacă nu se specifică acestă clauză, este adăugat tot fişierul dbase la sfârşitul bazei de date deschisă în zona de lucru curentă.
FOR expl - precizează condiţia (expl) care în cazul că este .T. realizează adăugarea înregistrârilor în baze de date
TYPE - clauză care specifică tipul fişierelor care vor fi adugate şi va fi detaliată în capitolul referitor la importul şi exportul datelor.
O altă metodă de adăugare a datelor în bazele de date este cea folosind comanda INSERT care are sintaxa:
INSERT [BEFORE][BLANK]
Comanda deschide o fereastră de editare în care pot fi făcute adăugarea unor înregistrări, câmp cu câmp.
BEFORE - duce la adăugarea unei înregistrări înaintea înregistrării curente, iar BLANK duce la adăugarea unei înregistrări vide. INSERT fără argumente duce la inserarea unei înregistrări după cea curentă.
Exemplu:
USE misc
INSERT before

4.7 Modificarea conţinutului bazelor de date

Deoarece datele care este necesar să fie depozitate în bazele de date sunt într-o evoluţie continuă atât în ceea ce priveşte calitatea cât şi cantitatea, acestea trebuie modificate pentru a fi puse în concordanţă cu realităţile vieţii. De asemenea este necesară modificarea unor date introduse greşit sau interpretate greşit.
Modificarea datelor se poate face cu ajutorul comenzilor CHANGE, EDIT, BROWSE şi REPLACE care vor fi prezentate în continuare.
Comanda CHANGE (identică cu EDIT şi realizează acelaşi lucru) are următoarea sintaxă:
CHANGE | EDIT [FIELDS listă câmpuri] [DOMENIU]
[FOR expl1] [WHILE expl2] [FONT expc1 [,expn1 ] ]
[STYLE expc2] [FREEZE câmp] [KEY expr1[expr2]]
[LAST] [LEDIT] [REDIT] [LPARTITION] [NOAPPEND]
[NOCLEAR] [NODELETE] [NOEDIT] [NOMODIFY]
[NOLINK][NOMENU] [NOOPTIMIZE] [NORMAL]
[NOWAIT] [PARTITION expn2] [PREFERANCE expc3]
[REST] [SAVE] [TIMEOUT expn3] [TITLE expc4]
[VALID] [:F] expl3] [ERROR expc5] [WHEN expl4]
[WIDTH expn4] [ [WINDOW] nume fereastră1]
[IN [WINDOW nume fereastră2 | IN SCREEN] ]
[COLOR SCHEME expn5] | [COLOR listă perechi culori]
leşirea din fereastra CHANGE şi salvarea modificărilor se face folosind combinaţia de taste CTRL/End.
Clauza FIELDS are ca efect afişarea pentru modificare doar a câmpurilor indicate în lista de câmpuri, dacă lipseşte sunt editate toate câmpurile. Această listă reprezintă o înşiruire de câmpuri separate prin virgulă, cu următoarea sintaxă:
CÂMP [:R] [:V=expr1[:F] [:E=expc1]]
[:P=expc2] [:B=expr2,expr3[:F]] [:H=expc3]
[:W=expl1] [,câmp2] [:R]...]
în lista de câmpuri pot fi incluse şi câmpuri ale bazelor de date deschise în alte zone de lucru.
:R - câmpul se poate numai vizualiza (fără modificare)
:V expr1 - permite validarea câmpului. Se evaluează valoarea modificată şi se verifică expl-1. Dacă valoarea expr1 (expresie logică) este .T. se face validarea (modificarea este acceptată), altfel nu şi se afişează un mesaj de eroare.
:F - perrnite forţarea validării când se trece cu cursorui prin câmp fără modificarea conţinutului.
:E exc1 - se foioseşte pentru modificarea mesajului, care va fi exc1
:B expr2,expr3 - specifică intervalul în care trebuie să se afle valoarea din câmp după editare. expr2 reprezintă limita inferioară iar expr3 cea superioară. În caz contrar se afişază un mesaj de eroare.
:P=expc2 - se poate specifica un cod PICTURE (prezentat la comanda GET).
:H= expc3 - precizează numele câmpului ce va fi afişat în partea superioară a ferestrei de editare
:W=expl1 - este o clauză while şi se permite editarea câmpului doar dacă expresia logică are valoarea .T.
Clauza FREEZE se foloseşte pentru a selecta spre modificare un singur câmp (secificat) la restul câmpurilor nepermiţându.se editarea.
Clauza KEY se foloseşte la baze de date indexate pentru limitarea mulţimii înregistrărilor afişate în fereastră şi anume cele ce au cheia de indexare în intervalul expr1, expr2.
NOAPPEND – opreşte utilizatorul de a adăuga înregistrări noi.
NODELETE - nu permite ştergerea înregistrărilor
NOEDIT şi NOMODIFY - (clauzele se exclud) nu permit modificarea câmpurilor din înregistrare
PREFERANCE - determină salvarea atributelor ferestrei de editare în fişierul de resurse sub numele expc4.
PARTITION expn2 - împarte fereastra de editare. Expresia expn2 indică coloana în care se va face despărtirea celor două părti. j
LEDIT - indică modul BROWSE ce se aplică în fereastra stângă REDIT - la fel în fereastra dreaptă (se pot folosi simultan) ;
NOLINK - face ca deplasarea în cele două partiţii să nu fie "legată" să se facă deci independent
NOWAIT - continuă executia programului cu instructiunea imediat următoare (este utilă doar la folosirea comenzii CHANGE în interiorul unui program, pentru a nu suspenda programuJ pe timpul executării acestei comenzi).
NOMENU - se utilizează pentru a face să nu apară pe ecran meniul BROWSE la executia acestei comenzi.
LAST - face ca fereastra de editare specifică să păstreze aceleaşi caracteristici ce le avea la ultima utilizare a acestei comenzi. (La ieşire aceste caracteristici se salvează în fişierul de resurse apăsând CTRL/END, iar cu CTRL/Q nu se salvează această configuraţie).
TIMEOUT expn3 - se specîfică numărul de secunde cât timp FoxProW va aştepta pentru introducerea modificărilor în fereastra de editare după care fereastra se închide automat.
CIauza REST indică sistemului să nu afecteze indicatorul de înregistrare la :deplasarea in interiorul bazei de date. La iniţierea comenzii acesta se află pe prima înregistrare.
SAVE - este utilizată pentru a păstra pe ecran fereastra de editare şi după ieşirea din comandă. Această clauză este disponibilă numai în interiorul programelor.
TITLE expc4 - este un titlu ce apare în primul rând al ferestrei change cu conţinutul "expc4".
VALID :F expl3 ERROR expc5 - este echivalentă cu optiunea :V din clauza FIELDS, adică este o condiţie de validare (exp!3), respectiv un mesaj ce apare în cazul în care conditia nu se verifică (expc5),
WIDTH expn3 - este utilizată pentru a limita numărul de caractere afişate pentru un câmp. Nu este afectată mărimea câmpului din baza de date.
Clauzele: NORMAL, WINDOW, IN WINDOW, IN SCREEN, COLOR SCHEME şi COLOR vor fi tratate mai târziu.
În fereastra CHANGE, câmpurile sunt afişate unul sub altuL, iar în fereastra BROWSE ele sunt afişate pe orizontală unul după altul. Comanda BROWSE are o formă asemănatoare cu change:
BROWSE [FIELDS Iistă câmpuri] [domeniu] [FORMAT]
[FOR expl1] [WHILE expl2] FONT expc1 [,expn1] ]
[STYLE expc2] [FREEZE câmp] [KEY expr1 [,expr2] ]
[LAST] [LEDIT] [REDIT] [LPARTITION] [NOAPPEND]
[LOCK expn]
[NOCLEAR] [NODELETE] [NOEDIT] [NOMODIFY]
[NOLGRID] [NORGRID] [WHEN expl4]
[NOLINK] [NOMENU] [NOOPTIMIZE] [NORMAL]
[NOWAIT] [PARTITION expn2] [PREFERANCE expc3]
[REST] [SAVE] [TIMEOUT expn3] [TITLE expc4]
[:VALID [:F] expl3] [ERROR expc5] [WHEN expl4]
[WIDTH expn4] [ [WINDOW] nume fereastră1]
[IN [WINDOW nume fereastrâ2 | IN SCREEN] ]
[COLOR SCHEME expn5] | [COLOR listă perechi culori]
Majoritatea clauzelor sunt asemănătoare cu cele din comanda CHANGE, diferenţele fiind următoarele:
LEDIT, REDIT - fac ca partiŢia stângă respectiv dreaptă să apară în formatul change.
LOCK expn - expresia numerică expn reprezintă numărul de câmpuri ce vor fi piasate în partiţia stângă a ferestrei.
NOLGRID, NORGRID - se utilizează pentru a elimina separarea prin linii verticale între câmpuri în partitia stângă şi respectiv cea dreaptă.
FORMAT - se referă la preluarea formatului de afişare dintr-un fişier de format.
REFRESH - duce la reîmprospătarea ferestrei de editare browse (retrasarea ei) şi este necesară la lucrul cu bazele de date în reţea.
Restul clauzelor au fost discutate la comanda CHANGE,
Comanda REPLACE înlocuieşte conţinutul unui câmp sau al mai multor câmpuri cu cel precizat în comandă. Ea are următoarea sintaxă:
REPLACE câmp1 WITH expr1 [ADDITIVE]
[,câmp2 WITH expr2 [ADDITIVE] ...]
[domeniu] [FOR expl1 [WHILE expl2] [NOOPTIMIZE]
Valoarea din expr1 este evaluată şi este modificat câmpul câmp1 cu valoarea expresiei (care trebuie să fie de acelaşi tip cu cea din câmp1), câmp2 cu expr2, şamd. Dacă este prezentă opţiunea ADDITIVE, atunci este adăugată valoarea expr1 la conţinutul din câmp1.
FOR, WHILE şi domeniu, specifică domeniu! înregistrărilor la care se referă comanda REPLACE.
Exemplu:
USE MFIXE
REPL valoare with valoare*3,uzură with 0 for tip = 2 USE
Această comandă realizează înlocuirea câmpului valoare cu o valoare de trei ori mai mare şi uzura cu 0, pentru toate mijlocele fixe de tipul 2.
4.8 Ştergerea înregistrărilor
Ştergerea înregistrărilor dintr-o bază de date este necesară deoarece datorită dinamicii fenomenelor unele manifestări dispar nemaifiind necesare. Ştergerea se poate face la nivel logic, când înregistrările sunt prezente în baza de date dar sunt invalidate printr-un octet cu care ea se marchează ştiindu-se că este ştearsă. Aceste înregistrări pot fi vizualizate sau nu după dorinţă.
Ştergerea la nivel fizic face ca înregistrările să dispară fizic din baza de date.
Marcarea pentru ştergere se face prin comanda DELETE:
DELETE
[domeniu] [FOR expl1 ] [WHILE expl2] [NOOPTIMIZE]
în care:
domeniu, FOR şi WHILE identifică înregistrărite care urmează să fie marcate pentru ştergere. Domeniul implicit este înregistrarea curentă.
Accesul !a înregistrările marcate pentru ştergere este controlat de comanda SET DELETED cu sintaxa:
SET DELETED ON | OFF
Când este aleasă opţiunea ON înregistrările marcate pentru ştergere nu sunt accesibile (accesibile cu OFF). Comenzile care acţionează asupra unei singure înregistrări sau au ca domeniu implicit înregistrarea curentă nu sunt afectate de această comandă.
Funcţia DELETED ([expc|expn]) returnează .T. dacă înregistrarea curentă a fost marcată pentru ştergere.
expc - este aliasul bazei de date selectată, iar expn este numărul zonei de lucru al acesteia
înregistrarea marcată pentru ştergere nu este eliminată din baza de date şi de aceea se poate elimina acest marcaj prin comanda:
RECALL
[domeniu] [FOR expl1] [WHILE expl2] (NOOPTIMIZEj
înregistrările selectate în "domeniu" vor fi refăcute pierzindu-şi marcajul de ştergere.
Ştergerea fizică a înregistrărilor marcate pentru ştergere se realizează prin:
PACK [MEMO] [DBF]
Comanda PACK poate fi oprită prin tastarea tastei ESC şi baza de date este refăcută. După ce a fost executată această comandă, înregistrările şterse nu mai pot fi refăcute.
Dacă o bază de date conţine câmpuri (unul sau mai multe) memo, acestea sunt retinute într-un fişier cu aceeaşi denumire dar cu extensia .FPT. Ştergerea acestui fişier memo asociat se realizează cu clauza MEMO a comenzii PACK (care nu afectează baza de date propriuzisă). Utilizarea opţiunii DBF duce la stergerea înregistrărilor marcate din baza de date fără a afecta fişierul memo. Comanda fără clauze se referă atât la fişierul memo cât şi la baza de date.
Comanda care realizează stergerea tuturor înregistrărilor dintr-o bază de date (vidarea bazei de date, ea rămânând doar cu structura), este:
ZAP
Această comandă este mult mai rapidă decât secvenţa:
DELE ALL
PACK
Comanda SET SAFETY ON | OFF dirijează modul de execuţie al confirmării ştergerii: dacă SAFETY este ON se va afişa un mesaj de confirmare a ştergerii, iar dacă este OFF, nu

4.9 Indicatorul de înregistrări

La crearea bazelor de date se asociază fiecărei baze de date o locaţie de memorie în care este memorat numărul înregistrării curente. Această zonă este ştearsă la închiderea bazei de date. La deschiderea unei baze de date indicatorul de înregistrare are întotdeauna valoarea 1.
Există o serie de comenzi şi funcţii care se referă la acest indicator de înregistrare sau comenzi care ţin cont de indicatorul de înregistrare şi eventual îl modifică:
Exemplu:
DISPLAY NEXT 2
Această comandă afişează următoarele 2 înregisfrări începând cu cea curentă şi avansează (creşte) îndicatorul de înregistrare cu 2.
Functia RECNO( [expn | expc]) returnază numărul înregistrării curente, expn, expc reprezentând numărul zonei de lucru respectiv alias-ul bazei de date deschise.
Comanda SKIP [expn] [IN expn2IN expc] indică modificarea indicatorului de înregistrare cu expn înregistrări (expn putând avea valori pozitive sau negative întregi). Dacă valoarea lui expn este negativă, indicatorul de înregistrare scade cu expn, iar dacă este pozitivă creşte cu acelaşi număr. Comanda fără argumente înseamnă creşterea cu 1 a indicatorului de înregistrare adică avansarea pe înregistrarea următoare. Expresiile IN expn2, IN expc indică zona de lucru în care este deschisă baza de date.
Comanda GO, sau GOTO este folosită de asemenea pentru modificarea indicatorului de înregistrare (adică pentru deplasarea în interiorul bazei de date). Ea are următoarele forme:
GO 1 - deplasare pe prima înregistrare
GO TOP - idem
GO BOTTOM - deplasare pe ultima înregistrare
GO RECORD expn - deplasare pe înregistrarea expn
Sintaxa acestei comenzi este:
GO | GOTO [RECORD] expn1 [IN expn2] | [IN expc] şi
GO | GOTO TOP | BOTTOM [IN expn2] | [IN expc]
Clauza record este opţională şi nu schimbă execuţia comenzii. A fost introdusă pentru ca această comandă să sune mai bine în limba engleză. Funcţiile BOF() şi EOF() având sintaxele:
BOF ([expn] | [expc])
EOF ([expn] | [expc])
testează dacă indictorul de înregistrare se află la începutul bazei de date selectată în zona expn sau precizată prin alias (BOF) sau la sfârşitui acesteia (EOF), Număru! de înregistrări dintr-o bază de date este returnat de functia:
RECCOUNT([expn] | [expc])
iar dimensiunea unei înregistrări se obţine folosina funcţia;
RECSIZE([expn] | [expc])
Dacă nu se indică o altă bază de date aceste funcţii se referă la baza de date activă din zona curentă.

4.10 Căutarea înregistrărilor. Accesul la înregistrări

În FoxProW există posibilitatea de a bloca accesul !a unele înregistrări, Această blocare se face doar pentru durata de acţiune a unei comenzi şi încetează când acest lucru nu mai este dorit (printr-o comandă). Comanda care realizează accesul doar la unele înregistrări nepermiţând accesul la altele este comanda SET FILTER cu sintaxa:
SETFILTER TO [expl]
expl - este o expresie logică. Pentru toate înregistrările pentru care expresia logică este .T. este permis accesul, iar pentru cele pentru care expresia este .F. nu este permis.
Exemplu;
USE MF!XE
SET FILT TO valoare <1000000.and.valoare>100000
BROW
Prin acest şir de comenzi se permite accesu! (vizualizat în browse) doar pentru mijloacele fixe cu valoare cuprinsă între 100000 şi 10000000. Aceasta nu înseamnă că celelalte mijloace fixe dispar din baza de data dar acestea nu pot fi accesate (nu ne interesează) în acest moment. Comanda;
SET FILTER TO
(fără condiţie) face ca efectul comenzii să dispară (să fie anulatâ filtrarea) şi să poată fi accesate toate înregistrările existente.
Pentru a afla condiţia de accesare a înregistrărilor se poate folosi funcţia:
FILTER ([expn] | [expc])
unde expn sau expc defineşte zona de lucru în care se testează modul de acces la înregistrări.
Căutarea unei înregistrări apare ca o problemă practică deseori în realitatea economică. Dacă ne interesează de exemplu care sunt mijloacele fixe ce au o anumită valoare atunci putem folosi metoda filtrării;
SET FILTER TO VALOARE = vvv iar apoi putem folosi o metodă de vizualizare (browse sau list) pentru a alege din mulţimea înregistrărilor pe cea căutată.
Sau se dă o condiţie care nu este îndeplinită decât de o înregistrare şi atunci aceasta va fi cea vizualizată. (de exemplu numele mijlocului fix). Există însă şi o altă posibilitate, dată de comanda:
LOCATE FOR expl1 [domeniu] [WHILE expl2]
[NOOPTIMIZE]
Acestă comandă caută prima înregistrare care îndeplineşte condiţia expl1 în baza de date activă. Domeniul implicit al înregistrărilor este ALL şi se poate indica o condiţie (expl2) pentru a limita domeniu! înregistrărilor.
Dacă se găseşte o înregistrare, FoxProW se poziţionează pe ea (poziţionează indicatorul de înregistrare) iar funcţia FOUND() ia valoarea .T. În cazul în care nu este gâsită o astfel de înregistrare, indicatorul de înregistrări se poziţionează pe sfârşitul fişierului, funcţia FOUND() ia valoarea .F. iar funcţia EOF () ia valoarea .T. (pentru că indicatorul se găseşte la sfârşitul fişierului).
În cazul în care s-a găsit o înregistrare şi există mai multe înregistrări ce satisfac această condiţie, următoarele pot fi găsite cu comanda:
CONTINUE
Această comandâ caută următoarea înregistrare care satisface condiţia din ultima comandă LOCATE.
Funcţia:
FOUND ([expn] | [expc])
este folosită pentru testarea rezultatulul unei căutări într-o bază de date. Ea returnaeză .T. dacă înregistrarea a fost găsită şi .F. în caz contrar, expn şi expc reprezintă zona de lucru în care a fost deschisă baza de date în care s-a făcut căutarea.
O altă metodă de căutare într-o bază de date este cea ce utilizează funcţia
LOCKUP () cu următoarea sintaxă:
LOCKUP (câmp1, expr, câmp2 [,expC])
în care;
câmp1 - reprezintă câmpul a cărui valoare va fi retumată de funcţie, în caz de căutare terminată cu succes;
expr - specifică expresia de căutat în baza de date;
câmp2 - se foloseşte pentru a realiza căutarea expresiei numai în acest câmp;
expc - este utilizată pentru bazele de date indexate şi va fi discutată mai târziu.
Rezultatu! funcţiei este de tip şir de caractere, numeric, logic sau dată calendaristică, în funcţie de tipul câmpului returnat.
Exemplu:
Să se afişeze numele primului mijloc fix "AUTO" din baza de date MIFIX
USE MFIX
LOCKUP (denumire, 'AUTO'.tip)
? denumire
Autocamion M200
use
Căutarea în bazele de date se face deosebit de eficient folosind alte comenzi specifice bazelor de date indexate şi vor fi tratate ulterior.

4.11 Câmpurile memo şi general

În memorarea datelor într-o bază de date există situaţii în care dimensiunea unor câmpuri diferă foarte mult de la o înregistrare la alta. În acest caz câmpul trebuie declarat cu lungimea cea mai lungă şi se face risipă de suport magnetic. De aceea s-a introdus câmpul memo care permite memorarea datelor de acest fel mult mai eficient.
O bază de date ce conţine un câmp memo, are un fişier asociat în care sunt depuse datele din câmpul memo. De asemenea în baza de date, în locul câmpului memo, se memorează toate mformaţiile necesare (de exempiu poziţia primului caracter al câmpului respectiv).
Accesul la datele respective se face astfel:
- se selectează înregistrarea dorită şi se citesc datele din baza de date respectiv
din câmpul memo;
- cu ajutorul datelor înscrise în câmpul memo se găsesc datele corespunzătoare din fişierul asociat şi se citesc şi acestea încărcarea datelor în câmpul memo se face astfel:
- se găseşte un spaţiu liber în fişierul asociat (memo) şi se încarcă aceste date în spaţiul respectiv;
- se completează baza de date cu înregistrarea dorită, în câmpu! memo respectiv şi se actualizează acest fişier cu toate datele necesare localizării în fişierul memo a respectivelor date.
Aceste operaţii sunt transparente pentru utilizator, FoxProW controlând în întregime acest mecanism.
Încărcarea unor date într-un câmp memo se poate face fie de către utilizator (introducere caracter cu caracter, într-o fereastră de editare) fie prin citirea acestora dintr-un fişier sau din memoria calculatorului.
Prima metodă se realizează după cum urmează:
- se deschide o fereastră de editare pentru modificarea conţinutului bazei de date (CHANGE, EDIT, BROWSE sau APPEND);
- se poziţionează cursorul pe câmpul memo după care se apasă CTRL/PgDn sau cu mouse-ul se apasă butonul stâng al acestuia de două ori (dubiu clic) şi apare fereastra de editare a câmpului memo.
- în fereastră se introduce conţinutul câmpului
- se apasă CTRL/W pentru salvarea modificărilor în baza de date, sau prin apăsarea tastei ESC când nu sunt salvate modificările dar se asigură ieşirea din fereastra de editare.
Se poate folosi şi comanda:
MODIFY MEMO câmp memo1 [,câmp memo2...]
[NOEDIT] [NOWAIT] [RANGE expn1,expn2]
[WINDOW nume fereastră]
[IN [WINDOW] | nume fereastră |screen]
[SAME][SAVE]
unde:
câmp memo1 (câmp memo2, ...) reprezinîă câmpuriie memo pentru care se vor deschide ferestre de editare, câte una pentru fiecare câmp. Se pot specitica câmpuri şi din alte baze de date decât cea activă, specificându-se alias-ul corespunzător.
NOEDIT - nu permite modificarea câmpului memo ci doar vizualizarea sa
NOWAIT - se foloseşte în interiorul unui program şi are ca efect continuarea execuţiei programului pe timpul efectuării modificărilor
RANGE expn1, expn2 - are ca efect selectarea doar a unei portiuni din câmpul memo şi anume cea începând cu caracterul expn1 şi până la caracterul expn2 exclusiv
Clauzele WINDOW, IN WINDOW, IN SCREEN se vor trata când se va trata în continuare capitolul FERESTRE Şl MENIURI.
SAVE - se utilizează pentru a păstra fereastra pe ecran şi după ieşirea din editare. Şi acestă opţiune operează în cadrul unui program, neavând efect altfel.
Inchiderea ferestrei se poate face foiosind comanda:
CLOSE MEMO câmp memo1 [,câmp memo2...] [ [ALL]
O altă metodă de a încărca un câmp memo într-o bază de date este cea ce utilizează comanda:
APPEND MEMO câmp memo FROM fişier [OVERWRITE]
Prin acestă comandă conţinutul întregului fişier cu numele "fişier" se adaugă la sfârşitul câmpului memo (numit "câmp memo"). Dacă se include opţiunea OVERWRITE, atunci conţinutul fişier va fi copiat peste conţinutul câmpului "câmp memo", pe care-l va înlocui.
Operaţia inversă (copierea conţinutului unui câmp memo într-un fişier ASCII) se realizează cu următoarea comandă:
COPY MEMO câmp memo TO fişier [ADDITIVE]
În cazul că nu se specifică nici o extensie pentru "fişier" acesta va avea extensia TXT (implicită).
În mod normal conţinutul câmpului memo va fi copiat peste conţinutiil "fişier", vechiul conţinut pierzându-se. Dacă se doreşte adăugarea la sfârşit a acestui conţinut se foloseşte clauza ADDITIVE. Dacă fişierul nu există, el va fi creat.
Cu comanda REPLACE se poate înlocui un câmp memo cu altul dintr-o altă baze de date.
Câmpurile memo sunt câmpuri de tip şir de caractere şi asupra lor acţionează toate funcţiile pe şiruri de caractere ca:
LEN(), ATLINE(), MLINE(), AT(), ATCLINE(), SUBSTR(),
ATC(), MEMLINES() etc.
Funcţia:
MEMLINES (câmp memo) retumează o valoare numerică reprezentând numărul de linii ale câmpului memo
Funcţia:
MLINE (câmp memo, expn1 [,expn2])
unde:
câmp memo - este câmpul memo din care se extrage linia expn1 - este numărul liniei care se extrage (dacă nu există, funcţia returnează şirul vid)
expn2 - reprezintă deplasamentul folosit la extragerea liniei adică se consideră câmpul memo ca începând de la expn2+1-lea caracter.
Exemplu:
? MEMLINE (loc.fol)
3
?MLINE (loc_fol,2)
Strada Luceafărului Nr 164
?MLINE (loc_fol,2,3)
ada Luceafărului Nr 164
Valorile retumate de funcţiile MEMLINE() şi MLINE() sunt influenţate de comanda SET MEMOWIDTH cu sintaxa;
SET MEMOWIDTH TO expn
Comanda limiteză numărul caracterelor afişate din câmpurile memo la rnaximum expn caractere (ca şi când câmpul ar avea maxim expn caractere).
Acestă cornandă stabileşte şi lungimea maximă de afişare a câmpurilor memo în comenzile:
LiST, DISPLAY, ?, ?? şi influenţează de asemenea funcţiile ATCLINE() şi ATLINE().
Această comandă acţionează şi asupra şirurilor de caractere cu lungime de peste 254 octeti. Valoarea implicită pentru această comandă este 50, iar vaioarea admisă trebuie să fie mai mare sau egală cu 8. Valoarea lui expn poate depăşi 256 dar valoarea de afişare pe ecran va fi limitată la 256 caractere.

CÂMPURILE DE TIP GENERAL
Unul din mecanismele specifice Windows-ului şi acestei versiuni FoxPro o reprezintă mecanismul OLE (Object Linking and Embedding - Legare şi încorporare de obiecte) create cu alte aplicaţii (Microsoft Excel, Microsoft Word etc) şi utilizate în FoxProW.
Mecanismul OLE reprezintă un set de protocoale de comunicare între aplicaţii prin intermediul cărora o aplicaţie poate folosi servicii oferite de alte aplicaţii.
Introducerea unui obiect într-un câmp general poate fi făcută cu comanda cu sintaxa:
APPEND GENERAL câmp_general FROM fişier
[LINK] [CLASS identificator_server]
Acestă comandă duce la încorporarea în câmpul de tip general al înregistrării curente o copie a fişierului (numit "fişier") realizat eventual cu o altă aplicaţie. CIauza LINK duce la "legarea" fişierului de baza de date, deci de introducerea unor mijloace de identificare a fişierului respectiv (şi nu la încorporarea lui).
La specificarea nume!ui fişierului se va indica calea completă, iar numele se introduce între ghilimele. Folosind clauza CLASS se va specifica în mod explicit identificatorul clasei fişierului. De exemplu pentru fişierele EXCEL se va indica extensia .XLS.
În tabelul următor se prezintă identificatorii aplicaţiilor utilizale frecvent:


TIP APLICAŢIE
IDENTIFICATOR
Microsoft Excel CHART - grafic
ExcelChart
Microsoft Excel Foaie de calcul
Excel Worksheet
Microsoft Graph
MSGraph
Microsoft Word 2.0
WordDocument
Microsoft Word 6.0
WordDocument.6
Microsoft Word Imagine
Word Picture
PaintBrush - Imagine
PBrush
imagine Bitmap
Static Dib
Sunet
SoundRec
fişiertext
textfile
                Exemplu:
                APPEND GENERAL campgen FROM 'c:\excel\tabel.xls' LINK
                Afişarea conţinutului unui fişier de tip bitmap sau al unui camp de tip general se face cu comanda:
                @ lin,col SAY fişier BITMAP | camp general
                 [STYLE  expc1 ] [CENTER] [ISOMETRIC | STRECH]
                 [SYZE expc1, expc2]
            Comanda afişeaza pe ecranul FoxProW sau într.o fereastră utilizator imaginea conţinută în fişierul de tip bitmap sau în câmpul “câmp general”.
  • lin,col – reprezintă coordonatele în care va fi plasat colţul din stânga sus al obiectului. Valorile lin,col sunt mai mari decât 0 la afişarea pe ecran, şi mai mari decât 1 la afişarea pe hârtie la imprimantă.
  • STYLE expc1 – specifică dacă imaginea se doreşte transparentă (expc1='T') sau opacă (expc1='Q').
  • CENTER – centrare în cadrul ecranului sau al ferestrei.
  • SIZE expc1, expc2 – specifică dimensiunile imaginii (înălţimea în linii respectiv lăţimea).
  • ISOMETRIC – dimensiunile imaginii vor fi modificate păstrând proporţiile astfel încât aria ocupată să fie cât mai mare.
  • STRECH – acelaşi lucru, astfel încât imaginea să ocupe o cât mai mare parte din zona de afişare.
          Exemplu:
         @ 0,0 SAY 'd:\foxprow\sample\book.bmp' BITMAP CENTER
         De obicei pornirea aplicaţiei (server – care este aplicaţia care a creat obiectul) se face în scopul modificării obiectului. În acest caz se poate folosi comanda
        @ lin,col SAY camp_gen VERB expn3 | expc2
        Acestă comandă va porni aplicaţia (server) de modificare a obiectului din câmp_gen- De exemplu în cazul când obirctul este creat cu Microsoft Word, comanda va porni Word-ul pentru modificarea obiectului.
        Expn3 şi expc2 reprezintă codul comenzii care va fi trimisă aplicaţiei. În cele mai multe cazuri se foloseşte codul 0 sau 'EDIT' care corespunde pornirii aplicaţiei pentru editarea obiectului.
        Exemplu: @ 0,0 SAY camp_gen VERB 0
`       Cu această comandă este încorporat documentul WORD numit camp_gen în înregistrarea curentă după oprirea (ieşirea din WORD) care este lans  at la lansarea acestei comenzi pentru editarea documentului (care a fost în prealabil, creat).
        ATENŢIE! Un obiect legat de baza de date nu poate fi modificat prin această comandă.

       Pentru a modifica, insera, sau şterge un obiect de tip general, se poate deschide o fereastră asociată acestui câmp folosind comanda:

       MODIFY COMMAND câmp_gen1 [,camp_gen2...]

       [NOMODIFY] [NOWAIT] [WINDOW fereastra1]

       [IN [WINDOW] fereastra2 | IN SCREEN]

       Cu o singură comandă se pot deschide mai multe ferestre asociate câmpurilor tip general.

       NOEDIT – obiectul nu poate fi modificat (doar vizualizat şi copiat în clipboard)

       NOWAIT – execuţia unui program din care e lansată comanda, nu se întrerupe pe timpul existenţei ferestrei

       WINDOW – fereastra ia caracteristicile ferestrei care trebuie să fie definită.

      IN WINDOW – fereastra este deschisă in ferestra2 (fereastră părinte) fără a prelua caracteristicile acesteia.

      Manipularea obiectelor conţinute în câmpuri de tip general se poate face şi prin opţiuni din meniul sistem FoxProW. Astfel introducerea unui obiect se poate face cu opţiunea Insert Object, din submeniul Edit. Acesta este disponibil dacă este activată fereastra asociată unui câmp general în care va fi introdus obiectul. Prin alegerea opţiunii Insert Object, pe ecran e va deschide o fereastră de dialog ce va solicita caracteristicile obiectului.

      Dacă obiectul urmează să fie creat, se acţionează declanşatorul OK şi este pornită aplicaţia selectată. La părăsirea acesteia obiectul va fi inserat în câmp. Dacă a fost creat anterior, i se specifică denumirea şi el va fi încorporat în câmp, prin intermediul declanşatorului File.

     Obiectele inserate prin intermediul opţiunii Insert File sunt încorpotate în baza de date şi nu pot fi modificate decât prin intermediul FoxProW.

     Modificarea obiectelor încorporate sau legate la o baza de date, se face prin intermediul opţiunii Object, aflată sub opţiunea Insert Object, în submeniul Edit. Această opţiune este disponibilă când fereastra asociată unui câmp de tip general este activă. Prin alegerea acestei opţiuni va fi pornită aplicaţia respectivă.

       Dacă numele sau locul fişierului a fost modificat faţă de acela al legării la baza de date, legătura trebuie refăcută. Această operaţie se realizează prin intermediul opţiunii Change Link din submeniul Edit.

      Un obiect general poate fi transformat într-o imagine statică folosind opţiunea Convert to Static din submeniul Edit. Opţiunea este de asemenea disponibilă dacă fereastra asociată este activă. Imaginea statică poate fi vizualizată dar nu modificată.

      Dacă este necesară păstrarea într-un câmp general a unei porţiuni dintr-un document, inserarea acestuia în câmp se poate face prin intermediul clipboard-ului. Această operaţie se realizează cu opţiunea Paste Special din submeiul Edit. Obiectul este introdus la acţionarea declanşatorului Paste Link prin legare la baza de date.

4.12 Import / export de date

ImportuI de date reprezinta transferul de date între fisiere din afara sistemului FoxPro (utilizate de alte sisteme) şi bazele de date iar exportui reprezinta transferul invers.
Sunt posibile doua tipuri de transfere;
1. Transfer între baze de date şi alte fisiere, realizate cu comenzile: APPEND FROM, COPY TO, IMPORT si EXPORT
2. Transfer intre baze de date şi masive sau variabile de memorie realizate cu comenzile APPEND FROM ARRAY, COPY TO ARRAY, SCATTER si GATHER.
Comanda:
APPEND FROM fisier | ? [FIELDS lista] [FOR expl]
[TYPE ] [DELIMITED | [WITH TAB | WITH delimit]
|WITH BLANK] [DIF| FWZ | MOD | PDOX | RPD | SDF|
SYLK | WK1| WK3 | WKS | WR1 | WRS | XLS]
adauga la sfarsitui bazei de date active inregistrarile preluate din "fisier", sau din fisierul selectat în fereastra deschisa când este mentionata clauza ?.
FIELDS - are ca efect preluarea doar a datelor prezente in câmpurile specifivate în "lista"
FOR - selecteaza din înregistrari doar pe acelea care satisfac condiţia "exp!"
TYPE - este inclusă pentru specificarea tipului fisierului sursa când acesta nu este un fisier FoxPro. Daca fisierul este ASCII se poate include clauza DELIMITED
unde:
WITH TAB - indică separarea câmpurilor prin tab-uri (chr(9))
WITH delimit - indică separatorul indicat prin "delimit"
WITH BLANK - câmpurile vor fi separate prin spaţii.
Pentru toate aceste optiuni, sfârşitui de înregistrere este dat de sfârşitui de linie al fisierului sursă (chr(10)+chr(13)).
Tabelul de mai jos descrie fiecare clauză şi tipul fişierului sursă:
clauza
Programul generator
extensia
Explicatii
DIP
VisiCalc
DIF
coloane->campuri
FW2
Framework II
FW2

MOD
M.Multiplan v4.01
MOD

PDOX
Paradox 3.5
DB

RPD
Rapid File v 1.2
RPD

SYLK
M.Multiplan
-
coloane->campuri
WK1
Lotus 1-2.3 rev 3x
WK1

SDF

TXT
Fişier ASCII nederminat de structura bazei de date
WKS
Lotus 1-2-3 rev 1A
WKS

WR1
Lotus Symfony 1.1, 1.2
WR1

WRK
Lotus Symfony 1.0
WRK

XLS
Excel v 2.0
XLS

Transferul invers, de la baza de date la un alt fisier (exportul) se realizează cu comanda:
COPY TO fişier [FIELDS lista] [FOR expl]
[domeniu] [ [WITH] CDX| [WITH] PRODUCTION ]
[NOOPTIMIZE] [WHILE exp2]
[TYPE] [FOXPLUS] [DIF | FWZ | MOD | PDOX | RPD | SDF |
SYLK | WK1 | WK3 | WKS | WR1 | WRS | XLS]
[DELIMITTED | [WITH TAB | WITH delimit] | WITH BLANK]
Clauzele au fost descrise în mare parte anterior.
WHILE - alaturi de FOR precizeaza condiţiile ce se cer a fi îndeplinite de înregistrările ce se transferă (exportă).
Clauzele WITH CDX, WITH PRODUCTION, vor fi discutate mai jos (se referă la fişiere indexate).
Clauzele WITH delimit se refera la delimitarea campurilor în fişierul ASCII rezultat în urma comenzii. Exemplu:
Use Mfixe
copy to mfixe.txt all delimited with','
NOTE se creaza fişierul mfixe.txt cu înregistrarile bazei de date
APPEND from mfixe.txt all delimited with','
NOTE din fişierul creat anterior se adaugă înregistrările la sfarşitui bazei de date mfixe
USE
Comanda:
IMPORT FROM fişier
[TYPE] [FWZ | MOD | PDOX | RPD |
SYLK | WK1 | WK3 | WKS | WR1 | WRS | XLS]
copiaza fişierul sursă "fisier" într-un fişier bază de date cu acelaşi nume (dar extensia DBF) cu fişierul originar. Comanda:
EXPORT TO fişier [FIELDS listă] [domeniu]
[FOR expl1] [WHILE expl2] [NOOPTIMIZE]
[TYPE] [FWZ | MOD | PDOX | RPD | 
SYLK | WK1 | WK3 | WKS | WR1 | WRS | XLS]
copiază înregistrările selectate prin clauzele FOR şi WHILE din baza de date activă în "fişier", Clauzete au fost explicate.
Trebuie avut în vedere că sortarea (indexarea) unei baze de date durează cu atât mai mult cu cât ea este mai voluminoasă. De aceea dacă dorim să listăm de exemplu o parte din înregistrări este mai rapid să extragem o altă bază de date din ea (cu comanda COPY de exemplu), să o sortăm şi apoi să o listăm. Dacă vom lucra în memorie, (cu un masiv) vom avea o viteză şi mai mare.
Comanda:
APPEND FROM ARRAY masiv [FOR expl] [FIELDS listă]
adaugă la baza de date activă înregistrări ce sunt preluate dintr-un masiv unde "masiv" este numele masivului iar clauzele FOR şi WHILE reprezintă condiţiile de selecţie ale înregistrărilor.
Dacă masivul este unidimensional, se consideră că fiecare element al acestuia corespunde cu un câmp al bazei de date, primul element copiindu-se în primul câmp, al doilea în al doilea câmp şamd. Dacă masivul are mai multe elemnnte decât câmpuri în baza de date, elementele în plus sunt ignorate. Dacă are mai puţine, câmpurile respective sunt iniţializate cu valori implicite:
- şirurite de caractere sunt iniţializate cii spaţii;
- cifrele cu valoarea 0;
- datele iau valori vide;
- câmpurile logice iau valoarea .F.
În acest caz se adaugă o singură înregistrare în baza de date.
Dacă masivul este bidimensional, !a baza de date se vor adăuga atâtea înregistrări câte linii are masivul (liniile fiind indexate după primul indice). O linie este tratată ca un masiv unidimensional (cum s-a arătat mai sus).
Pot apărea situaţii în care tipul elementului de masiv diferă de tipul câmpului. FoxPro încearcă transformarea elementului de masiv într-o valoare de tipul corespunzător. Dacă se reuşeşte acest lucru se copiază valoarea în câmp, dacă nu, câmpul ia vaioarea implicită.
Operaţia inversă, copierea unor înregistrări dintr-o bază de date într-un masiv se face cu comanda;
COPY TO ARRAY masiv [FOR expl1] [WHILE expl2]
[FIELDS listă] [domeniu] [NOOPTIMIZE]
Selectarea înregistrărilor se poate realiza prin domeniu, clauzele FOR şi WHILE iar câmpurile prin lista ataşată clauzei FIELDS.
Pentru masivele unidimensionale se va copia o înregistrare. Pentru masivele bidimensionale, fiecare coloană în câte una
Pentru transferul de date între variabile sau masive şi baze de date se pot folosi şi comenzile SCATTER şi GATHER.
GATHER FROM masiv | memvar [FIELDS listă] [MEMO]
şi
SCATTER [FIELDS listă] [MEMO] TO masiv |
TO masiv BLANK | TO memvar | TO memvar BLANK]
Comanda SCATTER copiază câmpurile înregistrării curente din baza de date activă, într-un masiv sau într-un set de variabile ataşat bazei de date. Clauza MEMO trebuie precizată dacă printre câmpurile bazei de date există şi câmpuri memo (altfel el este ignorat).
BLANK - indică faptul că se doreşte crearea unui masiv vid (în care toate elementele sunt iniţializate cu valori vide - spaţii, zero şamd).
MEMVAR - indică faptul că se doreşte crearea în memorie a unui set de variabile ce poartă acelaşi nume cu câmpurile bazei de date. Dacă nu există ele se vor crea.
Comanda GATHER realizează transferul invers, între variabile şi masive şi baza de date.
Exemplu:
CLOSE ALL
USE MFIXE
DIMENSION v(50,5)
COPY TO ARRAY v all for stare .T.
NOTE copiază înregistrăriie în masivul v

4.13 Ordonarea (sortarea) unei baze de date

Ordonarea bazelor de date presupune luarea în consideraţie a anumitor criterii şi aşezarea înregistrărilor funcţie de acestea. Aceasta se face în scopul unei găsiri mai uşoare şi mai simple a înregistrărilor.
Acest lucru se realizează în FoxPro prin două metode: sortare şi indexare.
Sortarea presupune construirea unei alte baze de date cu înregistrărife ordonate plecând de !a baza de date ce se ordonează.
Indexarea presupune construirea unui fişier ataşat bazei de date care conţine. informaţiile privind ordinea înregistrărilor din baza de date.
Comanda SORT realizează sortarea bazelor de date:
SORT TO fişier ON câmpl [/A] [/D] [/C]
[,câmp2 [/A] [/D] [/C]...] [ASCENDING] [DESCENDING]
[domeniu] [FOR expl1] [WHILE expl2] [FIELDS LISTĂ] [NOOPTIMIZE]
Comanda creează o nouă bază de date sortată după câmp1 eventual câmp2... Clauza FIELDS precizează conditiile ce trebuie să le îndeplinească înregistrările pentru a fi cuprinse în noa bază de date (ca şi clauzele FOR şi WHILE).
Clauzele /A şi /D specifică tipul de ordonare (crescăror sau descrescător ca şi ASCENDING şi DESCENDING).
Clauza /C se foloseşte pentru câmpurile şiruri de caractere pentru a face sortarea insensibilă la caracterul literelor (majuscule sau minuscule). Se pot folosi;
construcţiile /AC sau /DC.
Exemplu:
use mfixe
SORT TO mfixe_s ON valoare /D data_pf/A for stare=.F.
use
Comanda index realizează construirea fişierului index care conţine ordinea înregistrărilor în baza de date care nu se modifică,
INDEX ON expr TO fişier.idx TAG nume etichetă
[OF fişier.cdx] [FOR expl] [COMPACT]
[ASCENDING] [DESCENDING] [UNIQUE] [ADITIVE]
Cheia de ordonare se numeşte în acest caz cheie de indexare şi se specifică în expresia "expr", aceasta conţinând câmpuri din baza de date activă dar nu, câmpuri memo.
Fişierul index va fi de tipul .idx în cazul fişierelor simple sau .cdx în cazul unui fişier index compus care poate conţine mai multe chei de indexare fiecare corespunzând unui criteriu de ordonare. Fiecare criteriu este identificat prin eticheta asociată ce se specifică în comanda index prin dauza TAG fără introducerea unui nume de fişier cu clauza OF.
Fişierele compuse pot fi:
- structurale - care sunt deschise şi asociate automat bazei de date odată cu deschiderea acesteia. Acestea au acelaşi nume cu cel a! bazei de date, extensia fiind .cdx şi sunt create folosind clauza TAG fără nume de fişier în clauza OF. '
- nestructurale - care poartă alt nume decât cel al bazei de date, nu sunt deschise automat, şi trebuie precizat numele în clauza OF,
COMPACT - are ca efect crearea de fişiere compacte cu care pot fi accesate mai rapid înregistrările şi fişierele au dimensiune mai mică.
Clauza UNIQUE indică modul de actiune în cazul cheilor multiple. În cazu! în care avem două sau mai multe înregistrări şi este precizată clauza UNIQUE, va putea fi accesată numai una din înregtsirări.
Cele mai performante sunt fişierele index compuse structurale, compacte.
Modul de lucru cu o bază de date indexată este:
- se crează fişierul index asociat bazei de date;
- se deschide baza de date cu indexul asociat (dacă este un index structurat compus - se deschide automat, altfel trebuie precizat indexul la deschidere în clauza INDEX);
- se realizează operaţiile dorite asupra bazei de date. Modificarea conţinutului bazei de date atrage implicit modificarea indexilor corespunzători (doar a celor deschişi);
- se închide baza de date (automat se închid indexii).
Exemplu:
USE MFIXE
INDEX on cod TAG to tcod
INDEX on valoare TAG tvaloare
INDEX on amortizare TAG tamortizare
INDEX on stare TAG tstare
NOTE se indexează baza de date într-un index structural compus în care se introduc patru etichete corespunzătoare ordonărilor respective. Pentru deschidere sintaxa comenzii USE este:
USE [fişier |?]
...
[INDEX Iistă |? [order [expn] |fişier..idx
[TAG] nume etichetă [OF fişier cdx] |
[ASCENDING | DESCENDING] ]
La deschiderea bazei de date se vor deschide şi fişierele precizate în listă (nu se include extensia decât dacă ar fi altfel pericol de confuzie), separate prin virgulă.
Dacă nu se specifică clauza ORDER atunci primul fişier din listă va fi activ. Dacă este un fişier compus, înregistrările vor fi accesate în ordinea fizică din baza de date. Clauza ORDER determină fişierul index simplu (.idx) care va deveni activ.
Prin ORDER [ [tag nume etichetă ] [OF fişier.cdx] ] se determină care fişier (care etichetă) va deveni activ.
Dacă se doreşte selectarea unei etichete dintr-un index compus nestructural şi există aceeaşi etichetă într-un index compus structural, se va folosi clauza OF în care se va preciza fişierul index compus.
Dacă se doreşte deschiderea unor fişiere pentru baza de date activă după ce aceasta a fost deschisă, se foloseşte comanda:
SET INDEX TO [listă fişiere index |?]
[ORDER expn|fişier.idx|
TAG eticheta [of fişier.cdx]
[ASCENDING | DESCENDING] ] [ADDITIVE]
Având deschise mai multe fişiere index, pentru a schimba ordinea de accesare a înregistrărilor (setarea indexului activ), se foloseşte comanda:
SET ORDER TO expn1|fişier.idx | [TAG] etichetă
[OF] fişier.cdx] [IN expn2 | expc]
[ASCENDING | DESCENDING]
Clauza IN se utilizează atunci când comanda se referă la altă bază de date decât cea activă, cu aliasul expc sau din altă zonă de lucru (expn2).
La crearea unui fişier index sau a unei etichete pentru un index, fiecărei înregistrări îi va corespunde o valoare a cheii de indexare. Pot apărea situaţii în care mai multe înregistrări corespund la aceeaşi valoare a cheii de indexare apărând astfel problema accesului la înregistrările cu aceeaşi valoare a cheii. în acest caz se poate folosi comanda SET UNIQUE cu sintaxa:
SET UNIQUE ON | OFF
Cu opţiunea ON nu se includ în fişierul index chei duble spre deosebire de OFF.
Inchiderea fişierelor index se poate realiza cu;
CLOSE INDEX
când sunt închise toate fişierele index (fără a închide bazele de date) din zona de lucru curentă.
Pentru reindexarea bazelor de date (operaţie necesară dacă se pierd indexii, din cauza unor incidente cum ar fi întreruperi de alimentare cu energie electrică) se deschid bazele de date şi indexii corespunzători şi este utilizată comanda;
[REINDEX COMPACT]
Funcţii referitoare la indexarea bazelor de date:
NDX (expn1 [,expn2 , expc])
Această funcţie returnează numele fişierelor index simple (.idx) deschise într-o zonă de lucru precizând aliasul fişierului asociat sau zona de lucru (expn2), fişien index respectiv fiind identificat prin "expn 1".
CDX (expn1 [,expn2 |expc])
MDX (expn1 [,expn2 |expc])
Funcţiiie CDX() şi MDX() sunt identice şi se utilizează pentru fişiere compuse (.CDX). Rezultatul acestor funcţii este un şir de caractrere (şirul nul, dacă nu corespunde nici unui fişier index expresiei expn1).
Exemplu:
USE MFIXE inde mfixe_n ,mfixe_d.cdx, mfixe.cdx
?NDX(1)
c:\FOX\mfixe_n.idx
?MDX(1)
c:\FOX\mfixe.cdx
?CDX(2)
c:\FQX\mfix_d.cdx
CLOSE ALL
Ordinea de accesare a unei baze de date indexate este stabilită fie de fişierul index simplu activ, fie de eticheta index activă dintr-un fişier index compus. Toate fişierele index simple şi toate fişierele index ce sunt deschise la un moment dat pentru o bază de date, sunt grupate într-o listă numită lista indexilor bazei de date, care se alcătuieşte la deschiderea indexilor. Modul de alcătuire a listei este determinat de comenziie USE ... INDEX şi SET INDEX TO astfel:
- mai întâi se pun în listă fişiereie index simple în ordinea apariţiei lor în oomenzile amintite;
- apoi sunt puse în listă etichetele din fişieru! structural (compus) în ordinea definirii acestora;
- ultimele apar etichetele din celelalte fişiere index compuse după cum apar acestea în comenzi, ordinea etichetelor fiind cea a definirii lor.
Funcţia:
TAG ([fişier.cdx] expn1 [,expn2 | expc])
se poate folosi pentru a afla numele unui fişier index simplu sau al unei etichete de pe o anumită poziţie din listă sau pentru a afla numele unei etichete dintr-un fişier index specificat.
expn2 sau expc se specifică zona de lucru. Specificarea clauzei fişier.cdx are ca efect returnarea numelui etichetei a expn1-a din fişierul index compus fişier.cdx. Numărarea etichetelor începe cu 1 pentru prima etichetă definită.
Pentru aflarea numelui fişierulu! index simplu sau al etichetei index active din fişierul index compus, se foloseşte funcţia:
ORDER ([expn1 | expc [,expn2] ])
Rezuliatul funcţiei este un şir de caractere conţinând numele fişierului respectiv, identificat prin expn1 (numărul zonei de lucru) sau aliasul ei (expc). Dacă expn2 este prezentă, funcţia va returna numele fişierului index simplu sau numele etichetei active, iar dacă nu, va returna numele elementului activ din fişierul index.
Exemplu:
use mfixe index mfixe_n, mfixe_d, mfixe order tcod
?order()
TCOD
set order to tvaloare
?order(),' ',order(1,0)
c:\FOX\mfixe.cdx tvaloare
O funcţie asemănătoare cu TAG() este functia SYS(21) care are acelaşi efect.
Pentru a afla cheia de indexare a unui fişier index se utilizează funcţia:
KEY ([fişier.cdx,] expn1 [,expn2 | expc ])
în care expn1 reprezintă numărul de ordine al fişierului index simplu sau al etichetei fişierului index compus în lista de indexi ai bazei de date, iar expn2 şi expc reprezintă zona în care se află baza de date.
Rezultatul funcţiei este un şir de caractere care precizează cheia index.
Exemplu:
USE NOM inde indnom
?KEY (1)
str(codmater,8)
USE
La comanda INDEX poate fi fotosită clauza FOR (ca o condiţie de filtrare a înregistrărilor).
Aflarea acestei condiţii de filtrare se poate face prin intermediul funcţiei:
SYS (2021,expn1[ ,expn2 | expc])
Această funcţie returnează expresia logică folosită la filtrarea înregistrărilor la crearea fişierului index specificat prin expn1 din zona de lucru indicată prin expn2 sau expc.
Trecerea de la un index simplu la o etichetă de fişier index compus se realizeaază cu comanda:
COPY INDEXES listă fişiere index | ALL
[TO fişier.cdx]
Fişierele asupra cărora acţionează comanda trebuie să fie deschise în zona de lucru curentă.
Această comandă crează (transformă) fişierele index simple în etichete ale fişierului structural sau ale fişierului index compus "fişier.cdx", în cazul că se introduce clauza TO.
Operaţia inversă poate fi făcută cu comanda:
COPY TAG nume etichetă [OF fişier.cdx]
[TO fişier.cdx]
Comanda copiază eticheta "nume etichetă" în fişierul index simplu fişier.idx.
Eticheta este căutată în fişierul index structural al bazei de date, apoi continuă cu celetalte fişiere index compuse deschise pentru baza de date activă.
Folosind această comandă eticheta rămâne în continuare în lista de indexi ai bazei de date. Pentru ştergerea ei din fişierul index compus se foloseşte comanda:
DELETE TAG nume etichetă [OF fişier.cdx]
[, nume etichetă2 [OF fişier2.cdx]...]
sau
DELETETE TAG ALL OF [fişier.cdx]
Comanda şterge etichetele "nume etichetă1, 2 ..." din fişierele index compuse deschise în zona de lucru curentă, Conflictul care apare când se găsesc două etichete cu acelaşi nume se rezolvă prin includerea clauzei OF, cu fişierul compus în care se va căuta eticheta corespunzătoare.
Clauza ALL şterge toate etichetele deci şterge fişierul .cdx.
Căutarea unei înregistrări într-o bază de date indexată se realizează în mod deosebit de rapid cu ajutorul comenzii SEEK sau a funcţiei SEEK():
SEEK expr
Această comandă caută în baza de date activă, obligatoriu indexată şi cu indexul acesteia deschis şi activ, înregistrarea pentru care cheia de indexare ia valoarea expr. Dacă este găsită o astfel de înregistrare, indicatorul de înregistrări se va poziţiona pe acea înregistrare iar funcţia FOUND() va lua valoarea .T., funcţia EOF() va returna valoarea .F. în caz contrar funcţia FOUND() va returna valoarea .F. şi indicatorul de înregistrări se va poziţiona pe ultima înregistrare iar funcţia EOF() va retuma valoarea .T.
Comanda ete influenţată de comanda SET NEAR ON | OFF
Dacă SET NEAR este ON, în caz de căutare eşuată, indicatorul de înregistrări se poziţionează pe înregistrarea imediat următoare celei căutate, iar funcţia va returna numărul acestei înregistrări (care este înregistrarea cu valoarea cheii cea mai apropiată de valoarea căutată).
Comanda SEEK realizează acelaşi lucru ca şi comanda LOCATE dar ea lucrează numai pentru baze de date indexate, este mult mai rapidă datorită unor tehnici speciale de căutare şi este foarte utilizată din acest motiv.
Funcţia SEEK () retumează .T. sau .F. funcţie de rezuitatul căutării. Ea are sintaxa:
SEEK (expr [,expn | expc])
"expr" reprezintă expresia căutată (valoarea căutată pentru cheie) iar expn şi expc reprezintă zona de lucru în care se găseşte baza de date în care se caută această valoare.
Exemplu:
USE NOM INDE INDCOD
Seek ' 3000005'
?FOUND()
.T.
disp
codmater denumire pret stoc
3000005 AMBALAJ 350.55 500
use

4.14 Extragerea de informaţîi statistice

În practică, de multe ori este necesar să obţinem diverse informaţii despre totalitatea datelor din bazele de date sau informaţii despre un grup de date. Aceste date se pot obţine printr-o serie de comenzi ce oferă date statistice privind bazele de date ca:
1, Numărul datelor din baza de date:
COUNT [domeniu] [FOR expl1 ] [WHILE expl2]
[TO var] [NOOPTIMIZE]
Această comandă numără înregistrările din domeniul precizat (sau toate -implicit), respectând pentru înregistrările numărate conditiile FOR şi WHILE, şi depunând rezultatul în variabila var care va fi creată dacă nu există
Exemplu:
USE MFIXE
COUNT for valoare >100000 to nrm
use
2. Însumează anumite valori din baza de date:
SUM [listă expresii]
[domeniu] [FOR expl1] [WHILE expl2]
[to listă variabile | TO ARRAY masiv] [NOOPTlMIZE]
Însumează anumite expresii formate cu câmpurile bazei de date respectând condiţiile impuse şi depunând rezultatul însumării în lista de variabile (câte una pentru
fiecare expresie) sau în masivul "masiv".
Exemplu:
USE mfixe
SUM amortizare.valoare to valam.valtot
? 'S-a amortizat '.valam*100/valtot,'% valoare totală ',valtot
S-a amortizat 42,33% valoare totală 150954564
USE
3. Calculul mediei aritmetice a unor valori:
AVERAGE [listă expresii] [domeniu] [FOR expl1] [WhlLE expl2]
[TO listă variabile | TO ARRAY masiv] [NOOPTIMIZE]
Această comandă este asemănătoare cu comanda anterioară calculând media aritmetică a expresiilor formate cu câmpuri din baza de date. '
Exemplu;
AVERAGE valoare FOR categorie=2 to medval
Acelaşi lucru se poate obţine cu comenziie SUM şi COUNT şi împărţind suma
la numărul inregistrărilor.
4. O serie de calcule se pot realiza cu comanda:
CALCULATE [listă expresii]
[domeniu [FOR expl1[WHILE expl2]
[TO listă variabile | TO ARRAY masiv] [NOOPTIMIZE]
Diferenţa faţă de comenzile SUM şi CALCULATE este că această comandă poate efectua mai multe tipuri de calcule şi că în lista de expresii pot fi introduse
următoarele formulări:
           - AVG expn - calculează media aritmetică
           - CNT () - însumează înregistrările ;
           - MAX expr - returnează valoarea maximă
           - MIN expr - returnează valoarea minimă
           - NPV (expn1, expr2 [,expn3]) - calculează valoarea prezentă netă a unei serii de plăţi diminuată la o rată a dobânzii constantâ. expn1 reprezintă rata dobânzii iar expn2 reprezintă expresia care calculată pentru o înregistrare selectată, ne dă o plată din seria de plăţi considerate, expn3 reprezintă valoarea iniţială a investiţiei. Dacă aceasta lipseşte, investiţia iniţială va fi dată de prima înregistrare selectată.
          - STD expn - calculează deviaţia standard a valorii expn (prezentă în înregistrări ca un câmp).
           - SUM expn - calculează suma valorilor lui expn
           - VAR expn - calculează abaterea medie pătratică medie (deviaţia standard la pătrat)
           Exemplu:
           USE MFIXE
           CALCULATE AVG(amortizare) to medamort USE
           De asemenea există comanda TOTAL care crează o nouă bază de date cu aceeaşi structură ca şi o bază de date dată, activă, cu înregistrări care conţin totalul unor înregistrări din baza de date activă. Această bază de date trebuie să fie sortată după criteriul de totalizare şi va totaliza toate înregistrările care au aceeaşi valoare în această cheie. Sintaxa comenzii este:
          TOTAL TO fişier ON expr [FIELDS listă câmpuri]
          [domeniu] [FOR expl1] [WhlLE expl2] [NOOPTIMIZE]
         Comanda va crea o nouă bază de date (fişier) cu aceeaşi structură ca a bazei active, în care se vor încărca înregistrări totalizatoare obţinute din aceasta. Baza de date activă trebuie să fie ordonată fizic sau prin indexare după cheia expr.
Fiecare grup de înregistrări care au aceeaşi vatoare a cheii de indexare (a expresiei "expr") va genera o singură înregistrare în baza de date "fişier" în care însumarea câmpurilor va fi făcută pentru cele prezente în clauza FIELDS sau pentru toate câmpurile numerice din baza de date dacă a fost omisă această clauză.
         Exemplu:
         Considerăm baza de date cu stuctura:
              plătitor primitor suma
              Toni       Sandu    2000
              Toni       Norina    3000
              Andrei    Sandu    3000
              Andrei    Maria     5000
              Andrei    Norina    4000
        Această bază de date numită "plăti" va genera o bază de date nouă, centralizatoare numită "totplăti":
         use plăti
         TOTAL TO totplăti ON plătitor use
          Va rezulta o bază de date numită totplati care va conţine;
              Plătitor  primitor suma
     Toni        Sandu   5000
     Andrei    Sandu  12000

4.15 Relaţii între bazele de date

Să considerăm o bază de date care cuprinde materialele intrate într-o magazie de materiale dintr-o intreprindere. Deoarece acelaşi material poate să intre în zile diferite, de mai multe ori, este ineficient ca în acestă bază de date să avem informaţii ca denumirea materialului, preţul etc. Aceste elemente !a vom grupa într-o altă bază de date iar legătura înre ele o vom realiza după un câmp comun numit cod material. Atunci când ne interesează denumirea materialului pe baza codului materialului ne vom deplasa în cealaltă bază de date şi la codul respectiv vom găsi denumirea realizând astfel o importantă economie de spaţiu de memorare.
Această problemă se rezolvă în mod elegant prin crearea unor relaţii între bazele de date prin care cele două (sau mai multe) baze de date sunt văzute ca una singură, având toate elementele necesare.
Una din cele două baze de date este numitâ bază "părinte" deoarece în ea se fac căutările noastre iar cealaltă se numeşte bază "copil" care este subordonată primei. în momentul parcurgerii bazei de date părinte, indicatoru! de înregistrare se va deplasa automat în baza copii pe înregistrarea corespunzătoare cu care este pusă în relaţie.
În literatura de specialitate bazele de date între care s-au stabilit diverse relaţii se numesc baze de date complexe.
Modul de lucru cu astfel de baze de date este următorul:
- se deschid bazele de date, între care se vor stabili relaţii, fiecare în câte o zonă de lucru;
- se stabilesc relaţiile între aceste baze de date. Baza de date copil trebuie să fie indexată corespunzător cu aceeaşi cheie de indexare cu cea a relaţiei;
- se execută operaţiile asupra acestor baze de date (adăugare, modificare, consultare etc);
- la sfârşit se înlătură relatiile stabiiite şi se închid bazele de date.
Stabifirea relaţiilor se realizează în FoxPro cu ajutorul comenzii:
SET RELATION TO [expr1 INTO expn1 | expc1
[,expr2 INTO expn2 | expc2]...] [ADDITIVE]
Prin această comandă se stabiteşte o relaţie între o bază de date considerată părinte (baza de date activă) şi una sau mai multe baze de date considerate copii specificate prin numărul zonei în care sunt deschise sau aliasurile !or relaţia fiind indicată prin expresia "expr1", "expr2" etc. În general aceste expresii reprezintă un câmp comun bazei de date părinte şi copil şi de asemenea cheia de indexare a bazei de date copii.
Relaţiile între bazele de date pot fi de mai multe tipuri:
- relaţie unu la mai multe, când unei înregistrări în baza părinte pot să-i corespundă mai multe înregistrări în baza de date copil. În acest caz indicatoru! de înregistrare în baza de date copil se poziţionează pe prima înregistrare din cele relaţionate.
- relaţie mai multe la mai multe, când în baza de date părinte indicatoru! de în.registrare fiind pe una din înregistrăn, în baza copil acesi indicator se poziţionează pe prima înregistrare relaţionată.
Cu comanda:
SET SKIP TO [alias1 [,alias2]...]
o relaţie de tipul unu la unu se poate transforma în unu la mai multe. în acest caz căutând o înregistrare în baza de date părinte, indicatorul de înregistrări se pozitionează pe prima inregistrare în baza de date copil. La o comandă SKIP indicatorul de inregistrări nu se mută în înregistrarea părinte ci în înregistrarea copil, acest lucru întâmplându-se până când relaţia stabilită rămâne în vigoare (cheia de relaţie nu se modifică).
Exemplu: Considerăm baza de date NOM cu câmpurile cod, denumire şi pret şi baza de date MISC cu câmpurile cod, magazie, cantitate şi tip (tip mişcare poate fi 1 sau E).
USE MISC IN A
USE NOM IN B
SELE NOM
inde on cod to indnom
sele misc
set rela to cod into nom
brow
sele nom
brow
close data
Se va vedea că cele două browse-uri fiind pe ecran, în momentul în care ne plasăm în baza de date părinte (MISC), ne vom deplasa pe înregistrarea corespunzătoare automat în baza de date NOM. (Cu CTRL/F1 ne putem deplasa între cele două ferestre browse pentru a studia modul de acţiune al comenzii).
Pentru înlăturarea unei relaţii se utilizează comanda:
SET RELATION OFF INTO expn | expc
Acestă comandă şterge doar relaţiile indicate între baza de date activă şi baza de date copil indicată prin expn respectiv expc (alias) spre dosebire de:
SET RELATION TO
care şterge toate relaţiile existente.
Pentru aflarea cheii dintr-o relaţie între două tabele se foloseşte funcţia:
RELATION (expn1 [,expn2 | expc])
Functia retumează un şir de caractere reprezentând expresia cheie stabilită între baza de date activă şi cea specificată prin expn2 sau expc (numărul zonei în care este deschisă sau aliasul respectiv) pentru relaţia a expn1-a.
Numerotarea relaţiilor începe cu prima relaţie ce se stabileşte pentru o bază de date şi se continuă cu a doua, a treia şamd. Functia RELATION (2,B) va retuma a 2-a relaţie a bazei de date active, cu baza de date deschisă în zona B.
Fucţia cu sintaxa:
TARGET (expn1 [,expn2 | expc])
returnează un şir de caractere reprezentând aliasul cu care baza de date activă se află în relaţia a expn1-a, în ordinea definirii relaţiilor, sau dacă dorim să ne referim !a o altă bază de date decât cea activă o vom preciza prin zona în care ea este deschisă sau prin aliasul său.
Deci pentru a afla aliasul bazei cu care baza de date din zona B se află în relaţia a 2-a, vom folosi funcţia:
TARGET (2,B)

4.16 Fişiere de comenzi

Un fişier de comenzi reprezintă un fişier ce contine un şir de comenzi, care în general urmează să fie executate una după cealaltă. Aceste fişiere, care respectă un algoritm cu care ele au fost create (adică au o logică - urmăresc să reaiizeze diverse lucruri) poartă numele de programe. Ele sunt create în genera! de către utiiizatori folosind editorul de comenzi FoxPro.
Editorul de comenzi se lansează cu comanda:
MODIFY COMMAND fişier | ?
în urma lansării acestei comenzi îşi face apariţia pe ecran fereastra COMMAND care are numele "fişier" şi se poate introduce un text de la tastatură, sau în cea de a doua formă, apar vizualizate pentru selecţie toate programele existente (?). În cazul în care programul nu există ci urmează a fi introdus de la tastatură, fereastra este vidă, iar în cazul existentei sale în fereastră apar liniile programului care pot fi modificate.
În cadrul ferestrei COMMAND ne putem deplasa prin textul care a fost editat cu ajutorul tastelor săgeţi sau cu ajutorul mouse-ului. De asemenea există posibilitatea utilizării submeniului edit pentru a copia zone de text, a le selecta, a le muta sau copia etc,
În cadrul unui fişier de comenzi (pe care îl vom numi în continuare program) sunt introduse una după alta o serie de comenzi, în ordinea în care dorim să fie executate. Executarea lor nu se va face imediat (cum am făcut până acum) ci se va folosi comanda:
DO fişier [WITH [listă parametri] IN fişier2]
În care „fişier” este numele programului de executat, iar „listă parametri” reprezintă nişte informaţii care sunt transmise programului (din afara sa) pentru execuţie. De asemenea "fişier2" se foloseşte la execuţia unor proceduri şi va fi tratată mai jos.
În cazui unei comenzi DO se execută urmâtoarele categorii de fişiere în ordinea următoare (dacă nu este precizată şi extensia în comandă):
FISIER.EXE dacă el există
Ff.SER.APP
FISIER.FXP
FISIER.PRG
În cazul lansării comenzii modify command, fişierul care va fi creat (în cazul absenţei extensiei în comandă) va fi cel cu extensia .PRG care este implicită. Fişierele cu extensia .FXP se obţin din fişierele .PRG în urma compilării programelor, iar celelalte fişiere (APP şi EXE) se pot obtine în urma utilizării comenzii BUILD care va fi tratată ulterior.
Un program poate contine trimiteri la executia altor programe deci ele pot conţine comanda DO (imbricarea acestei comenzi), numărul maxim de nivele de imbricare fiind 32.
Execuţia programului se opreşte în următoarele cazuri:
- la executia comenzii RETURN
- la execuţia comenzii CANCEL
- la executia comenzii SUSPEND
- la execuţia comenzii QUIT
Comanda RETURN opreşte executia unui program şi predă executia programului apelant. în cazul în care nu există un program apelant, comanda este predată sistemului FoxPro.
Comanda CANCEL opreşte execuţia programului şi predă execuţia sistemului FoxPro.
Comanda SUSPEND suspendă executia programului. Acesta poate fi reluată din locul din care a fost suspendată prin folosirea comenzii RESUME.
Comanda QUIT opreşte execuţia programului, determină ieşirea din sistemul FoxPro şi predă comanda sistemului WINDOWS.
Numele unui program aflat în curs de executie poate fi aflat prin funcţia:
PROGRAM (expn) sau prin functia:
SYS(16 [,exprn])
Funcţia returnează un şir de caractere reprezentând numete programului în curs de executie sau numele ultimului program executat dacă în acesta a apărut o eroare.
Dacă este inclusă "expn" aceasta va desemna nivelul programului curent executat ce va fi returnat de funcţie (un program apelat din alt program are nivelul 2).

4.16.1 STRUCTURI DE CONTROL

În cadrul unui program există necesitatea ca în execuţie să sărim în anumite locurii peste anumite comenzi sau să executăm anumite comenzi numai în anumite cazuri. Acest lucru îl realizăm cu ajutorul unor comenzi condiţionate. De asemenea în anumite cazuri este necesar să executăm anumite comenzi de un număr de ori şi de aceea avem la dispoziţie comenzile repetitive. În FoxPro toate comenzile sunt realizate în concepţia programării structurate în care programul are o singură intrare şi o singură ieşre şi în care structurile comenzilor condiţionale iau până la urmă o formă apropiată de structurile imperative,
Programarea structurată, apărută prin anii 1970, s-a dezvoltat în scopul de a face programeie mai inteligibile, mai uşor de înţeles. În acest scop era necesar ca structurile greoaie să fie înlăturate. Structurile greoaie se datorau în special comenzii IF şi acestea nu puteau fi înlăturate dar ele au fost transformate în sensul ca cele două ieşiri să fie ulterior unite şi în final programul să aibă tot o structură liniară. Bineînţeles rolul programatorului rămâne unul important. Comanda IF
Format:
IF expl
comenzi
           [ELSE
comenzi ]
ENDIF
Această comandă dirijează executia programului pe două variante functie de o expresie logică, reunind pe o singură ramură, în final execuţia programului.
În cursul execuţiei comenzii se evaluează expresia logică expl. Dacă expl este adevărată, (.T.) toate comenzile care urmează până la ELSE sau ENDIF (când else nu există) vor fi executate; dacă această expresie este falsă (.F.), se execută toate omenzile între else (dacă există) şi ENDIF. În continuare programul se continuă cu comenzile existente după ENDIF.
Se pot folosi comenzi IF imbricate cu condiţia ca fiecărui IF să-i corespundă câte un ENDIF.
Pe liniile ce conţin comenzile IF, ELSE şi ENDIF se pot introduce comentarii. Exemplu:
IF marca .NOT. > 0
dele
? 'sunt marci mai mici decât 0'
ELSE
display
ENDIF
Această comandă va afişa mesajul 'sunt marci mai mici decât 0' pentru toate marcile care sunt mai mici decât 0 iar pentru înregistrările care au mărci mai mari, se vor tipări aceste înregistrări.
Schema logică a acestei comenzi se poate exemplifica astfel:
                        

În acest exemplu dacă a=b se vor executa comenzil (.T.), în caz contrar se vor executa comenzi2 (.F.), în ambele cazuri execuţia programului va continua cu prima comandă de după ENDIF.
Funcţia IIF
Este o functie ce returnează o valoare din două posibile functie de evaluarea unei expresii. Este un if imediat.
Format:
IIF(expl,expr1,expr2)
Dacă expl este .T. atunci funcţia va returna expr1, dacă ea este .F. funcţia va returna expr2.
Exemplu: IIF (a=0,' ';'*')
În exemplu dacă a=0 atunci funcţia va returna spaţiul, dacă nu atunci se va returna asteriscul. (Funcţia se utilizează de obicei în liste pentru a afişa valori diferite pentru un câmp funcţie de o condiţie ce trebuie evaluată imediat).
Comanda DO CASE
Format:
DO CASE
CASE expl1
comenzi 1
CASE expl2
comenzi 2
.................
[OTHERWISE
comenzi 3]
ENDCASE
Comanda execută un set de comenzi pe baza unor condiţii logice, în cursul execuţiei comenzii cazurile sunt evaluate şi primui rezultat .T. determină setul de comenzi ce vor fi executate. La primul caz .T. comenzile ce urmează sunt executate. Execuţia continuă până !a următorul caz sau până la ENDCASE. Dacă nu se întâlneşte nici un caz .T. atunci se execută comenzile care urmează după OTERWISE (dacă există).
În toate cazurile se execută apoi comenzile de dupâ ENDCASE. Se pot plasa comentarii pe aceeşi linie cu DO CASE şi ENDCASE. Schema bloc a acestei comenzi este următoarea:
                     

În schema logică se execută cazul care este .T. iar dacă nici unul din cazuri nu este .T. se execută comenzile otherwise. în continuare executia programului continuă pe aceeaşi ramură (cu comenzile ce urmează după ENDCASE).
Comanda DO WHILE
Format:
DO WHILE expl comenzi [LOOP]
[EXIT]
ENDDO
Această comandă execută comenzite ce se află între DO şi ENDDO atâta timp cât expl este adevărată.
EXIT este un cuvânt cheie care transferă controlul execuţiei din exteriorul buclei la prima comandă care urmează după ENDDO.
LOOP întoarce controlul execuţiei înapoi spre DO WHILE (la întâlnirea acestui cuvânt cheie). (Se execută deci o parte din comanda DO WHILE... ENDDO).
Exemplu:
do while marca>=0
if marca=0
EXIT
endif
replace nume with num, adres with adr
adaug=adaug+1
if adaug<=50
LOOP
endif
replace telef with tel
enddo
În acest exemplu se execută în mod normal (pentru mărci mai mari decât zero) înlocuirea numelui dintr-o bază de date cu numele dintr-o variabilă de memorie, etc şi se adaugă 1 la variabila adaug. Dacă s-au adăugat mai putin de 50 mărci atunci executia este reluată de la do while, iar dacă ne aflăm la peste 50 de parcurgeri ale buclei, atunci se face şi o înlocuire a zonei telef din baza de date cu variabila de memorie tel.
În cazul în care marca este zero, execuţia buclei se va termina şi controlul buclei se va preda la comanda următoare după ENDDO.
Comanda începe prin evaluarea expresiei expl. Dacă această expresie este adevărată, atunci se execută comenzile precizate (atenţie! În aceste comenzi pot fi prezente şi comenzife LOOP şi EXIT, ca şi anumite operaţii care influenţeză expl). Apoi execuţia este predată liniei ce conţine DO WHILE pentru evaluarea condiţiei. Dacă conditia a rămas .T. se execută comenzile, dacă nu, atunci comanda este încheiată şi se continuă cu prima comandă de după enddo.
Schema logică a acestei comenzi se exemplifică astfel:
                 

 
Comanda FOR ... ENDFOR
Format:
FOR memvar = expn1 TO expn2
[STEP expn3]
comenzi
[EXIT]
[LOOP]
ENDFOR | NEXT
Comanda execută bucla de un număr de ori specificat. Se utilizează o variabilă de memorie memvar, drept contor pentru a determina numărul de executii a comenzilor din interirul buclei. Variabila de memorie memvar nu trebuie să fie definită înaintea executării comenzii. Variabila expn1 se numeşte valoarea iniţială a contorului iar expn2, valoarea sa finală. Se execută toate comenzile până la întâlnirea cuvântului cheie ENDFOR sau NEXT. În acest moment se măreşte valoarea contorului expn3 (dacă există, dacă nu cu 1.) Se compară apoi valoarea obţinută cu valoarea finală (expn2).
Dacă acestă valoare este mai mică sau egală cu expn2, execuţia continuă, altfel execuţia este încheiată.
Cuvântul cheie EXIT transferă controlul în afara buclei (ca şi când s-ar fi atins valoarea expn2).
LOOP determină returnarea controlului la FOR, mărind contorul ca şi când   s-ar fi ajuns la ENDFOR.
Comenzile FOR ... ENDFOR pot fi imbricate. Comentarii se pot plasa în liniite ce conţin STEP expn3 şi ENDFOR (după acestea).
Expn1, expn2 şi expn3 pot fi expresii numerice întregi sau variabile de memorie întregi. Valorile lor sunt citite la început şi nu există control asupra lor e!e putând fi schimbate în cursul execuţiei (atentie!). Valoarea expn3 poate fi negativă caz în care valoarea contorului se micşorează şi valoarea iniţială trebuie să fie mai mică decât cea finală.
Exemplu:
For x= 1 to 10 step 2
?x*x
endfor
Comanda va afişa pătratele primelor numere impare mai mici decât 10.
Schema logică a acestei comenzi este ilustrată în continuare:
          
Comanda începe prin atribuirea valorii expn1 variabilei memvar. Apoi se evaluează dacă memvar este mai mic decât expn2. Dacă această conditie este îndeplintă, atunci se execută comenzile. După aceasta se adaugă expn3 variabilei memvar iar apoi se reia compararea cu expn2. Dacă memvar este mai mică decât expn2 se reia bucla, dacă nu controlul se predă primei comenzi de după endfor. În cadrul comenzilor pot fi prezente şi cuvintele cheie EXIT şi LOOP cu acţiunea lor
Comanda SCAN
Forrnat:
SCAN [NOOPTIMIZE]
[SCOPE] [FOR expl1] [WHILE expl2]
comenzi
[LOOP]
[EXIT]
ENDSCAN
Această comandă parcurge o bază de date de la primul până la uitimul articol realizând pentru fiecare înregistrare comenzile prevăzute în comandă, eventual funcţe de anumite condiţii, pentru doar o parte din înregistrări, dacă este dorit acest lucru.
Opţiunile au următoarele efecte:
NOOPTIMIZE - realizează dezactivarea rushmore pentru o acţiune neoptimizată, deci mai puţin rapidă. Deci nu recomandăm această opţiune.
scope (ALL, NEXT nr, REST) - precizează grupul înregistrărilor pentru care va acţiona comanda - toate înregistrările, următoarele nr înregistrări, restul înregistrărilor de la înregistrarea curentă până la sfârşitul bazei de date.
FOR şi WHILE precizează condiţiile (expl1 şi expl2) care aplicate asupra înregistrărilor, face să se execute comenzile prevăzute (dacă condiţiile sunt .T.) sau nu.
LOOP - întoarce la SCAN executia comenzii în momentul când se atinge acestă opţiune.
EXIT - opreşte acţiunea comenzii ca şi când s-ar fi atins sfârşitul fişierului.
Comentariile se pot plasa în comandă după ENDSCAN pe aceeaşi finie.
Exempiu:
Considerăm baza de date numită BAZA cu următoarele câmpuri: marca, nuine, prenume, adresă şi telefon
SCAN for prenume = 'ion'
repl prenume with 'ION'
Endscan
În cadrul acestei comenzi se înlocuieşte în toată baza de date prenumele 'ion' (scris cu litere mici) cu 'ION' scris cu majuscule pentru toate înregistrările în care prenumele ion este scris cu minuscule.
Schema logică a instrucţiunii este următoarea:
Comanda la început verifică dacă pointerul de înregistrare se găseşte sfârşitul de fişier (EOF - end of file). dacă nu, atunci se execută comenzile şi se avansează la înregistrarea următoare (dacă sunt prezente opţiunile for sau while se verifică şi îndeplinirea condiţiilor prevăzute de acestea. Dacă este prezentă clauza scope se acţionează în conformitate cu ea. În continuare (se pot întâlni şi clauzele exit sau loop), după ce s-a avansat cu o înregistrare se reface bucla verificând dacă s-a ajuns la sfârşitul fişierului când se întrerupe execuţia, aceasta continuând cu prima comandă care urmează comenzii scan.
      
4.17 Proceduri şi funcţii definite utilizator

Aşa cum FoxPro-u! are o serie de funcţii, tot aşa, în special când avem porţiuni de program care trebuie utilizate de mai mu!te ori şi în special când dorim să utilizăm părti din program în scopul de a ne furniza anumite calcule, elemente care vor fi utilizate în continuare, putem să ne definim funcţii proprii.
O funcţie definită utllizator (UDF - user define file) este o secvenţă de program care întoarce o valoare programului apelant. Poate fi un program de sine stătător, o procedură sau o functie într-un program. UDF-urile se apelează prin numele lor. Numele nu are voie să fie identic cu acela al unei functii FOXPRO (funcţia FOX are precedenţă şi va fi executată neglijând UDF - ul.
EXEMPLU:
Utilizarea unei cifre de control.
În cazul programelor de introducere date (numere de marcă, coduri de produse etc) este foarte util să poată fi detectate erorile de introducere chiar de la introducerea datelor. De aceea se utilizează cifrele de control. Cifra de control, în cazul în care una din cifrele numărului este schimbat (dintr-o eroare) se schimbă şi cifra de control ceea ce duce la depistarea acestei erori (prin simplul fapt că programu! va semnaliza o eroare este un semn că s-a greşit la completarea cifrei sau !a introducerea ei).
Folosim metoda M11 (modulo 11), care are avantajul că oricare din cifre s-ar schimba, cifra de control se schimbă şi ea şi permite detectarea erorii. Această metodă constă în înmultirea primei cifre a numărului cu 2, a celei de a doua cu 3 ... , se însumează aceste produse şi suma se împarte !a 11, restul fiind cifra de control.
prima cifră x 2 Numerele cu care se înmulţesc cifreie tre-
doua 3 buie să fie numere prime între ele şi să fie
treia 5 prime faţă de numărul cu care se împarte.
patra 7
..........
Se adună produsele calculate ca mai sus şi suma lor se împarte la 11. Dacă restul este 10, cifra de control este 0, alfel restul este cifra de control. Acestă cifră obţinută (cifra de control) se alătură (ca ultimă cifră) la numărul initial. Marca 45 devine de exemplu 451.
La introducere (când vom avea de introdus pentru marca 45, vom folosi marca 451, deci marca cu cifră de control, cifră care va inlocui marca peste tot cifra ce reprezintă marca), dacă se va greşi la introducere şi se va introduce 457 (aşa se vedea pe document sau aşa va vedea operatorul sau va tasta el eronat), programul va sesiza deoarece va verifica cifra de control.
Procedurile pot fi plasate în programe separate (una sau mai multe proceduri) la când se utilizează înaintea lansării apelării procedurii a comenzii set procedure to, sau la sfârşitul unui program (după încheierea programului ... return) într-un program activ în momentul lansării programului care apelează procedura.
Procedurile pot fi utilizate pentru diferite calcule, validarea unor introduri (get) sau în alte scopuri. Ele se apelează prin numele lor eventual punând între paranteze parametrul (parametrii).
Exemplu: mai jos este prezentat un program (o procedură) care calculează cifra de control a unor numere. Numărul căruia i se calculează cifra de control are să aibă maxim 4 cifre. Acest număr se va transforma într-unul de cinci cifre maxim prin adăugarea cifrei de control la sfârşitul numărului,
PROGRAMUL DE APELARE AL FUNCŢIEl
* CCP.PRG 1
clea &&2
set procedure to control &&3
@ 1,2 to 22,78 &&4
@ 3,35 say 'PROCEDURA' &&5
@ 4,24 say 'DE CALCUL AL CIFREI DE CONTROL' && 6
@ 2,5 to 5,75 double &&7
cc = 'T' &&8
do while cc='T' &&9
icod=0 &&10
@ 6,27 say 'CODUL:' &&11
@ 6,35 get icod pict '9999999' &&12
Read &&13
if icod=0 &&14
exit &&15
endif &&16
dw=control(icod) &&17
@ 6,44 say dw &&18
set curs off &&19
dw = inkey(0) &&20
set curs on &&21
@ 6,44 say &&22
enddo &&23
clear &&24
return &&25
*: EOF: CCP.PRG 26
FUNCŢIA APELATĂ (ca program separat)
*CONTROL.PRG 27
function control &&28
param n &&29
dimens I(5) &&30
y=n &&31
j=5 &&32
q=int(n/10)  &&33
i=0 &&34
do while .not. j<=0 &&35
l(j)=y-q*10  &&36
y=q &&37
q=int(q/10) &&38
j=j-1 &&39
enddo &&40
q=i(5)*2+i(4)*3+i(3)*5+i(2)*7+i(1 )*11 &&41
y=int(q/11) &&42
c=q-y*11 &&43
if c=10 &&44
c=0 &&45
endif  &&46
return c &&47
EOF: CONTROL.PRG 48

Comentarea liniilor programetor:
1. Linie comentariu - programul de calcul al cifrei de control CCP.
2. această linie şterge ecranul
3. se realizează posibilitatea comunicării cu procedura de calcul a cifrei de contro! (care este situată într-un program numit CONTROL.PRG)
4. comanda realizează pe ecran un chenar dreptunghiular din linia 1 coloana 2 până în linia 22 coloana 78
5 şi 6. comenzi care realizează afişarea unor şiruri de caractere.
7. reafizează un alt chenar, dublu în care s-a tipărit titlul.
8. variabila cc ia valoarea logică .T.
9. se iniţiază o buclă (cât timp variabila cc este true)
10. variabila de memorie icod ia valoarea 0
11. se afişează şirul de caractere 'CODUL' pentru a şti că se cere introducerea codului
12. se cere (prin GET introducerea codului, a unei cifre pentru care programul urmează să calculeze cifra de control.
13. comanda READ de citirire a introducerii făcute
14. testează dacă codul introdus este 0
15. dacă s-a introdus codul 0 se iese din buclă (oprirea programului)
16. se încheie testarea (if este urmat prin sintaxa instrucţiunii de endif).
17. variabila dw ia valoarea cifrei de control a cifrei (codului) introduse prin get cifra este diferită de 0, după apelarea procedurii de calcul care calculează cifra de control)
18 se afişează acestă cifră de control
19. se dezactivează cursorul
20. se aşteptă introducerea unui caracter de la tastatură
21. ss activează cursorul
22. se afişează un spaţiu (pentru a şterge cifra decontrol)
23. se încheie bucla (do... enddo)
24. linia realizează ştergerea ecranuiui
25. se încheie programul
26. comentariu marcând sfârşitul programului
27. marchează începutul procedurii control (nu trebuie scrisă în procedură. A fost pusă aici doar pentru a şti ce program este scris mai jos).
28. marchează începutul procedurii (obligatoriu prima linie din program)
29. parametru! procedurii. Prin comanda dw=control(icod) se transmite cifra (icod) acestui parametru şi el ia valoarea lui, deci n=icod. în felul acesta se legătura între program şi procedură.
30. se defineşte variabila I ca tablou cu o dimensiune şi cinci etemente
31. variabila y ia valoarea parametrului (y=n=icod)
32. variabila j ia valoarea 5 (cifra noastră cu tot cu cifră de control va avea maximum cinci caractere)
33. variabila q ia valoarea primelor 3 cifre din numărul nostru (se neglizează ultima cifră)
34. se iniţializează variabilele tabloului l cu valoarea 0.
35. se iniţiază un ciciu ce se repetă atâta timp cât j nu este negativ sau 0 (în buclă se vor face înmulţiriie fiecărei cifre a numărului conform algoritmului de calcul al cifrei de control. Pentru aceasta va trebui să separăm numărul în cifrele componente înmuftim cifrele în mod corespunzător şi să facem suma produselor numerelor),
36. se stabileşte cifra de cel mai mic rang a numărului (cifra a patra)
37. q ia valoarea variabilei y
38. se mai reduce numărul cu o cifră (pentru stabilirea cifrei de rang următor)
39. se reduce j cu 1 (pentru că s-a parcurs o iteratie)
40. se încheie iteratia, se compară valoarea lui j cu 0 şi se reia dacă j este mare decât 0
41. cum toate cifrele numărului au fost separate (în i(j)) se poate calcula produsul conform algoritmului de cafcul al cifrei de control
42. variabila y ia valoarea câtului dintre produsu! obţinut şi cifra 11
43. cifra de control (cc) este restul acestei împărtiri
44. dacă restul este 10
45. el devine 0
46. se încheie testarea
47. se încheie procedura prin predarea cifrei de control programului în cadrul comenzii dw=control(icod).
48. comentariu ce marchează sfârşitul procedurii.
În continuare este dată o schemă care indică modul de funcţionare al procedurii:
* CCP.PRG
Clea                                          EXPLICAREA
set procedure to control
@ 1,2 to 2278              PROCEDURII DE CALCUL A CIFREI
@ 3,35 say 'PROCEDURA'         DE CONTROL
@ 4,24 say 'DE CALCUL AL CIFREI DE CONTROL'
@ 2,5 to 5,75 double
cc = 'T'                             Explicaţiile sunt subliniate!
do while cc=.t,
icod=0
@ 6,27 say 'CODUL:'
@ 6,35 get icod pict '9999999'                 icod=1234
read
if icod=0
exit
endif
dw=control(icod)                                       1
@ 6,44 say dw                         (afişează cifra de control calculată)
Set curs off                              (valoarea este preluată din
dw=!nkey(0)                             procedură, după ce ea a fost
set curs on  m                               executată)
@ 6,44 say ' '
enddo
clear
return
EOF; CCP.PRG
function control
Param n                                                       n=1234
dimens I(5)
y=n
j=5
q=int(n/10)                                          q=int(1234/10)=123
I=0                                                  IT1      IT2      IT3     IT4      ultima iteraţie
Do while .not.j<=0                                      j=4>0   j=3>0  j=2>0   j=1>0
I(j)=y-q*10                                     i(5)=4  i(4)=3   i(3)=2  i(2)=1   i(1)=0
y=q                                              y=123     y=12     y=1    y=0      y=0
q=int(q/10)                                    q=12       q=1      q=0    q=0     q=0
J=J - 1                                j=4          j=3       j=2      j=1     j =0
enddo
q=i(5)*2+i(4)*3+i(3)*5+i(2)*7+i(1)*11         q=4*2+3*3+2*+7=34
y=int(q/11)                                               y=int(34/11)=3
cc=q-y*11                                                cc=34-3*11=1
if cc=10                                                    cc #10 = 1
cc=0
endif
return cc                                                    cc = 1
*: EOF: CONTROL.PRG

La definirea unei funcţii sau proceduri, trebuie stabilite prelucrările ce vor avea loc în interiorul ei, care sunt parametrii functiei (în cazul că are parametrii, şi care sunt parametrii transmişi de functie programului. Numele sub care sunt definiţi parametrii în funcţie pot fi diferiţi de cel care apare în program, recunoaşterea lor fiind automată.
Definirea unei funcţii se face prin intermediul comenzii:
FUNCTION nume_funcţie
în care nume_funcţie este numele atribuit funcţiei, deci numele prin care este recunoscută de către sistem.
Definirea procedurilor se realizează analog:
PROCEDURE nume_procedură
Numele funcţiei sau procedurii poate avea maxim 10 caractere. Apelul lor se realizează prin numele lor urmat între paranteze de lista parametrilor de comunicare cu funcţia, ca rezultat al prelucrărilor din cadrul funcţiei. Ordinea în care sunt aşezaţi parametri este aceeaşi cu ordinea din comanda parameter din cadrul functiei, astfel încât fiecărui parametru din !ista de !a apelare să-i corespundă câte unul în lista parametrilor din funcţie,
o procedură se lansează în execuţie prin comanda DO urmată de numele procedurii. Parametrii acesteia se introduc după cuvântul WITH a acestei comenzi.
Terminarea normală a unei proceduri sau funcţii se face la întâlnirea comenzii RETURN, când sunt predaţi programului apelant parametrii, la executarea ultimei comenzi a procedurii (funcţiei), la întâlnirea comenzilor SUSPEND, CANCEL şi QUIT cu acţiunea lor specifică.
Comanda:
SET PROCEDURE TO [fişier]
asociază la programul curent, în execuţie fişierul (cu extensia .PRG) unde se vor căuta toate procedurile ce nu sunt găsite în programul apelant.
Comanda:
CLOSE PROCEDURE
închide fişierul respectiv (realizează disocierea dintre program şi fişierul de proceduri).
În cazul apelării unei proceduri se procedează astfel:
- se caută procedura în programul curent (apelant)
- se caută în fişierele deschise cu comanda SET PROCEDURE
- se caută în toate programele active (în curs de execuţie) la diferite nivele (până la nivelul 1 (primul executat).
- se caută fişierul cu nume identic cu al procedurii considerând comanda ca executând un program. Pentru ca o căutare să fie făcută numai într-un anumit fişier, deumirea acestuia se va include în clauza IN a comenzii DO.

2 comentarii:

  1. doresc sa stiu daca se poate lua legatura cu administratorul sau daca exista legatura catre forum

    RăspundețiȘtergere
  2. Casino Secret - The Ultimate Free Slot Machine Games!
    The ultimate free casino slot game! Experience the thrill of casino gambling with カジノ シークレット our exclusive free slot bk8 machine games! vua nhà cái Play slots and more with No Download or Registration

    RăspundețiȘtergere