Professional Documents
Culture Documents
1
126 7 01/30/05 6500000
127 8 01/31/05 37400000
128 1 02/01/05 13000000
129 9 02/01/05 55000000
130 4 02/02/05 72000000
Tabela PRODUSE_DIN_FACTURI_EMISE
Nr_factur
cod_produs Pret_unitar cantitate
a
11 100 62000 100
19 100 52000 100
20 100 55000 250
12 101 10000 250
14 102 125000 200
15 102 110000 250
17 103 250000 100
12 104 10000 200
25 105 80000 1000
15 106 110000 200
17 106 250000 100
14 107 125000 100
21 107 70000 250
23 108 35000 200
24 108 70000 500
18 109 15000 200
20 109 55000 200
13 110 10000 200
16 111 130000 500
22 111 55000 500
13 112 10000 300
18 113 15000 100
23 114 35000 200
25 114 80000 200
15 115 110000 100
18 116 15000 200
22 117 55000 200
25 117 80000 100
12 118 10000 100
13 118 10000 100
15 118 110000 200
11 119 62000 250
21 120 65000 250
24 121 70000 250
2
22 122 55000 1000
25 123 82000 100
14 124 125000 100
16 124 130000 200
16 125 130000 200
21 126 65000 100
11 127 62000 200
14 127 125000 200
16 128 130000 100
20 129 55000 1000
15 130 110000 200
17 130 250000 200
Tabela PRODUSE
Cod_produ
den_produs unit_masura
s
11 vopsea alba kg
12 Var kg
13 Nisip kg
14 tabla aluminiu kg
15 geam sticla 5 mm mp
16 geam sticla 10 mm mp
17 tabla inox kg
18 Ciment kg
19 Adeziv kg
20 vopsea neagra kg
21 Diluant litru
22 plasa sirma kg
23 cuie 10 cm kg
24 vopsea verde kg
25 var lavabil cutie
Visual FoxPro este un SGBD care aplică principiile teoriei relaţionale, dispunând de
facilităţile unui SGBD relaţional performant. În Visual FoxPro se materializează conceptul de
bază de date (Database Container) în accepţiunea unei colecţii de tabele sau relaţii (Tables) între
care se realizează legături permanente prin intermediul cheilor primare şi străine. Se păstrează,
din raţiuni de compatibilitate, comanda SET RELATION care permite stabilirea de relaţii
temporare. Baza de date foloseşte un fişier cu extensia .DBC. De asemenea, aceasta posedă un
dicţionar de date (fişier cu extensia .DCT) şi un fişier index (cu extensia .DCX).
Elementul central al bazei de date este tabela (table). O tabelă corespunde noţiunii teoretice
de relaţie. Coloanele tabelei sunt denumite atribute sau câmpuri (fields). Noţiunii de tuplu îi
corespunde cea de înregistrare (record). Fiecare înregistrare are un număr intern (recno) care
depinde de ordinea "fizică" în care înregistrările au fost adăugate în tabelă. O mare parte din
comenzile SGBD-ului au ca domeniu toate înregistrările tabelei, în timp ce altele doar
3
înregistrarea curentă. Caracteristic categoriei de SGBD-uri din care face parte FoxPro este
prezenţa unui pointer intern (un fel de contoar) care memorează numărul înregistrării curente.
Informaţii despre înregistrări sunt furnizate de funcţii, precum:
• Recno() - furnizează numărul intern al înregistrării curente;
• Reccount() - furnizează numărul total de înregistrări din tabelă.
O bază de date FoxPro, ca orice bază de date relaţională, este alcătuită din una sau mai multe
tabele puse în legătură prin intermediul cheilor străine. Atât declararea cheilor primare, cât şi
acelor străine (şi implicit a restricţiilor referenţiale) se bazează în VFP pe indecşi asociaţi
tabelelor care sunt firesc incluşi în baza de date.
În Visual FoxPro o bază de date este alcătuită nu numai din tabele, dar cuprinde şi:
• tabele derivate (views) care pot fi locale sau la distanţă (remote - sunt utilizate pentru a
face legătura cu baze de date gestionate de alte SGBD-uri);
• conexiuni cu alte baze de date;
• proceduri stocate care sunt blocuri de program păstrate în dicţionarul de date. Cele mai
utlizate tipuri de proceduri stocate în VFP sunt funcţii şi proceduri pentru validarea
modificărilor în baza de date, funcţii pentru calcularea valorilor implicite ale unor
atribute şi declanşatoare (triggere).
Numele tabelelor, atributele care o compun, restricţiile de cheie, regulile de validare la nivel
de atribut şi înregistrare, legăturile permanente dintre tabele (cheile străine), declanşatoarele,
precum şi celelalte proceduri stocate sunt păstrate într-un fişier special, denumit dicţionar de date
care în VFP are extensia .DBC (DataBase Container). Tabelele au extensia .DBF, iar indecşii
.CDX.
Mecanismul de bază în declararea domeniilor de valori ale unui atribut are la bază
precizarea tipului şi lungimii fiecărui câmp dintr-o tabelă.
4
• Tipul Double (real, dublă precizie) presupune repreyentarea datelor numerice în virgulă
mobilă dublă precizie şi ste destinat reprezentării numerelor foarte mari sau foarte mici.
• Tipul Currency (format monetar) este utilizat pentru memorarea datelor referitoare la
tranzacţii în unităţi monetare.
Tipul Dată calendaristică este implementat prin Date (dată) şi DateTime (dată-oră)
• Date este utilizat pentru memorarea datelor calendaristice cuprinse în domeniul
01/01/100 şi 31/12/9999. Datele calendaristice se pot afişa în diferite formate stabilite
prin comanda SET DATE.
• DateTime permite o gestiune mai analitică a timpului prin includerea alături de date
calendaristică şi a momentelor de timp din cadrul unei zile. Ora este stocată în formatul
HHMMSS, unde HH reprezintă ora în formatul de 24 de ore., ora variind în domeniul
00:00:00 a.m. şi 11:59:59 p.m.
Exemplu:
Data_com, D
Data_nast, DT
Tipul Logical (logic) desemnează date ce nu pot lua decât două valori: True (adevărat) şi
Flase (fals). Are lungimea de un caracter. Pentru adevărat este asociată litera T sau cifra 1, iar
pentru fals litera F sau cifra 0.
Exemplu: taxabil, L, 1.
Tipul Memo se foloseşte pentru date tip caracter care depăşesc 254 de caractere şi prevede
o dimensiune de stocare variabilă de la înregistrare la alta. Un bloc reprezintă un număr fix de
caractere pe care FoxPro le rezervă pentru un câmp memo. În mod prestabilit, FoxPro utilizează
64 de octeţi pentru un bloc. FoxPro stochează valorile câmpurilor memo într-un fişier distinct
care are extensia .FPT şi cu acelaşi nume cu al tabelei. Utilizând câmpurile memo se pot memora
nu numai texte, ci şi alte informaţii: fişiere executabile DOS, imagini, biţi de sunet etc.
Tipul General apare începând cu versiunea FoxPro 2.5 sub Windows. Într-un câmp de tip
general pot fi păstrate obiecte de diferite tipuri: grafic, imagine, sunet, foaie de calcul, adică
obiecte create cu alte aplicaţii Windows. Datorită folosirii mecanismului OLE (Object Linking
and Embedding = legare şi încorporare de obiecte), un obiect poate fi păstrat într-un câmp de tip
general prin legare sau prin încorporare. În ambele cazuri între baza de date şi aplicaţia sursă cu
care a fost creat obiectul se realizează o legătură. Această legătură permite modificarea
obiectelor încorporate sau legate la baza de date, direct din FoxPro (apelarea aplicţiei sursă cu
care se modifică obiectul se face din FoxPro). În cazul acestei relaţii FoxPro este considerat
client pentru că foloseşte obiecte create cu alte aplicăii, acestea fiind servere.Un câmp General
este un câmp Memo specializat. FoxPro stochează câmpurile General în acelaşi fişier .FPT
utilizat de celelalte câmpuri Memo ale tabelului, însă acestea nu sunt utilizate în acelaşi fel.
Câmpurile General sunt utilizate în primul rând pentru stocarea referinţelor la obiecte OLE
legate. Prin legare obiectul nu este inclus fizic în document, ci se memorează doar referinţele
despre obiect necesare localizării şi descrierii obiectului. Prin încorporare o copie a obiectului
este inclusă fizic în document.
În VFP stocarea datelor se realizează de cele mai multe ori în tabelele care compun baza de
date. În afară de acestea, în VFP se pot utiliza variabile sau constante. Dacă datele memorate în
tabele sunt stocate pe disc şi le putem considera permante deoarece ele nu se pierd între două
sesiuni de lucru, datele memorate în variabile sunt stocate în memoria internă a calculatorului şi
au un caracter temporar deoarece la închiderea sesiunii de lucru ele vor fi pierdute. Variabilele şi
constantele sunt utilizate mai ales în cadrul programelor.
Variabilele de memorie pot fi simple sau structurate în tablouri. O variabilă are asociată o
locaţie de memorie în care se poate scrie sau citi o valoare. Referirea la o locaţie de memorie în
vederea citirii/scrierii unei valori se face doar prin nume, în cazul variabilelor simple de memorie
şi prin nume urmat de indicii care indică numărul liniei şi numărul coloanei (dacă este un tablou
bidimensional) pentru tablourile de date. De exemplu, tabloul IMP_SAL (2,3) poate stoca 6
valori în acelaşi timp.
5
Definirea unei variabile de memorie se poate face prin simpla atribuire a unei valori, iar în
cazul tablourilor de date se utilizează comanda DIMENSION.
Exemplu:
SAL_BRUT=1000000
DIMENSION IMP_SAL(2,3)
IMP_SAL(1,1)=0.15
IMP_SAL(1,2)=0.20
IMP_SAL(1,3)=0.22
IMP_SAL(2,1)=0.25
IMP_SAL(2,2)=0.30
IMP_SAL(2,3)=0.40
? SAL_BRUT*IMP_SAL(2,1)
În plus, FoxPro dispune de numeroase funcţii de conversie care dau posibilitatea
transformării datelor de diferite tipuri astfel încât acestea să fie compatibile pentru a fi utilizate în
expresii. De exemplu, conversia este necesară la specificarea expresiei indexului compus pentru
o tabelă, expresie care să combine o dată de tip şir de caractere cu date numerice sau date de tip
şi de caractere cu date calendaristice. În astfel de expresii toate datele trebuie să fie compatibile
din punct de vedere al tipului de dată.
Cele mai utilizate funcţii de conversie a tipului de dată sunt:
• Conversia datelor numerice în date de tip şir de caractere
STR(expresie numerică [,lungime [, număr_zecimale]]), în care lungime reprezintă numărul
de caractere pe care-l va conţine şirul de caractere returnat, iar număr_zecimale num[rul de
cifre de la partea fracţionară care-l va conţine şirul de caractere returnat.
• Conversia datelor de tip şir de caractere în date numerice
VAL(expresie_caracter)
• Conversia datelor calendaristice în date de tip şir de caractere
DTOC(expresie_dată[,1], în care parametrul '1' permite conversia unei date calendaristice
într-un şir de caractere potrivit pentru indexare, în sensul că se păstrază succesiunea
cronologică a înregistrărilor din tabelă.
• Conversia datelor de tip şir de caractere în date calendaristice
CTOD(expresie_caracter)
Crearea unei baze de date se realizează cu comanda CREATE DATABASE.
6
Inserează un câmp
nou deasupra
câmpului selectat
Şterge câmpul
selectat din
tabelă
Fig. nr..1. Caseta de dialog pentru crearea tabelelor în Visual FoxPro utilizând Table
Designer
Din cele trei cadre de pagină - Fields, Indexes şi Table este utilizat mai întâi primul. Cadrul
de pagină Fields este utilizat pentru definirea câmpurilor din tabelă, prin intermediul
următoarelor elemente:
• Name specifică numele câmpului. Spaţiile nu sunt acceptate. În Visual FoxPro numele
atributelor asociate tabelelor din baza de date container (Database Container) pot depăşi
10 caractere. Tabelele independente (free tables) trebuie să respecte însă limita de 10
caractere pentru numele câmpurilor, specifică versiunilor anterioare lui 3.0.
• Type specifică tipul câmpului.
• Width specifică numărul de caractere sau de cifre pentru fiecare câmp.
• Decimal precizează numărul de cifre de la dreapta punctului zecimal. Se precizează doar
la datele numerice, cu excepţia celor de tip întreg
• Index specifică dacă valorile câmpului sunt ordonate crescător sau descrescător.
• NULL - când este specificat, atributul respectiv poate accepta valori nule.
Imediat după declararea ultimului câmp, după salvarea structurii, pe ecran apare mesajul
"Input data records now?" . Dacă se răspunde cu Yes atunci se pot introduce înregistrări în
tabela nou creată.
ATENŢIE! Este recomandat ca introducerea înregistrărilor să se facă după definirea tuturor
tabelelor, a restricţiilor şi a relaţiilor dintre ele, pentru a asigura astfel consistenţa şi
corectitudinea datelor introduse.
7
pointeri distincţi pentru fiecare înregistrare. În cazul tipului Unique sunt incluse doar valorile
distincte ale expresiei de construire a indexului. Dacă mai multe înregistrări generează aceeaţi
valoare a expresiei indexului, este stocată numai prima întâlnită. Candidate indică faptul că
expresia indexului respectiv este o cheie candidat (cheie alternativă), deci creează un index unic
care include fiecare înregistrare din tabel.
FoxPro nu limitează expresiile indecşilor la un singur câmp. Orice combinaţie de câmpuri
poate fi folosită drept expresie a unui index. Pentru a crea o expresie complexă se foloseşte
caseta de text Expression din Table Designer.
Dezavantajul comenzii INDEX este că nu permite declararea unui index primar şi,
implicit, a cheii sale de indexare ca şi cheie primară a tabelei curente. Din acest punct de vedere
de mare folos poate fi comanda SQL ALTER TABLE. Spre exemplu, pentru tabela CLIENTI se
poate crea indexul cod_client ce poate fi declarat index primar şi implicit atributul cod_client
este declarat cheie primară astfel:
ALTER TABLE CLIENTI ADD PRIMARY KEY COD_CLIENT TAG COD_CLIENT
sau
ALTER TABLE CLIENTI ALTER COLUMN COD_CLIENT N(5) PRIMARY KEY.
Indecşii creaţi prin ALTER TABLE fac obligatoriu parte din indexul structurat al tabelei.
8
Fig.nr.2. Indecşii tabelei Produse_din_facturi_emise
Cel mai simplu mod de creare a legăturilor permanente între tabele este pornind de la
proiectantul bazei de date (Database Designer) printr-o sinplă "tragere" de mouse între numele
indexului primar din tabela părinte şi numele indexului regular (obişnuit) corespondent din
tabela copil. Fig. nr. ilustrează acest lucru.
10
PRIMARY KEY COD_PRODUS TAG COD_PRODUS)
Structura unei tabele din baza de date poate fi modificată prin comanda MODIFY
STRUCTURE, iar vizualizarea acesteia se poate face cu comanda LIST STRUCTURE.
Deschiderea unei baze de date se face cu comanda OPEN DATABASE care are următoarea
sintaxă:
OPEN DATABASE [FileName | ?]
[EXCLUSIVE | SHARED]
[NOUPDATE]
[VALIDATE]
Accesul la datele din tabelele bazei de date este permis numai după deschiderea lor, adică
după asocierea zonei de lucru prin comanda USE. În Visual Fox Pro formatul acestei comenzi
este:
USE [[DatabaseName.]Table | SQLViewName | ?]
[IN nWorkArea | cTableAlias]
[ONLINE]
[ADMIN]
[AGAIN]
[NOREQUERY [nDataSessionNumber]]
[NODATA]
[INDEX IndexFileList | ?
[ORDER [nIndexNumber | IDXFileName
| [TAG] TagName [OF CDXFileName]
[ASCENDING | DESCENDING]]]]
[ALIAS cTableAlias]
[EXCLUSIVE]
11
[SHARED]
[NOUPDATE]
Închiderea tabelei se face tot prin comanda USE sau prin comenzile CLOSE TABLES,
CLOSE DATABASES sau CLOSE ALL.
Fiecare tabel al bazei de date are asociată o zonă de lucru prin intermediul căreia are loc
accesul la date. Gestionarea zonelor de lucru se realizează prin comanda SELECT care are
următoarea sintaxă:
SELECT nWorkArea | cTableAlias
Exemplu:
SELECT 1
USE CLIENTI
SELECT 2
USE FACTURI_EMISE
SELECT 3
USE PRODUSE
Ultima zonă deschisă se numeşte zonă curentă. Asupra tabelei din zona curentă au efect
comenzile date. Dacă se utilizează câmpuri ale tabelelor din alte zone, numele câmpurilor va fi
precedat de un prefix ce reprezintă numele sau alias-ul tabelului.
Exemplu:
SELECT 1
USE clienti
SELECT 2
USE facturi_emise
LIST FOR facturi_emise.cod_client=clienti.cod_cl
Actualizarea unei baze de date (respectiv a unei tabele) se realizează după deschiderea
acesteia şi are în vedere trei acţiuni:
• adăugarea de noi înregistrări la cele existente în tabelă;
• ştergerea unor înregistrări;
• modificarea valorii unor atribute.
12
Exemplu: Actualizaţi tabela CLIENŢI prin adăugarea unei înregistrări, a unei înregistrări vide şi
inserarea unei înregistrări vide după înregistrarea a doua a tabelei.
USE CLIENTI
APPEND
APPE BLANK
GOTO 2
INSERT BLANK
Exemplu: Actualizaţi tabela CLIENŢI prin ştergerea clienţilor care au codul mai mare decât 7.
USE CLIENTI
CLEAR
SET DELETED OFF
DELETE FOR COD_CLIENT>7
NOTE se marchează pentru ştergere înregistrarile pentru care codul clientului este;
mare decât 7
LIST
NOTE toate înregistrările din baza de date sunt afişate, cele marcate pentru
ştergere având un asterisc în dreptul lor
USE
Exemplu: Actualizaţi tabela CLIENŢI prin ştergerea înregistrărilor al căror număr de înregistrare
este mai mare decât 8.
USE CLIENTI
DELETE FOR RECNO()>8 && sunt marcate pentru ştergere înregistrările ;
13
cu numărul de înregistrare mai mare decât 8
SET DELETED ON
LIST && înregistrările marcate pentru ştergere nu pot fi accesate prin această comandă
USE
O înregistrare marcată pentru ştergere nu este ştearsă fizic din baza de date. Eliminând
marcajul de ştergere, înregistrarea este refăcută, ea redevenind accesibilă pentru toate comenzile.
Înlăturarea marcajului de ştergere se realizează prin comanda RECALL.
Exemplu: Actualizaţi tabela CLIENTI prin ştergerea logică a înregistrărilor cu numărul de
înregistrare mai mic decât 3. După aceea refaceţi toate înregistrările marcate logic.
USE CLIENTI
DELETE FOR RECNO()<3
LIST
RECALL ALL && sunt refăcute toate înregistrările
LIST
USE
Ştergerea la nivel fizic se realizează prin comanda PACK care efectuează ştergerea fizică a
tuturor înregistrărilor marcate pentru ştergere din baza de date. În acest caz trebuie folosite
succesiv comenzile DELETE şi PACK.
Exemplu: Actualizaţi tabela CLIENŢI prin eliminarea definitivă a înregistrării numărul 4.
USE CLIENTI
DELETE RECORD 4 && se marchează pentru ştergere înregistrarea a 4-a
PACK && se şterge fizic a 4-a înregistrare
LIST
USE
O altă comanda cu privire la ştergerea înregistrărilor din baza de date este comanda ZAP
care şterge toate înregistrările din baza de date activă.
Comanda ZAP realizează ştergerea fizică a înregistrărilor din tabelele bazei de date într-o
singură etapă. Astfel secvenţa de comenzi:
USE CLIENTI
ZAP
este echivalentă cu:
USE CLIENTI
DELE ALL
PACK
14
aceasta se alege opţiunea Replace Field a meniului Table pentru a fi deschisă pe ecran fereastra
cu acelaşi nume.
15
LIST while data <{01/16/05} TO PRINTER && rezultatul listării se trimite la
imprimantă
DISPLAY RECORD 5 && se afişează doar valorile pentru înregistrarea numărul 5
Căutarea înregistrărilor dintr-o tabelă care respectă o anumită condiţie se mai poate face
utilizănd comenzile LOCATE şi CONTINUE. Comanda LOCATE are sintaxa:
LOCATE FOR <expL1>
[<domeniu>]
[WHILE <expL2>]
[NOOPTIMIZE]
La găsirea unei înregistrări care respectă condiţia <expL1>, indicatorul de înregistrări se va
poziţiona pe înregistrarea respectivă, iar funcţia FOUND() va returna valoarea .T. Dacă în tabela
respectivă există mai multe înregistrări care respectă o condiţie dată, căutarea acestora se va
realiza utilizând prima oară comanda LOCATE şi apoi comanda CONTINUE.
Exemplu: Să se găsească toate înregistrările din tabela FACTURI_EMISE pentru care codul
clientului este egal cu 9.
USE FACTURI_EMISE
LOCATE FOR COD_CLIENT=9 && se caută prima înregistrare pentru care ;
codul clientului este egal cu 9
?FOUND()
.T.
DISP
DO WHILE .NOT. EOF()
CONTINUE && se caută următoarea înregistrare care satisface criteriul
?FOUND()
DISP
ENDDO
16
în două etape: crearea acestora utilizând comanda CREATE REPORT, respectiv CREATE
LABEL sau utilizând modul asistat (File/New/Report sau Label), după care se realizează afişarea
datelor în formatul creat, utilizând comenzile REPORT FORM, respectiv LABEL FORM. În
raport datele pot fi grupate utilizând opţiunea Data Grouping.
Sortarea şi indexarea sunt legate de două elemente foarte importante în lucrul cu bazele de
date. Pe de o parte, informaţiile cuprinse în baza de date trebuie prezentate diferit, ordonate după
criterii multiple, în funcţie de intenţiile utilizatorului sau de aplicaţiile care le
consultă/prelucrează. În al doilea rând, atunci când baza de date capătă proporţii serioase, iar
numărul celor care lucrează simultan cu baza este considerabil, viteza de acces la date este vitală.
Sortarea este operaţiunea prin care dintr-o tabelă se obţine o altă tabelă care va avea
înregistrările (liniile) ordonate după o anumită cheie de sortare (un atribut al tabelei). Tabela
rezultat poate avea aceeaşi structură ca tabela sursă, însă există şi situaţii în care sunt selectate
numai anumite atribute sau generate altele noi, prin expresii.
Spre deosebire de sortare, prin indexare nu se creează o altă tabelă, ci se asociază un tabel
special care conţine indecşii, respectiv cheia de indexare după care se ordonează înregistrările şi
adresa corespunzătoare înregistrărilor. Cheia de indexare poate fi un atribut sau o expresie
formată din atributele tabelei. Un fişier tip index nu conţine înregistrări, ci ordinea acestora, în
funcţie de o anumită cheie (atribut/combinaţie de atribute).
17
FIELDS LIKE <skel> specifică o “mască” pe care numele atributelor din tabela sursă
trebuie să o verifice pentru a incluse în tabela sortată.
FIELDS EXCEPT <skel> specifică care din atributele care verifică “masca” introdusă în
clauza FIELDS LIKE nu vor fi totuşi incluse în tabela sortată (excepţiile de la mască).
Caracterele de tip specificator multiplu (sau joker) - wildcards sunt * sau ?.
NOOPTIMIZE dezactivează motorul de optimizare FoxPro (Rushmore)
Avantajul sortării îl constituie prezentarea înregistrărilor într-o ordine dorită de un
utilizatori/aplicaţie. Tabela sortată nu face parte din structura bazei de date, deci nu există riscul
alterării neautorizate a bazei, însă nici posibilitatea de a o actualiza.
Dezavantajul principal al sortării este legat de volumul mare de disc ocupat, care, atunci
când tabela sursă este voluminoasă iar tabela-destinaţie are acelaşi număr de atribute şi de liniii
ca şi cea sursă, poate încărca periculos discul.
Exemplul 1
Se dă tabela CLIENTI. Să se obţină o tabelă numită ClientiS cu aceeaşi structură ca şi
Clienti, dar cu înregistrările ordonate descrescător în funcţie de valoarea atributului cod_client.
USE CLIENTI
SORT TO ClientiS ON cod_client /D
Tabela rezultat al sortării, ClientiS, este prezentată în fig. nr. 7.
18
2. Indexarea bazelor de date
Indexarea este o facilitate frecvent folosită pentru afişarea datelor într-o anumită ordine, dar
şi pentru un acces rapid la date. În plus, indexarea este utilă şi pentru crearea unor relaţii
temporare între tabele.
În FoxPro există două tipuri de indecşi: simpli şi compuşi. Indecşii simpli sunt creaţi pe
disc sub forma unor fişiere cu extensia .IDX şi conţin o singură tabelă de indexare. Indecşii
compuşi sunt alcătuiţi din mai mulţi indecşi elementari (tag-uri).
19
Obs.
Numărul indecşilor deschişi simultan este limitat numai de resursele sistemului
(memoria, în principal).
Exemplu:
Luăm în discuţie tabela CLIENŢI. Realizaţi indexarea după valorile atributului (câmpului)
Localitate cu un index simplu şi după valorile atributelor Cod_client şi Den_client utilizând
indexul structural.
Indexul simplu (.IDX), denumit Localit este obţinut pe baza atributului Localitate prin
secvenţa:
SELECT CLIENTI
INDEX ON Localitate to Localit
în timp ce indexul structural compus, ce are doi indecşi elementari, cod_client şi
den_client, este obţinut prin comenzile INDEX următoare:
INDEX ON cod_client tag codcl
INDEX ON den_client tag dencl
20
USE CLIENŢI ORDER TAG CodCl
Pentru deschiderea unuia sau mai multor fişiere de tip index pentru tabela curentă, se poate
folosi şi comanda SET INDEX TO.
SET INDEX TO
[<index file list> | ?]
[ORDER <expN> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[ASCENDING | DESCENDING]]
[ADDITIVE]
Obs.
SET INDEX TO fără nici un argument închide toate fişierele index deschise pentru tabela
curentă, cu expecţia celui structural.
Stabilirea indexului principal al tabelei curente se realizează prin comanda SET ORDER
TO TAG.
SET ORDER TO
[<expN1> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[IN <expN2> | <expC>]
[ASCENDING | DESCENDING]]
Argumente:
<expN1> - vezi USE, SET INDEX...
IN <expN2> | <expC>. Această clauză stabileşte indexul principal pentru o tabelă deschisă
într-o altă zonă decât cea curentă.
Obs.
O tabelă poate avea mai mulţi indecşi deschişi simultan. Cu toate acestea, numai unul este
principal, în funcţie de care are loc accesul şi afişarea.
SELECT CLIENŢI
SET INDEX TO Localitate
sau
SET ORDER TO TAG dencl
Reindexarea
Indecşii pierd ultimele actualizări, când, la modificarea tabelei (modificări ale atributelor-
cheie de indexare), aceştia nu sunt deschişi. În asemenea situaţii, actualizarea se realizează prin
comanda REINDEX. Aceasta actualizează toţi indecşii deschişi în zona curentă.
21
Dacă parametrul SET NEAR este pe ON, pointerul este poziţionat pe înregistrarea
care se aproie cel mai mult de expresia specificată. Dacă SET NEAR este OFF,
pointerul este poziţionat la sfârşitul fişierului.
Exemple:
SELECT CLIENTI
SET ORDER TO TAG CODCL
SEEK 10
SGBD-ul vă căuta în tabela de indecşi a indexului elementar CODCL, pe prima coloannă
(cea a cheii), valoarea 10. O găseşte şi preia numărul înregistrării (Record_no).
Căutarea după o valoare de tip şir de caractere se face astfel:
SELECT CLIENTI
SET ORDER TO TAG DENCL
SEEK “Gama SRL”
Exemplul 1
Care sunt clienţii din Iaşi ?
SELECT COD_CLIENT, DEN_CLIENT ;
FROM CLIENTI;
WHERE LOCALITATE = "IASI”
Exemplul 2
Care sunt produsele facturate după 23 ianaurie 2005?Rezultatul se va regăsi în tabela
prodfact..
SELECT Produse.den_produs, FACTURI_EMISE.data;
FROM FACTURI_EMISE INNER JOIN produse_din_FACTURI_EMISE;
INNER JOIN produse ;
ON Produse.cod_produs = Produse_din_FACTURI_EMISE.cod_produs ;
ON FACTURI_EMISE.nr_factura = Produse_din_FACTURI_EMISE.nr_factura;
WHERE FACTURI_EMISE.data >= {^2005/01/23};
INTO TABLE prodfact.dbf
USE prodfact
LIST
Exemplul 3
Care sunt produsele facturate între 23.01.2005 şi 31.01.2005 ?
SELECT Produse.den_produs, FACTURI_EMISE.data;
FROM FACTURI_EMISE INNER JOIN Produse_din_FACTURI_EMISE;
INNER JOIN Produse ;
ON Produse.cod_produs = Produse_din_FACTURI_EMISE.cod_produs ;
ON FACTURI_EMISE.nr_factura = Produse_din_FACTURI_EMISE.nr_factura;
WHERE FACTURI_EMISE.data BETWEEN {^2005/01/23} AND {^2005/01/31}
Exemplul 4
Care sunt clienţii al căror nume începe cu litera S şi sunt societăţi pe acţiuni ?
SELECT *;
FROM CLIENTI;
WHERE den_cl LIKE "S%SA"
Exemplul 5
Care sunt clienţii din localităţile Iaşi şi Bacău ?
SELECT cod_client, den_client
FROM CLIENTI
WHERE localitate = "Iaşi" OR localitate = "Bacau"
22
sau
SELECT *
FROM CLIENTI
WHERE localitate IN ("Iaşi", "Bacau")
Exemplul 6
Care sunt localităţile în care firma are clienţi ?
SELECT DISTINCT localitate
FROM CLIENTI
Exemplul 7
Care sunt localităţile în care firma are clienţi, ordonate după localitate?
SELECT DISTINCT Localitate
FROM CLIENTI
ORDER BY Localitate
SELECT *
FROM CLIENTI
ORDER BY localitate ASC, den_client DESC
Exemplul 8
Care este valoarea facturilor emise pentru clientul cu codul 5 ?
SELECT sum(valoare)
FROM FACTURI_EMISE
WHERE Cod_client =5
Exemplul 9
Care sunt facturile emise clienţilor din municipiul Iaşi ?
SELECT nr_factura, CLIENTI.cod_client, CLIENTI.den_client;
FROM FACTURI_EMISE, CLIENTI;
WHERE FACTURI_EMISE.cod_client= CLIENTI.cod_client;
And localitate="IASI"
Exemplul 10
Care sunt facturile emise în alte zile decât cea în care a fost întocmită factura cu numarul
105?
SELECT *
FROM FACTURI_EMISE
WHERE Data not IN
(SELECT Data
FROM FACTURI_EMISE
WHERE Nr_factura=105)
Exemplul 11
Care sunt clienţii pentru care s-au facturat produse după data de 18.01.2005 ?
SELECT DISTINCT den_client;
FROM CLIENTI;
WHERE Cod_Client IN ;
(SELECT Cod_Client;
FROM FACTURI_EMISEi;
WHERE Data>{^2005/01/18})
sau
SELECT DISTINCT den_client;
FROM CLIENTI, FACTURI_EMISE;
WHERE CLIENTI.Cod_Client=FACTURI_EMISEi.Cod_Client;
AND Data IN (SELECT Data;
23
FROM FACTURI_EMISE;
WHERE Data>{^2005/01/18})
Exemplul 12
Câţi clienţi are firma ?
SELECT COUNT (Cod_client) AS Nr_CLIENTI;
FROM CLIENTI
Exemplul 13
Pentru câţi clienţii s au emis facturi după 25.01.2005 ?
SELECT COUNT (∗);
FROM CLIENTI;
WHERE Cod_Client IN ;
(SELECT Cod_Cl ient
FROM FACTURI_EMISE
WHERE DATA>{^2005/01/25})
sau
SELECT COUNT (DISTINCT Cod_client);
FROM FACTURI_EMISE;
WHERE DATA>{^2005/01/25}
Exemplul 14
Care este valoarea totală a facturilor emise în luna ianaurie 2005?
SELECT SUM (valoare) AS Total_val;
FROM FACTURI_EMISE;
Where data>={^2005/01/01} and data<{^2005/02/01}
Exemplul 15
Care este totalul valorii facturilor emise clientului ALFA SRL ?
SELECT SUM (valoare) AS Total_val;
FROM FACTURI_EMISE, CLIENTI;
Where CLIENTI.cod_client = FACTURI_EMISE.cod_client;
AND den_client = "ALFA SRL"
Exemplul 16
Care este cea mai mică valoare a unei facturi emise?
SELECT MIN (valoare) AS valmin;
FROM FACTURI_EMISE
Exemplul 17
Care este cea mai mare valoare a unei factutri ?
SELECT MAX (valoare) ;
FROM FACTURI_EMISE
Exemplul 18
Care este totalul zilnic al facturilor emise?
SELECT Data, SUM (valoare) ;
FROM FACTURI_EMISE;
GROUP BY Data
Exemplul 19
Care este numărul facturilor emise pentru fiecare client ?
SELECT Den_client, count(nr_factura);
FROM CLIENTI, FACTURI_EMISE;
WHERE CLIENTI.Cod_Client=FACTURI_EMISE.Cod_client;
ORDER BY den_client;
GROUP BY FACTURI_EMISE.Cod_Client
Exemplul 20
Care este numărul facturilor emise în fiecare zi?
SELECT Data, count(nr_factura);
24
FROM FACTURI_EMISE;
GROUP BY Data
Exemplul 21
Câte facturi au fost emise în luna februarie 2005?
SELECT COUNT(Nr_factura);
From FACTURI_EMISE;
Where data>{^2005/01/31}
Exemplul 22
Care este totalul vânzărilor pe localităţi?
SELECT CLIENTI.localitate, sum(FACTURI_EMISE.valoare);
FROM CLIENTI inner join FACTURI_EMISE;
ON CLIENTI.cod_client=FACTURI_EMISE.cod_client;
GROUP BY CLIENTI.localitate;
ORDER BY CLIENTI.localitate
Exemplul 23
Care sunt produsele cu preţul unitar cel mai mare?
SELECT DISTINCT(cod_produs), pret_unitar;
FROM produse_din_FACTURI_EMISE;
WHERE pret_unitar=SELECT(MAX(pret_unitar);
FROM produse_din_FACTURI_EMISE)
Cele trei structuri de control fundamentale (secvenţa, selecţia, iteraţia) se codifică în mod
direct prin comenzi specifice. Structurile de control secvenţiale se descriu prin specificarea unor
comenzi cum sunt: LIST, REPLACE, GOTO etc. Structurile de control alternative şi repetitive
presupun însă comenzi cu o sintaxă ceva mai complicată.
25
Rezolvarea problemei este expusă în programul EX_IF.PRG prezentat mai jos. Se observă
că o comandă IF … ENDIF poate conţine la rândul ei o altă comandă IF … ENDIF. Pentru
urmărirea rapidă a combinării comenzilor IF în momentul depanării programelor se recomandă
scrierea indentată. Structura pseudoalternativă se codifică tot prin IF … ENDIF dar fără ELSE.
* EX_IF.PRG
* Program listare clienti pe categorii distanta
close all
clear
use clienti alias clienti
? 'Lista clientilor dupa distanta'
?
? 'Cod client Denumire client categorie distanta'
do while not eof()
if distanta < 100
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'Aproape'
else
if distanta <= 160
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'Departe'
else
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'foarte departe'
endif
endif
skip
enddo
? '_________________'
? 'Terminat'
return
27
bazei de date. Prin comanda SCAN se gestionează şi indicatorul de înregistrări (pointer-ul)
nemaifiind necesară comanda SKIP. Formatul general al comenzii SCAN este următorul:
SCAN [<domeniu>] [FOR <expresieL1>] [WHILE <expresieL2>]
<comenzi>
[LOOP]
[EXIT]
ENDSCAN
Domeniul implicit este reprezentat de toate înregistrările tabelului activ. Restricţionarea
domeniului se poate face prin clauzele FOR, respectiv WHILE. Exemplul de la IF … ENDIF şi
DO WHILE … ENDDO poate fi exprimat şi prin SCAN … ENDSCAN. Clauzele LOOP şi
EXIT au acelaşi rol ca în DO WHILE … ENDDO.
* EX_SCAN.PRG
* Program listare clienti pe categorii distanta
close all
clear
use clienti alias clienti
? 'Lista clientilor dupa distanta'
?
? 'Cod client Denumire client categorie distanta'
scan
if distanta < 100
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'Aproape'
else
if distanta <= 160
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'Departe'
else
? str(cod_cl,3)+' '
?? den_cl+' '
?? 'foarte departe'
endif
endif
endscan
? '_________________'
? 'Terminat'
return
O aplicaţie FoxPro este formată din unul sau mai multe programe. La rândul lor programele
pot conţine una sau mai multe proceduri. Delimitarea program - procedură nu este absolută. De
obicei există un program coordonator (principal) care apelează subprogramele sau procedurile
după o anumită schemă.
Comanda pentru executia programelor/ procedurilor este DO cu următorul format general:
DO <nume_fişier1> [WITH <lista-parametri>] [IN <nume_fişier2>]
Numele specificat după DO trebuie să numele unui fişier cu extensia .PRG; .EXE; .FXP;
.SPR; .MPR; .QPR sau numele unei proceduri locale sau externe. Dacă nu este precizată
extensia fişierului sistemul caută automat un fişier cu extensia.EXE; .FXP; .PRG. Extensiile
.SPR, .MPR; .QPR trebuie să fie preznte în specificatorul de fişier.
Când este lansată un program/ o procedură cu ajutorul comenzii DO execuţia continuă până
la apariţia unuia din evenimentele următoare:
• întâlnirea unie comenzi CANCEL;
• întâlnirea unie comenzi QUIT;
• întâlnirea unie comenzi RETURN;
• sfârşitul procedurii
Procedurile locale sunt definite chiar în programul care le apelează. Procedurile pot fi şi
fişiere separate cu extensia .PRG. În acest caz este vorba de proceduri externe. În practică
29
procedurile se reunesc într-un fişier cu extensia .PRG de unde sunt apoi accesate, după comanda
SET PROCEDURE. Când se întâlneste o comandă DO căutarea procedurii de executat se face
astfel:
• mai întâi se caută procedura locală, din programul în curs de execuţie;
• se cecetează apoi fişierul indicat în comanda SET PROCEDURE;
• se caută procedura ca un fişier independent, cu extensia: .EXE; .APP; .FXP; .PRG.
CLOSE ALL
CLEAR
SET TALK OFF
USE CLIENTI
N=RECCOUNT()
STORE 0 TO I,CC,NS, DIST
STORE SPACE(15) TO DC, LC, STR
STORE .T. TO MODIFICARE
STORE " " TO RASP1,RASP2
DO WHILE MODIFICARE=.T.
CLEAR
@2,1 SAY "NR. INREGISTRARII PENTRU MODIFICARE" GET I
READ
IF I<=N
GO I
DISPLAY
@3,1 SAY "SUNTETI SIGUR?(D/N)" GET RASP1
READ
IF RASP1="D"
CLEAR
@2,1 SAY "COD CLIENT" GET CC PICT "999999"
@3,1 SAY "DENUMIRE CLIENT" GET DC
@4,1 SAY "LOCALITATE" GET LC
@5,1 SAY "STRADA" GET STR PICT “9999”
@6,1 SAY "NUMAR STRADA" GET NS PICT “99999”
@7,1 SAY "DISTANTA” GET DIST PICT”9999”
READ
REPLACE COD_CL WITH CC
REPLACE DEN_CL WITH DC
REPLACE LOCALITATE WITH LC
REPLACE STRADA WITH STR
REPLACE NRSTRADA WITH NS
REPLACE DISTANTA WITH DIST
ENDIF
ELSE
@3,1 SAY "INREGISTRAREA NU EXISTA"
ENDIF
@12,1 SAY "MAI MODIFICATI O INREGISTRARE?(D/N)" GET RASP2
READ
IF RASP2="N"
STORE .F. TO MODIFICARE
USE
ENDIF
ENDDO
30
CLEAR
CLOSE ALL
TIPURI DE RAPOARTE
În Visual FoxPro rapoartele pot prezenta informaţiile în mai multe moduri. De exemplu,
datele pot fi aliniate în coloane distincte într-un format reminiscent de la spreadsheet-uri (fig.
nr.1). O altă modalitate ar fi prezentarea datelor ce constituie o înregistrare unele sub altele ca
într-un formular (fig.nr.2). Datele pot fi prezentate aşa cum sunt sau pot fi grupate, agregate
(adunate, numărate, calculată media, calculate subtotaluri etc.). Pentru reprezentarea datelor se
pot include diverse grafice sau chart-uri. Sursa datelor pentru rapoarte este reprezentată de
tabele, interogări sau vederi (views). Într-un raport pot apare chiar şi câmpuri calculate (câmpuri
a căror valoare este calculată cu ajutorul unei expresii) sau câmpuri ce conţin rezultatele unor
funcţii (operaţii de prelucrare a datelor) definită de către utilizator.
31
Fig. nr.1. Raport "pe coloane"
Fig. nr. 2. Raport cu datele unei înregistrări aranjate una sub alta
32
REPORT DESIGNER-UL
Chiar dacă v-aţi obişnuit să utilizaţi opţiunea Quick Report, veţi dori probabil să apelaţi la
facilităţile oferite de Report Designer în aplicaţiile dvs. Aţi vazut deja cum se creează un simplu
raport cu ajutorul opţiunii Quick Report. Un raport poate fi creat însă în mai multe moduri. Iată
cele mai comune modalităţi:
• Alegeţi File, New. Click butonul Report, apoi click New Report.
• Din fereastra Project Manager, click tab-ul (eticheta) Documents, selectaţi icon-ul Report
în lista de documente, apoi click pe butonul New. Apoi selectaţi New Report.
• În fereastra de comenzi introduceţi comanda Create Report sau comanda Modify
Report <numele raport>.
• Utitlizaţi Report Wizard-ul (asistentul) pentru a crea un raport, salvaţi-l şi modificaţi-l
apoi după dorinţă.
Veţi învăţa despre utilizarea Report Wizard în secţiunea intitulată "Crearea unui raport cu
Report Wizard". În continuare, explorăm Report Designer-ul.
Nu contează cum creaţi un nou raport, Visual FoxPro va lansa în mod automat Report
Designer-ul (fig. nr. 5). Report Designer-ul are câteva componente:
33
• Paleta Layout palette permite alinierea sau dimensionarea unuia sau mai multor controale
(vezi "Formatarea controalelor unui raport").
• Butoanele Data Grouping şi Data Environment asigură controlul rapid asupra modalităţii
de prezentare a datelor dvs.
SFAT
Puteţi amplasa liniile de instrumente specifice rapoartelor imediat sub
zona meniului principal al aplicaţiei. Puteţi, de asemenea, să le
redimensionaţi (în limite rezonabile) pentru a fi pe placul dvs. - tot ce
trebuie să faceţi este să plasaţi cursorul mouse-ului deasupra
"marginilor" liniilor de instrumente şi să "trageţi" în direcţia în care
doriţi.
Imaginile dintr-un raport Visual FoxPro pot fi stocate în câmpurile unui tabel sau pe disc în
diverse formate grafice: .BMP, .ICO, .ANI, .JPG, .GIF, sau .CUR. Această capabilitate
constituie pentru Visual FoxPro un plus faţă de versiunile anterioare ale programului, ce nu
suportau decât fişiere Windows Paintbrush cu extensia .BMP.
Pe măsură ce adaugaţi obiecte pe suprafaţa raportului, le puteţi manipula după cum doriţi.
34
obiectul original. Puteţi selecta cu un click obiectul şi, utilizând tastele săgeţi sau mouse-ul, să-l
deplasaţi într-o nouă locaţie.
SFAT
Cea mai uşoară modalitate de a redimensiona un obiect al unui raport
este de a selecta obiectul, de a ţine apăsată tasta Shift şi de a apăsa şi o
tastă săgeată. Cu fiecare apăsare a tastei săgeată, obiectul este expandat
sau contractat cu un pixel sau unitate de scară. De asemenea, puteţi ţine
apăsată tasta Shift şi puteţi utiliza mouse-ul pentru redimensionarea
unui obiect, dar este dificil să lucraţi cu precizie.
Lucrul cu câmpurile
Obiectele de tip text şi graficele sunt importante, însă utilizatorii sunt mai degrabă interesaţi de
datele incluse într-un raport. Pentru a afişa datele într-un raport, utilizaţi obiectul text box pentru
a adăuga un câmp, o variabilă, o expresie sau o funcţie definită de utilizator. Pentru a adăuga un
câmp pe suprafaţa raportului, selectaţi controlul text box / field din linia de instrumente Report
Controls. Când efectuaţi click pe suprafaţa raportului pentru a adăuga controlul, apare fereastra
de dialog intitulată Report Expression (Fig.nr 6). De notat ca puteţi accesa această fereastră de
dialog şi mai târziu, efectuând click dreapta pe un control de tip câmp (field) şi selectând
Properties din meniul shortcut.
35
Fig nr. 7. Fereastra Expression Builder.
Puteţi include orice nume de variabilă sau apel la funcţie în Expression, însă aceste
variabile şi funcţii trebuie să fie utilizate atunci când raportul este rulat; în caz contrar, obţinem o
eroare.
SFAT
Puteţi include IF-uri imediate în formatul următor în caseta de text expression:
IIF(condiţie,rezultat dacă este true, rezultat dacă
nu este true)
Aceste "statements" (IIf-urile) pot fi deosebit de utile. Puteţi modifica
valoarea True sau False a unui câmp logic, de exemplu, în ceva mult mai
informativ sau "ochios" cu ajutorul următoarei expresii:
IIF(situatie = .T.,"Asta e!","Sorry, sucker!")
36
benzii. Sau puteţi stabili ca poziţia câmpului să rămână relativă la marginea de sus sau de jos a
benzii intitulate Detail, ceea ce înseamnă că acesta va fi întotdeauna la o distanţă fixată faţă de
una din marginile benzii, indiferent de dimensiunile oricăror alte controale.
Caseta de validare Stretch with Overflow (check box) indică dacă un control de tip câmp poate
"creşte" pe verticală destul pentru a afişa tot textul dintr-un câmp sau o variabilă. În caz contrar,
doar o porţiune a rezultatului expresiei va fi afişată şi implicit imprimată. Această opţiune este
utilă mai ales atunci când se lucrează cu date din câmpuri de tip Memo.
Butonul Calculations permite specificarea unui subtotal sau a unui calcul. Pentru a crea un
subtotal pentru un câmp, click pe acest buton, iar apoi, în fereastra de dialog Subtotal sau
Calculate Field, indicaţi tipul calculului şi unde să apară. În fig. nr. 9, de exemplu, se specifică
faptul că se doreşte să se calculeze câte valori au fost în câmpuri, la sfârşitul fiecărei pagini.
Acest control se amplasează în banda intitulată Page Footer.
37
În fereastra de dialog Print When puteţi specifica în ce condiţii vor apare expresiile dintr-un
raport la imprimantă.
Puteţi utiliza porţiunea Comment din fereastra de dialog Report Expression pentru a introduce
comentarii comments pentru dvs. sau pentru alţi utilizatori. Comentariile nu apar nicăieri în
raport.
Lucrul cu variabile într-un raport
Puteţi defini variabile ce vor fi utilizate în raportul dvs. prin slectarea opţiunilor Report,
Variables (fig nr.11). De ce să utilizaţi variabile în rapoarte? Ei bine, aţi putea dori să stocaţi
anumite valori sau rezultate ale raportului pe care să le utilizaţi şi după încetarea rulării
raportului.
38
textului şi formelor ca şi în cazul câmpurilor. Acelaşi lucru este valabil şi în cazul controlului
poziţiei unui obiect de tip text sau a poziţiei unei forme geometrice: utilizaţi grupul de butoane
de opţiune Object Position pentru a determina aceste proprietăţi. Controalele Rectangle şi Line
au o serie de opţiuni suplimentare faţă de cele ale obiectelor de tip text (fig nr.13). Dacă efectuaţi
dublu-click pe o linie dintr-un raport, puteţi indica şi cum se dimensionează aceasta relativ la
banda de care aparţine. Opţiunea No Stretch restricţionează redimensionarea liniilor verticale sau
dreptunghiurilor. Opţiunea Stretch Relative to Tallest Object in Group permite unei linii verticale
sau unui dreptugnhi să se "întindă" până la înalţimea celui mai "înalt" obiect din cadrul grupului,
în timp ce opţiunea Stretch Relative to Height of Band permite unei linii verticale sau dreptunghi
să se "întindă" în funcţie de înălţimea benzii sale.
39
LUCRUL CU IMAGINI ŞI GRAFICE
Adăugarea obiectelor de tip text sau a formelor este utilă dar dacă se doreşte ca raportul să "ia
ochii" în sensul de a atrage atenţia la anumite informaţii cum ar fi, de exemplu, logo-ul
companiei, este necesar să se lucreze cu imagini şi grafice. Puteţi adauga grafice la un raport
dintr-un câmp general al unui tabel Visual FoxPro sau dintr-un fişier de pe disc. De exemplu, fig.
nr. 15 prezintă un raport ce include o imagine.
40
Picture, Retain Shape "spune" Visual FoxPro-ului să afişeze întreaga imagine "umplând" pe cât
posibil cadrul specificat şi menţinând proporţiile imaginii. În fine, opţiunea Scale Picture, Fill the
Frame afişează imaginea completă, "umplând" complet cadrul, chiar dacă acest lucru
distorsionează imaginea. Caseta de validare Center Picture este utilizată pentru imaginile stocate
în câmpurile generale ale unei tabele. Imaginile din fişiere de pe disc nu sunt afectate de această
opţiune. Dacă imaginea dintr-un câmp este mai mică decât cadrul specificat, validarea casetei de
validare va face ca imaginea să fie centrată în respectivul cadru.
Butonul Print When lucrează în mod similar cu imagini ca şi cu alte controale. Puteţi opta pentru
afişarea unei imagini doar dacă sunt îndeplinite anumite condiţii.
Zona Object Position a ferestrei de dialog are trei opţiuni: Fix Relative to Top of Band, Fix
Relative to Bottom of Band, and Float. Opţiunea Fix Relative to Top of Band menţine poziţia
textului în legătură cu marginea de sus a benzii şi nu permite redimensionarea câmpului pentru a
afişa o altă imagine cu altă dimensiune. Opţiunea Fix Relative to Bottom of Band va permite
redimensionarea câmpului pentru a accepta date mai "mari" (sau mai lungi), dar va menţine
poziţia imaginii relativ la marginea de jos a benzii. Opţiunea Float permite textului să "floteze"
în relaţie cu poziţia benzii.
Puteţi utiliza porţiunea Comment a ferestrei de dialog pentru a adăuga comentarii despre
imagine, pentru dvs. sau pentru alţi utilizatori. Comentariile nu afectează în nici un fel raportul
imprimat.
41
grupaţi şi apoi le centraţi, veţi obţine rezultatul dorit: controalele, ca grup, vor fi centrate în
cadrul paginii.
Dacă selectaţi un control care a fost deja "grupat" opţiunea se modifica în Ungroup.
Snap to Grid şi Grid Scale
Opţiunea View, Grid Lines "umple" suprafaţa raportului cu linii de ghidare verticale şi
orizontale, permitându-vă să "simţiţi" şi să apreciaţi distanţele dintre controale. Cele două opţiuni
din Format - Snap to Grid şi Grid Scale - vă permit să modificaţi lungimea şi lăţimea zonelor de
ghidare, şi să aliniaţi un control la cea mai apropiată linie orizontală sau verticală.
Opţiuni Text
Opţiunea Format, Font vă permite să specificaţi un font pentru un control sau un grup de
controale. Puteţi utiliza orice font disponibil specific Windows.
Alinierea textului determină alinierea textului în cadrul unui control. Opţiunile Format, Align
determină poziţionarea controalelor unele faţă de altele. Opţiunile de aliniere a textului vă permit
să aliniaţi textul la stânga, la dreapta, centrat sau justify.
Opţiunile Fill şi Pen
Opţiunile Fill şi Pen options asigură un mecanism intern de modificare a şabloanelor de umplere
şi realizare a chenarelor. Opţiunea Fill afişează un submeniu ce include o serie de şabloane de
umplere sau o opţiune implicită de non-umplere. Opţiunea Pen lansează un submeniu de lăţimi
ale conturului şi tipuri de linii.
Opţiunea Mode determină dacă background-ul (fundalul) unui control este transparent sau opac,
afectând doar obiectele text, dreptunghiurile şi dreptunghiurile rotunjite.
Benzile Rapoartelor
Report Designer-ul din Visual FoxPro utilizează abordarea orientată pe benzi ce a devenit atât de
populară în crerea rapoartelor în ultimii ani. Diferitele benzi reprezintă diferite secţiuni ale
raportului.
Principalele benzi ale unui raport. Aproape fiecare raport pe care îl proiectaţi va avea o aşa-
numită detail band (banda detaliilor), ce conţine datele afişate în porţiunea principală a
raportului. Controalele din această secţiune reprezintă probabil "inima" raportului. Controalele
amplasate în această banda vor fi afişate imediat pentru fiecare înregistrare din sursa de date.
Controalele din title band sunt afişate doar odată, pe prima pagină a raportului în timp ce
controalele din "summary band" vor apare doar la sfârşitul raportului. Benzile de titlu sunt
utilizate în mod curent pentru titluri. Benzile de sumar sunt utilizate pentru informaţii de "sumar"
cum ar fi totaluri de câmpuri numerice, "numărări" de înregistrări incluse în raport etc.
SFAT
Spre deosebire de marea majoritate a produselor de realizare a
rapoartelor, Visual FoxPro permite "dragarea" controalelor dintr-o
banda în alta.
Banda page header band va fi afişată în partea de sus a fiecărei pagini, iar banda page footer
band ar trebui să includă doar acele obiecte pe care doriţi să le vedeţi afişate în partea de jos a
fiecărei pagini.
SFAT
Page footers sunt cel mai bun loc pentru numere de pagină, date,
nume ale rapoartelor sau orice altă informaţie de care utilizatorii ar
avea nevoie în eventualitatea pierderii accidentale a unor pagini sau a
întregului raport.
Alte benzi ale rapoartelor. Dacă alegeţi să grupaţi datele, veţi fi capabili să amplasaţi
informaţiile în aşa-numitele benzi group header şi group footer. Benzile group header şi group
footer vă permit să aranjaţi rapoartele prin gruparea datelor şi să precizaţi informaţii privind
aceste grupuri. De exemplu, aţi putea sorta lista pacienţilor unui spital după tipul asigurării
medicale. O posibilitate ar fi să afişaţi fiecare nume şi fiecare tip de asigurare dar o altă opţiune
mai bună ar fi să grupaţi datele, afişând tipul asigurării doar o dată pentru mai multe nume.
42
Dacă alegeţi să creaţi un raport cu coloane multiple, aţi putea dori să includeţi headere şi footere.
Pentru a crea un raport cu coloane multiple, selectaţi File, Page Setup şi introduceţi numărul de
coloane în fereastra de dialog, precum şi lăţimea coloanelor şi spaţiul dintre acestea.
Tabelul 1. Controalele ferestrei de dialog Page Setup
Control Descriere
Number spinner Utilizaţi acest "spinner" (contor) pentru a creşte sau descreşte
numărul de coloane din raportul dvs.
Width spinner Utilizaţi acest spinner pentru a stabili lăţimea coloanelor.
Spacing spinner Utilizaţi acest spinner pentru a stabili lăţimea spaţiului dintre
coloane.
Print Area options Utilizaţi aceste opţiuni pentru a determina modul în care marginile
de imprimare sunt "manevrate" de către raport. Dacă selectaţi
Printable Page, zona imprimabilă a paginii este determinată în
concordanţă cu specificaţiile implicite ale imprimantei şi este
afişată în zona Page Layout a ferestrei de dialog. Dacă selectaţi
Whole Page, raportul dvs. va "umple" întreaga pagină.
Print Setup button Utilizaţi acest buton pentru a deschide fereastra de dialog
Windows Print Setup, unde puteţi modifica setările implicite ale
imprimantei instalată implicit sub Windows.
Print Order buttons Utilizaţi aceste butoane pentru a determina umplerea coloanelor
verticale de sus în jos şi de la stânga la dreapta începând din partea
de sus a paginii.
Left Margin spinner Utilizaţi acest spinner pentru a stabili lăţimea marginii din stânga.
STRATEGII DE PROIECTARE
O planificare adecvată vă poate ajuta să economisiţi mult timp şi efort, evitând totodată
rapoartele ce nu furnizează utilizatorilor informaţiile necesare. Atunci când proiectaţi rapoarte,
sarcina dvs. este de a prelua datele furnizate de o tabelă sau de o interogare şi să le transformaţi
într-un raport ce asigură informaţiile într-o manieră ce are sens pentru utilizator. Iată câţiva paşi
sau etape utile în proiectarea unui raport:
• Discutaţi forma raportului cu utilizatorii şi, dacă este posibil, căutaţi să examinaţi copii
ale unor rapoarte existente.
• Proiectaţi forma pe hârtie şi specificaţi orice operaţii de grupare, calculare a unor
subtotaluri sau de formatare.
44
• Decideţi dacă puteţi utiliza o sesiune privată de date şi Data Environment sau dacă veţi
crea un "cursor" în una curentă înainte de rularea raportului.
• Proiectaţi raportul în Visual FoxPro.
• Previzualizaţi sau tipăriţi raportul, apoi căutaţi feed-back-ul din partea utilizatorilor.
45
Fig. nr. 19. Al doilea pas al asistentului Report Wizard
Fereastra de dialog din fig. nr. 20 permite stabilirea modalităţii de legătură dintre cele două
tabele utilizate pentru realizarea raportului.
46
Fig. nr. 21 Pasul patru al asistentului Report Wizard
În următoarea fereastră de dialog puteţi selecta un stil pentru raportul dvs., din cele cinci stiluri
disponibile şi puteţi stabili dacă raportul va fi imprimat în modul landscape sau portrait (Fig. nr.
22).
47
Fig. nr. 23. Fereastra de dialog Summary Options
Ultima fereastră de dialog întreabă dacă doriţi să salvaţi raportul în vederea unei utlizări
ulterioare, să-l salvaţi şi să-l rulaţi imediat sau să-l salvaţi şi să-l modificaţi imediat (fig. nr. 24).
SFAT
Asistentul Report Wizard poate fi un instrument util pentru crearea
unui simplu form, prototipizarea unui form sau învăţarea mai multor
lucruri despre obiectele Report Designer şi modul în care acestea
lucrează.
.
Fig. nr. 24. Ultimul pas al asistentului Report Wizard
RULAREA RAPORTELOR
Puteţi imprima un raport completat utilizând una din următoarele metode:
• Din Project Manager, click tab-ul Document, click şi selectaţi un raport, apoi click
butonul Print din linia de instrumente Standard.
• Din fereastra de comenzi (sau din cod program), utilizaţi comanda Report Form.
Această comandă are următoarea sintaxă:
48
REPORT FORM nume_raport TO PRINT | PREVIEW | TO
filename | FOR filter expression
Reţineţi că rapoartele dvs. vor fi formatate pentru imprimanta instalată implicit.
Pentru a rula aceleaşi rapoarte la o imprimantă diferită unele alinieri şi spaţieri ar
trebui reactualizate. Visual FoxPro face o treabă bună în general în rezolvarea
diferenţelor dacă imprimantele utilizate sunt relativ standardizate şi nu foarte
diferite una faţă de alta.
Alegerea unei destinaţii
Utilizând comanda Report Form puteţi direcţiona "ieşirea" unui raport către una sau mai
multe destinaţii. Dacă doriţi să imprimaţi raportul comanda va arăta astfel:
REPORT FORM Raportul_meu TO PRINT
Dacă doriţi să previzualizaţi raportul în loc să-l trimiteţi direct la imprimantă utilizaţi următoarea
comandă:
REPORT FORM Raportul_meu TO PRINT PREVIEW
Dacă doriţi să salvaţi textul raportului într-un fişier ASCII:
REPORT FORM Raportul_meu TO FILE Fişierul_meu.txt
ASCII
În mod implicit, rapoartele rezultate sunt afişate şi pe ecran în timp ce sunt generate. Pentru a
preveni acest lucru, utilizaţi opţiunea NOCONSOLE.
49