Documente Academic
Documente Profesional
Documente Cultură
BIBLIOGRAFIE MINIMALĂ
[1] Rotaru, Simona; Ghită, Mirela, (2015), Sisteme și aplicații informatice pentru economie, Editura
Revers, Craiova
2] Rotaru, Simona; Ghită, Mirela, (2010), Sisteme de gestiune economică, Editura Sitech, Craiova.
[3] Fusaru D., Gherasim Z, Andronie M., Bâră A., (2003), Aplicaţii economice în Visual Basic şi Access,
Ed. Fundaţiei România de Mâine, Bucureşti.
[4] Gherasim Z, (2007), Programarea si Baze de dates, Ed. Fundaţiei România de Mâine, Bucureşti.
[5] Lungu I, Sabău Gh, (2013), Sisteme informatice și baze de date, ASE, București
[6] Velicanu Manole ş.a.(2013), Sisteme de gestiune a bazelor de date prin exemple, ASE, București
[7] Curtis G., Cobham D (2012), Bussiness Information Systems, Analysis, Design and Practice,
Prentice – Hall, fourth editions
[8] Connolly, T. and Begg, C (2012), Database Systems. A Practical Approach to Design,
Implementation and Management, Addison Wesley, third edition
CAP.I ORGANIZAREA DATELOR
Datele sunt stocate în memoria internă şi memoria externă a oricărui sistem de calcul.
Organizarea datelor presupune:
Definirea, structurarea, ordonarea şi gruparea datelor în colecţii de date omogene;
Stabilirea legăturilor în mod ierarhic între date, între elementele unei colecţii de
date şi în final, între colecţiile de date;
Stocarea datelor pe suport informaţional prelucrabil într-un sistem de calcul.
Organizarea datelor este făcută în scopul regăsirii automate după diverse criterii.
În organizarea datelor se urmăresc mai multe obiective:
Timpul de acces la datele organizate pe diverse suporturi să fie minim;
Datele să apară o singură dată în sistem;
Spaţiul de memorie internă şi externă alocat datelor să fie cât mai redus;
Această organizare să reflecte absolut toate legăturile dintre obiectele, procesele
economice pe care aceste date le reprezintă;
Să permită schimbarea structurii datelor şi a relaţiilor dintre acestea fără a produce
modificări în programele care le gestionează.
O colecţie de date reuneşte date despre o anume clasă de obiecte (reale sau conceptuale).
Spre exemplu colecţia de alte PRODUSE - FINITE reuneşte datele cu privire la clasa de obiecte
PRODUSE .
O clasă de obiecte conţine obiecte de acelaşi tip, adică obiecte ce au aceleaşi
caracteristici (atribute). Realizările unei clase de obiecte formează o colecţie de date. Colecţiile
de date au structuri uniforme, ele reprezintă valori ale caracteristicilor (atributelor) obiectelor
tip.
Întreprinderile organizează mai multe colecţii de date: colecţia de date CONTURI,
colecţia de date PRODUSE colecţia de date LOCURI-DE-ACTIVITATE etc.
Folosirea tehnologiilor informaţionale în colectarea, stocarea, procesarea şi transmiterea
colecţiilor de date a impus definirea unor tehnicii şi metode de organizare a acestora .
Se cunosc două metode de organizare a colecţiilor de date :organizarea în fişiere de date
şi în baze de date.
Un fişier este un ansamblu organizat de date omogene din punct de vedere al naturii şi al
criteriilor de prelucrare, memorate pe suporturi de unde pot fi utilizate în procesul de prelucrare.
Se consideră că organizarea datelor în fişiere prezintă următoarele limite:
- Datele au un caracter separat, izolat fără a fi puse în evidenţă legăturile dintre ele;
- Redundanţa datelor şi riscul de inconsistenţă a datelor sunt apreciabile;
- Dependenţa programelor faţă de date în sensul că elaborarea programelor este strâns
legată de organizarea datelor şi de natura suportului. Orice modificare de suport sau structură a
datelor generează modificarea programului, recompilarea şi resetarea acestuia;
- Reprezentarea unor obiecte complexe în cazul utilizării fişierelor este extrem de
dificilă;
- Imposibilitatea realizării unor prelucrări care nu au fost prevăzute anterior.
Limitele organizării datelor în fişiere şi posibilităţile oferite de noile tehnologii
informaţionale au dus la promovarea metodei de organizare a datelor în bază de date.
În esenţă conceptul de baza de date poate fi definit ca un sistem de colecţii de date, cu
legături logice multiple şi de descriere a datelor şi a legăturilor, destinat satisfacerii operative a
celor mai diversificate solicitări provenite din partea unor grupuri diferite de utilizatori.
Într-o bază de date sunt înregistrate datele despre obiectele reale sau abstracte, dar şi
asocierile (relaţiile) care se pot stabili între acestea. Se spune că între baze de date există o
interdependenţă logică. Luarea în calcul a interdependenţelor ce se pot stabili între colecţiile de
date memorate într-o bază de date contribuie la asigurarea integrităţii funcţionale a bazei de
date. Spre exemplu, înregistrarea datelor privind facturile primite de la furnizori este posibilă
numai dacă datele despre furnizori există în baza de date.
Între colecţiile de date FACTURI şi respectiv, FURNIZORI există o legătură logică
(spunem noi o relaţie de integritate funcţională).
Datele sunt descrise o singură dată şi utilizate chiar simultan, de mai mulţi utilizatori
(fără ca aceştia să se mai preocupe de descrierea acestora şi de modul cum sunt memorate fizic
datele pe suporturi tehnice).
O bază de date conţine: descrierea datelor; înregistrările de date (tuplurile).
Organizarea datelor în baze de date trebuie să îndeplinească următoarele condiţii:
- Să asigure o independenţă sporită a datelor faţă de programe şi invers;
- Structura bazei de date trebuie astfel concepută încât să asigure informaţiile necesare şi
suficiente pentru cerinţele de informare şi decizie;
- Să asigure o redundanţă minimă şi controlată a datelor;
- Să permită accesul rapid la datele stocate în bază.
Organizarea datelor într-o bază de date se realizează pe trei niveluri:
logic (extern);
conceptual (virtual);
fizic (intern).
Pentru fiecare nivel se defineşte o schemă a bazei de date: schema logică, conceptuală şi
fizică.
Schema logică (externă) reflectă viziunile specifice unui utilizator sau grupuri de
utilizatori asupra datelor. Fiecare utilizator îşi creează colecţiile de date prin prisma intereselor
sale de aplicaţie. Dacă datele ar fi stocate conform acestei scheme, ar putea apărea o redundanţă
sporită a datelor deoarece mai mulţi utilizatori pot utiliza aceleaşi date.
Schema conceptuală (virtuală) este obţinută pe baza schemelor logice prin eliminarea
redundanţelor şi sintetizarea datelor.
Schema fizică (internă) reprezintă descrierea schemei conceptuale în termeni specifici
memorării fizice a datelor pe suporturi tehnice. Trecerea de la schema conceptuală la cea internă
se face prin intermediul limbajelor de descriere a datelor, care sunt incluse în sistemele de
gestiune a bazelor de date.
Pentru o bază de date se pot defini:
mai multe scheme logice;
o singură schemă conceptuală;
o singură schemă fizică.
Cele trei niveluri de reprezentare a datelor şi cu structurile aferente sunt reprezentate în
figura 1.1
Nivel extern
Schema Schema
externă 1 externă n
INTERFAŢĂ
SGBD Nivel
SCHEMA
conceptual
CONCEPTUALĂ
INTERFAŢA
BAZA DE DATE
MEMORATĂ PE DISC Nivel intern
Fig. 2.1
MODELE DE DATE PENTRU BAZE DE DATE
Fig. 2.2
FACULTĂŢI
Fig. 2.4
În exemplul considerat, tipului de înregistrare FACULTĂŢI îi corespund trei înregistrări:
(1, Marketing), (2, Informatică de gestiune), (3, Finanţe şi Bănci), tipului de înregistrare BURSE
două realizări (9.42, Bursă studiu), (9.86, Bursă merit), iar tipului de înregistrare STUDENŢI
trei realizări: (111, Mihai Dan, I), (211, Manea Ion, I), (212, Ciurea Elena, I). Înregistrările (1,
Marketing) - FACULTĂŢI şi (9.42, Bursă studiu) - BURSE sunt părinţi pentru (111, Mihai Dan,
I) - STUDENŢI. Realizarea (211, Manea Ion, I) - STUDENŢI are ca părinţi: (2, Informatică de
gestiune) - FACULTĂŢI şi (9.42, Bursă studiu) - BURSE, iar realizarea (212, Ciurea Elena, I) -
STUDENŢI are ca părinţi înregistrările: (2, Informatică de gestiune) - FACULTĂŢI şi (9.86,
Bursă merit) - BURSE. Înregistrarea (3, Finanţe şi Bănci) - FACULTĂŢI nu are copii.
Fig. 2.5
Modelul relaţional
Modelul relaţional are la bază teoria matematică a relaţiilor (algebra relaţională = colecţie
de operatori ce au ca operanzi relaţii) permiţând utilizatorului să vadă baza de date ca o colecţie
de tabele (relaţii).
Modelul relaţional a fost introdus în 1970 de cercetătorul american E. F. Codd şi se
fundamentează pe conceptul de structură relaţională şi algebră relaţională.
Structura relaţională
Relaţia reprezintă un subansamblu al produsului cartezian al mai multor mulţimi
(domenii), subansamblu caracterizat printr-un nume şi care conţine tupluri cu semnificaţie.
Putem descrie o relaţie prin formula:
R D1 D2 D3 .......... ......... Dn
sau
R ( X 1 , X 2 ,............. X n )
Funcţia de mulţimi pe care este definită relaţia se numeşte domeniu. Un domeniu se poate
defini explicit , prin enumerarea tuturor valorilor aparţinând acestuia, sau, implicit, prin
precizarea proprietăţilor pe care le au valorile din cadrul domeniului respectiv.
Pentru un ansamblu de domenii D1 , D2 ,...........Dn , produsul cartezian al acestora
reprezintă ansamblul tuplurilor d1 , d 2 ,........d n unde: d1 este o valoare aparţinând
domeniului D1 , d 2 este o valoare aparţinând domeniului D2 , ş.a.m.d. Numărul n (numărul
valorilor dintr-un tuplu) reprezintă gradul relaţiei. Numărul de tupluri m din relaţie indică
cardinalitatea relaţiei şi reprezintă extensia acesteia.
Dacă tuplurile dintr-o relaţie trebuie să fie unice, un domeniu poate apărea de mai multe
ori în produsul cartezian pe care este definită relaţia.
O relaţie este reprezentată într-o formă simplă, uşor de întreţinut şi utilizat, printr-un
tabel bidimensional. La definirea şi utilizarea acestuia se operează cu următoarele concepte:
atribut, tuplu, cheie primară, cheie externă, domeniul atributului.
În constituirea tabelului (relaţiei) se vor respecta următoarele reguli:
fiecare coloană este identificată printr-un nume distinct;
în fiecare coloană toate valorile sunt de acelaşi tip;
toate liniile sunt distincte, dublurile nefiind admise;
ordinea liniilor şi coloanelor nu este impusă.
Pentru exemplificare se consideră tabelele (relaţiile): CLIENŢI şi FACTURI
CLIENŢI
Cod
Nume client Adresă client Telefon
client
469 Matei Alin Braşov 092746539
765 Gusu Pavel Cluj 091765350
595 Micu Dan Arad 092847586
FACTURI
Nr. factură Dată factură Preţ factură Cod client
1543772 12/04/02 154676839 595
2645799 24/05/02 243869435 469
12978635 09/06/02 367485932 765
Cod client, Nume client, Adresă client, Telefon, Nr. factură, Dată factură, Preţ factură,
Cod client sunt atributele celor două tabele.
Fiecare coloană se numeşte domeniu şi conţine toate valorile unui atribut, iar fiecare linie
se numeşte tuplu. Numărul liniilor se numeşte cardinalul tabelului, în timp ce numărul
coloanelor se numeşte gradul tabelului.
Trebuie făcută diferenţierea între:
structura tabelului, definită prin ansamblul atributelor;
tupluri (înregistrări) care sunt instanţieri (realizări) ale structurii.
În cadrul fiecărui tabel se alege un atribut care să poată identifica în mod unic, printr-o
valoare distinctă, tuplurile relaţiei. Acest atribut se numeşte cheie primară.
Atributul Cod client din tabelul CLIENŢI constituie cheie primară (nu pot exista mai
mulţi clienţi cu acelaşi cod).
Legătura între tabele se asigură pe baza valorilor unor atribute din structura tabelului
numite şi chei externe. Un atribut este cheie externă pentru o relaţie, dacă se regăseşte pe post de
cheie primară în altă relaţie.
Atributul Cod client din tabelul FACTURI este cheie externă a acestui tabel. Legăturile se
stabilesc pe baza valorilor atributului Cod client. Unei realizări a tabelului CLIENŢI i se pot
asocia zero, una sau mai multe realizări ale tabelei FACTURI.
În activitatea de modelare relaţională a datelor, având în vedere că relaţiile reflectă
anumite aspecte din lumea reală, trebuie respectate restricţiile (constrângerile) de integritate.
Restricţiile de integritate ale modelului relaţional sunt de două tipuri:
a) restricţii de integritate care depind de semantica valorilor domeniilor.
Din această categorie fac parte:
restricţia de unicitate a cheii – semnifică faptul că într-o relaţie nu pot exista două tupluri
cu o aceeaşi valoare pentru atributele cheie;
restricţia entităţii (integritatea entităţii), potrivit căreia, într-o relaţie atributele cheii
primare să fie nenule; altfel cheia nu va mai fi identificator;
restricţia referenţială (integritatea referirii), impune ca valorile unei chei externe să
figureze (refere) prin valorile cheii primare din altă relaţie sau să fie valori „null” (nedefinite).
b) alte restricţii de integritate care ţin cont de dependenţa între date şi de semnificaţia valorilor
din cadrul bazei de date.
1. ANALIZA DE SISTEM
lumea reală
studiul analiza
2. PROIECTAREA
alegerea proiectarea
SGBD fcţ. BD
3. REALIZAREA
COMPONENTELOR LOGICE
4. PUNEREA ÎN FUNCŢIUNE ŞI
EXPLOATAREA
5. DEZVOLTAREA
Figura 4.1. Activităţile parcurse pentru realizarea unei baze de date
Analiza este o activitate de modelare (conceptuală) şi se poate realiza sub trei aspecte:
structural, dinamic şi funcţional.
a) Analiza structurală evidenţiază, la nivel conceptual, modul de structurare a datelor şi
a legăturilor dintre ele. Cea mai utilizată tehnică este entitate-asociere.
Aceasta conţine:
1) Identificarea entităţilor: fenomene, procese, obiecte concrete sau abstracte
(substantivele din prezentarea activităţii descrise) (exemple de entităţi: Persoane,
Produse, Beneficiari).
2) Identificarea asocierilor dintre entităţi ca fiind legăturile semnificative de un anumit
tip (verbele din prezentarea activităţii descrise).
3) Identificarea atributelor ce caracterizează fiecare entitate în parte (exemple de
atribute: Marca, Nume, Adresă).
4) Stabilirea atributelor de identificare unică a realizărilor entităţii, drept chei.
Rezultatul analizei structurale este modelul static (structural), numit şi diagramă entitate-
asociere.
b) Analiza dinamică evidenţiază comportamentul elementelor sistemului la anumite
evenimente. Una dintre tehnicile utilizate este diagrama stare-tranziţie.
Aceasta presupune:
1) Identificarea stărilor în care se pot afla componentele sistemului.
2) Identificarea evenimentelor care determină trecerea unei componente dintr-o stare în
alta.
3) Stabilirea tranziţiilor admise între stări
4) Construirea diagramei stare-tranziţie
Rezultatul analizei dinamice: modelul dinamic
c) Analiza funcţională evidenţiază modul de asigurare a cerinţelor informaţionale
(fluxul prelucrărilor) din cadrul sistemului, prin care intrările sunt transformate în
ieşiri. Cea mai utilizată tehnică este diagrama de flux a datelor.
Conform acestei tehnici se delimitează:
1) Aria de cuprindere a sistemului.
2) Se identifică sursele de date.
3) Se identifică modul de circulaţie şi prelucrare a datelor.
4) Se identifică apoi rezultatele obţinute.
Rezultatul analizei funcţionale: modelul funcţional.
Notă. Exemplu privind activitatea de analiză, sub toate cele trei aspecte prezentate mai
sus, vezi cartea [LUVE00].
2. Proiectarea structurii bazei de date
Pornind de la modelele realizate prin activitatea de analiză, se poate proiecta structura
BD, parcurgând două subactivităţi: alegerea SGBD-ului, proiectarea funcţiilor BD.
a) Alegerea SGBD-ului se face ţinând cont de două aspecte: cerinţele aplicaţiei
(utilizatorului) şi performanţele tehnice ale SGBD-ului.
Cerinţele aplicaţiei se referă la:
- volumul de date estimat a fi memorat şi prelucrat în BD;
- complexitatea problemei de rezolvat;
- ponderea şi frecvenţa operaţiilor de intrare/ieşire;
- condiţii privind protecţia datelor;
- operaţii necesare pe baza de date (încărcare/validare, actualizare, regăsire etc.)
- particularităţi ale activităţii pentru care se realizează baza de date.
Performanţele tehnice ala SGBD-ului se referă la:
- modelul de date pe care-l implementează;
- ponderea utilizării SGBD-ului pe piaţă şi tendinţa;
- configuraţia de calcul minim cerută,
- limbajele de programare din SGBD;
- facilităţi de utilizare oferite pentru diferite categorii de utilizatori;
- limitele SGBD-ului;
- optimizări realizate de SGBD;
- facilităţi tehnice;
lucrul cu mediul distribuit şi concurenţa de date;
elemente de multimedia;
elemente de CASE;
interfeţe de comunicare;
autodocumentarea;
instrumente specifice oferite.
b) Proiectarea funcţiilor BD se realizează prin: proiectarea schemelor BD, proiectarea
modulelor funcţionale specializate.
Proiectarea schemelor BD se realizează pornind de la rezultatele modelării conceptuale
(analiza de sistem) şi ţinând cont de modelul de date implementat de SGBD-ul ales. Se vor
proiecta schemele: conceptuală, externă internă.
Proiectarea schemei structurale porneşte de la identificarea setului de date necesar
sistemului. Aceste date sunt apoi integrate şi structurate într-o schemă (exemplu: pentru BD
relaţionale cea mai utilizată tehnică este nominalizarea).
Proiectarea schemei externe are rolul de a specifica viziunea fiecărui utilizator asupra
BD. Pentru acest lucru, din schema conceptuală se identifică datele necesare fiecărei viziuni.
Datele obţinute se structurează logic în subscheme ţinând cont de facilităţile de utilizare şi de
cerinţele utilizatorului. Schema externă devine OPERAŢIONALĂ PRIN CONSTRUIREA
UNOR VIZIUNI (VIEW) CU SGBD-UL şi acordarea drepturilor de acces. Datele într-o viziune
pot proveni din una sau mai multe colecţii şi nu ocupă spaţiul fizic.
Proiectarea schemei interne presupune stabilirea structurilor de memorare fizică a
datelor şi definirea căilor de acces la date. Acestea sunt specifice fie SGBD-ului (scheme de
alocare), fie sistemului de operare. Proiectarea schemei interne înseamnă realizarea operaţiilor:
estimarea spaţiului fizic pentru BD şi definirea unui model fizic de alocare (a se
vedea dacă SGBD-ul permite explicit acest lucru);
definirea unor indecşi pentru accesul direct, după cheie, la date;
Proiectarea modulelor funcţionale ţine cont de concepţia generală a BD, precum şi de
schemele proictate anterior. În acest sens, se proiectează:
- fluxul informaţional;
- modulele de încărcare şi manipulare a datelor;
- interfeţele specializate;
- integrarea elementelor proiectate cu organizarea şi funcţionarea BD.
3. Realizarea componentelor logice
Componentele logice ale unei BD sunt programele de aplicaţie dezvoltate, în cea mai
mare parte, în SGBD-ul ales.
Programele se realizează conform modulelor funcţionale proiectate în etapa anterioară.
Componentele logice ţin cont de ieşiri, intrări, prelucrări şi colecţiile date.
În paralel cu dezvoltarea programelor de aplicaţii se întocmesc şi documentaţiile diferite
(tehnică, de exploatare , de prezentare).
4. Punerea în funcţiune şi exploatarea
Se testează funcţiile BD mai întâi cu date de test, apoi cu date reale.
Se încarcă datele în BD şi se efectuează procedurile de manipulare, de către beneficiar cu
asistenţa proiectantului.
Se definitivează documentaţiile aplicaţiei.
Se intră în exploatare curentă de către beneficiar conform documentaţiei.
5. Dezvoltarea sistemului
Imediat după darea în exploatare a BD, în mod continuu, pot exista factori perturbatori
care generează schimbări în BD.
Schimbările necesare trebuie preluate de BD uşor şi din mers.
Factorii pot fi: organizatorici, datoraţi progresului tehnic, rezultaţi din cerinţele noi ale
beneficiarului, din schimbarea metodologiilor etc.
Efectele directe şi indirecte ale bazelor de date conduc spre eficienţă, mai ales pentru
aplicaţiile mari şi complexe, acolo unde alte produse informatice nu fac faţă.
Efectele utilizării BD conduc spre avantajele oferite de acestea:
- elimină redundanţele necontrolate;
- creşte productivitatea activităţii informatice;
- oferă suport informaţional optim pentru conducere şi execuţie,
- permite interogarea datelor de către toate categoriile de utilizatori;
- conduce spre aplicaţii deschise.
Efortul depus pentru realizarea şi întreţinerea unei BD este considerabil şi de aceea
investiţia necesară trebuie fundamentată pentru a putea fi recuperată.
Fundamentarea investiţiei pentru o aplicaţie cu BD se face prin studiul de fezabilitate
(analiza preliminară) care va conţine un studiu al costurilor şi o evaluare a eforturilor de
realizare şi întreţinere.
Etape care trebuie parcurse pentru stabilirea eficienţei BD:
1. Studiul costurilor iniţiale (de realizare)
costul software-ului necesar;
costul hardware-ului necesar;
costul impus de trecerea de la sistemul existent la SBD;
costul resurselor necesare (umane, materiale, informaţionale etc.);
costul consultaţiei tehnice.
2. Evaluarea costurilor de funcţionare a BD
costul de punere în funcţiune;
costul de exploatare;
costul de întreţinere şi dezvoltare.
3. Calcule de rentabilitate
utilizarea unor modele specifice (exemplu: Analiza Cost-Beneficiu);
utilizarea unor instrumente hardware şi software specializate pentru BD (cresc
performanţa, scad portabilitatea).
CAP.III LIMBAJUL SQL
Limbajul SQL (Structured Query Language) este unul dintre cele mai puternice limbaje
structurate pentru interogarea bazelor de date relaţionale permiţând o comunicare complexă şi rapidă a
utilizatorului cu bazele de date, în funcţie de cerinţele şi restricţiile acestuia.
Se cunosc trei metode de bază privind implementarea limbajului SQL, şi anume:
cea prin apelare directă (Direct Invocation) – constă în introducerea instrucţiunilor SQL de la
prompter;
cea modulară (Modul Language) – foloseşte anumite proceduri apelate de programele aplicaţiei;
cea de tip încapsulat (Embedded SQL) – are în vedere instrucţiuni încapsulate în codul de
program, fiind de tip static sau dinamic.
Instrucţiunile SQL, în funcţie de rolul lor în manipularea datelor şi tranzacţiilor, pot fi grupate
astfel:
instrucţiuni de definire a datelor care permit descrierea structurii bazei de date;
instrucţiuni de selecţie a datelor care permit consultarea bazei de date;
instrucţiuni de manipulare a datelor, în sensul adăugării, modificării şi ştergerii înregistrărilor;
instrucţiuni de procesare a tranzacţiilor care privesc unităţile logice de prelucrare şi constituie în
fapt operaţii multiple de manipulare a datelor;
instrucţiuni de control al cursorului;
instrucţiuni privind controlul accesului la date.
Cu ajutorul următoarelor reguli se pot construi instrucţiuni valide, uşor de citit şi de editat:
Instrucţiunile SQL pot fi scrise cu litere mari sau mici, în afară de cazurile indicate;
Instrucţiunile SQL pot fi introduse pe una sau mai multe linii;
Cuvintele cheie nu pot fi abreviate sau despărţite în linii diferite;
Clauzele, de obicei, sunt plasate pe linii separate pentru a fi lizibile;
De obicei cuvintele cheie sunt introduse cu majuscule; iar toate celelalte cuvinte, ca numele de
tabele şi coloane, sunt introduse cu litere mici;
În cadrul SQL*Plus, instrucţiunile SQL sunt introduse de la promterul SQL, iar următoarele linii
sunt numerotate. Acesta se numeşte un buffer SQL. O singură instrucţiune poate fi curentă în orice timp
în cadrul buffer–ului.
Executarea instrucţiunilor SQL
Poziţionarea punct şi virgulei (;) la sfârşitul ultimei clauze;
Poziţionarea unui slash (/) la sfârşitul ultimei linii din buffer;
Punerea unui slash la promterul SQL;
În cadrul SQL*Plus – comanda RUN la promterul SQL.
Exemplu:
Să se creeze tabela Beneficiar cu structura următoare: Cod beneficiar (tip numeric), Denumire
beneficiar (tip text), Adresa (tip text), Telefon (tip numeric).
CREATE TABLE Beneficiar
(Cod_beneficiar Number, Den_beneficiar Text, Adresa Text, Telefon Number);
Modificarea structurii unei tabele.
Comanda ALTER TABLE permite modificarea unei tabele prin adăugarea/ştergerea de atribute şi
prezintă următoarea sintaxă:
Sintaxa:
ALTER TABLE nume_tabelă {ADD COLUMN nume_atribut1
Tip_data [(mărime)] [NOT NULL][CONSTRAINT index] │DROP COLUMN nume_atribut2
CONSTRAINT indexname};
Exemplu:
Să se adauge tabelei Beneficiar un nou câmp numit Banca.
ALTER TABLE Beneficiar
ADD COLUMN Banca Text;
Exemplu:
Să se realizeze ştergerea atributului Adresa din tabela Beneficiar
ALTER TABLE Beneficiar
DROP COLUMN Adresa Text;
Ştergerea relaţiilor dintr–o bază de date
Ştergerea unei tabele se realizează cu ajutorul comenzii DROP TABLE, odată cu aceasta
ştergându–se şi indecşii, view–urile definite pentru respectiva tabelă, neexistând nici o posibilitate de
recuperare a informaţiei şterse.
Sintaxa:
DROP TABLE nume_tabelă;
Exemplu:
Să se şteargă tabela Beneficiar din baza de date Situaţia beneficiarilor
DROP TABLE Beneficiar;
Ştergerea unei baze de date
Ştergerea unei baze de date determină ştergerea tuturor obiectelor conţinute de aceasta, a copiei
cataloagelor SQL din directorul bazei de date.
Sintaxa:
DROP DATABASE nume_bază de date;
Această instrucţiune nu este inclusă de anumite versiuni SQL, ştergerea făcându–se mai uşor
printr–o apăsare a mouse–lui. Într–o reţea de calculatoare nu poate fi ştearsă o bază de date activată de
către un alt utilizator. Comanda de ştergere nu poate acţiona asupra unei baze de date active.
3.2.2. Gestiunea indecşilor
Un index este un obiect schemă care îmbunătaţeşte regăsirea înregistrărilor folosind un pointer.
Indecşii pot fi creaţi explicit sau automat.
Un index furnizează un acces direct şi rapid la înregistrarile unei baze de date. Scopul utilizării
indecşilor este reducerea numărului de citiri/scrieri pe disc, prin folosirea unei căi indexate pentru a
localiza mai rapid datele. Indexul este automat folosit si întreţinut de serverul Oracle. Odată creat
indexul, nu este necesară nici o intervenţie din partea utilizatorului.
Indecşii sunt logic si fizic şi sunt independenţi de bazele de date pe care le indexează. Acest lucru
înseamnă că indecşii pot fi creaţi sau şterşi oricând fără nici un efect asupra bazelor de date sau a altor
indecşi.
Nota:
Când este şters un tabel, indecşii corespunzători sunt de asemenea şterşi.
Indexul este un obiect din schemă.
Indexul este folosit de serverul Oracle pentru o mai bună regăsire a înregistrarilor prin utilizarea
unui pointer.
Indexul reduce numărul operaţiilor de citire/scriere pe disc prin utilizarea unei metode de
accesare rapidă, pentru o mai eficientă localizare a datelor.
Indexul este independent de tabelele pe care le indexează.
Indexul este folosit şi întreţinut de serverul Oracle.
Indecşii sunt creaţi:
Automat – când este definită o cheie primara (PRIMARY KEY) sau unică (UNIQUE KEY) în
definiţia unui tabel.
Manual – utilizatorii pot crea indecşi mecanic pentru a accelera accesul la înregistrările bazelor
de date
Crearea unui index
Sintaxa:
INDEX_NAME COLUMN_NAME COL_P UNIQUENES CREATE
INDEX index OS
ON EMP_EMPNO_PK EMPNO 1 UNIQUE table
(column[, EMP_ENAME_IDX ENAME 1 NONUNIQUE column]…);
Îmbunătăţirea
accesului câmpului ENAME în baza de date EMP
SQL> CREATE INDEX emp_ename_idx
ON emp(ename);
Index created.
Unde:
index – este numele indexului.
table – numele bazei de date.
column – numele câmpului în baza de date ce urmează a fi indexat
Crearea unui index se face pentru:
un câmp ce este folosit des în clauzele WHERE sau în condiţii de join;
câmpuri cu mare varietate de valori;
câmpuri cu un număr mare de valori NULL;
două sau mai multe câmpuri ce sunt folosite împreună frecvent într–o clauză WHERE sau într–o
condiţie join;
o bază de date mare şi majoritatea interogărilor nu vizează mai mult de 2–4% din înregistrări.
Mai multi indecşi într–o bază de date nu înseamnă o optimizare a interogărilor. Fiecare operaţie
DML ce se realizează într–o bază de date ce conţine indecşi implică o actualizare a indecşilor. Cu cât sunt
mai mulţi indecşi asociaţi tabelului, cu atât va dura mai mult până când serverul Oracle va actualiza
indecşii dupa DML.
Nu este necesară crearea unui index atunci când:
baza de date este mică;
câmpurile nu sunt des folosite într–o condiţie;
majoritatea interogărilor vizeaza mai mult de 2–4% dintre înregistrari.
Confirmarea indecşilor
USER_INDEXES conţine numele indexului si unicitatea lui.
Componenta USER_IND_COLUMNS conţine numele indexului, numele bazei de date si numele
câmpului.
SQL> SELECT ic.index_name, ic.column_name,
ic.column_position col_pos, ix.uniques
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = ‘EMP’;
Confirmarea indecşilor
Confirmarea indecşilor existenţi se realizează prin vizualizarea lui USER_INDEXES. De
asemenea se pot verifica câmpurile implicate într–o indexare prin interogarea lui
USER_IND_COLUMNS.
Exemplul următor afişează toţi indecşii creaţi anterior, numele câmpurilor afectate şi unicitatea în
baza de date EMP.
Ştergerea unui index poate fi realizată doar cel care l–a creat sau de cel care are privilegiul
Sintaxa:
DROP ANY INDEX.
Indecşi care aparţin unei legături dintre tabele
Clauza CONSTRAINT
Permite crearea unui index după numele unui câmp; indexul poate fi declarat drept cheie primară
(PRIMARY KEY) sau ca UNIQUE sau stabileşte o relaţie între câmpul nume de index şi câmpul unei
tabele externe (cu opţiunea REFERENCES foreign_tabele [foreign_field]).
Sintaxa:
CONSTRAINT nume_index
{PRIMARY KEY ! UNIQUE ! REFERENCES foreign_table
[foreign_field]};
Există o diferenţă intre UNIQUE şi PRIMARY KEY şi anume: pe o tabelă poate exista o singură
cheie primară, dar UNIQUE specifică existenţa unor valori unice la nivelul unei coloane. În plus,
PRIMARY KEY conţine automat o restricţie NOT NULL, pe când o coloană UNIQUE poate avea valori
NULL dacă nu este specificată in mod expres clauza NOT NULL.
Menţionăm faptul că indexul poate fi simplu (creat pe o singură) sau multiplu (creat pe mai multe
coloane).
REFERENCES
Este varianta cea mai simplă de definire a unei restricţii relaţionale şi care s–a dovedit deosebit de
practică. Această clauză pune in legătură două tabele. Ea specifică faptul că valorile unei coloane
aparţinând tabelei ( care serveăte la stabilirea de legături trebuie să apară intr–o coloană din tabela
referită al cărei nume este precizat în restricţie (CONSTRAINT nume_index).
Observaţie: Restricţiile UNIQUE nu sunt acelaşi lucru cu INDEX UNIQUE. Un index UNIQUE
nu poate fi referit pentru că el aparţine unei singure tabele şi nu unei legături între tabele.
Exemplu:
CONSTRAINT idcod PRIMARY KEY (codp)
CONSTRAINT rcod REFERENCES vânzări (codp);
Comanda DROP CONSTRAINT permite ştergerea unei restricţii de unicitate sau de referinţă
utilizând sintaxa:
Sintaxa:
DROP CONSTRAINT nume_index;
3.2.3 Gestiunea drepturilor de utilizare
Utilizatorii bazei de date sunt repertorizaţi de SGBD prin:
identificatorul sistem;
parolă;
nume de utilizare de date drepturi asupra tabelelor sale.
Acordarea drepturilor de acces
Proprietarul unei tabele poate acorda altor utilizatori drepturi de a manipula tabela. Acordarea
acestor drepturi se realizează prin comanda GRANT care prezintă următoarea sintaxă:
Sintaxă:
GRANT [ ALL/Listă de privilegii]
ON TABLE1,...,TABLE n
TO [PUBLIC/ Listă utilizatori]
[WITH GRANT OPTION]
Unde:
Listă privilegii: alter, delete, insert, update, select;
ALL: toate comezile;
Public: toţi utilizatorii;
WITH GRANT OPTION: drepturi utilizatorilor de a acorda la rândul lor drepturi de acces altor
utilizatori.
Exemplu:
Să se acorde tuturor utilizatorilor toate drepturile asupra tabelei BENEFICIAR:
SQL> GRANT ALL ON BENEFICIAR TO PUBLIC;
Să se acorde utilizatorului Ştefan drepturi de actualizare şi dreptul de ştegere in tabela BENEFICIAR:
Exemplu:
Să se retragă dreptul de actualizare a tablelei BENEFICIAR utilizatorului Ionescu:
REVOKE UPDATE
ON TABLE BENEFICIAR
FROM IONESCU;
În toate SGBD–urile, administratorul bazei de date are, în mod implicit toate drepturile asupra
tuturor obiectelor bazei de date. Pentru a limita accesul la atributele şi tuplurile unei tabele se folosesc
view–urile:
Exemplu:
SQL> CREATE VIEW LOG
AS SELECT Cod_beneficiar, Adresa, Telefon
FROM BENEFICIAR;
GRANT SELECT ON LOG TO PUBLIC;
Se acordă dreptul de consultare a tabelei BENEFICIAR pe atributele: Cod_beneficiar, Adresa,
Telefon.
3.3 LIMBAJUL DE MANIPULARE A BAZEI DE DATE (SQL–LMD)
Limbajul de manipulare a datelor (DML) este partea de bază a SQL. Când dorim să adăugăm, să
modificăm sau să ştergem date dintr–o bază de date, executăm o comandă DML.
O colecţie de comenzi DML care formează o unitate logică de lucru se numeşte tranzacţie.
Considerăm o bază de date din domeniul bancar. Atunci când un client al bancii doreşte să
transfere bani dintr–un depozit într–un cont curent, tranzacţia ar putea consta în 3 operaţii separate: scade
suma din depozit, creşte suma din contul curent, înregistrează tranzacţia în jurnalul de tranzacţii. Serverul
Oracle trebuie să garanteze că toate cele 3 comenzi SQL sunt executate în aşa fel încât să menţină
echilibrul necesar între conturi. Atunci când, din anumite cauze, una dintre comenzile tranzacţiilor de mai
sus nu se execută, atunci celelalte comenzi ale tranzacţiilor trebuie să fie anulate.
3.3.1. Instrucţiuni pentru selectarea datelor
Cereri de interogare simple
Instrucţiunile de selecţie reprezintă una dintre categoriile cele mai importante ale limbajului de
interogare SQL ACCESS.
Pentru definirea interogarilor de selecţie simple avem instrucţunea SELECT cu următoarea
sintaxă :
Exemplu:
dorim afişarea mediilor fiecărui student identificat după NrLeg
dorim afişarea numărului de note primite de fiecare student identificat după NrLeg
SQL> SELECT NrLeg, Count(Nota) NrNote
FROM Note
Group By NrLeg;
dorim afişarea mediei pe fiecare materie si grupa ordonata crescator dupa Grupa
SQL> SELECT Grupa, Denumire, Avg(N.Nota) Media FROM Student S, Materii m, Note N
WHERE S.NrLeg=N.NrLeg and M.Cod_materie=N.Cod_materie
GROUP BY Grupa, Denumire
Order by Grupa
dorim să vizualizăm din tabela Produs (cod produs, den produs, um, pret) numai acele produse cu
preţuri cuprinse între 10 ROL şi 12 ROL.
Din structura instrucţiunii se observă anumite clauze care au fost întâlnite şi la definirea
interogărilor simple însă apar şi elemente mai de sinteză şi anume:
Listă selecţie – se referă la una sau mai multe funcţii agregate care au ca argumente nume de
câmpuri ale bazei de date
AS alias – asociază un pseudonim (nume) rezultatului utilizării funcţiei agregat
Clauza GROUP BY – precizeză câmpul sau câmpurile pe baza cărora se va efectua gruparea
înegistrărilor; se pot executa funcţiile agregate descrise în lista de selecţie pentru fiecare dintre grupări.
Echivalentul acestei clauze în macheta grafică QBE de constucţie a interogării il reprezintă rândul Total
Clauza HAVINIG – se referă la criteriul care va fi aplicat câmpului definit ca argument al funcţiei
agregat
Exemplu:
Dorim să cunoaştem clientii care au datorii mai mari de 1500 ROL.
Deoarece în instrucţiunile SQL, care descriu joncţiuni se utilizează câmpuri ce fac parte din
tabele diferite, este necesară întotdeauna specificarea tabelei de care aparţin.
Forma generală de descriere a unui astfel de câmp
SELECT Factura. nr_factura, Client. cod_client, Factura.suma_factura, Incasari. suma_incasata
FROM Factura, Client, Incasari
WHERE Factura. cod_client=Client. cod_client AND Client. cod_client=Incasari. cod_client
ORDER BY Client. cod_client;
Interogările UNION
Când utilizatorul doreşte să vadă rezultatele a mai multor interogari SELECT în acelaşi timp, prin
combinarea ieşirilor lor, poate utiliza facilitatea UNION a limbajului de interogare SQL ACCESS. Nu
există echivalent QBE pentru această instrucţiune.
Sintaxa generală pentru interogările UNION este:
Exemplu:
Să se creeze o tabelă cu numele Beneficiari_teritoriali plecând de la tabela Beneficiari în care să
regăsim doar beneficiarii care au sediul în Craiova şi Timişoara.
SELECT DISTRICTROW Den_beneficiar, Adresa
INTO Beneficiari_teritoriali
FROM Beneficiari
WHERE Adresa = “Craiova” OR Adresa= “Timişoara”;
Adăugarea unei înregistrări dintr–o tabelă în alta
Există două forme ale instrucţiunii şi anume:
INSERT...VALUES
INSERT...SELECT
INSERT...VALUES
Sintaxa:
INSERT INTO nume_tabelă (câmp 1, câmp 2...)
VALUES (valoare 1, valoare 2...);
Exemplu:
Să se adauge în tabela Produse o înregistrare care respectă structura: Cod produs, Denumire
produs, UM, Pret.
INSERT...SELECT
Sintaxa:
INSERT INTO tabelă_destinaţie (câmp 1, câmp 2...)
SELECT [domeniu] câmp 1, câmp 2...
FROM tabelă_sursă
WHERE criteriul_de_adăugare;
În acest caz este posibil să se copieze selectiv înregistrări dintr–o tabelă într–una sau în mai multe
tabele.
Regulile menţionate la instrucţiunea INSERT...VALUES rămân valabile, în plus se adaugă
următoarele:
fraza SELECT nu poate extrage înregistrări din tabela destinaţie;
numărul şi natura câmpurilor menţionate în clauza INTO trebuie să fie aceleaşi cu numărul şi
natura câmpurilor returnate de instrucţiunea SELECT;
dacă nu se introduce clauza WHERE, toate înregistrările din tabela sursă vor fi adăugate în tabela
destinaţie.
Exemplu:
Se inserează valorile câmpurilor: număr, nume, prenume şi studii doar pentru agenţii de vânzare
care sunt studenţi. Selecţia se face din tabela sursă Agent_vânzare, iar destinaţia o constituie tabela Studii
(care trebuie creată în prealabil). Comanda de creare a tabelei STUDII este:
CREATE TABLE STUDII
(nr Number, nume Text, pren Text, std Text);
Interogarea acţiune de ştergere parţială sau totală a înregistrărilor din tabele DELETE
Sintaxa:
DELETE FROM nume_tabela
[WHERE criteriul_de _stergere];
Nu este utilizată pentru ştergerea de valori din câmpuri individuale, ci va acţiona doar asupra
înregistrărilor în totalitatea lor. În acelaşi timp se va şterge doar conţinutul tabelei nu şi aceasta (pentru
eliminarea tabelei se va apela la instrucţiunea DROP TABLE).
Ca şi instrucţiunea INSERT, operaţia de ştergere a înregistrărilor dintr–o tabelă poate duce la
apariţia unor probleme de integritate referenţială în alte tabele. Clauza WHERE restricţionează domeniul
de ştergere în funcţie de cerinţele utilizatorului.
Exemplu:
Din tabela Produse să se şteargă înregistrările care au preţul mai mic de 200 ROL.
DELETE FROM Produse
WHERE Pret < 200;
Unele sisteme de baze de date pun la dispoziţie o extensie la sintaxa standard a instrucţiunii
UPDATE. De exemplu, limbajul Transact–SQL al sistemului SQL Server permite programatorului să
actualizeze conţinutul unui tabel pe baza conţinutului altor câteva tabele, prin folosirea clauzei FROM.
Sintaxa extinsă arată astfel:
UPDATE nume_tabela
SET nume_câmp 1= valoare 1
[,nume_câmp 2 = valoare 2]
FROM listă_tabele
[WHERE criteriul_de _actualizare];
Tipul datelor rezultate din evaluarea expresiei trebuie să fie acelaşi cu tipul de dată al câmpului
care este modificat. De asemenea, dimensiunea (lungimea) valorii trebuie să fie corespunzătoare cu
câmpul care este modificat.
La obţinerea rezultatelor în valoarea calculată pot rezulta două situaţii:
trunchierea – atunci când sistemul de baze de date converteşte, de exemplu un număr fracţionar
într–un număr întreg;
depăşirea zonei de memorie – atunci când valoarea rezultată este mai mare decât capacitatea
coloanei modificate. Aceasta va determina semnalarea unei erori de depăşire din partea sistemului de
baze de date.
3.4 VEDERI
O vedere este un tabel virtual. Vederile permit programatorului SQL să creeze “imagini” ale
datelor care pot fi diferite de imaginile fizice ale acestora situate pe hard–disc. După crearea vederii, se
pot folosi următoarele comenzi SQL:
CREATE VIEW – crearea unei vederi;
SELECT – interogarea vederilor;
INSERT – adăugarea de noi date;
UPDATE – actualizarea datelor într–o vedere;
DELETE – ştergerea datelor dintr–o vedere.
Crearea unei vederi
Permite definirea unei “ferestre” prin care se pot consulta datele stocate din tabel..
Sintaxa:
CREATE VIEW nume_view [<lista atribute>]
AS SELECT secventa_select
[WITH CHECK OPTION];
unde:
nume_view – reprezintă numele vederii şi opţional a denumirii atributelor din view, în cazul când
se doreşte redenumirea atributelor specificate în instrucţiunea SELECT;
SELECT – specificarea interogării;
WITH CHECK OPTION – specificarea opţională a unei condiţii suplimentare impuse view–ului,
astfel încât să poată fi realizată actualizarea sau inserarea datelor în view.
Exemple:
Crearea unui view simplu. Sursa de date o va reprezenta tabela Student iar rezultatul returnat
constă în afişarea codului, denumirii şi facultăţii studentului.
Ulterior view–ul poate fi vizualizat ca orice tabelă. Date_stud reprezintă view–ul creat în
comanda anterioară. Se doreşte afişarea numai a studenţilor care încep cu ‘Pop’.
Crearea unui view simplu. Sursa de date o va reprezenta tabela Student iar rezultatul returnat
constă în afişarea studenţilor căsătoriţi.
Crearea unei vederi cu notele mai mari decat 5. Sursa de date o va reprezenta tabela Note.
Crearea unui view complex presupune utilizarea unor funcţii agregat în fraza Select.
SQL plasează câteva restricţii la folosirea instrucţiunii SELECT pentru a formula o vedere.
Următoarele două reguli sunt valabile atunci când folosiţi instrucţiunea amintită:
Nu poate fi folosit operatorul UNION;
Nu poate fi folosită clauza ORDER BY.
Eroare – la crearea unei vederi nu puteti folosi în SELECT clauzele ORDER BY si UNION
CREATE VIEW Note_stud_err AS
SELECT S.NrLeg, Nume+' '+Initiala+'.'+Prenume Student,Grupa, Denumire, Nota FROM Student AS
S,Note AS N, Materii AS M
WHERE S.NrLeg=N.NrLeg AND N.Cod_materie=M.Cod_materie
ORDER BY S.NrLeg
Exemple:
Scade 5 puncte la toate notele din vederea Notele
NOŢIUNI GENERALE
În proiectarea de aplicaţii se foloseşte tot mai mult programarea modulară. Dacă programarea
structurală oferea un program care îl dirija pe utilizator pas cu pas, fără posibilitatea alegerii altei opţiuni,
programarea modulară constă dintr–un ansamblu de subrutine (proceduri sau subprograme) care pot fi
apelate în ordinea dorită de utilizator.
Limbajul în care programăm în Access este VBA (Visual Basic pentru Aplicaţii) şi care este
varianta limbajului Visual Basic dedicată componentei Access.
Conceptele de bază ale programării în VBA sunt: obiectul, proprietatea, metoda, evenimentul.
Dintre obiectele bazei de date Access, modulul este singurul care conţine proceduri definite de utilizator
şi scrise în limbajul de programare VBA. În cadrul modulelor codul este organizat în proceduri sau
funcţii. În general, un modul are următoarea structură:
Declaraţii
Procedură sau funcţie
..................................
Procedură sau funcţie
Zona de declaraţii este rezervată declarării variabilelor şi constantelor accesibile pentru toate
procedurile şi funcţiile componente ale modulului şi una sau mai multe proceduri sau funcţii.
După apartenenţa lor modulele se pot grupa în următoarele categorii (pot fi vizualizate prin
Object Browser):
module globale sau standard – sunt accesibile întregii aplicaţii;
module specifice formularelor sau rapoartelor sunt accesibile numai formularelor şi rapoartelor în
care au fost declarate;
module class – permit definirea de module noi.
EDITAREA MODULELOR VBA
Scrierea codului din punct de vedere sintactic, se poate face cu caractere minuscule sau
majuscule. Atât cuvintele cheie cât şi cele utilizator sunt automat transcrise în forma în care au fost
declarate, dacă sunt scrise corect. Editorul are, de asemenea, facilităţi de colorare a cuvintelor cheie,
declaraţiilor şi comentariilor utilizator, frazelor eronate.
Comentariile incluse constituie linii de cod care nu se execută, dar care, facilitează înţelegerea
programului. Pentru definirea comentariilor se utilizează un apostrof „ ’ ” la începutul comentariului;
în acest fel se pot scrie comentarii şi după o instrucţiune, pe acelaşi rând.
Instrucţiunile se scriu, în general, câte una pe un rând, însă există şi posibilitatea scrierii a
mai multor instrucţiuni pe acelaşi rând, separate prin delimitatorul „ : ”.
Dacă o instrucţiune se continuă pe mai multe rânduri, se utilizează, la sfârşitul fiecăruia,
liniuţa de subliniere ” _ ”, cu excepţia rândului care o încheie.
Prin intermediul desfăşurătorului de obiecte, sistemul VBA evidenţiază proprietăţile şi metodele
posibile pentru un anumit obiect. Afişarea este contextuală, adică are loc în momentul scrierii în VBA a
elementelor care caracterizează un anumit context.
Proprietăţile descriu un obiect prin caracteristici cum ar fi: dimensiunea, culoarea, poziţia pe
ecran şi se stabilesc, de regulă, în faza de proiectare, adică în momentul în care se proiectează sau se
modifică formele.
Proprietăţile stabilite în faza de proiectare devin operaţionale la prima lansare în execuţie a
aplicaţiei şi rămân valabile până la încheierea execuţiei aplicaţiei sau până la modificarea lor prin
program.
Metodele reprezintă procedurile sau funcţiile care se execută pentru a informa un obiect despre
acţiunile pe care le va efectua. Dacă proprietăţile sunt date, metodele sunt cod. Spre deosebire de
proprietăţi, metodele pot fi executate numai în momentul rulării programului, sau în timpul unei sesiuni
de depanare a programului.
Pe lângă proprietăţi şi metode, fiecare tip de obiect are prestabilit un număr de evenimente
posibile, dar cel puţin unul.
Evenimentele se produc ca urmare a unei acţiuni utilizatorului ori a execuţiei unui program sau
pot fi declanşate de calculator. Utilizatorul poate efectua acţiuni ca: click sau dublu click de mouse,
acţionarea unei taste, etc. În mod automat un eveniment poate fi declanşat de o procedură inclusă în
program. Pe de altă parte, evenimentele declanşează procedurile. O astfel de programare este denumită
„event–driven”, adică „dirijată prin evenimente”.
ELEMENTELE LIMBAJULUI VBA
Tipuri de date
VBA este unul din limbajele de programare care impune, înainte de a manipula datele, să
specificăm natura acestora.
Există trei mari categorii de date: numerice, şir de caractere şi speciale. Încadrarea unei date într–
una din categorii este absolut necesară pentru a efectua calcule sau alte prelucrări. De asemenea, VBA
acceptă şi o clasificare a datelor din punct de vedere al utilizatorului, şi anume: date standard
(predefinite) şi date utilizator.
În tabelul următor se prezintă tipurile de date utilizate de Visual Basic.
Tip de Caracteristici
date
Double Număr memorat pe 64 biţi, virgulă mobilă, dublă
precizie. Valori posibile: de la – 1,797*10308 până la
+ 1,797*10308.
Single Număr memorat pe 32 biţi, virgulă mobilă, simplă
precizie. Valori posibile: de la –3,4*1038 până la
+ 3,4*1038.
Currency Număr memorat pe 64 biţi. Sunt memorate 15
caractere la stânga virgulei şi 4 caractere la dreapta
virgulei. Valori posibile:
–922337203685477,5808 până la
922337203685477,5807.
Byte Număr întreg pe 8 biţi. Valori posibile: 0–255.
Integer Număr întreg pe 16 biţi. Valori posibile: –32768
până la 32767.
Long Număr întreg pe 32 biţi. Valori posibile:
–2147483648 până la 2147483647.
Boolean Poate conţine valoarea logică True (–1) sau False
(0).
Date Poate conţine date calendaristice şi timp. Se
utilizează între #.
String Şir de caractere. Poate conţine maximum 2 la
puterea 31 de caractere. Se utilizează între “”.
Variant Tip de date generic. O asemenea variabilă se poate
utiliza pentru orice tip de date. Practic, toate
variabilele utilizate pot fi declarate de tip Variant.
Este Sufix
recomandat totuşi Tip dată
ca să specificaţi Exemplu
tipul
variabilei
$ în momentulLong declarării pentru a 547
nu fi$
create! confuzii. Single 547 !
Object Tip de# date care referă Double
un obiect. Pentru a asocia
547un#
obiect@propriu–zis unei Currency
asemenea variabile trebuie
547să@
se utilizeze şi instrucţiunea Set.
Variabile şi constante
Variabile
O variabilă reprezintă numele unei porţiuni din memoria calculatorului în care sse stochează
temporar datele. O variabilă poate conţine o singură valoare la un moment dat dar care poate fi
modificată la acţiunea utilizatorului sau prin program.
O variabilă are un nume şi conţine un anumit tip de date pentru a o identifica la un moment dat în
memorie. Numele unei variabile poate avea maxim 256 caractere şi trebuie să înceapă cu un caracter
alfanumeric.
Declararea variabilelor
Într–un program, pentru a putea utiliza o variabilă, aceasta trebuie declarată, specificând numele
şi tipul de date pe care îl va conţine. Există două moduri de a declara variabilele: implicită şi explicită.
Declararea implicită se face prin adăugarea unui caracter specific la sfârşitul numelui variabilei.
Sufixurile utilizate sunt reprezentate în tabelul de mai jos
Exemplu:
Dim Nr_marcă As Integer
Dim Prenume
Dim Nume As String 20
Dim Adresă As String
unde:
prima linie defineşte o variabilă de tip integer;
a doua linie defineşte o variabilă de tip variant;
a treia linie defineşte o variabilă de tip şir de caracter ce conţine maxim 20 de caractere;
a patra linie defineşte o variabilă şir de caracter cu lungimea cuprinsă între 0 şi 65535 de
caractere.
Domeniul unei variabile.Variabile locale şi globale
Locul în care este plasată instrucţiunea de declarare a variabilei este important pentru că specifică
modul în care se va lucra cu variabilele într–o aplicaţie.
Modul în care se va lucra cu o variabilă în cadrul unui program, sau durata ei de viaţă, sau sau
zonele din program în care variabila este vizibilă este cunosccut sub numele de domeniul variabilei.
Locul în care este declarată o variabilă determină domeniul acesteia. VBA este unul din limbajele care
respectă reguliile domeniului de valabilitate. Domeniul de valabilitate al unei variabile VBA este
determinat de două elemente: locul în care declarăm variabila în cadrul procedurii şi de instrucţiunile
folosite pentru declarare.
Sintaxa generală de declararea a unei variabile este următoarea:
Dim! Private! Public! Global! nume vb1as tip_date, nume vb2 as tip_date,…….
Unde:
nume vbi este numele atribuit variabilei i;
as tip_date este unul din tipurile de date definite de utilizator.
Există trei locuri diferite în care pot fi declarate variabilele:
nivel procedură sau funcţie;
nivel formă;
nivel modul.
Dacă Dim este plasată la începutul unei proceduri (după declaraţia Subnume_procedură),
atunci variabila declarată va cunoscută şi va putea fi utilizată doar în procedura respectivă, fiind o
variabilă locală. Dacă dorim ca variabilele să fie vizibile în toate procedurile dintr–un modul, vom plasa
instrucţiunea Dim în secţiunea generală a modulului
Exemplu:
Const Angajat = “Manea Ion”
Const Data_angaj = # 1/1 / 2002 #
Const Studii_super = “ “
Constantele de tip String se scriu între ghilimele “Manea Ion”, “ 547“
Constantele de tip Date se scriu între două caractere # (diez).
Când între ghilimele nu este specificat nici un caracter avem un şir nul.
Domeniul de vizibilitate, atât al constantelor, cât şi al variabilelor, în funcţie de modul de
declarare Privat sau Public, este prezentat sintetic în tabelul.10
Tabelul.10
Operatori
Pentru construirea diverselor expresii (matematice, logice, de comparare) tematice cu datele
conţinute de program se utilizează operatorii.
Operatorii acceptaţi de VBA sunt de trei categorii: matemetici, de comparare, logici.
operatori matematici :
+ adunare
– scădere
* înmulţire
/ impărţire returnează partea întreagă
MOD împărţire (returnează numai restul)
^ exponent
operatori de comparare:
< mai mic
<= mai mic sau egal
> mai mare
>= mai mare sau egal
= egal
<> diferit
operatori logici:
o AND şi
o OR sau
o NOT negaţie
o XOR pentru sau exclusiv
operatori pentru concatenerea şirurilor : &, +
alţi operatori:
o IN pentru regăsirea de valori în cadrul unei liste;
o LIKE pentru comparare cu caractere de înlocuire;
o BETWEEN pentru regăsirea de valori în cadrul gamei;
o EQV pentru echivalarea logică a două expresii;
o IMP pentru implicarea logică a două expresii.
2.3.4 Proceduri/funcţii
Procedurile reprezintă secvenţe de instrucţiuni care realizează o prelucrare bine definită din punct
de vedere funcţional. Procedurile sunt subprograme, la care un alt program face referire prin numele lor.
Procedurile care nu returnează nici o valoare sunt numite subrutine şi au sintaxa:
[Static] [Private] Sub nume_procedură[(listă argumente)]
[ <instrucţiuni>
End Sub
unde:
Static – variabilele locale sunt memorate între două execuţii;
Private – procedura este accesibilă numai din interiorul modulului;
Listă argumente – reprezintă variabilele ce sunt transmise în momentul apelării procedurii;
Exit Sub – forţează ieşirea din procedură.
Apelul unei proceduri se face astfel:
Call nume_procedură ([lista argumente])
sau
nume_procedură ([listă argumente])
Procedurile care întotdeauna returnează o valoare se numesc funcţii şi au următoarea sintaxă:
Variabila=nume_funcţie[(valoare_param_1, valoare_param_2,……….)]
Între paranteze se scriu argumentele funcţiei, separate prin virgulă. Prezenţa parantezelor şi a
semnului egal sunt semnele care diferenţiază funcţia de procedură.
VBA fiind un mediu integrat de dezvoltare include două categorii de funcţii:
integrate (standard);
definite de utillizator.
Funcţiile integrate (standard)
VBA conţine un număr mare de funcţii integrate care pot fi utilizate pentru executarea unor
operaţii, pentru care altfel ar trebui scrise secvenţe de cod. Diversitatea problemelor pe care le
soluţionează, a determinat gruparea funcţiilor pe categorii.
Funcţii pentru preluarea şi afişarea datelor
Funcţiile încorporate ale programului, InputBox() şi MsgBox() permit efectuarea unor operaţii
simple de intrare/ieşire (I/O) prin utilizarea unor casete de dialog predefinite pe care le putem adapta
utilizând o gamă de pictograme şi combinaţii de butoane de răspuns.
Funcţia InputBox() afişează o invitaţie într–o casetă de dialog, aşteaptă ca utilizatorul să
introducă text sau să selecteze un buton, apoi returnează conţinutul casetei de text. Valoarea introdusă de
către funcţie este de tip Variant, fie de tip String, în funcţie de varianta utilizată.
Singurul argument obligatoriu este primul mesaj. Acesta va fi o expresie de tip şir de caractere
(String) care invită utilizatorul să introducă ceva şi va fi afişat lângă caseta de text în care va scrie
utilizatorul.
Al doilea argument, titlu, este un şir de caractere afişat în bara de titlu a casetei de dialog. Dacă se
omite, în bara de titlu nu se va afişa nimic.
[<x>], [<y>] reprezintă expresii numerice care specifică distanţa pe orizontală, respectiv pe
verticală, a colţului din stânga sus al casetei de dialog faţă de colţul din stânga sus al ecranului. Dacă se
omite argumentul [<x>], trebuie să se omită şi argumentul [<y>]. Dacă ambele argumente se omit, caseta
de dialog va fi centrată pe orizotală, la aproximativ o treime din înălţimea ecranului faţă de partea
superioară.
Sintetizaţi sunt prezentaţi parametrii înstrucţiunii InputBox în tabelul.11
Tabelul.11
Parametru
Parametru
Constantă Descriere
Descriere
Valoare Explicaţie
<mesaj>
vbOK
<mesaj> Şir
Şirdedecractere
cractere
1 afişat
afişat
Butonul
în
în fereastra
OK selectat
InputBox.
MsgBox. Pot Pot fifi Funcţia
MsgBox() vbCancel maximum
maximum21024 1024 de de caractere.
caractere.
Butonul CancelDacă
Dacă se
se doreşte
selectat doreşte afişează un
mesaj într–o vbAbort afişarea
afişareaunui
unui
3 mesajmesaj pe
pemai
Butonul mai multe
multe
Abort rânduri
rânduri trebuie
selectat trebuie casetă de
dialog şi vbRetry intercalat
intercalatcaracterul
4 caracterul <ENTER>
<ENTER> adică
adică
Butonul Retry selectat CHRCHR (13)
(13)
la aşteaptă ca
utilizatorul să vbIgnore sfârşitul
la sfârşitul
rândului.
5 rândului.
Butonul Ignore selectat selecteze un
buton. Funcţia <titlu>
<titlu>
vbYes Titlul
Titlulferestei
ferestei
6 afişate
afişate(şir
(şirdede
Butonul caractere)
Yescaractere)
selectat MsgBox()
returnează o <val_implicită>
<butoane>
vbNo Butoanele
Valoarea 7implicită
şi pictogramele
afişatăNo
Butonul deafişate
fereastra
selectat în InputBox
fereastra valoare
întreagă care MsgBox
pentru introducere
(expresie numerică).
(şir de caractere). indică butonul
selectat de <x>
<fişier_help> Fişierul
PoziţiaHelp
feresteri
utilizat
InputBox
în cazulfaţăîn care
de marginea
se foloseşte
din utilizator.
Sintaxa help
stânga
senzitiv
a eranului
la context
(expresie
(şir denumerică).
caractere). funcţiei este:
<y>
<context> Numărul
Poziţia care
feresteri
exprimă
InputBox
locul din
faţăfişierul
de marginea
Help care
de MsgBox
(<mesaj>, vasus
fi apelat.
a eranului (expresie numerică). [<butoane>],
[<titlu>, <fişier_help> Fişierul Help utilizat în cazul în care se foloseşte
help senzitiv la context (şir de caractere).
<context> Numărul care exprimă locul din fişierul Help
care va fi apelat.
[<fisier_help>, <context>])
Mesaj este o expresie şir afişată ca mesaj în caseta de dialog.
Al doilea argument, titlu, este o expresie şir care apare în bara de titlu a casetei de dialog.
Sintetizaţi sunt prezentaţi parametrii înstrucţiunii MsgBox în tabelul.12
Tabelul.12
Funcţii numerice
Cuprind funcţii matematice şi trigonometrice, având ca argumente şi ca rezultate valori numerice.
Câteva funcţii reprezentative sunt cuprinse în tabelul.15. Sunt utilizate în calcule matematice şi
inginereşti.
Tabelul.15
Funcţie Descriere
Abs Returnează valoarea absolută a unei expresii
(<expresie_numerică>) numerice, sau a unui număr.
Exp Returnează valoarea constantei e ridicată la o
(<expresie_numerică>) putere (expresie numerică sau număr).
Funcţii Funcţii Discriere
Descriere Descriere
Int Date
Cbool
IsNull Returnează partea întreagă
() (<expresie>) Returneazădintr–un
Returnează
Boolean număr sauadevărat
datavaloarea
sistemului
(<expresie_numerică>)
Day
Cbyte dintr–o expresie numerică.
(<data_calendaristică>)
(<expresie>) (TRUE)
Returnează
Byte dacă expresia
numărul zilei dindintre
lună
Returnează primul număr
Ccur (<expresie>) negativ conţine
paranteze
(1–31).
Currency îmntreg valoarea
mai mic NULL
Month sau egal decât numărul
(<data_calendaristică>)
Cdate (<expresie>) (datespecificat
invalide)
Returnează
Date (sau numărul
numărul lunii din an (1–
IsError rezultat în
(<expresie>)
CDbl (<expresie>) urma evaluării numerice)
Returnează
12).Double valoarea adevărat
Fix Year Returnează partea întreagă
Cdec(<data_calendaristică>)
(<expresie>) (TRUE)
Returneazădintr–un
Decimal dacănumăr
anul. expresia
sau dintre
(<expresie_numerică>)
Hour dintr–o expresie numerică.
CINt(<expresie_timp>)
(<expresie>) paranteze
Integer conţine
Returnează numărulo eroare.
orei din zi (0–
IsEmpty Returnează primul număr
(<expresie>)
CLng (<expresie>) negativ întreg
Returnează
23) Long mai mareadevărat
valoarea
Minute sau egal decât
(<expresie_timp>)
CSng (<expresie>) numărul specificat
(TRUE) (sau numărul
Single numărulexpresia
Returnează dacă minutului dintre
dintr–
rezultat
CStr (<expresie>) în urma evaluării
o orăexpresiei
paranteze
(0–59).
String nunumerice)
conţine o valoare.
Second (<expresie_timp>)
Cvar (<expresie>) NULL
Returnează este considerat
Variant numărul uneivaloare.
secunde
IsDate (<expresie>) Returnează
dintr–un valoarea adevărat
minut (0–59).
(TRUE) dacă expresia dintre
paranteze este compatibilă cu o
dată calendaristică.
IsNumeric (<expresie>) Returnează valoarea adevărat
(TRUE) dacă expresia dintre
paranteze poate fi evaluat ca
număr.
IsObject (<identificator>) Returnează valoarea adevărat
Funcţii pentru şiruri de caractere (Tabelul.16)
(TRUE) dacă identificatorul dintre
paranteze este de tip obiect.
Tabelul.16FuncţieDescriereChr (<cod_caracter>)Returnează caracterul corespunzător codului
specificat.Len (<şir_cractere/variabilă>)Returnează numărul de caractere al şirului de
caractere specificat sau numărul de octeţi necesari pentru a stoca conţinutul unei
variabile.Space (număr)Returnează numărul de spaţii specificateStr
(expresie_numerică)Converteşte rezultatul evaluării expresiei numerice dintre paranteze într–
un şir de caractereVal (şir_caractere)Returnează rezultatul evaluării şirului de caractee
specificat, într–un numărMid (şir_caractere, poziţie_start, lungimea)Extrage un şir de
caractere dintr–un alt şir de caractere.
– şir_caractere – şirul de caractere din care se extrage;
– poziţie_start poziţia din şirul de caractere, de unde începe extragerea;
– lungimea – numărul de caractere care se extrage.
Instrucţiune 1
Instrucţiune 2
Instrucţiune n
Structuri alternative
Aceste structuri,numite şi condiţionate, sunt de două categorii: de selecţie şi de decizie. şi se
caracterizează prin executarea unui set de instrucţiuni sau a altuia, în funcţie de îndeplinirea sau
neîndeplinirea unei condiţii.
Structurile alternative permit astfel ramificarea ordinii de execuţie a instrucţiunilor unui program.
Instrucţiune
1
Fals Adevărat
Con
diţie
Instrucţiune 2 Instrucţiune
3
Structuri repetitive
În cadrul structurilor repetitive (sau iterative), un set de instrucţiuni se repetă în funcţie de o
condiţie specificată
Structurile repetitive pot fi:
condiţionate anterior – caracterizate prin executarea repetată a setului de instrucţiuni cît timp
condiţia testată este adevărată;
condiţionate posterior caracterizate prin executarea setului de instrucţiuni cât timp o condiţie este
falsă;
condiţionate anterior sau posterior, cu contor. Cu această structură se execută setul de instrucţiuni
de un număr de ori, plecându–se de la valoarea iniţială a variabilei contor până la valoarea finală a
acesteia, incrementându–se automat variabila contor cu +1
Instrucţiune 1
Adevărat
Condiţi
e
Fals Instrucţiune 2
Instrucţiuni VBA pentru programarea structurilor
A.
If <condiţie>Then
[secvenţă_instrucţiuni_1]
[Else
[secvenţă_instrucţiuni_2]]
End If
Unde:
Condiţie poate fi o expresie numerică sau o expresie şir de caractere, care poate fi evaluată la
adevărat (true) sau fals (False).
Dacă rezultatul evaluării expresiei din condiţie este adevărat, atunci este executată
secvenţă_instrucţiuni_1, astfel este executată secvenţă_instrucţiuni_2.
Exemplu:
Dacă media este egală cu 5 atunci studentul este considerat integralist, în caz contrar este
restanţier.
If Media = 5 Then
MsgBox „Student integralist”
Else
MsgBox „Student restanţier”
End If
B.
If <condiţie_1>Then
[secvenţă_instrucţiuni_1]
[Else lf<condiţie_2> Then
[secvenţă_instrucţiuni_2]]
……
[Else
[secvenţă_instrucţiuni_n]]
End If
Exemplu:
Agenţii comerciali sunt premiaţi în funcţie de valoarea mărfurilor vândute.
If suma_de_încasat<100000000 Then
MsgBox „Prima=suma_de_încasat * 5%
Elself suma_de_încasat >=100000000 Then
MsgBox „Prima=suma_de_incasat * 10%
Else pentru suma_de_încasat> 200000000 Then
MsgBox „Prima=suma_de_încasat * 15%
End If
C.
If<condiţie> Then <instrucţiune_1> [Else <instrucţiune_2 >]
În această variantă, după evaluarea condiţiei, se poate executa o singură instrucţiune şi trebuie
scrisă pe un singur rând.
Exemplu:
În calculul valorii de plată corespunzătoare facturilor întocmite, firma X oferă o reducere de 5%
pentru facturile mai mari de 100 milioane lei.
If val_fact>100000000 Then val_de_plată=val_fat*0,95_
Else val_de_plată=val_fact
Exemplu:
Penalităţile percepute de firma X pentru întârzierea plăţi facturilor de către beneficiari, în funcţie
de numărul de zile de întârziate.
While <condiţie>
[secvenţă_instrucţiuni]
Wend
Condiţie poate fi o expresie numerică sau o expresie şir de caractere, care poate fi evaluată la
adevărat sau fals. Întâi se evaluează condiţia, dacă este adevărată, se repetă secvenţa de instrucţiuni; dacă
nu este adevărată se iese din structură şi se trece la următoarea secvenţă de instrucţiuni de după Wend.
Exemplu:
Să se afişeze numerele mai mici decât 10.
Score = 0
While Score < 0
Score = Score + 1
Wend
Instrucţiunea Do………Loop
Formatul instrucţiunii este:
Do [{While│Until} <condiţie>]
[secvenţă_instrucţiuni]
[Exit Do]
[secvenţă_instrucţiuni]
Loop
În varianta Do While...Loop se repetă secvenţa de instrucţiuni atâta timp cât condiţia este
adevărată. Dacă evaluarea ei este Null, evaluarea condiţiei este False. Această variantă funcţionează
exact ca While...Wend, cu deosebirea că se poate ieşi forţat din structură cu Exit Do.
Do
[secvenţă_instrucţiuni]
[Exit Do]
[secvenţă_instrucţiuni]
Loop [{While│Until} <condiţie>]
Exemplu:
Se va introduce Nr_Matricol al studenţilor până când Nr_ Matricol = 3456
Nr_ Matricol = 0
Do
Nr_ Matricol = Nr_ Matricol + 1
Loop Until Nr_ Matricol = 3456
Instrucţiunea For………….Next
Codifică structura repetitivă cu un număr definit de paşi, în care o secvenţă de cod se repetă cu un
număr specificat de ori.
Formatul instrucţiunii este:
Exemplu:
Se va afişa suma numerelor de la 10 la 100.
Suma = 10
For CONTOR = 11 To 100
Suma = Suma + CONTOR
Next CONTOR
Evenimentul OnDeactivate se declanşează atunci când un formular nu mai este fereastră activă
pe ecran. Ordinea evenimentelor la închiderea formularului este:
Evenimentul OnCurrent se declanşează atunci când o înregistrare din tabela sau interogarea
ataşată formularului devine înregistrare curentă. Acest eveniment nu se poate abandona.
Procedura ataşată evenimentului OnCurrent are următorul antet:
Evenimentul OnFormat se produce înainte de formatarea pentru afişare sau tipărire a unei
secţiuni dintr–un raport.
Procedura ataşată evenimentului OnFormat are următorul antet:
Evenimentul OnPrint se produce înainte de formatarea pentru tipărire a unei secţiuni dintr–un
raport.
Procedura ataşată evenimentului OnPrint are următorul antet:
Parametrul Cancel se foloseşte pentru a abandona cel de–al doilea click din secvenţa dublu click
(rămâne deci doar un eveniment OnClick).
Observaţie:
La producerea unui eveniment OnDblClick se produce automat şi un eveniment OnClick.
Evenimentul OnClick îl precedă pe OnDblClick.
Observaţie:
Button Constanta
Constanta Descriere
Descriere indică butonul
acţionat în acLeftButton
acShiftMask Butonul
Starea tastei
stângSHIFT
al mouse–ului momentul
declanşării unui acRightButton
acCtrlMask Butonul
Starea tastei
drept CTRL
al mouse–ului eveniment prin
intermediul unor acMiddleButton
acAltMask Butonul
Starea tastei
din mijloc
ALT al mouse–ului constante
Shift indică starea tastelor SHIFT, ALT, CTRL în momentul declanşării acestor evenimente prin
intermediul unor constante (
Evenimentul OnChange se declanşează atunci când conţinutul unui control casetă de text sau
listă derulantă se modifică. Acest eveniment nu se poate abandona.
Procedura ataşată evenimentului OnChange are următorul antet:
Un obiect tip macro este desemnat printr–un nume şi are ca scop automatizarea unor acţiuni
asupra unor obiecte ale bazei de date.
Macrourile definesc o serie de comenzi care se execută automat la apariţia unor evenimente.
Macrourile pot fi ataşate unui formular sau control, în scopul automatizării unor operaţii diverse
(tipărirea rapoartelor, deschiderea şi închiderea formularelor, lansarea în execuţie a unor programe,
executarea unei fraze SQL).
Acţiunile unui obiect macro se aplică obiectelor dintr–o bază de date.
Acţiunile pot viza:
Deschiderea unui obiect tip tabel, cerere, formular, raport;
Filtrarea datelor afişate într–un formular sau tabel;
Configurarea imprimării;
Automatizarea importului/exportului de date;
Căutarea unei înregistrări care răspunde la un anumit criteriu;
Definirea meniurilor personalizate.
CREAREA UNUI MACRO