You are on page 1of 178

Episodul 1 – SQL Server 2000 si SQL Server 2005

Va propun ca pe parcursul a citorva episoade sa construim de la zero o aplicatie de


gestionare a unei baze de date cu CD / DVD-uri, cu o structura relativ simpla, dar usor
de extins de catre orice programator sau impatimit de baze de date, cu niste unelte care
sint relativ la indemina. Vom folosi pentru acest tutorial ca suport al bazelor de date
produsul SQL Server, dar pentru scopul aplicatiei versiunea free (da, scoate si
Microsoft produse performante free !) a acestuia, MSDE (Microsoft Desktop Engine)
este mai mult decit suficienta. Aceasta versiune free este disponibila pentru download
de pe site-ul Microsoft. OBSERVATIE: versiunea MSDE a SQL 2005 a fost
redenumita in Microsoft SQL Server Express Edition.

Chiar daca tematica nu poate parea interesanta, ce se doreste prin intermediul acestor
tutoriale este transmiterea unor principii de lucru, prezentarea utilitarelor cu ajutorul
carora se pot implementa aceste principii si prezentarea unui rezultat intr-o forma
primara care, evident, suporta multe imbuntatiri. Aceste imbunatatiri sint, insa, la
latitudinea fiecaruia si depind de imaginatia si nevoile personale ale celui care dezvolta
aplicatia.

NOTA: Unele notiuni nu sint acoperite de acest tutorial. Se presupune ca cititorul


are cunostinte elementare cu privire la infrastructura unei retele, administrarea
unei retele care include un domeniu (permisiuni, useri, servicii, etc), administrarea
la nivel de baza a unui server, moduri de autentificare.

Prezentare generala a produselor si comparatii

SQL Server 2000 a reprezentat un salt major in domeniul bazelor de date. Daca saltul de
la SQL Server 6.5 la 7.0 a fost considerat de multi specialisti ca fiind unul semnificativ,
saltul de la 7.0 la 2000 (sau versiunea 8) este la fel de important, din mai multe puncte
de vedere. Cele mai importante aspecte au fost cele legate de securitate si performanta,
zone in care s-au depus eforturi semnificative.

Saltul de la SQL 2000 la SQL 2005 este, din nou, major si, pe mai multe planuri:
 Mai multe editii (Express, Workgroup, Developer, Standard, Enterprise) fata de 4
(Desktop, Developer, Standard, Enterprise, Mobile) in SQL 2000
 Notification Services
 Integration Services
 Reporting Services
 Management tools – o integrare mai buna cu alte tool-uri de management ale MS
(MOM, SMS)
 Integrare puternica cu Visual Studio – interfata de administrare a fost, de fapt,
complet rescrisa folosind VS si ofera acces la obiectele de administrare si implementare
a bazelor de date prin intermediul VS
 Relational Database – s-a optimizat mult database engine, s-a imbuntatit partea de
securitate, suportul pentru date structurate si ne-structurate (XML)

Mai multe detalii despre diferente si imbunatatirile aduse in SQL 2005, se gasesc aici:
http://www.microsoft.com/sql/prodinfo/overview/whats-new-in-sqlserver2005.mspx

O vedere de ansamblu asupra produsului este disponibila aici:


http://www.microsoft.com/sql/prodinfo/overview/default.mspx.

SQL Server 2000 Standard

Pasii pentru instalarea SQL Server pentru acest tutorial vor fi descrisi in episodul
urmator. Ce dorim acum, este sa familiarizam putin cititorul cu unele facilitati ale SQL
Server, referitor la optiunile de instalare. Aceste optiuni vor fi intilnite pe parcursul
episodului 2, cind vom instala impreuna SQL Server 200 Standard Edition, dar as dori
sa le clarificam aici, o data cu prezentarea succinta a citorva din facilitatile oferite de
SQL Server.

Instante diferite (sau mai multe servere intr-unul singur)


Sa consideram urmatorul scenariu: avem SQL Server instalat pe un server si care
ruleaza o baza de date de contabilitate. Dorim sa creem o copie a acestui server, pentru
niste teste de optimizare a performantelor, dar nu dispunem de banii necesari
achizitionarii unui server nou. Pe serverul curent, spatiul de pe hardisk nu este o
problema, este un server cu 4 procesoare si memorie avem destula (comparativ cu
specificatiile producatorului).

Ce putem face este sa mai instalam o data SQL Server, ca o noua instanta (sau named
instance). In acest fel, vom putea experimenta diferite setari la nivel de server (alocare
de memorie, etc) fara a afecta functionarea celeilalte instante. Acest mod de lucru este
posibil datorita faptului ca fiecare instanta ruleaza intr-un spatiu propriu de memorie si
resurse hardware, fara sa afecteze celelalte instante daca se modifica setarile uneia din
ele. Este ca si cum am avea inca un server fizic disponibil pe care sa rulam inca un SQL
Server. Identificarea unui server SQL in retea, in scopul conectarii la acesta se face
dupa numele NetBIOS asociat acestuia. In cazul in care avem mai multe instante SQL
instalate pe acel server, identificarea acestora se va face dupa sablonul
numeserver\numeinstanta. De exemplu, avem serverul cu numele SQLDBSRV01 si
avem 2 instante SQL instalate pe acesta. Prima instanta, cea default, va fi identificata
dupa numele NetBIOS al serverului, adica SQLDBSRV01. Instanta 2 cu numele
CONTAB_DB, va fi putea fi accesata folosind identificatorul
SQLDBSRV01\CONTAB_DB.

SQL Server ruleaza ca serviciu in cadrul sistemului de operare. In cazul in care avem
mai multe instante, fiecare instanta va crea propriul serviciu in cadrul sistemului de
operare. Identificarea acestora se face similar cu identificarea instantelor, cu urmatoarea
diferenta: numele serviciilor pentru instantele din exemplul de mai sus sint astfel –
MSSQLServer si SQLServerAgent pentru instanta default si MSSQL$CONTAB_DB si
SQLAgent$CONTAB_DB pentru instanta CONTAB_DB.

Instalarea utilitarelor client


Sa presupunem urmatorul scenariu: avem un server SQL (sau mai multe) dar nu avem
access fizic la ele pentru a le administra. Putem instala numai utilitarele de administrare,
asa-numitele Client Tools. Aceasta optiune este disponibila in faza de setup si va instala
urmatoarele componente:
 SQL Enterprise Manager (in cazul SQL 2000, despre care discutam)
 SQL Query Analyzer
 SQL Books Online
 Client Network Utility
 Utilitarele linie de comanda (osql, etc)

Avind aceste utilitare si detaliile de conectare la server la indemina, un administrator se


va putea conecta la orice server ar avea nevoie pentru a efectua taskurile administrative
de care este nevoie.

Editiile SQL Server si alegerea unei editii

Editiile SQL Server 2000 sint urmatoarele:


 Desktop Engine (versiune free) sau MSDE
 Developer Edition
 Standard Edition
 Enterprise Edition

Exista inca o editie a SQL Server, mai putin folosita, si anume Personal Edition. Am
avut ocazia, la un moment dat, sa instalez un Personal Edition, este o versiune limitata
ca si facilitati, din ce teste am reusit sa fac in timpul avut la dispozitie, iar ca si
pozitionare pe lista de editii, ar fi undeva intre Desktop Engine si Developer Edition.

Exista limitari si diferente intre editiile SQL: la volumul de resurse hardware pe care le
pot folosi, la dimensiunea bazelor de date (MSDE nu poate folosi baze de date mai mari
de 2G), la utilitarele care se instaleaza o data cu fiecare editie (MSDE nu are Enterprise
Manager) sau la performantele SQL in cazul bazelor de date mari.

Mai multe detalii despre aceste diferente, puteti gasi in SQL Books Online, unde va sint
prezentate diferentele dintre diferitele editii dpdv al facilitatilor incluse in fiecare dintre
acestea.

Descrierea componentelor
 SQL Enterprise Manager (sau EM in unele documentatii) permite “inregistrarea”
serverelor SQL intr-o lista de administrare disponibila unui administrator. Inscrierea
serverelor in aceasta lista presupune ca userul respectiv are permisiuni pe acel server.
 SQL Query Analyzer (sau QA) permite interogarea bazelor de date existente pe un
server SQL folosind limbajul Transact-SQL (sau T-SQL).
 SQL Books Online este documentatia SQL in format electronic. Contine 90% din
informatiile necesare unui administrator sa-si faca munca in conditii optime.
 Client Network Utility permite conifgurarea protocoalelor de retea pe care sa le
utilizeze SQL Server pentru a permite conectarea clientilor la bazele de date gestionate
de acesta.
 Utilitarele linie de comanda (osql) permit interogarea bazelor de date din linia de
comanda, folosind parametri pentru a specifica interogarea, numele serverului, numele
bazei de date, etc. Mai multe detalii despre utilitarele linie de comanda se gasesc in
SQL Books online.

Conceptul de baze de date relationale


Conceptul de baze de date relationale este indeobste cunoscut. Tot mai des putem auzi
sintagme de genul “Nu va gasesc in baza de date”, “Nu avem produsul asta in baza de
date”. As dori sa fac o clarificare importanta, dupa parerea mea, pentru ca acest termen,
de baza de date, este destul de larg. Bazele de date, conform definitiei largi, sint o
colectie de date, inregistrari, care pot fi parcuse secvential sau dupa un alt algoritm si
care permit stocarea, regasirea si procesarea datelor conform unor nevoie specifice.
Bazele de date relationale difera putin de aceasta definitie, prin extinderea acesteia si
anume prin introducerea termenului de relational. De exemplu, in Excel exista
conceptul de database pe o foaie de calcul. Dar nu este neaparat relationala, sau nu este
relationala 100%. SQL si alte motoare de baze de date folosesc relationarea pentru
optimizarea bazelor de date.

Sa luam un exemplu. Avem 100 de CD-uri si am vrea sa le ordonam cumva, intr-o baza
de date. Asociat unui CD, avem o serie de atribute: casa de discuri, an aparitie, gen
muzical, artist, etc. Aceasta baza de date o putem dezvolta si implementa foarte simplu
si rapid si in Excel, cu toate detaliile. Ce se intimpla insa, cind casa de discuri este scrisa
gresit la 25 de CD-uri ? Sau genul muzical ? Trebuie parcurse toate inregistrarile si
corectate manual. Insa, folosind relatiile, in loc sa stocam textul explicit al, sa luam un
exemplu, numelui casei de discuri, stocam un cod al acestei case de discuri in tabela de
CD-uri, iar in baza codului, regasim numele acesteia, dintr-o tabela “relationata” prin
intermediul codului. Folosind aceasta abordare, schimbam doar numele casei de discuri
in acea tabela cu casele de discuri, iar interogarea noastra va afisa numele corect la
toate inregistrarile, cu o singura modificare. In imaginea de mai jos este afisat,
schematic, exemplul de mai sus:
Diagrama 1 – Tabela cu CD-urile (structura partiala) – Fara relatii, cu atributele
in text clar

Diagrama 2 – Tabela cu CD-urile (structura partiala) – Cu relatii spre tabele


auxiliare, de unde se preiau textele asociate atributelor unui CD

Din diagrama 2 se poate vedea destul de usor faptul ca daca dorim sa schimbam ceva in
denumirile unor genuri muzicale sau ale unor case de discuri, sau sa adaugam niste
atribute asociate acestor 2 tabele este mult mai usor decit in prima varianta. Aceasta
abordare are si unele dezavantaje (orice moneda are 2 fete), dar aceste dezavantaje sint
“umbrite”, ca sa zicem asa, de usurinta in administrare. Acest proces de separare a
datelor se numeste normalizare. Nu vom intra in detalii care tin de acest proces, pentru
ca nu face obiectul acestui tutorial, dar se gasesc destule articole pe net care explica in
detaliu si pe intelesul tuturor ce presupune normalizarea bazelor de date si avantajele pe
care aceasta le aduce.

In episodul 2 al acestui tutorial vom trece la instalarea SQL Server 2000 Standard
Edition si MS-Access, urmind ca de la episodul 3 sa trecem la exercitiul practic propus.

Autor Alin Selicean


T
u
t
o
r
i
a
l

S
q
l

S
e
r
v
e
r

P
a
r
t
e
a

Episodul 2 – Instalarea SQL Server si MS-Access

Tutorialul de fata isi propune sa familiarizeze cititorul cu facilitatile oferite de SQL


Server in domeniul bazelor de date si sa furnizeze, in acelasi timp, un set minim de
cunostinte necesare implementarii cu succes a unei baze de date SQL exploatate prin
intermediul unei interfete dezvoltate cu ajutorul MS-Access.

Ca si aplicatie am ales un exemplu probabil des intilnit in acest domeniu, dar care ofera
destule variatiuni care sa faca, totusi, exercitiul interesant: o baza de date cu CD-uri. Ca
liste cu persoanele carora le-am imprumutat CD-uri si detaliile aferente acestor
imprumuri (CD-ul in cauza, data la care am imprumutat CD-ul, data la care se va
returna CD-ul). In plus, pentru diversitate, am dori ca aplicatia sa permita si intretinerea
unei agende cu CD-urile care le-am cerut noi imprumut de la alti colectionari, la fel, cu
acelasi fel de detalii (data la care am cerut CD-ul, numele acestuia, data la care trebuie
sa returnam CD-ul).

Ca si optiuni, am putea mentiona:


 Detalii suplimentare despre CD-uri (adrese web, adrese email ale caselor de discuri
sau ale artistilor)
 Mentinerea unei agende cu Tutorial
detaliile Sql Server ale
de contact - Partea 3
cunoscutilor
 Pastrarea in baza de date a unor fotografii ale CD-urilor (CD covers)

Solutia aleasa pentru acest tutorial, include:


Adauga
 Baza de date SQL care permita stocarea tuturor detaliilor conform comentarii
specificatiilor
 Interfata de utilizare, dezvoltata folosind MS Access
Episodul
Pentru a 3implementa
– Dezvoltarea aplicatiei
solutia aleasa, vom avea nevoie de urmatoarele componente
software instalate pe calculatorul nostru:
Pentru
 1.dezvoltarea
Microsoft SQLaplicatiei,
Servervom2000elabora un set
Standard minim
Edition de specificatii,
(pentru care ne
un dezvoltator vor ajuta
individual,
saseparcurgem
poate optaimpreuna urmatoarele
pentru versiunea free etape,
a SQLcritice, si intilnite
2000, MSDE sau in toate
SQL etapele
Server dezvoltarii
Express
unei baze de date. Inainte
Edition in cazul SQL 2005).de intra in detalii, trebuie spus un lucru important: inainte de a
intreprinde orice actiune
 2. Microsoft Accesscu privire la designul unei baze de date trebuie intelese datele
2003
si natura datelor care vor fi stocate in aceasta baza de date. Daca datele in sine (ca si
semnificatie) sint relativ
Aceste componente clare, ramine
software vor rulasapediscutam
o masinadespre natura
virtuala datelor
creata (sauMicrosoft
folosind tipul lor).
Virtual PC 2004. Sistemul de operare gazda este Windows XP Professional SP2.
OBSERVATIE:
Sistemul de operareScopul acestuivirtuala
pe masina exercitiu
vanu este de aspecificatiilor
fi conform avea aceasta aplicatie gata in n
pentru Microsoft
zile si sa fie mai simpla sau mai complicata. La o prima vedere, poate ca structura
SQL Server 2000 Standard Edition. In acest episod nu vom parcurge si pasii de instalare pe
care am ales-o pare mai complicata decit este nevoie, dar ceea ce as vrea sa
pentru Microsoft Access, pentru ca sintem convinsi ca ati mai instalat cel putin o datase retina
din acest
acest exercitiu
produs si nueste
estelogica folosita
un proces pentru
ale caror a ajunge
optiuni sa nulava
o structura sau alta,
fie familiare.
conceptele folosite, metodologia, etc. Am incercat sa materializez anumite concepte
abstracte:
Instalarea flexibilitatea
SQL Serveraplicatiei pe termen
2000 Standard lung, optimizarea datelor, etc. Daca am
Edition
reusit sau nu, asta ramine la aprecierea fiecaruia din voi.
Instalarea SQL Server 2000 Standard Edition se face respectind optiunile implicite ale
Dintre celelalte
utilitarului aspecte care
de instalare. trebuie
In cele luate in calcul
ce urmeaza, vor fi la designul
afisate, pasunei bazecapturile
cu pas, de date,ecranelor
cele
mai importante
afisate de acestarutilitar
fi urmatoarele:
si selectiile pe care utilizatorul trebuie sa le efectueze.
1. Securitatea datelor – aplicatia rulind pe local si datele nefiind critice, aspectul
securizarii accesului la date nu-l vom mai discuta. Oricum, securitatea datelor
este un subiect atit de vast, incit ar putea face obiectul unui tutorial separat (si,
probabil, ca asa va si fi la un moment dat)
2. Utilizarea preponderenta a bazei de date (pentru actualizari sau pentru rapoarte),
dpdv al performantelor
3. Constringeri de spatiu / resurse hardware
4. Arhitectura aplicatiei (aplicatie distribuita, web, baza de date distribuita, etc)

Nu vom intra in amanunte pe aceste subiecte, din lipsa de spatiu. Dar acestea nu trebuie
uitate de nici un dezvoltator / consultant cind propune / dezvolta o solutie pentru clientii
sai.

Ca si date de pornire, pentru aspectele mai sus mentionate, vom presupune urmatoarele:
1. Nu se doreste securizarea datelor, datele nefiind confindentiale sau critice
Se selecteaza optiunea SQL Server 2000 Components.

2. Baza de date va fi o baza de date de uz personal, deci performanta nu este un


criteriu critic
3. Baza de date va ajunge la o dimensiune suportabila pe un calculator de uz
personal
4. Baza de date va fi utilizata local, pe un calculator de uz personal, interfata de
exploatare va fi dezvoltata folosind facilitatile oferite de MS-Access 2003

Cerintele aplicatiei

Ca si minimum, aplicatia trebuie sa permita stocarea in baza de date a urmatoarelor


detalii despre CD / DVD-uri:
 Titlul discului
 Standard disc (audio, mp3, divx, dvd, etc)
 Anul de aparitie
 Casa de discuri / casa de “filme” (Paramount, etc)
 Artist (in cazul audio, mp3 sau unde e cazul)
 Gen muzical / gen film
 Disc propriu (propriu vs imprumutat)
 Data cumpararii / imprumutarii
 Data returnarii
 Persoana (care ne-a imprumutat sau careia i-am imprumutat)

In acelasi timp, dorim ca aplicatia sa ne permita sa stim ce CD-uri / DVD-uri am


imprumutat, de optiunea
Se selecteaza la cine siInstall
cind trebuie returnate;
Database Server.in aceeasi ordine de idei, dorim sa stim
ce CD-uri / DVD-uri avem imprumtate, cui si pina cind.

Natura datelor
Dupa cum se observa din descrierea cerintelor de mai sus, majoritatea datelor folosite
sint de tip data calendaristica sau de tip caracter. Natura datelor afecteaza si tipul de
data pe care urmeaza sa-l folosim in SQL Server. Foarte pe scurt, SQL Server permite
ca pentru acelasi cimp sa avem mai multe optiuni dintre care sa alegem. Astfel, pentru
un cimp numeric, in functie de valorile pe care le determinam ca vor fi stocate in acel
cimp, putem opta intre mai multe feluri de date numerice: tinyint, smallint, int, bigint,
numeric si real (cu zecimale si nivele de precizie), bit, etc. Mai multe detalii despre
data types se gasesc in SQL Server Books Online, cu cautare pe keyword-ul data types
si selectind in lista de optiuni sectiunea Overview.

Ca si concluzie, intelegerea naturii datelor vehiculate si determinarea plajei de valori pe


care urmeaza sa o stocam intr-un cimp anume este critica pentru faza de design a bazei
de date si ne poate aduce un plus de performanta si o “economie” de spatiu necesar pe
disc. O data facut designul unei baze de date cu privire la acest aspect, prea multe
modificari nu se mai pot face, fara a afecta negativ partea de dezvoltare a aplicatiei care
urmeaza sa foloseasca baza de date.

Aceste tipuri de date reprezinta o caracteristica importanta, in ceea ce priveste spatiul


necesar, si anume faptul ca valorile care pot fi stocate in aceste cimpuri pot avea

Click pe Next
lungimi variabile, aspect deloc de neglijat in cazul cimpurilor care vor stoca date de tip
sir de caractere (dar si in cazul cimpurilor cu date de tip intreg, in acest caz insa cistigul
de spatiu este mai putin evident). Aceasta facilitate ne permite sa “economisim” spatiu
fizic pe disc, in cazul in care acest aspect este o constringere. Ca si best-practice, este
bine de stiut acest aspect si indusa obisnuinta folosirii cimpurilor cu lungime variabila.
Poate parea un amanunt, dar cind vorbim de baze de date mari, acest “amanunt” devine
important.

Sa luam un exemplu, si anume un cimp ale carui date pot avea lungimi diferite, cu un
maxim de 50 de caractere si un minim de 3 caractere. O plaja larga de valori (80%) pot
avea lungimi de aproximativ 20 – 25 de caractere (vom lua in calcul o medie de 23 de
caractere), 5% vor avea lungimea minima (adica 3 caractere) iar restul de 15% vor avea
lungimea maxima (adica 50 caractere). Numarul maxim de inregistrari in aceasta tabela
a fost determinat la aproximativ 2 milioane de inregistrari. Ca sa se poata vedea mai
bine diferenta, vom folosi tabela de mai jos (calculele sint aproximative):

Cimp cu lungime fixa Cimp cu lungime variabila


1.600.000 (80%) x 23 bytes =
36.800.000 bytes = 36.8Mbytes
Local Computer, click pe Next. Ca si optiuni la instalare:
2.000.000 x 50 bytes = 100.000.000 (aprox) 100.000 (5%) x 3 bytes =
 1. Se poate instala pe un calculator remote
bytes = 100Mbytes (aprox) 300.000 bytes = 0.3Mbytes (aprox)
 2. Se poate instala pe un server virtual. In acest caz, este nevoie de Microsoft
300.000 (15%) x 50 bytes =
Cluster Service (sau MSCS) si se va specifica numele serverului virtual cu butonul
15.000.000 bytes = 15Mbytes (aprox)
Browse (dezactivat in imaginea de mai sus)
Total: 100M Total: 36.8 + 0.3 + 15 = 52.1M

Dupa cum se poate vedea din tabelul de mai sus, prin simpla folosire a unui tip de data
sau a altuia se pot realiza “economii” importante de spatiu. Aceasta economie este
obtinuta in mod nativ, datorita modului in care SQL Server trateaza aceste tipuri de
date. In exemplul nostru, daca in baza de date avem de stocat 3 bytes, SQL Server va
aloca exact spatiul de care e nevoie (3 bytes) in loc sa aloce 50 bytes. Acest tip de data
este identificat in SQL Server sub numele de varchar (variable character). Mai multe
detalii despre tipurile de date veti gasi studiind SQL Books online, cautind keyword-ul
“data types”.

Aceasta economie se traduce in final prin performante imbunatatite, cerinte de


administrare mai scazute, cerinte hardware mai reduse. Din aceasta cauza, alegerea unui
tip de data sau a altuia, poate avea un impact major pe termen lung, desi la o prima
vedere, acest aspect poate parea un amanunt.

Sa continuam si sa discutam putin despre tabelele care vor compune baza noastra de
date.

Vom avea nevoie de o tabela care sa contina numele caselor de discuri sau, in cazul
DVD-urilor, a caselor de productie filme, cu structura urmatoare:
Cod casa de discuri, numeric, identity

Click pe Next. Optiunile disponibile in acest moment:


1. Instalarea SQL Server, ca si instanta noua.
(dezactivata in imaginea de mai sus, pt ca este prima instalare pe acest
calculator)
3. Optiuni avansate:
1. Record Unattended .ISS file – Inregistrarea unui fisier ISS pentru
instalarea ulterioara a SQL Server in modul unattended.
2. Registry
Denumire casa de discuri,Rebuild – pentru corectarea erorilor din Registry pt o instalare
varchar(50)
de SQL existenta
3. Maintain a virtual server for failover clustering – administrarea unui
server virtual

Vom mai avea nevoie de o tabela care sa contina diferitele standarde de discuri (mp3,
audio, etc), cu urmatoarea structura:
Cod standard, numeric, identity
Denumire standard, varchar(50)

Vom mai avea nevoie de o tabela care sa contina diferitele genuri muzicale sau de filme
(hip-hop, R&B, drama, etc), cu urmatoarea structura:
Cod gen muzical, numeric, identity
Denumire gen muzical, varchar(50)

Diferenta de optiuni intre o instalare pe “curat” si instalarea unei noi instante SQL. Se
observa ca optiunea Upgrade, remove, or add components to an existing instance of
SQL Server este disponibila.

Vom mai avea nevoie de o tabela care sa contina un fel de agenda cu datele de contact
ale persoanelor care ne-au imprumutat discuri sau carora le-am imprumutat noi discuri.
Aceasta tabela va trebui sa ne ofere, ca un minim, urmatoarele detalii: numele
persoanei, adresa completa, numar de telefon si adresa de email. Pentru acesta, propun
urmatoarea structura:
Cod persoana, numeric, identity
Nume persoana, varchar(50)
Adresa, varchar(100)
Numar de telefon, varchar(20)
Adresa email,
Click pe varchar(30)
Next. Se introduce numele titularului licentei de utilizare si numele companiei.

Cele de mai sus, sint doar tabelele auxiliare care vor fi folosite de catre aplicatie. Tabela
urmatoare contine datele de baza ale aplicatiei, si anume colectia de discuri. In aceasta
tabela, vom memora, in loc de denumirea in clar a genurilor muzicale sau a numelor
caselor de discuri sau de filme, codul asociat acestora, pentru a permite modificarea
facila a acestor detalii in tabelele care contin aceste detalii, fara sa afectam tabela de
discuri.
Structura pe care v-o propun pentru aceasta tabela este descrisa in imaginea de mai jos:

Click pe Yes

Toate tabelele definite pina acuma, le-am definit cu ajutorul Microsoft Visio 2003 for
Click pe Next. Optiunile afisate vor instala dupa cum urmeaza:
Enterprise
 ClientArchitects.
tools only Acest proces
– utilitare poarta numele
de conectare de “modelare”
la serverul SQL si lasinamed
are unele avantaje
instances
deloc
(SQLdeQA,neglijat. Cel mai 2.6,
EM, MDAC important este faptulde
osql), utilitarele caconectivitate
permite modificarea
(networkstructurii bazei
libraries).
dedate pina cind se ajunge la un model stabil, functional, care sa acopere
Server and Client Tools – instaleaza atit motorul de baze de date SQL cit si toate nevoile
aplicatiei si client
utilitarele a clientului.
descriseToate
mai acestea
sus fara sa lucram inca cu SQL Server sau sa scriem
osingura linie de cod in Transact-SQL
Connectivity Only – instaleaza numai sau MS-Access. Microsoft
network libraries Visio2.6
si MDAC 2003 for
Enterprise Architects (disponibil in pachetul Microsoft Visual Studio 2003 Enterprise
Architect) ofera aceasta facilitate si in plus, cind totul este gata, prin conectori ODBC se
poate conecta la serverul SQL dorit si sa creeze baza de date conform modelului
construit de noi.

Pentru a definitiva modelul bazei de date, vom trece la modelarea relatiilor dintre
tabele. Voi lasa schema sa vorbeasca de la sine si vom vedea in lectiile urmatoare cum
ne vom folosi de aceste relatii.

Click pe Next. La prima instalare pe un server, nu se poate opta pentru instalarea unei
named instance, numai de la a doua instalare incolo. Prima instalare este totdeauna cea
default.
In cazul instalarii unei noi instante. Optiunea Default nu mai este disponibila, pentru ca
numai prima instanta este cea Default, restul sint named instances. Se introduce un
nume pentru noua instanta si click pe Next.

Click pe Custom si apoi Next

Pentru a va usura munca, va voi oferi pentru download scriptul SQL care va va crea
baza de date, la finele articolului. Desi, de preferat ar fi, dpdv al scopului acestui
tutorial, sa creati baza de date manual, din Enterprise Manager.

Obiectele unei baze de date


Intr-o baza de date, datele sint stocate in tabele. Pe linga aceste tabele, intr-o baza de
date SQL mai gasim si alte obiecte, cum ar fi: views (sau vederi), users (userii care au
acces la baza de date respectiva), stored procedures (sau proceduri stocate – bucati de
cod sau instructiuni Transact-SQL proiectate sa execute anumite operatii bine
determinate), etc.
Bifata optiunea Code Samples si click pe Next (ajuta pe cei care vor sa vada mai multe
exemple despre posibilitatile SQL decit cele care urmeaza a fi discutate in cadrul
acestui tutorial). Se pot lasa si optiunile implicite.

Se introduce userul si parola asociata acestuia. SQL Server va rula in contextul userului
specificatunei
Obiectele aicibaze
si vade
avea
datedrepturile de acces
se pot vedea in retea de
in imaginea corespunzator nivelulde
mai sus. Imaginea demai
acces
susale
acestui user.
afiseaza, de fapt, tipurile de obiecte care pot fi definite in cadrul unei baze de date. Le
vom lua, pe scurt, pe rind pe fiecare din ele:
 Diagrams – contine diagramele care reprezinta schematic legaturile dintre tabelele
bazei de date
 Tables – contine tabelele care, la rindul lor, contin datele utile ale bazei de date
 Views – contine definitia vederilor (sau a interogarilor salvate) folosite de aplicatie
pentru a interoga baza de date
 Stored Procedures – contine definitiile procedurilor stocate folosite pentru a
efectua anumite operatii predefinite asupra datelor si / sau a tabelelor din baza de date
 Users – contine utilizatorii care au permisiuni (pe diferite nivele) in cadrul bazei de
date curente
 Roles – contine grupurile de utilizatori pre-definiti in cadrul SQL Server si in cadrul
bazei de date. Aceste grupuri contin permisiuni predefinite care se pot aplica userilor
pentru accesul la date
 Rules – contine regulile de validare a datelor de la nivelul bazei de date. Regulile de
validare a datelor
Se specifica se pot
modul implementa pe
de autentificare 2 nivele
care urmeaza(cela putin), si de
fi folosit in cazul nostru mai
SQL Server. Se da click
specific,
pe Next.la nivelul tabelelor (la nivel declarativ al tabelelor) si la nivelul interfetei
utilizator (asa numita validare pe client). Avantajele folosirii validarii la nivelul bazei de
date sint in principal la capitolul performanta (clientul nu mai trebuie sa faca validarile,
deci va rula mai rapid, validarile pe server merg mai rapid datorita resurselor hardware
mai mari, etc).
 Defaults – contine definitiile valorilor implicite definite de utilizator pentru baza de
date. Aceste defaults sint folosite la definirea tabelelor la specificarea valorilor implicite
care sa fie introduse in tabele cind utilizatorul, prin interfata oferita, nu furnizeaza toate
datele pentru a actualiza tabelele. Vom vedea in cadrul exercitiului practic utilitatea
acestor defaults.
 User Defined Datatypes – am discutat putin mai sus despre tipurile de date. Aici se
pot defini tipuri de date conform cerintelor sau specificului aplicatiei sau a bazei de
date.
 User Defined Functions – contine definitiile functiilor definite de dezvoltator /
implementator si care functii fac diferite operatii asupra datelor sau a altor obiecte ale
bazei de date
 Full-Text Catalogs – contine cataloagele full-text existente in cadrul bazei de date.
Aceste cataloage contin referinte sistem cu privire la indecsii full-text. Un exemplu de
indecsi full-text si o baza de date care foloseste acest tip de indecsi ar fi o baza de date
cu CV-uri, cind se doreste cautarea in cadrul acestor CV-uri dupa cuvinte cheie.

Din pacate, nu avem mai mult spatiu la dispozitie pentru a detalia aceste obiect, dar
pentru cei interesati, SQL Server Books Online contine detalii despre aceste tipuri de
obiecte.

Noi vom merge mai departe cu exercitiul practic si vom trece la definirea tabelelor
bazei de date, folosind SQL Server Enterprise Manager.
Click pe Next.
Voi exemplifica practic cum se creeaza tabela tbl_Colectie, urmind ca pe baza
definitiilor de mai sus pentru restul tabelelor, sa creati tabelele auxiliare. Creerea
diagramei va incheia lectia de azi, urmind ca in partea a 4-a sa trecem la lucrul in MS-
Access.

Creerea tabelelor folosind Enterprise Manager


Pentru creerea tabelelor, vom incepe prin a creea baza de date. Modul in care SQL
Server gestioneaza bazele de date nu face obiectul acestui tutorial, dar foarte pe scurt,
lucrurile se intimpla in felul urmator. Fiecare baza de date are 2 componente: fisierele
cu date (sau data files) si log-ul operatiilor (sau transaction log). Data files contin
tabelele si toate celelalte obiecte dintr-o baza de date. Transaction log-ul contine un
istoric al modificarilor efectuate asupra datelor. Dimensiunea acestui istoric variaza la
fiecare baza de date, in functie de nevoile specifice ale acestei baze de date.

Ca si functionare, orice modificare se doreste a fi operata asupra datelor, se


inregistreaza intii in transaction log (care este o scriere fizica pe disc) si abia apoi
Click pe Next
trimisa spre executie. SQL Server lucreaza la nivel de tranzactii. Adica o modificare
asupra datelor se considera un bloc unitar, care se executa integral cu succes sau nu se
executa deloc (un exemplu ar fi un update asupra unor inregistrari urmat de un insert de
inregistrari noi, insert care este conditionat de primul update – ori se executa ambele
instructiuni cu succes ori deloc). Este “treaba” aplicatiei sa detecteze erorile
tranzactionale si sa trateze aceste erori. Acesta este, foarte schematic, modul in care
lucreaza SQL Server.

Fiecare din cele 2 componente (data files si transaction log) sint formate din 1 sau mai
multe fisiere pe disc. Data files au extensia MDF iar transaction log-ul are extensia
LDF.

In cele ce urmeaza, vom creea o baza de date in care vom trece la creerea tabelelor
necesare aplicatiei noastre.

Se lanseaza Enterprise Manager, se expandeaza in lista serverul curent si se da click


dreapta pe Databases, click pe New Database.

Click pe Next. Dupa aceaasta, urmeaza faza de instalare a produsului si de copiere a


fiserelor asociate pe calculator.
Selectat cf imaginii si click pe Continue
Se asteapta terminarea instalarii…

Click pe Finish

Verificarea instalarii SQL Server – citeva metode

Apare Microsoft SQL Server in meniul Start, Programs:

Se completeaza numele bazei de date. Click pe tab-ul Data Files.


In Enterprise Manager, se pot vedea cele 2 instante de SQL instalate prin pasii de mai
sus:

Pornirea serviciilor folosind Service Control Manager:

Se mareste dimensiunea implicita la 10MB, se lasa restul optiunilor cu valorile implicite


si click pe tab-ul Transaction Log.
Se poate observa in lista afisata de SQL Server Service Manager atit instanta implicita,
cit si cea named (LONDON\CONTAB_DB). Prin intermediul acestui utilitar, putem
starta, opri temporar sau stopa serviciile asociate SQL Server.
Verificarea instalarii folosind SQL Query Analyzer

Se lanseaza SQL Query Analyzer si se apasa pe butonul …. Daca instalarea s-a terminat
cu succes, la apasarea acestui buton, trebuie sa apara o lista cu serverele SQL gasite de
Query Analyzer in retea, similar cu imaginea de mai jos:

Se lasa valorile implicite si click pe OK. SQL Server va crea baza de date dupa care ar
trebui sa vedem aceasta noua baza de date in Enterprise Manager.
Aceastea au fost o parte din metodele de verificare a instalarii SQL Server. Dupa
selectarea unui server din lista (sau a unei instante) si apasarea pe butonul OK, trebuie
sa apara un ecran similar cu cel de mai jos:

Acest ecran ne indica faptul ca SQL Query Analyzer s-a putut conecta la serverul sau
instanta selectata si ne permite, conform permisiunilor ce ne sint asignate la userul
curent, sa interogam bazele de date.

Daca in urma verificarilor nu au aparut erori, instalarea se poate considera incheiata. Nu


trebuie scapata din vedere si inspectarea Event Log-ului sistemului de operare, care ne
poate semnala probleme minore care au putut aparea pe parcursul instalarii si care, pe
termen scurt, sa nu afecteze instalarea, dar care pe termen lung, sa poata genera
probleme. In cazul in care in Event Log se intilnesc mesaje suspecte (Warnings sau
InInformational
stinga vedemdarbaza de fac
care datetrimiteri
ITZone spre
creata anterior,
unele iar in
posibile partea
erori, etc),dreapta, sint afisate
se va consulta SQL
containerele pentru obiectele din aceasta baza de date. Expandind baza de
Server Books Online pentru a depista cauza acestor mesaje si, daca este posibil, date, aceleasi
containere apar
actiunile ce si in partea
trebuie stinga.
intreprinse pentru a remedia / corecta erorile.

Vom trece acum


In episodul la creerea
urmator tabelelor.
vom face primiiPentru exemplificare,
pasi pentru vom
dezvoltarea crea impreuna
aplicatiei tabela
dorite de noi.
centrala a aplicatiei,
Pina atunci, tbl_Colectie.
toate cele bune. Creerea restului tabelelor o las pentru voi ca exercitiu.

Cu baza de date ITZone selectata si expandata, click dreapta pe containerul Tables si


selectata optiunea New Table….
Completate detaliile conform imaginii de mai jos si apoi salvata tabela cu numele
tbl_Colectie.
Simbolul cheitei galbene din dreptul cimpului DiscID arata faptul ca acel cimp este
index primar in tabela noastra. “Bifele” din coloana “Allow Nulls” specifica faptul ca in
acele cimpuri se permite ca utilizatorul sa nu specifice nici o valoare cind se introduc
valori noi sau se face un update.

Similar cu acest ecran, se vor crea tabelele auxiliare ale aplicatiei noastre. Descrierile
acestora sint in acest tutorial.

Pentru mai multe detalii privitor la fiecare din optiunile disponibile in Table Designer
puteti accesa SQL BOL (Books Online).

Pentru comoditate, am inclus scriptul care creeaza baza de date si tabelele necesare. In
acelasi script sint creati si toti indecsii necesari ordonarii datelor in forma dorita de noi.

Pentru rularea acestui script, se procedeaza astfel:


Se download-eaza scriptul si se salveaza intr-un folder in care este accesibil pentru SQL
Server. Dupa aceasta, se lanseaza SQL Query Analyzer.
Click pe OK
Meniul File, Open… si navigat pina in folderul in care este salvat scriptul si selectat
acel script.
Dupa ce scriptul este afisat pe ecran, va trebui modificata calea unde sa fie stocate pe
disc fisierele MDF si LDF asociate bazei de date (zona highlight din script).
Modificati textul highlight sa pointeze spre un folder pe calculatorul unde ruleaza SQL
Server si apoi click pe butonul Run Script (incercuit in imaginea de mai sus) pentru a
rula scriptul.
Dupa rularea scriptului, daca nu au aparut probleme, SQL Query Analyzer va afisa
mesajele:
Iar in folderele mentionate in script, vor aparea urmatoarele fisiere:

Se observa tabelele create in urma rularii scriptului.


Apasa aici pentru a downloada scriptul

Concluzie
Desi s-ar mai putea discuta mult la acest capitol, sa nu uitam ca SQL Server este un
produs cu o arhitectura complexa si o functionalitate mult peste scopul acestui tutorial.
Daca ar fi sa discutam in detaliu despre un anumit subiect asociat SQL Server, am putea
lejer sa acaparam tot spatiul de care dispune ITZone. In plus, exista tone de informatie
disponibile online atit pe site-ul Microsoft (www.microsoft.com/sql) cit si pe diferite
forumuri specializate pe SQL Server. Alte zone de interes online: TechNet, MSDN.
Sau, un simplu Google pe “sqlserver” si va va afisa o lista considerabila de resurse
online despre SQL Server.

Las ca si exercitiu pentru voi creerea unei diagrame a bazei de date proaspat create de
noi. Puteti folosi schema relatiilor dintre tabele prezentata mai sus folosind Visio. Voi
publica in partea a 4-a diagrama, pentru ca fiecare din voi sa se poata verifica.

Pina atunci, va doresc toate cele bune.

Puteti adauga comentarii sau pune intrebari pe tema acestui tutorial aici:
http://www.itzone.ro/forum/viewtopic.php?p=157#157

Dupa rularea scriptului, in Enterprise Manager va aparea noua baza de date si obiectele
definite in aceasta.
Autor Alin Selice

Tutorial Sql Server - Partea 4 Autor Alin Selicean

Adauga comentarii

Episodul 4 – Dezvoltarea aplicatiei

Dupa ce in episoadele anterioare ne-am familiarizat cu SQL Server si am creat fundatia


pe care vom construi aplicatia, in episodul de fata, vom incerca sa facem primii pasi in
construirea elementelor din care va fi compusa, in final, aplicatia.

Insa, inainte de orice, asa cum v-am promis in episodul 3, vom finaliza diagrama bazei
de date.
Aveti mai jos diagrama realizata folosind mecanismele oferite de SQL Server si pasii
necesari pentru a o obtine.

In Enterprise Manager, conform imaginii, click dreapta pe container-ul Diagrams si


selectata optiunea New Database Diagram…

Se va lansa wizard-ul Create Database Diagram.


Click pe Next.
Selectata tabela in jurul careia vom construi aplicatia, tbl_Colectie. Bifati optiunea Add
related tables automatically si lasati valoarea 1 la How many levels of related tables ?.
Semnificatia pasilor de mai sus este urmatoarea: se selecteaza tabela “centrala” a
aplicatie si specificam wizard-ului faptul ca dorim ca odata cu tabela selectata sa fie
incluse si tabelele relationate cu tabela selectata. Conform designului nostru, tabela
tbl_Colectie este relationata cu toate celelalte tabele si avem, in cazul nostru, un singur
nivel de relationare (adica tabelele relationate nu au alte tabele relationate cu acestea).
Click pe Add.
Dupa cum se vede in imaginea de mai sus, wizard-ul a adaugat automat toate tabelele
relationate cu tabela selectata. Click pe Next.
Click pe Finish.
Si avem rezultatul wizard-ului. Dupa cum se vede, in baza relatiilor definite de noi in
faza de design, wizard-ul a reprezentat grafic aceste relatii.
Cu un click dreapta pe oricare din “liniile de relatie”, SQL Server va afisa un meniu
contextual, in care daca selectam optiunea Properties, vom putea edita detaliile relatiei
dintre tabele:
Nu vom intra in toate detaliile disponibile in aceasta fereastra, insa va invit pe cei
interesati sa le descoperiti. Va voi detalia, dintre toate, doar doua optiuni importante si
utile: Cascade Update Related Fields si Cascade Delete Related Records. Cele 2 optiuni
devin disponibile cind se bifeaza casuta Enforce relationship for INSERTs and
UPDATEs. Cele doua optiuni, cind sint activate, permit propagarea modificarilor pe
cimpurile care stau la baza relatiei dintre tabele, in tabelele relationate, respectiv
stergerea inregistrarilor din tabelele relationate. De mentionat faptul ca modificarile,
respectiv stergerile, se propaga de sus in jos (de la tabela spre care este semnul cheitei
spre tabela care are asociat semnul “infinit”). Aceste 2 optiuni ajuta la implementarea
asa-numitului mecanism de integritate relationala a datelor. Daca acest mecanism nu
este implementat, pot aparea inregistrari orfane in tabela tbl_Colectie (inregistrari cu
codul casei de discuri fara corespondent in tabela tbl_CaseDeDiscuri).

Daca ati ajuns la aceeasi diagrama, va felicit. Pe ceilalti ii felicit pentru rabdarea de care
au dat dovada asteptind pina am publicat acest episod si au la indemina pasii necesari
obtinerii diagramei.
Sa trecem acum la MS-Access. MS-Access, pe linga modul standard de lucru (baze de
date in format MDB), ofera posibilitatea stocarii si accesarii datelor pe un server SQL.
Acest mod de lucru ofera mai multe avantaje decit cel standard (standard dpdv al MS-
Access), si anume:
1. Putere mai mare de calcul – datele sint procesate pe server, care dispune de
putere mai mare de calcul
2. Usurinta in dezvoltarea de aplicatii – se modifica doar partea care afiseaza si
proceseaza datele, fara sa fie afectata structura in care sint stocate datele
3. Structura datelor se modifica intr-un singur loc, nu pe fiecare client care
foloseste aceste date. Pe partea de client, se modifica doar partea dezvoltata in
MS-Access.

Pentru a beneficia de acest mod de lucru, vom incepe dezvoltarea aplicatiei noastre,
lansind MS-Access si selectind optiunea File, New….
In New File Panel (partea din dreapta a ecranului), se va selecta optiunea “Project using
exiting data…”.

Se va specifica locatia si numele sub care se va salva aplicatia noastra pe disc. Click pe
Create.

Se va afisa o noua fereastra in care urmeaza sa specificam detaliile de conectare la


serverul SQL pe care sint stocate datele. Completati in fiecare cimp datele specifice
contextului vostru. Eu voi include datele conform contextului curent si voi furniza,
acolo unde este cazul, detaliile necesare.
Pasul 1, Select or enter a server name, se specifica sau selecteaza din lista, numele
serverului SQL pe care este configurata baza de date. In cazul nostru, serverul este
LONDON.

Pasul 2, selectarea unui mod de autentificare. Despre modurile de autentificare am putea


scrie destul de mult. Foarte pe scurt, SQL Server poate folosi serviciile de autentificare
oferite de un domain controller din retea (daca reteaua este configurata pe domenii) sau
poate folosi mecanisme proprii de autentificare a userilor. In mediul de lucru pe care-l
folosesc pentru teste, dispun de un domain controller, astfel incit am ales modul de
autentificare integrat (si care ofera mai multe avantaje dpdv al securitatii). Daca nu se
dispune de un domain controller, se va specifica un user name si o parola valida,
definite pe SQL Server. Pentru detalii despre cum se creeaza un user SQL, va stau la
dispozitie pe forum.

Pasul 3, selectarea unei baze de date. Se va selecta din lista bazelor de date disponibile
pe serverul selectat la pasul 1, baza de date care ne intereseaza (ITZone, in cazul meu).
Daca ati atribuit alt nume bazei de date, selectati baza de date creata de voi pentru acest
tutorial.

OBSERVATIE: Userul selectat (in cazul in care ati selectat modul de autentificare
SQL) trebuie sa aiba acces la baza de date dorita. Pentru detalii, va stau la
dispozitie pe forum.

Dupa completarea acestor pasi, click pe Test Connection. Daca totul a fost ok, veti
primi urmatorul mesaj. Daca nu, va ajut sa treceti peste acest obstacol pe forum ca apoi
sa puteti continua.

Click pe OK ca sa inchideti mesajul afisat si apoi din nou pe OK pentru a inchide


fereastra cu parametri de conectare.

Dupa citeva secunde, SQL Server va afisa o fereastra similara cu cea de mai jos. Pentru
cei care au mai lucrat in MS-Access, aceasta seamana cu ce au mai intilnit pina acum in
MS-Access. Dar asemanarile sint doar aparente. Exista diferente majore, atit in ce se
afiseaza, cit si in “comportamentul” MS-Access.
Va las pe fiecare in parte sa descoperiti asemanarile si diferentele MS-Access fata de
modul “standard”, conform interesului fiecaruia dintre voi.

Vom continua cu explicarea elementelor MS-Access afisate si disponibile in acest mod


de lucru:
 Tables – contine tabelele definite in baza noastra de date. Nu trebuie uitat ca aceste
tabele exista pe serverul SQL, nu in Access.
 Queries – contine definitiile interogarilor definite de noi, pentru a accesa si
manipula datele din tabele. Este echivalentul Views din MS-Access “standard”. Tot in
acest container sint stocate si definitiile functiilor si procedurilor stocate (sau stored
procedures).
 Database Diagrams – optiune inexistenta in aceasta forma in MS-Access
“standard”. In locul acestei optiuni, exista optiunea Relationships.
 Forms – aceeasi functionalitate ca si in MS-Access “standard”. Aici vom crea
interfata prin intermediul careia vom manipula datele din tabelele noastre.
 Reports – definitiile rapoartelor dorite de noi vor fi stocate in acest container.
 Pages – acest container stocheaza definitiile paginilor de acces direct la date. Sint
echivalentul functional al paginilor ASP si este o facilitate existenta si in MS-Access
“standard” si permite publicarea unor pagini html si asp de acces la date pe un intranet.
 Macros – contine definitiile unor colectii de comenzi predefinite si salvate de
executie prestabilita de noi, pentru a ne atinge un scop.
 Modules – contine cod VBA asociat formurilor si celorlalte obiecte definite in
aplicatia noastra.

Ce este important de retinut este faptul ca nu toate obiectele din MS-Access cu care
urmeaza sa interactionam sint sau vor fi stocate in Access. O parte din acestea urmeaza
sa fie create prin intermediul tool-urilor disponibile in MS-Access, dar vor fi salvate si
stocate in SQL Server. Altele, cum ar fi rapoartele, formurile sau codul VBA (Macro-
urile), vor fi stocate in MS-Access. Este treaba MS-Access sa pastreze intacta legaturile
dintre obiectele stocate pe SQL Server si cele stocate in structurile specifice MS-
Access.

Ca si pasi imediat urmatori, vom efectua urmatoarele:


1. Definirea formurilor principale (afisarea datelor de interes, operatii asupra
datelor primare)
2. Definirea formurilor secundare (editare detalii, tranzactii cu elementele din
colectia de discuri, etc)
3. Definirea rapoartelor

Formurile le vom defini in baza cerintelor. Astfel, vom avea nevoie de:
1. un form care sa afiseze colectia integrala de discuri si care sa ofere acces la
urmatoarele operatii:
1. editarea detaliilor asociate unui disc / titlu
2. generarea unei tranzactii cu titlul respective
2. un form care sa ofere acces la tabele catalog ale aplicatie:
1. casele de discuri
2. genurile musicale
3. standarde
4. agenda
3. un form care sa permita accesul la rapoartele definite ale aplicatiei si care sa
permita selectarea comoda, din interfata aplicatiei, a unui raport spre a fi tiparit
sau afisat pe ecran

Acestea ar fi, in linii mari, formurile de care am avea nevoie. Pe masura ce vom avansa
cu lucrul, vom descoperi ca vom avea nevoie de unele formuri de acces rapid la date sau
care sa permita adaugarea rapida, pe moment, de noi inregistrari in anumite tabele ale
bazei de date. Aceste formuri, de care sigur ne vom lovi, vor fi necesare pentru a
imbunatati gradul de ergonomie si rapiditatea in utilizare a aplicatiei, in ansamblul ei.
Sa presupunem urmatorul scenariu: sinteti in formul de inregistrare a unui nou titlu in
baza de date. Aveti discul in fata si ce ar trebui sa faceti ?
1. Sa va asigurati ca in tabela de case de discuri exista o inregistrare care sa
corespunda cu ce gasiti pe discul respectiv
2. Sa va asigurati ca in tabela de genuri muzicale sau filme exista o inregistrare
potrivita cu genul discului in cauza
3. Sa va asigurati ca in tabela de standarde exista o inregistrare etc etc etc

Abia dupa ce pasii de mai sus (pentru simplitate nu i-am inclus pe toti) vor fi parcursi,
veti putea trece la adaugarea efectiva a noului titlu in baza de date. Dar pe masura ce
tabelele asociate tabele “centrale” se vor inmulti, marind gradul de detaliere al datelor,
pasii de mai sus vor fi tot mai multi. Puteti elimina acesti pasi premergatori, prin
oferirea unor facilitati de adaugare rapida de inregistrari in tabele respective.

Pentru a ne usura munca, vom incepe cu creerea diagramei si in MS-Access. Diagrama


creata la inceput este stocata in SQL Server si nu este accesibila din MS-Access.

Pentru aceasta, in Access, dam click pe Database Diagrams si apoi dublu-click pe


Create database diagram in designer.
Selectam tabela tbl_Colectie si, pe rind, fiecare din celelalte tabele. Dupa aceasta, click
pe butonul Close.
Ar trebui sa obtinem aceeasi diagrama ca si in SQL. Inchidem si salvam diagrama
creata.
In Access, in Database Window, ne va aparea diagrama creata si salvata in pasii de mai
sus.
In episodul urmator, vom incepe creerea formurilor principale. Pina atunci, va stau la
dispozitie pentru intrebari pe forumul asociat acestui tutorial.
Autor Alin Selicean

Tutorial Sql Server - Partea 6 Autor Alin Selicean


Ultimul comentariu:
"Unul dintre cele mai cuprinzatoare tutoriale de
mssql"
Adauga comentarii
Toate comentariile

Episodul 6 - Adaugarea functionalitatilor necesare

Continuam dezvoltarea aplicatiei noastre cu extinderea formului principal prin


adaugarea functionalitatilor necesare.
Practica m-a invatat ca e bine sa atribui nume sugestive diferitelor componente ale
oricarui proiect care accepta nominalizarea obiectelor si ca atribuirea acestor nume sa se
faca in baza unui sablon. Asa ca, in timp, mi-am dezvoltat obieciul de a atribui nume
pentru fiecare obiect definit in Access (si nu numai, dar luam acum in discutie acest
aspect numai) in functie de tipul obiectului. Astfel, pentru un ListBox prefixul este lst,
pentru un combo-box prefixul este cbo si asa mai departe. Va puteti stabili singuri acest
tip de regula, dar ideea este sa respectati aceasta regula intotdeauna, indiferent de
amploarea proiectului. In timp, uitati amanuntele si la o eventuala depanare a aplicatiei
sau un eventual upgrade sau modificare, va va fi greu daca nu aproape imposibil sa va
amintiti logica in diferitele locuri ale aplicatiei.

In aceasta idee, vom avea urmatoarele obiecte in formul principal:


 lstCDList – lista de cd-uri
 btnAdd – butonul de adaugare
 btnEdt – butonul de editare
 btnDel – butonul de stergere
 btnRpt – butonul pentru acces la rapoarte
 btn_Iesire – butonul de inchidere a aplicatiei (il vom lasa cu nume diferit ca sablon
de restul, pentru simplul motiv ca deja e configurat cu un event si nu-l mai modificam)

Numele obiectelor se schimba in panoul Properties, tabul Other. Cateva cuvinte despre
acest panou, Properties.

Fiecare obiect definit in aplicatia noastra, are asociate niste proprietati. Aceste
proprietati depind de tipul obiectul si sunt impartite pe categorii (si afisate fiecare in
tab-ul propriu).
Aceste tab-uri sunt:
 Format – proprietati care afecteaza formatarea obiectului la afisare
 Data – proprietati legate de datele manipulate prin intermediul acelui obiect
(control)
 Event – proprietati legate de diferitele evenimente aparute in aplicatie si cum
reactioneaza "controlul” respectiv la acel eveniment
 Other – alte proprietati, specifice tipului de obiect in cauza
 All – toate proprietatile de mai sus, indiferent de categorie, grupate alfabetic

Am mentionat termenul de evenimente (sau events) care apar in aplicatie. Foarte sumar,
aceste evenimente (sau events) sunt generate in parte de Windows, in parte de Access.
Evenimentele sunt "semnale” emise de Windows si de Access prin care "semnalizeaza”
faptul ca, de exemplu, s-a apasat un buton al mouse-ului, s-a apasat o tasta, s-a schimbat
valoarea unui control (un checkbox, de exemplu) si altele. Aplicatia, prin intermediul
actiunilor pe care le specificam la tabul Event, reactioneaza conform specificului event-
ului in cauza. De exemplu, putem specifica faptul ca la fiecare click de mouse in lista de
discuri (lstCDList) sa fie actualizate, in partea dreapta, detaliile relativ la inregistrarea
selectata prin acel click. Evident, fiecare event interceptat de Access se refera la
eventuri care "tin” de Access. Este treaba Windows-ului sa gestioneze corect aceste
aspecte si nu vom insista deloc in aceasta directie.

Vom modifica acum, proprietatile obiectelor din formul principal dupa cum se poate
vedea in imaginile care urmeaza.

Lista de discuri – schimbat numele in lstCDList:

Butoanele
Butonul Adauga redenumit in btnAdd.
Butonul Editeaza redenumit in btnEdit.
Butonul Sterge redenumit in btnDel.
Butonul Rapoarte redenumit in btnRpt.
Butonul Iesire redenumit in btn_Iesire.

Asta a fost pentru schimbarea numele butoanelor. Urmeaza sa adaugam detaliile pe care
le dorim afisate in partea din dreapta a formului. Pentru aceasta, vom adauga niste
textbox-uri in care nu vom permite editarea datelor (editarea se va face in formuri
dedicate). Pentru ca aceste textbox-uri sa contina datele corecte, ne vom folosi de
Event-ul On Click al lstCDList. Textbox-urile se includ in form apasind pe butonul
evidentiat in imaginea de mai jos:
Voi include textbox-urile si va voi prezenta forma finala a formului, in imaginea
urmatoare:
In partea dreapta a formului, dupa cum am spus ceva mai inainte, am inclus unele
controale pentru afisarea detaliilor "ascunse” ale inregistrarii curent selectate in lista din
stanga. Pentru a impiedica editarea datelor in ecranul din dreapta, am setat proprietatea
Locked a fiecarui control pe Yes. In tabelul care urmeaza, am inclus proprietatile
generale ale controalelor de afisare incluse in partea dreapta a formului:

Camp Nume control Continut


ID txtID ID-ul unic al inregistrarii
Flag disc propriu / disc
Disc propriu txtDiscPropriu
imprumutat
An aparitie txtAn Anul de aparitie al discului
Gen txtGen Genul productiei
Producator txtProducator Casa de discuri, producator
Data achizitionarii discului
Data
txtDataCump (sau data la care a fost luat
cumpararii
imprumut)
Data ReturnariitxtDataRetur Data returnarii discului
Nume persoanatxtNume Numele persoanei care a
furnizat discul (daca este luat
imprumut) sau careia i-a fost
imprumutat discul
Adresa de domiciliu a
Adresa txtAdresa
persoanei in cauza
Numarul de telefon al
Telefon txtTelefon
persoanei in cauza
Adresa de email a persoanei in
Email txtEmail
cauza

In imaginea anterioara, la prima vedere, un utilizator mai neatent ar putea incerca sa


modifice datele afisate. Pentru a elimina aceasta posibila confuzie, vom modifica
aspectul campurilor dupa cum se va vedea in cele ce urmeaza.

Am modificat proprietatea Special Effect a fiecarui control din caseta de detalii pe


valoarea Chiseled, cu exceptia cimpului Adresa, pentru care am ales valoarea Etched.
Efectele acestor modificari se vad in imaginea de mai sus.

Un control aparte, cel putin la prima vedere, este campul Disc Propriu. Am
implementat acest camp folosind un combo-box (o lista derulanta), care contine valorile
Da si Nu. Valoarea acceptata de baza de date, in schimb, este True sau False. Pentru
aceasta, asa cum se poate vedea in imaginea de mai sus, am implementat aceste valori,
folosindu-ma de facilitatea oferita de acest tip de control: setarea unei surse a datelor
care sa fie afisata de control (proprietatile Row Source Type si Row Source). Astfel, am
setat ca sursa a datelor pentru acest control o lista fixa de valori (Da si Nu), iar ca valori
pe care sa le "transmita” spre baza de date o alta lista de valori (True si False), care este
ascunsa la afisare, folosind optiunile de formatare a controlului, asa cum se vede in
imaginea de mai jos (proprietatile Column Count si Column Widths):

Acelasi mod de implementare il vom folosi putin mai tarziu, pentru acest camp, in
formurile de editare date si de adaugare inregistrari noi in baza de date.

Modificarea "comportamentului” formului

De unde vom lua aceste date ? Din interogarea care este sursa datelor afisate in lista din
stinga. Daca ne amintim din exercitiile anterioare, pentru lista din stanga, am inclus mai
multe campuri, mai multe detalii decat afisam in acea lista. Acele campuri in plus le-am
inclus exact pentru acest scop. Cum vom actualiza aceste campuri ? Am spus mai sus ca
ne vom folosi de event-ul OnClick al listei din stanga. Acest event, se declanseaza de
cate ori utilizatorul face click pe lista. Ce alte event-uri vom mai folosi ? Inainte de
orice, trebuie spus ca ne vom folosi de event-uri de form si de event-uri de controale. In
functie de context, exista o ordine in care se declanseaza aceste event-uri. De exemplu,
la prima incarcare a unui form, se declanseaza toate eventurile de form si apoi cele
specifice controalelor. Ulterior incarcarii paginii (formului), se vor declansa acele
event-uri specifice actiunilor executate de utilizator. Unele event-uri sunt specifice unei
clase anume (la nivel de form sau la nivel de control). De asemenea, anumite actiuni
sunt limitate din punct de vedere al optiunilor permise, in functie de contextul de
executie (apelate din cadrul unui event la nivelul unui form sau a unui control).

In continuare, vom enumera event-urile de care ne vom folosi in exercitiul nostru.

Event-uri la nivel de form:


OnLoad – event-ul se declanseaza la incarcarea paginii (form-ului) si a controalelor de
pe aceasta (acesta este un event la nivel de form)

Event-uri la nivel de controale:


OnClick – event-ul se declanseaza de cate ori utilizatorul executa un click pe un control
OnDblClick – event-ul se declanseaza de cate ori utilizatorul executa dublu-click pe un
control

Modificarea acestor event-uri, modificarea "comportamentului” formului in cazul


declansarii anumitor event-uri, se face folosind cod VBA (Visual Basic for
Applications). Modificarea codului VBA din spatele fiecarui event se face conform
imaginii de mai jos:
In lista superioara se selecteaza elementul lstCDList. In tab-ul Event, se selecteaza
event-ul dorit si din lista se alege optiunea [Event Procedure], dupa care se executa un
click pe butonul … (evidentiat in imaginea de mai sus). Dupa aceasta, se va afisa
editorul VBA.

Pentru eventul Form_OnLoad, se va introduce codul evidentiat cu bold:

Private Sub Form_Load()


If Me.lstCDList.ListIndex + 1 = 0 Then
' Setam butoanele Edit si Sterge pe inactiv, daca nu este selectata nici o inregistrare in
lista
Me.btnEdt.Enabled = False
Me.btnDel.Enabled = False
End If
End Sub

Pentru event-urile OnClick si OnDblClick, se va introduce codul de mai jos:


Private Sub lstCDList_Click()
' Cind utilizatorul da click pe lista, dorim:
' 1. sa se actualizeze datele din caseta de detalii
' 2. sa se activeze butoanele de editare si stergere inregistrari
If Me.lstCDList.ListIndex + 1 > 0 Then
' Setam butoanele Edit si Sterge pe activ
Me.btnEdt.Enabled = True
Me.btnDel.Enabled = True

' Setam valorile afisate in caseta Detalii


Me.txtID = Me.lstCDList ' Se preia prima coloana (Bound Column)
Me.txtAn = Me.lstCDList.Column(3) ' indexul coloanelor incepe de la 0
Me.txtGen = Me.lstCDList.Column(5)
Me.txtDiscPropriu = lstCDList.Column(6)
Me.txtDataCump.Value = Me.lstCDList.Column(7)
Me.txtDataRetur = Me.lstCDList.Column(8)
Me.txtNume = Me.lstCDList.Column(9)
Me.txtAdresa = Me.lstCDList.Column(10)
Me.txtTelefon = Me.lstCDList.Column(11)
Me.txtEmail = Me.lstCDList.Column(12)
Me.txtProducator = Me.lstCDList.Column(13)
End If
End Sub

Private Sub lstCDList_DblClick(Cancel As Integer)


' Cind utilizatorul de dublu click pe lista, dorim sa se intre
' in modul editare pe inregistrarea curent selectata in lista
' Codul aferent acestei operatii se gaseste asociat cu butonul de editare
btnEdt_Click ' Se apeleaza codul asociat butonului Editare
End Sub

Efectul codului VBA de mai sus este evidentiat in imaginile urmatoare:


Nici o inregistrare selectata in lista din stanga.
Click pe una din inregistrari si in caseta de detalii sunt afisate detaliile acelei
inregistrari.

In continuare, vom genera formurile necesare editarii detaliilor unei inregistrari si


adaugarii uneia noi. Totodata, vom include si functionalitatea de stergere a unei
inregistrari.

Functia de adaugare a unei inregistrari noi si cea de editare a detaliilor unei inregistrari
existente pot folosi acelasi form. Singura diferenta va fi initializarea valorilor
campurilor afisate in acest form, specific contextului (de editare sau de adaugare a unei
noi inregistrari). Astfel, in cazul editarii unei inregistrari, vom dori ca in campurile
formului sa fie afisate valorile curente pentru fiecare camp in parte, pe cand in cazul
adaugarii unei inregistrari, ne este suficient ca aceste campuri sa fie blank
(necompletate cu nimic) sau cu anumite valori care pot fi determinate (de exemplu, data
cumpararii poate fi presupusa, si propusa, cea curenta).

Vom putea folosi acelasi form in scopuri diferite, prin 2 metode: ori folosind un wizard,
ori prin intermediul codului VBA. Pentru diversificare, va voi prezenta si modul rapid
de dezvoltare a unui form, folosind un wizard. Inainte de a incepe, sa ne amintim putin
cateva detalii despre formul principal. Datele care ne intereseaza sunt afisate sumar in
lista lstCDList, afisata in partea stinga a formului principal. Proprietatea Bound
Column a acestei lista am setat-o pe valoarea 1, adica prima coloana din aceasta lista
contine codul unic de identificare a inregistrarilor afisate in lista. Ne vom folosi de acest
control si de aceasta proprietate putin mai tirziu.

Si acum la lucru…
Ne pozitionam in containerul Forms si dam dublu click pe Create new form by using
wizard.
Selectam in lista Tables/Queries, tabela tbl_Colectie, apoi click pe butonul cu sageti
duble, pentru includerea tuturor cimpurilor din aceasta tabela in form.
Click pe Next.
Selectata optiunea Columnar. Puteti experimenta si cu celelalte valori, pentru a vedea
rezultatul. Pentru exercitiul nostru, vom alege optiunea Columnar. Click pe Next.
Vom alege ca efect de afisare a cimpurilor modul Standard. Puteti experimenta si
celelate optiuni, pentru a vedea rezultatele. In acest pas, puteti alege ce efect va place,
neinfluentind major rezultatul exercitiului. Eu am sa aleg Standard. Click pe Next.
Specificati un nume pentru form (se va modifica oricum in faza de design) si specificati
ca doriti sa intrati in modul Design dupa inchiderea wizardului si click pe Finish.
Si acesta este formul obtinut cu ajutorul Wizard-ului. Urmeaza sa-l adaptam nevoilor
noastre. Acest lucru il vom face prin 2 metode, complementare. Adaptand diferitele
proprietati ale formului si incluzand cod VBA care sa modifice formul in functie de
contextul in care este apelat (editare sau adaugare date). Vom incepe prin a adauga un
buton de salvare a datelor si unul de abandon.
Alt tip de adaptare consta in modificarea tipului unor campuri, din text box in combo
box. Mai exact, ne referim la campurile Producator (CasaID), Tip (StandardID), Gen
(GenID) si Nume (AgendaID). Aceasta modificare se impune a fi efectuata pentru ca in
aceste campuri vom stoca doar codurile corespunzatoare valorilor pe care le dorim.
Schimbarea o vom face cu click dreapta pe controlul respectiv, selectat Change To… si
apoi Combo Box.
Si rezultatul acestor modificari, la toate campurile mentionate mai sus:
Acest tip de control ne permite sa afisam o valoare in form si sa stocam aceeasi valoare
sau alta, dupa caz, in baza de date. In cazul nostru, in loc sa afisam un cod, care nu este
sugestiv, vom afisa in aceste combobox-uri un text descriptiv asociat fiecarui cod iar in
baza de date vom stoca codul corespunzator textului descriptiv selectat in combobox.
Urmeaza sa specificam valorile pe care le dorim afisate in aceste combobox-uri. Voi
include printscreen-uri pentru fiecare combobox in parte.

Campul CasaID
Click pe … pentru a specifica sursa datelor.
Click pe tbl_CaseDeDiscuri, click pe Add si click pe Close.
Incluse campurile conform imaginii de mai sus. In coloana Sort Order specificata
valoarea 1 si apoi se inchide fereastra.
Click pe Yes.
Rezultatul.

Campul StandardID
Click pe … pentru specificarea sursei datelor.
Selectata tabela tbl_Standarde, click pe Add si click pe Close.
Efectuate selectiile ca in imaginea de mai sus si inchisa fereastra.
Click pe Yes

Campul GenID
Click pe … pentru specificarea sursei datelor
Click pe tabela tbl_GenuriMuzicale, click pe Add, click pe Close.
Efectuate selectiile ca in imaginea de mai sus.
Click pe Yes.

Campul AgendaID
Click pe … pentru specificarea sursei datelor.
Selectata tabela tbl_Agenda, click pe Add si apoi click pe Close.
Efectuate selectiile ca in imaginea de mai sus. Pentru a obtine randul 2, se scrie de mana
textul Nume & " – " & Adresa iar in coloana urmatoare (Alias) se trece textul Nume. Ca
si rezultat, in acest combobox, vor fi afisate numele si adresa fiecarei persoane din
tabela.
Am ales acest mod de afisare, pentru a permite selectarea persoanei dorite, in situatia in
care exista mai multe persoane cu acelasi nume in baza de date. Daca doriti, pentru
simplitate (sau daca nu va iese J ), puteti lasa numai Nume in prima coloana, caz in care
nu mai e nevoie sa treceti nimic in coloana Alias. Inchisa fereastra.

La toate campurile de pana acum, se vor modifica proprietatile Column Count pe


valoarea 2 si Column Widths pe valoarea 0”;1”, similar imaginii de mai jos:
Click pe Yes, pentru salvare.

Urmeaza sa includem codul VBA prin intermediul caruia vom:


1. Determina contextul in care ruleaza formul (editare sau adaugare) 2. Permite salvarea
sau abandonul modificarii datelor 3. Afisa noile valori in formul principal daca datele
(modificate sau adaugate) au fost salvate.

Vom incepe prin a modifica formul principal, din care vom apela formul tocmai creat.
Inainte de asta, sa salvam formul creat si sa-i dam un nume. Inchidem Form Designer-
ul, click pe Yes.
Selectat formul nou creat (in Wizard i-am dat numele Colectie), click dreapta, Rename
si tastat noul nume al formului: frm_DetaliiDisc.
Am redenumit formul pentru a respecta conventia de nume pentru obiectele din
aplicatie.
Deschis formul frm_StartUp, click dreapta pe butonul Adauga, click pe Build Event.
Selectata optiunea Code Builder si click pe OK.
Dupa cum se vede in imaginea de mai sus, Code Editor-ul afiseaza informatii despre
comanda pe care ati tastat-o (evident, in ideea ca ceea ce ati scris este corect sintactic).
Nu mai urmeaza decat sa introducem parametrii doriti de noi pentru comanda noastra.
Nu voi intra in detalii despre sintaxa diferitelor comenzi VBA si am sa va invit pe
fiecare din voi sa o descoperiti. Pentru acest buton, comanda este urmatoarea:

DoCmd.OpenForm "frm_DetaliiDisc", acNormal, , , acFormAdd, , "ADD"

Semnificatia parametrilor este descrisa de tooltip, in Code Editor. Ce nu este explicat in


Code Editor, este ultimul parametru. VBA de permite sa specificam pe aceasta pozitie
un parametru, optional, pe care sa-l folosim dupa cum credem noi de cuviinta. In astfel
de situatii, de refolosire a unui form (sau de parametrizare a acestuia), personal am decis
sa folosesc acest parametru pentru a decide contextul in care ruleaza acest form. In
cazul nostru, furnizam parametrul "ADD” pentru modul adaugare, "EDT” pentru editare
si "DEL” pentru stergere. Tot cu acest parametru, mai putem lua unele decizii cu privire
la ce mai afisam in plus in form (vom vedea mai tirziu putin despre ce e vorba).
Inchidem Code Editor si trecem la celelalte 2 butoane (Editare si Stergere).

Codul pentru butonul Editare: DoCmd.OpenForm "frm_DetaliiDisc", acNormal, ,


"[DiscID]=" & Me.lstCDList, acFormEdit, , "EDT"
In plus fata de codul pentru butonul Adaugare, apare conditia "[DiscID]=” &
Me.lstCDList. Acest parametru de tip conditional, specifica criteriul de selectie si
filtrare a datelor din tabela tbl_Colectie. Daca va mai amintiti, am mentionat la un
moment dat, despre proprietatea Bound Column a controlului lstCDList. Aici este
momentul sa ne folosim de aceasta. Clauza de filtrare mentionata selecteaza din toata
tabela tbl_Colectie, numai acea inregistrare care are codul DiscID egal cu cel al
inregistrarii selectate in lstCDList.

Codul pentru butonul Sterge: DoCmd.OpenForm "frm_DetaliiDisc", acNormal, ,


"[DiscID]=" & Me.lstCDList, acFormEdit, , "DEL"

Semnificatiile parametrilor sunt aceleasi ca in cazul editarii, cu exceptia ultimului


parametru.

Urmeaza acum sa specificam, prin intermediul VBA, cum se va "comporta” formul


nostru, in functie de context. Ca si prime aspecte de mentionat cu privire la
comportament:
1. In functie de context, vom modifica titlul afisat in bara de titlu a formului 2. Tot in
functie de context, unele butoane vor avea alt text descriptiv afisat (de exemplu, in cazul
in care dorim stergere, textul nu va fi Salveaza J, ci Sterge)
Pentru aceasta, deschidem fereastra frm_DetaliiDisc in modul design si trecem la
scrierea codului VBA. Pentru a modifica proprietatile formului enumerate mai sus, ne
vom folosi de event-ul OnLoad al formului.
In lista din dreptul eventului On Load, selectata optiunea Event Procedure, click pe ….
Se introduce codul VBA de mai jos:

Private sPar AS String

Private Sub Form_Load()


' Salvare parametru extra
sPar = Me.OpenArgs

' Modificare proprietati controale & form


If sPar = "ADD" Then
' Titlul afisat in bara de titlu a formului
Me.Caption = "Adaugare disc"
ElseIf sPar = "EDT" Then
' Titlul afisat in bara de titlu a formului
Me.Caption = "Editare disc #" & Me.DiscID & " - " & Me.Titlu
ElseIf sPar = "DEL" Then
' Titlul afisat in bara de titlu a formului
Me.Caption = "Stergere disc #" & Me.DiscID & " - " & Me.Titlu
' In acest context, se modifica si textul afisat pe butonul Salveaza
Me.btnSave.Caption = "Sterge"

' Tot in acest context, pt a evita modificarea accidentala a datelor,


' se comuta controalele pe Locked
Me.Titlu.Locked = True
Me.StandardID.Locked = True
Me.An.Locked = True
Me.NumeArtist.Locked = True
Me.GenID.Locked = True
Me.DiscPropriu.Locked = True
Me.DataCumpararii.Locked = True
Me.DataReturnarii.Locked = True
Me.AgendaID.Locked = True
Me.CasaID.Locked = True

' Setam focus-ul pe butonul Cancel, pt a evita stergerea din greseala a inregistrarii
Me.btnCancel.SetFocus
End If
End Sub

Cu ajutorul codului de mai sus, am stabilit ce se intampla cu formul, in cele 3 ipostaze


in care e folosit: editare, adaugare si stergere inregistrari.

NOTA: Prima linie (Private sPar AS String) se va introduce imediat sub linia Option
Database Implicit.

Urmeaza sa adaugam codul VBA pentru cele 2 butoane din form.

Codul pentru butonul Salvare

Private Sub btnSave_Click()


' Salvare parametru context
sPar = Me.OpenArgs
If sPar = "DEL" Then
' In acest caz, se executa o alta secventa de instructiuni
' Mai exact, se va sterge inregistrarea curenta
' Dar mai intii se va cere o confirmare
If MsgBox("Sigur stergeti inregistrarea selectata ?", vbYesNo + vbCritical +
vbDefaultButton2 + vbQuestion, "Stergere") = vbYes Then
sSql = "DELETE FROM tbl_Colectie WHERE DiscID = " & Me.DiscID
DoCmd.RunSQL sSql
End If
End If
' Fortare refresh pe lista discuri din formul principal
Forms![frm_StartUp]![lstCDList].Requery
Forms![frm_StartUp]![lstCDList].SetFocus

' Inchidere form curent


DoCmd.Close
End Sub<br><br>

Codul pentru butonul Abandon<br>


Private Sub btnCancel_Click()
' Simulam un abandon al editarii folosind tasta ESC
SendKeys "{Esc}"

' Inchidere form curent


DoCmd.Close
End Sub

Acestea fiind spuse, mai aducem un ultim touch formului nostru. Anume, la partea de
aspect. Pentru a vedea despre ce e vorba, salvam modificarile efectuate pana acum si
incercam formul in real-life.

La apasarea pe butonul Adaugare, rezultatul este cel de mai jos:


Cateva observatii:
1. Apare fereastra Properties (cea din dreapta) 2. Apare Record Selector 3. Apare
controlul de navigare intre inregistrarile disponibile la nivel de form 4. Campul DiscID
este afisat, desi nu este necesar in nici unul din scenarii (adaugare, editare sau stergere)

Pentru a elimina / corecta cele de mai sus, modificam o parte din proprietatile formului
frm_DetaliiDisc (cu formul deschis in modul Design, ca in imaginea afisata dupa tabel)
conform tabelului de mai jos:

Proprietate Valoare Semnificatie


Scroll bars Neither Elimina scroll bar-urile de la nivelul formului.
Elimina record selector (bara verticala din stinga
Record Selectors No
formului)
Elimina record selector (bara verticala din stinga
Navigation Buttons No
formului)
Border style Thin Nu permite resizing-ul formului
Allow Design Changes (tabul Design View
Afiseaza fereastra Properties numai in modul Design
Other) Only
Se observa faptul ca in fereastra Properties, este selectat elementul Form. Sa trecem
acum la campul DiscID. Se selecteaza acest cimp si se seteaza proprietatea Visible pe
No (tabul Format).
Si acum sa repetam testul.
Arata mai bine

Inainte de a incheia partea a 6-a a tutorialului nostru, sa incercam sa ne definim un


raport pe care sa-l generam in ultima parte a tutorialului. Acest raport ne dorim sa
includa toate inregistrarile care reprezinta discuri date imprumut unor terti, cu toate
detaliile asociate acestor discuri (titlu, data estimata a returului, etc). Totodata, dorim ca
in acest raport sa fie evidentiate separat discurile a caror data de returnare e depasita
(fata de data generarii raportului).

Puteti downloada baza de date de aici

Pentru cometarii, intrebari, alte solutii accesati sectiunea de pe forum rezervata


acestui tutorial

In partea a 7-a si ultima a tutorialului nostru, vom finaliza aplicatia noastra cu formul
pentru activarea si generarea raportului, vom genera raportul si vom mai aduce unele
finisari aplicatiei.

Autor Alin Selicean


Tutorial Sql Server - Partea 7 (episodul 1) Autor Alin Selicean

Adauga comentarii

Am ajuns cu aplicatia intr-un stadiu aproape de final. Mai avem de facut urmatoarele:
1. Creat raportul mentionat in finalul partii a 6-a a tutorialului
2. Creat formul prin intermediul caruia vom oferi acces la rapoartele predefinite
3. Testata aplicatia in ansamblu
4. Concluzii

Creerea raportului

Sa incepem prin a genera raportul nostru. La acest capitol, trebuie sa incepem cu citeva
detalii.

Un raport contine 2 componente distincte: a) sursa datelor care furnizeaza datele care
urmeaza a fi prezentate in raport si b) raportul in sine care prin prisma designului sau,
prezinta datele furnizate conform unei structuri si a unei logici specifice acelui raport.
Sursa datelor poate fi o tabela (cu sau fara criterii de filtrare sau ordonare a datelor) sau
o interogare mai complexa a tabelelor (cu scopul de a oferi spre afisare date din mai
multe tabele). Raportul in sine nu este altceva decit o definitie stocata in baza de date,
definitie care este “interpretata” la run-time si rezultatul acestei “interpretari” este afisat
in formatul definit.

Acestea fiind lamurite, sa trecem la definirea structurii datelor care urmeaza a fi afisate.
Pentru aceasta, sa ne reamintim putin cele spuse despre raport in partea 6.
“Inainte de a incheia partea a 6-a a tutorialului nostru, sa incercam sa ne definim un
raport pe care sa-l generam in ultima parte a tutorialului. Acest raport ne dorim sa
includa toate inregistrarile care reprezinta discuri date imprumut unor terti, cu toate
detaliile asociate acestor discuri (titlu, data estimata a returului, etc). Totodata, dorim
ca in acest raport sa fie evidentiate separat discurile a caror data de returnare e
depasita (fata de data generarii raportului).”
Din cele de mai sus reiese ca vom avea nevoie de 2 criterii de departajare a datelor.
Unul este indicatorul de disc propriu si celelalt, mai mult de evidentiere, data returnarii,
in cazul in care discul este dat sau luat imprumut.

Pentru aceasta, ne vom folosi de o functie care intoarce ca rezultat un set de inregistrari
care sa contina datele din tabelele noastre, cu criteriile mentionate mai sus gata
calculate.

Datorita unor incompatibilitati dintre MS Access si SQL Server la capitolul


interpretarea codului Transact-SQL, vom genera functia necesara raportului in SQL
Enterprise Manager.
Pentru a defini aceasta functie, parcurgem pasii descrisi in cele ce urmeaza:

In Enterprise Manager, expandata lista pina ajungeti la containerul Stored Procedures.


Click dreapta pe acesta, selectata optiunea New Stored Procedure…

Introducem urmatorul cod in fereastra afisata:

CREATE PROCEDURE dbo.prc_Raport


@p_Data as smalldatetime
AS
BEGIN
DECLARE @dData AS smalldatetime
IF @p_Data = NULL
SET @dData = @p_Data
ELSE
SET @dData = GetDate()

SELECT dbo.tbl_Colectie.Titlu, dbo.tbl_Colectie.An, dbo.tbl_Colectie.NumeArtist,


dbo.tbl_Colectie.DiscPropriu, dbo.tbl_Colectie.DataCumpararii,
dbo.tbl_Colectie.DataReturnarii,
DATEDIFF(d,@dData,dbo.tbl_Colectie.DataReturnarii) AS 'Intirziere',
dbo.tbl_Standarde.DenumireStandard,
dbo.tbl_GenuriMuzicale.DenumireGen, dbo.tbl_CaseDeDiscuri.DenumireCasa,
dbo.tbl_Agenda.Nume, dbo.tbl_Agenda.Adresa, dbo.tbl_Agenda.Telefon,
dbo.tbl_Agenda.Email,
CASE dbo.tbl_Agenda.AgendaID WHEN NULL
THEN CASE dbo.tbl_Colectie.DiscPropriu
WHEN 1 THEN 'Disc propriu'
ELSE 'Disc X' END
ELSE CASE dbo.tbl_Colectie.DiscPropriu
WHEN 1 THEN 'Date imprumut'
ELSE 'Luate imprumut' END
END AS Categorie,
CASE dbo.tbl_Agenda.AgendaID WHEN NULL
THEN 'Nul' ELSE 'Not nul' END AS 'Agenda ID'
FROM dbo.tbl_Colectie INNER JOIN
dbo.tbl_CaseDeDiscuri ON dbo.tbl_Colectie.CasaID = dbo.tbl_CaseDeDiscuri.CasaID
INNER JOIN
dbo.tbl_GenuriMuzicale ON dbo.tbl_Colectie.GenID = dbo.tbl_GenuriMuzicale.GenID
INNER JOIN
dbo.tbl_Standarde ON dbo.tbl_Colectie.StandardID = dbo.tbl_Standarde.StandardID
LEFT OUTER JOIN
dbo.tbl_Agenda ON dbo.tbl_Colectie.AgendaID = dbo.tbl_Agenda.AgendaID
END
GO

In final, ar trebui sa obtineti urmatoarea functie:


Citeva cuvinte despre aceasta bucata de cod. Aceasta functie ne va returna inregistrarile
din baza de date, cu anumite detalii asociate, calculate. Functia primeste ca parametru o
data de referinta (@p_Data as smalldatetime) fata de care se vor calcula zilele de
intirziere in returnarea discurilor (atit pentru cele luate imprumut, cit si pentru cele date
imprumut). Aceasta data trebuie transmisa intr-un format recunoscut de SQL.

Se mai afiseaza detalii de genul “Disc propriu”, “Dat imprumut” sau “Luat imprumut”.
Acestea sint de fapt si categoriile pe baza carora sint grupate inregistrarile (asta era si o
cerinta a raportului, daca ne amintim). Aceasta informatie este calculata in constructia
de mai jos:

CASE dbo.tbl_Agenda.AgendaID WHEN NULL


THEN CASE dbo.tbl_Colectie.DiscPropriu
WHEN 1 THEN 'Disc propriu'
ELSE 'Disc X' END
ELSE CASE dbo.tbl_Colectie.DiscPropriu
WHEN 1 THEN 'Date imprumut'
ELSE 'Luate imprumut' END
END AS Categorie,

Nu vom intra in detalii privind aceasta constructie, vom spune doar ca in cadrul unei
instructiuni SELECT putem folosi cuvintul-cheie CASE pentru a testa valoarea unui
cimp si in functie de valoarea acestuia, sa operam niste schimbari sau sa efectuam niste
calcule pe care sa le afisam in locul valorii efective a cimpului testat. Pentru mai multe
detalii despre CASE, va invit sa consultati sistemul de help al SQL, SQL Books Online.

Comutam in MS Access pentru a vedea procedura nou creata:

Procedura va aparea in containerul Queries din MS Access. Cu un dublu-click pe


aceasta procedura, vom obtine setul de inregistrari dorit:
Trebuie introdusa data de referinta. Click pe OK dupa ce ati introdus data si obtinem
inregistrarile, ca in imaginea urmatoare:
OBSERVATIE: Daca doriti efectuarea de modificari in codul functiei descrise pina
acum, nu folositi Access-ul, pentru ca altereaza functionalitatea. Exista incompatibilitati
in modul de tratare a valorilor NULL intre Access si SQL.

Avem sursa datelor pentru raport. Putem trece la designul raportului. Pentru aceasta,
parcurgem urmatorii pasi.

Accesam containerul Reports.


Dublu click pe Create Report by using Wizard. Selectam din lista afisata de wizard
elementul Procedure: prc_Raport si adaugam toate cimpurile afisate in stinga, cu click
pe butonul > >.
Click pe Next.
Grupam datele pe cimpul Categorie, cu dublu click pe acel cimp. Rezultatul ar trebui sa
fie similar cu cel ilustrat mai sus. Click pe Next.

Pentru a evidentia discurile cu zile de intirziere, specificam faptul ca dorim sortarea


datelor pe cimpul Intirziere, in mod descrescator, similar imaginii de mai jos:
Click pe Next.
Facem setarile referitoare la aspectul paginii similar cu cele de mai sus. Click pe Next.
Selectam stilul Corporate, click pe Next. NOTA: Puteti alege orice alt stil, va afecta
doar aspectul raportului, nu si continutul. Click pe Next.
Dam un nume raportului nostru: rpt_RaportGeneral. Click pe Finish.

Pentru ca era selectata optiunea Preview the report, sintem rugati sa introducem data de
referinta:
Si obtinem raportul nostru:
Nu prea arata bine, asa ca va trebui sa-l cosmetizam putin. Pentru aceasta, intram pe
raportul nostru in modul Design, cu click pe butonul evidentiat in imaginea de mai sus
cu un cerc rosu.

Apare fereastra de mai jos:


Incepem sa modificam proprietatile raportului:
Caption = Raport colectie
Auto Center = Yes
Titlu = Raport colectie
Pentru restul detaliilor (aramjare in pagina, setari de imprimanta, etc), am sa va las pe
fiecare in parte sa va aranjati si sa va setati raportul conform dorintelor proprii. Eu am
sa va prezint, ca si model, raportul in forma lui finala, asa cum l-am imaginat si aranjat
eu.

Referitor la posibilitatile de aranjare a cimpurilor pe raport, va stau la dispozitie pe


forum.

Si acum, sa trecem mai departe cu dezvoltarea aplicatiei noastre.


Ansambluri Imobiliare, blocuri noi, anunturi imobiliare la Imobiliare-
Rezidentiale.ro
case / vile noi * apartamente de vanzare * apartamente noi Vitan * apartamente noi
Drumul Taberei
Autor Alin Selicean
Tutorial Sql Server - Partea 7 (episodul 2) Autor Alin Selicean

Adauga comentarii

Crearea formului de acces la rapoarte


Vom trece la creerea unui form de acces la rapoarte, din interfata, care sa fie activat la
apasarea butonului Rapoarte din formul principal. Pentru inceput, vom crea formul cu
controalele necesare, apoi vom trece la popularea acestui form cu datele relevante.

Click pe Create form in Design View.


Dimensionati formul afisat implicit pina ajunge la dimensiuni similare cu cele de mai
sus. Vom avea nevoie de urmatoarele controale:
 Un Listbox pentru a afisa o lista cu rapoartele predefinite din aplicatie
 Un buton pentru preview
 Un buton de abandon si revenire in formul principal

Le inseram pe rind si obtinem un aspect si continut al formului similar cu cel de mai


jos:
Schimbam numele acestor controale, astfel:
 Listabox = lstRaport
 Preview = btnPreview
 Abandon = btnCancel Eticheta listei o editam si trecem textul Rapoarte disponibile:
Urmeaza sa afisam numele rapoartelor predefinite in aplicatia noastra. Pentru aceasta,
avemnevoie de doua coloane. Una in care sa includem numele raportului, asa cum l-am
salvat in aplicatie, iar in cealalta sa afisam numele raportului, pe larg. Pentru aceasta,
activam tab-ul Data si editam astfel:

Proprietatea Row Source Type, trecem pe Value List:


Proprietatea Row Source:
Trecem urmatoarele valori: “rpt_RaportGeneral”,”Raport general”; (exact asa cum
sint trecute aici, cu ; la final care este delimitatorul de rind afisat in lista).
In tab-ul Format, editam proprietatile conform imaginii de mai jos:
In combobox-ul de sus selectam item-ul Form:
Si modificam proprietatile afisate conform imaginii de mai jos:
In tab-ul Other:
Setam Allow Design Changes pe Design View Only.

Urmeaza sa setam actiunile care sa fie intreprinse cind sint apasate butoanele incluse in
form.

Click dreapta pe butonul Abandon si selectata optiunea Build Event:


Selectam Code Builder si editam codul conform imaginii de mai jos:
Inchidem Visual Basic editor-ul si revenim in formul nostru.

Click dreapta pe butonul Preview, Build Event, Code Builder si includem urmatorul
cod:

Aici sint necesare citeva precizari.


In bucata de cod de mai sus, ne-am folosit de un obiect special, Me. Acesta defineste
elementul Access curent, in cazul nostru formul curent. Odata scris in Visual Basic, sint
afisate toate elementele definite in cadrul obiectului curent plus cele identificabile in
cadrul aplicatiei (sa nu uitam ca in Access si implicit in VBA se poate lucra cu obiecte).
Din lista afisata, puteti selecta controlul cu numele “lstRaport” care identifica lista cu
rapoartele definite in aplicatie. Daca ne amintim, in aceasta lista am inclus 2 coloane, in
care am inclus astfel: in coloana 1 numele sub care este salvat raportul in baza de date,
in coloana 2 o descriere generica a raportului respectiv. Ca si rezultat, sintaxa de mai
sus, preia din controlul lstRaport valoarea din coloana 1 (adica numele sub care este
salvat raportul in baza de date) si o returneaza Access pentru ca acesta sa identifice
univoc raportul dorit pentru a-l afisa. Modul de afisare este specificat prin parametru
acViewPreview.
Inchidem si salvam formul:
Si acum sa facem o proba a formului creat pina acum.
Dupa cum se poate vedea, aplicatia lanseaza raportul dorit in executie si raportul
respectiv asteapta ca parametru data de referinta la care se doreste raportul. In aceasta
fereastra avem 2 optiuni: introducem manual o data calendaristica valida sau selectam
din lista disponibila valoarea .
Selectind valoarea aplicatia va lua in calcul data curenta din sistem. In cazul in care se
va selecta valoarea , aplicatia va genera un mesaj de eroare, pentru ca nu este specificata
o valoare implicita pentru acest parametru.

Oricare din variantele de mai sus este aleasa, aplicatia va afisa raportul pe ecran,
existind posibilitatea tipariri acestuia.
Las la latitudinea fiecaruia dintre voi re-designul raportului, pentru ca dupa cum se
vede, linia de detaliu nu incape pe o singura pagina.

Autor Alin Selicean

Tutorial Sql Server - Partea 7 (episodul 3) Autor Alin Selicean


Ultimul comentariu:
"Nu stiu de ce setari este nevoie pentru ca o baza de date creat in Access care
functioneaza pe SQL server sa functioneze in reteaua locala??? Ma poate ajuta cineva?
Multumesc anticipat pentru idei."

Adauga comentarii
Toate comentariile

Testarea aplicatiei
Acum sa testam aplicatia. Aici am sa va las pe fiecare in parte sa faceti acest test. Eu am
sa evidentiez direct unele lipsuri, pe care le-am lasat intentionat la urma. De ce ? Pentru
ca am dorit sa evidentiez importanta analizei din mai multe puncte de vedere:
functionalitati, interfata (formul principal), implementarea functionalitatilor in diferite
locuri in cadrul aplicatiei.

Deficienta majora a aplicatiei o reprezinta faptul ca nu exista formuri de actualizare a


datelor statice (gen cataloage) care sa fie afisate in combobox-urile corespunzatoare.
Aceasta lipsa este evidenta in formul de editare / adaugare discuri.

Intrebarea apare cind incercam sa modificam, de exemplu, genul unui disc si genul dorit
nu este regasit in lista afisata.

Cum corectam aceasta deficienta ? Putem adauga, linga fiecare lista de acest tip, cite un
buton care sa activeze un form de actualizare a tabelelor care contin datele respective.
Formurile necesare vor trebui sa permita atit adaugarea rapida de date, cit si editarea
datelor existente.

Sint necesari trei pasi majori: 1) modificarea designului formului de editare / adaugare a
unui titlu, 2) creerea cite unui form de adaugare rapida a datelor dorite specific fiecarui
combobox si 3) creerea unui form general care sa contina tabelele cu datele existente
pentru a putea fi modificate. Va voi prezenta modul de creere a formului general si a
unui form de adaugare rapida si va las cu titlu de exercitiu creerea celorlalte formuri.
Dispuneti de aplicatia completa pentru download, daca intimpinati probleme cu acest
exercitiu.

Deschidem formul frm_Detalii in modul Design.

Pentru a face loc noilor butoane, marim spre dreapta formul, repozitionam spre dreapta
butoanele Salvare, Abandon si casuta DiscID. Putem, acum, pozitiona cite un buton
linga fiecare combobox, similar imaginii de mai sus. Sfat: inserati un buton,
redimensionati-l si schimbati-i textul afisat din “CommandNN” in “…”, dupa care cu
Copy & Paste creati celelalte butoane (e nevoie de repozitionarea acestora).

Actualizam proprietatea Name pentru fiecare buton (primul este descris in imaginea de
mai sus):
Creem acum formurile care vor fi apelate de aceste butoane.

Pentru a usura acest task, vom apela la wizard-uri. In containerul Tables, selectam
tabela tbl_CaseDeDiscuri si din toolbar, selectam wizard-ul Autoform.
Rezultatul:
Urmeaza sa finisam formul creat cu acest wizard, prin ajustarea unro setari la nivel de
form. Dupa aceasta, vom avea de adaugat unele controale la acest form. Pentru aceasta,
comutam in modul Design.

In primul rind dorim sa nu mai avem fereastra de proprietati afisata tot timpul.
In al doilea rind, dorim sa eliminam unele elemente incluse implicit de wizard:
scrollbars, record selectors, titlul, etc.
Eliminam subformul care apare sub numele Table.tbl_Colectie.
Adaugam 2 butoane: OK (sau Save) si Abandon.
Setam cimpul CasaID sa nu fie disponibil si vizibil:
Salvam formul nou creat:
La acest form, mai avem de adaugat codul VBA care sa ne ofere functionalitatile
specifice contextului din care vom apela acest form.

Nu am sa intru in detalii foarte mari, dar pe scurt:


1. Acest form va fi apelat atit din formul de editare detalii cit si dintr-un form care
ne va permite accesul la toate cataloagele aplicatiei (case de discuri, standarde,
etc)
2. In functie de context, formul se va comporta diferit (anumite liste vor trebui
repopulate cu datele din tabelele corespunzatoare, etc)
3. Contextul din care este apelat va fi determinat cu ajutorul parametrului
OpenArgs care se poate furniza (parametrul este optional) unui form la
deschiderea acestuia (via VBA)

Sa trecem la construirea codului VBA pentru acest form, incepind cu formul de editare
a detaliilor unui disc.
Citeva cuvinte despre bucata de cod:
Deschidem formul in modul de afisare “normal” (acNormal), in modul de parcurgere a
datelor “adaugare” (acFormAdd), in modul “Dialog” (acDialog – nu se permite
accesarea altor elemente ale aplicatiei pina nu se inchide formul curent) si transmitem
prin intermediul ultimului parametru contextul din care apelam formul (“ADD” –
OpenArgs). Acest ultim parametru il vom folosi in cadrul codului VBA asociat
formului frm_CasaDeDiscuri pentru a actiona conform cerintelor acelui context.

Deschidem acest form pentru design si completam codul VBA asociat atit formului (ce
sa se intimple cind formul este deschis sau inchis), cit si codul asociat diferitelor
controale.
Introducem codul urmator:

Private Sub btn_Save_Click()


Dim sArgs As String

' Salvam valoarea ultimului parametru


sArgs = Me.OpenArgs
If sArgs = "ADD" Then
' Sintem in modul adaugare rapida din formul de editare detalii
' 1. Inchidem formul curent
' 2. Recitim tabela cu casele de discuri, afisata in controlul CASAID
' 3. Predam focusul pe controlul CASAID
DoCmd.Close acForm, "frm_CasaDeDiscuri"
Forms![frm_DetaliiDisc]![CasaID].Requery
Forms![frm_DetaliiDisc]![CasaID].SetFocus
End If
End Sub

Codul este comentat, asa ca nu am sa mai insist asupra actiunilor din cod.
Adaugam si codul pentru butonul Abandon.

Private Sub btn_Abandon_Click()


Dim sArgs As String

' Salvam valoarea ultimului parametru


sArgs = Me.OpenArgs
If sArgs = "ADD" Then
' Sintem in modul adaugare rapida din formul de editare detalii
' Inchidem formul curent
DoCmd.Close acForm, "frm_CasaDeDiscuri"
' Redam focusul pe lista CasaID
Forms![frm_DetaliiDisc]![CasaID].SetFocus
End If
End Sub

Pentru a putea identifica vizual contextul in care lucreaza formul, vom introduce un cod
VBA care va afisa in bara de titlu a ferestrei modul de lucru curent.
Cu click pe butonul … se deschide VBA Editor si se introduce codul de mai jos:

Private Sub Form_Open(Cancel As Integer)


If Me.OpenArgs = "ADD" Then
Me.Caption = "Adaugare rapida casa de discuri"
ElseIf Me.OpenArgs = "EDT" Then
Me.Caption = "Editare casa de discuri"
ElseIf Me.OpenArgs = "ADR" Then
Me.Caption = "Adaugare casa de discuri"
End If
End Sub

Si acum sa vedem efectul.

Se poate vedea ca titlul afisat in bara de titlu este “Adaugare rapida”.

Va voi asista acum in creerea formului in care vom putea edita datele din celelalte
tabele asociate aplicatiei: case de discuri, genuri, standarde disc, agenda. Pentru
usurinta, vom folosi modul de afisare / gestionare / modificare date tabelar, cu
subformuri care include tabelele dorite.
Pentru aceasta vom avea nevoie de un form principal, in care vom include aceste
subformuri, pe cite un tab separat fiecare subform. Incepem cu un click pe New… in
containerul Forms.

Click pe Design View, OK.


Redimensionati formul implicit pina ajunge suficient de mare (similar cu imaginea de
mai sus). Click pe butonul Tabbed Control (vezi imaginea de mai sus pentru localizarea
acestuia in toolbar). NOTA: Tabbed control este un control ActiveX. Mai multe detalii
despre controalele ActiveX gasiti in documentatia Access.
Dimensionati tab-urile similar imaginii de mai sus. Click dreapta pe tab-uri si selectati
Properties.
Modificam titlul afisat pentru fiecare tab si adaugam tab-uri conform imaginii de mai
sus

Adaugam pagini noi cu click dreapta si Insert Page.


Inseram ca subform in fiecare tab, un link catre tabelele cu rol de cataloage. Pentru a
insera un subform, click pe butonul Subform / Subreport din toolbar (vezi in imaginea
de mai sus localizarea acestui buton in toolbar).
Procedati similar cu celelalte tab-uri si subformuri.
Click pe tab-ul dorit, si apoi click pe subformul inclus. Modificati proprietatea Name
conform imaginii de mai sus. Procedati similar pentru restul tab-urilor / subformurilor.

Formul creat mai sus ne va permite accesul rapid si facil la datele cu rol de cataloage,
pentru a actualiza aceste date: adaugari, modificari si stergeri de date din aceste
cataloage.

Modificam unele proprietati de afisare a formului. Setati conform imaginii de mai jos:

Acest form se va inchide cu ajutorul butonului standard Close (X) al ferestrelor


Windows.
Salvam formul si facem o proba.
Formul nou creat:

Acum, pentru a accesa acest form, trebuie sa creem un nou buton in formul principal al
aplicatiei. Deschidem formul frm_Startup in modul design.
Asignam o actiune acestui buton, si anume sa deschida formul frm_Cataloage, prin
intermediul codului de mai jos:

Private Sub btn_Cataloage_Click()


DoCmd.OpenForm "frm_Cataloage", , , , , acDialog
End Sub

Salvam si inchidem formul frm_Startup. Cu acestea, am putea spune ca aplicatia noastra


este gata. Totusi, am vrea ca accesind aceasta baza de date (sau aplicatie Access), sa se
deschida automat formul frm_Startup si fereastra bazei de date Access (unde sint
disponibile tabelele si celelalte obiecte) sa fie ascunse.

Aceasta se poate face foarte usor, astfel:

Tools, Startup…
Efectuati setarile conform imaginii de mai sus si click pe OK. Inchideti Access si creati
un shortcut la baza de date creata in cadrul acestui exercitiu. Dati dublu click pe acest
shortcut si vedeti rezultatul muncii voastre.

In functie de anumite setari de securitate din cadrul pachetului Office, poate aparea
urmatorul mesaj de avertizare:
Selectati Open si mergeti mai departe.
Si cu asta putem considera aplicatia noastra terminata. Va invit sa o parcurgeti de la un
capat la altul si sa ii testati functionalitatile.

Concluzii
Citeva imbuntatiri posibile:
 Se poate asigna formului de rapoarte ca la dublu-click pe un raport sa se afiseze
raportul dorit;
 Se poate adopta un alt format al raportului, se pot filtra datele pe diferite criterii, se
pot genera rapoarte diferite pentru diferitele categorii de cd-uri, care sa includa datele
relevante pentru acea categorie
 Se pot include si alte informatii relevante pentru acest domeniu

Pentru comoditatea voastra, aveti aplicatia disponibila pentru download Aici

Sper ca acest tutorial sa va fi ajutat cit de cit si sa va trezeasca interesul pentru bazele de
date. Dupa cum ati vazut, Access poate fi o unealta puternica si permite lucrul cu baze
de date mari, stocate pe un server puternic de baze de date (SQL Server). Frumusetea
acestui aspect nu consta in faptul ca puteti folosi un SQL Server, ci ca puteti folosi orice
motor de baze de date puternic (Oracle, etc), cu unele mici amendamente (care nu fac
obiectul acestui tutorial) si unele aspecte specifice fiecarui motor de baze de date.
Autor Alin Selicean

You might also like