Implementarea unui sistem OLAP in cadrul unei firme
Introducere
“Informaţia este moneda democraţiei” spunea renumitul autor al Declaraţiei de
Independenţă, Thomas Jefferson, în secolul al XIX-lea, poate nebănuind valoarea acestei
afirmaţii astăzi, după aproape 200 de ani.
Sursă de conflicte, de invenţii, de progres, informaţia privată este şi sursa marilor
averi moderne. Orice economie puternică sau orice companie solidă se bazează pe un flux
continuu de informaţie în încercarea de a fi întotdeauna cu un pas înaintea celorlalţi.
Este deci natural ca odată cu primele apariţii ale calculatoarelor si ale reţelelor
moderne de comunicaţii să apară un nou domeniu de activitate, acela al tehnologiei
informaţiei, hardware şi software angrenate într-un proces de continuă cercetare şi dezvoltare,
întotdeauna existând mai rapid, mai sigur, mai bine. Este momentul apariţiei marilor
companii din domeniu şi momentul în care se trasează direcţiile fiecăreia. Una din direcţiile
majore de implementare este cea a bazelor de date, acestea din urmă fiind poate accepţiunea
cea mai apropiată de informaţie privată, securizată, şi deci, un domeniu indispensabil, unde
nu se poate face rabat la calitate.
Lucrarea de faţă îşi propune să prezinte o implementare teoretică şi practică a unui
depozit de date precum şi o aplicaţie Java potrivită acestui tip de stocare de date. Datele de
intrare aparţin S.C. INPRODCOM S.R.L. şi reprezintă date veridice din anii 2003, 2004,
2005 asupra activităţii principale a firmei, evidenţa unor automate de cafea într-o anumită
răspândire teritorială, acestea fiind detaliate în capitolul 1, alături de o descriere a
intreprinderii, din punct de vedere strategic, comercial, tehnic, financiar-contabil, dar şi din
perspectiva resurselor umane şi a structurii manageriale.
Conceptul ce stă la baza depozitului de date este acela de cub n-dimensional, o
metodă inovatoare de grupare a datelor unor tabele relaţionale într-una sau mai multe tabele
de fapte prin produs cartezian. Instrumentul folosit ca suport în crearea acestor cuburi este
Oracle 9i OLAP, continuare a mai vechiului Express Server, şi care este detaliat în capitolul
2. În capitolul 2 se face o scurtă trecere în revistă a istoricului sistemelor OLAP şi a
conceptelor teoretice necesare ulterior în dezvoltarea sistemului OLAP.
Pagina 1 din 207
Domeniul tehnologiei informaţiei a adus recent în prim-plan un nou instrument de
dezvoltare a aplicaţiilor ce interacţionează cu baze de date, Oracle JDeveloper, care
aprofundează şi domeniul inteligenţei afacerii. Caracteristicile şi principalele facilităţi ale
acestuia sunt prezentate în capitolul 3.
Capitolul 4 reprezintă partea practică a lucrării, construirea sistemului OLAP,
utilizând instrumentele prezentate în capitolele anterioare. Programele pentru definirea
structurii bazei de date cât şi cele folosite la realizarea interfeţei sistemului sunt prezentate în
anexe, ataşate la sfârşitul lucrării alături de bibliografie.
Capitolul 1
PREZENTAREA INTREPRINDERII
1.1 ASPECTE GENERALE, ISTORIC
SC INDPRODCOM SRL este o societate cu răspundere limitată cu sediul în DEVA
str.Grigorescu nr. 12.
Societatea a fost înfiinţată în anul 1992 şi este înregistrată la Registrul Comerţului sub
numărul J20/1909/0408/992.
În cursul lunii martie 2004 societatea a renunţat la activitatea de comerţ en-gros
urmând să îşi desfăşoare numai activitatea de comerţ cu amănuntul prin magazinul de
desfacere din Deva şi comerţ cu amănuntul prin automate de cafea.
Se poate aprecia că SC INDPRODCOM SRL, în perioada de la înfiintare şi până în
prezent, a avut o evoluţie bună în sensul că cifra de afaceri şi profitul au avut un trend
ascendent cu o singură excepţie în anul fiscal 2001 când societatea a pierdut contractul de
distribuţie cu firma KRAFT JACOBS SUCHARD SA BRAŞOV.
Evoluţia indicatorilor cifra de afaceri şi profitul brut în perioada analizată este redată
în tabelul 1.1 şi figura 1.1, respectiv figura 1.2.
Tabelul 1.1: Evoluţia cifrei de afaceri, profit din exploatare şi profit brut
MII LEI
Pagina 2 din 207
An / indicator 2000 2001 2002 2003
CIFRA AFACERI 38697992 34393911 36936547 46075881
PROFIT DIN EXPLOATARE 1.967.843 1.212.858 1.833.017 2.629.909
PROFIT BRUT 1.134.417 71.528 502.946 1.280.741
Figura 1.1: Graficul evoluţiei indicatorului profit brut
Pagina 3 din 207
Figura 1.2: Graficul evoluţiei indicatorului cifra de afaceri
DOMENIU STRATEGIC
Încă din anul 1994 SC INDPRODCOM SRL Deva a avut o poziţie privilegiată pe
piaţa en-gros a judeţului Hunedoara ca urmare a contractului de unic distribuitor încheiat în
acel an cu SC KRAFT JACOBS SUCHARD SA BRAŞOV, contract care a durat până în anul
2001.
Ca urmare a acestui contract societatea analizată a trebuit să facă faţă cerinţelor
impuse privind:
- dezvoltarea parcului auto
- amenajarea spaţiilor de depozitare
- personal calificat
Este perioada în care societatea achiziţionează maşinile de transport, sediul firmei şi
spaţiile de depozitare.
În urma rezilierii contractului cu SC KRAFT JACOBS SUCHARD SA BRAŞOV
societatea a fost nevoită să încheie un nou contract de distribuitor unic de data aceasta cu
firma KANDIA SA TIMIŞOARA. Contractul s-a încheiat în data de 01.09.2001 şi s-a derulat
până în luna martie 2004.
Pagina 4 din 207
Datorită faptului că cerinţa pe piaţă a produselor fabricate de KANDIA SA
TIMIŞOARA a fost mai scăzută, cifra de afaceri pentru comerţul en-gros a scăzut astfel încât
în luna martie 2004 societatea a renunţat la acest tip de activitate.
În scopul diminuării consecinţelor legate de rezilierea contractului de unic distribuitor
cu SC KRAFT JACOBS SUCHARD SA BRAŞOV, societatea a achiziţionat în luna mai
2001 un magazin în Deva în care desfăşoară activitatea de comerţ cu amănuntul a produselor
alimentare şi nealimentare.
Poziţia acestui magazin situat într-un cartier periferic al municipiului Deva lipsit de
magazine alimentare mari, precum şi interesul salariaţilor şi a conducerii societăţii fac din
această activitate o afacere sigură cu o evoluţie ascendentă lină, dar nu spectaculoasă.
La începutul anului 2002 SC INPRODCOM SRL a încheiat un contract de unic
distribuitor cu societatea ELITE ROMANIA SA BUCUREŞTI pentru activitatea de
comercializare a băuturilor calde prin intermediul automatelor de băuturi calde (cafea, ceai,
ciocolată etc).
Conform acestui contract se asigură distribuţie unică pe raza judeţelor Hunedoara,
Arad, Bihor, Timiş, Caraş Severin şi începând cu aprilie 2004 şi Mehedinţi.
Ca urmare a condiţiilor stabilite prin acest contract, a managementului adecvat şi a
cerinţelor crescânde pe piaţă a acestor produse, la ora actuală este activitatea de bază a
societăţii, având un aport de peste 95% la cifra de afaceri cu toate că pe piaţă există
concurenţa unor firme de renume precum SC HESS CAFÉ SA BUCUREŞTI, respectiv SC
DALMAYS SA BRAŞOV precum şi existenţa unei pieţe de comercializare second-hand a
acestor automate.
DOMENIU COMERCIAL
1.3.1. Analiza vânzărilor
Ţinând cont de faptul că societatea desfăşoară mai multe tipuri de activităţi, iar pentru
comercializarea băuturilor calde desfăşoară activităţi pe raza mai multor judeţe, evoluţia în
timp a diferiţilor indicatori s-a făcut în baza acestei structuri.
Evoluţia cifrei de afaceri pe activităţi este prezentată în tabelul 1.2 şi figura 1.3
Pagina 5 din 207
Tabelul 1.2 : Evoluţia cifrei de afaceri pe activităţi
Nr.
crt.
An / activitate 2000 2001 2002 2003
1 Comerţ en- gros 88697992 32316661 26026071 21608710
2 Comerţ cu amănuntul - 2077250 5711200 6575826
3 Băuturi calde - - 5199276 17891345
Figura 1.3: Evoluţia cifrei de afaceri pe activităţi
Analiza marjei comerciale pe activităţile de bază rezultă pe baza datelor prezentate în
tabelul 1.3, respectiv figura 1.4
Marja comercială se defineşte ca diferenţa dintre veniturile realizate din vânzarea
mărfurilor şi costul acestora.
Tabelul 1.3 : Marja comercială pe activităţi
MII LEI
Nr.
crt.
An / activitate 2000 2001 2002 2003
1 Comerţ en – gros 4456307 3993072 2695609 170051
2 Comerţ cu amanuntul - 296023 833286 951337
3 Băuturi calde - - 2573862 8283729
Total 4456307 4289095 6102757 9405117
Pagina 6 din 207
Figura 1.4 : Marja comercială pe activităţi
Analiza duratei de încasare a creanţelor
În baza analizei indicatorilor cifrei de afaceri pe activităţi şi a marjei comerciale pe
activităţi şi ţinând seama de termenele de încasare pe activităţi (en-gros 20-35 zile iar la
automatele de cafea zilnic), conducerea societăţii a renunţat la activitatea de en-gros începând
cu luna martie 2004.
Influenţa acestei decizii este reliefată de evoluţia indicatorului durata de încasare
creanţe clienţi DIC prezentată în tabelul 1.4, respectiv figura 1.5 şi calculat cu relaţia:
Creanţe ( clienţi )
DIC = ------------------------- X 360 zile
Cifra de afaceri
Tabelul 1.4 : Evoluţia duratei de încasare a creanţelor
MII LEI
Nr.
crt.
An /
indicator
2000 2001 2002 2003 2004
1 Clienţi 3455942 1639959 1880353 2426980 461283
Pagina 7 din 207
2 Cifra de
afaceri
38697992 34393911 36936547 46075881 15415666
3 DIC(zile) 32 17 18 18 11
Figura 1.5 : Evoluţia duratei de încasare a creanţelor
Analiza cifrei de afaceri pe judeţe pentru activitatea băuturi calde rezultă din tabelul
1.5, respectiv figura 1.6.
Tabelul 1.5 : Cifra de afaceri pe judeţe
MII LEI
Nr.
crt.
An / judeţe 2000 2001 2002 2003
1 Hunedoara - - 1793300 4605688
2 Timiş - - 1945513 5915999
3 Bihor - - 782741 3712942
4 Arad - - 677722 3656716
Total - - 5199276 17891345
Aceste cifre demonstrează că în 2003 activitatea a fost mai intensă în judeţul Timiş,
urmat de judeţul Hunedoara.
Pagina 8 din 207
Figura 1.6 : Cifra de afaceri pe judeţe
Analiza pieţei de aprovizionare
În ceea ce priveşte piaţa de aprovizionare, încă din anul 1994 aceasta a fost dominată
rând pe rând de 3 firme mari: KRAFT JACOBS SUCHARD BRAŞOV, KANDIA
TIMIŞOARA şi actualmente ELITE ROMÂNIA SRL.
Dacă în cazul KRAFT JACOBS SUCHARD BRAŞOV contractul a fost reziliat din
iniţiativa acestuia cu consecinţe grave asupra activităţii societăţii, în cazul KANDIA
TIMIŞOARA contractul a fost reziliat din iniţiativa SC INDPRODCOM SRL.
Actualmente aprovizionarea cu marfă se face în proporţie de 99% de către firma
ELITE ROMÂNIA SRL care este şi furnizorul de echipamente (aparate de băuturi calde) şi
apreciem că pe termen lung nu există pericolul rezilierii acestui contract.
Pentru a vedea modul în care societatea şi-a achitat obligaţiile către furnizorii curenţi
urmărim evoluţia indicatorului durata de achitare a obligaţiilor curente (furnizori) DAO
( tabelul 1.6, respectiv figura 1.7) calculat cu relaţia:
Furnizori (marfă + utilităţi)
DAO = ----------------------------------
Pagina 9 din 207
Cifra de afaceri
Tabelul 1.6 : Durata de achitare a obligaţiilor curente
MII LEI
Nr.
crt.
An / indicator 2000 2001 2002 2003 2004
1 Furnizori 3958474 3884568 4595871 4799089 2485124
2 Cifra de
afaceri
38697992 34393911 36936547 46075881 1541568
6
3 DAO(zile) 37 41 45 37 58
Figura 1.7 : Durata de achitare a obligaţiilor curente
Analizând indicatorii durata de încasare a creanţelor şi durata de achitare a datoriilor
curente observăm că evoluţia acestora este favorabilă societăţii în sensul că se încasează
clienţii mult mai repede decât se plătesc furnizorii.
Acest lucru a făcut posibil ca în cursul anului 2004 să se diminueze linia de credit de
la 6.000.000 mii lei până la 4.000.000 mii lei, linie de credit care în cursul lunii aprilie 2004 a
ajuns să fie folosită numai în proporţie de 25%.
Pagina 10 din 207
1.4 DOMENIU TEHNIC
La data analizei societatea are în proprietate 3 imobile cu terenul aferent (sediul
administrativ, magazin de desfacere cu amănuntul şi spaţiul de depozitare) precum şi un
număr de 381 echipamente tehnologice (automate de băuturi calde). În funcţie de
caracteristicile tehnice (capacitate de producţie) ele se grupează în :
aparate de tip SAECO
aparate de tip RHEAXS
aparate de tip COLIBRI
aparate de tip RHEAXM
aparate de tip BRIO 200
aparate de tip BRIO 250
aparate de tip FUTUREMA
- aparate de tip KIKO
aparate de tip SPAZIO.
Durata de funcţionare a acestor echipamente conform legislaţiei este de 7 ani.
Societatea aplică metoda de amortizare liniară. Începând cu achiziţionările din 2004
societatea a hotărât să aplice metoda de amortizare accelerată.
Pentru a face faţă ariei geografice extinse în care îşi desfăşoară activitatea societatea
deţine un număr de 19 mijloace de transport completat cu încă 6 autoturisme achiziţionate în
leasing operaţional .
1.5 DOMENIUL RESURSELOR UMANE ŞI AL MANAGEMENTULUI
În perioada analizată şi în cursul anului 2004 societatea îşi desfăşoară activitatea
numai cu personal angajat (salariaţi).
Facem menţiunea că asociatul unic are calitatea de angajat îndeplinind funcţia de
director general.
Evoluţia în timp pe perioada analizată a resurselor umane impune calcularea unor
indicatori care se referă la comportament precum şi indicatori de eficienţă a resurselor umane.
Pagina 11 din 207
Indicatori de comportament
-număr mediu scriptic – evoluţia este prezentată în tabelul 1.7, respectiv figura 1.8.
Tabelul 1.7 : Evoluţia numărului mediu scriptic
An / Element 2000 2001 2002 2003
Număr mediu scriptic
salariaţi
28 27 30 37
Figura 1.8: Evoluţia numărului mediu scriptic
gradul de utilizare a timpului Gut – rezultatele sunt prezentate în tabelul 1.8, respectiv
figura 1.9.
Timp efectiv lucrat
Gut = ------------------------------------- X 100
Timp maxim disponibil
Tabelul 1.8: Gradul de utilizare a timpului
ORE
An / Element 2000 2001 2002 2003
Timp efectiv lucrat 50368 48854 53402 67718
Timp max disponibil 56896 54864 60960 75184
Gut 89% 89% 87% 90%
Pagina 12 din 207
Figura 1.9 : Gradul de utilizare a timpului
Timp max. disponibil = 254 zile după ce se scad sâmbetele, duminicile şi sărbătorile
legale
Indicatori de eficienţă a muncii
productivitatea muncii W calculată funcţie de cifra de afaceri este analizată în tabelul
1.9, respectiv figura 1.10.
Cifra de afaceri
W = -------------------------------------
Număr mediu personal
Tabelul 1.9: Evoluţia productivităţii muncii
An / Element 2000 2001 2002 2003
Cifra de afaceri 38697992 34393911 36936547 46075881
Număr mediu
personal
28 27 30 37
W mii lei / pers 1382071 1273849 1231218 1245294
Pagina 13 din 207
Figura 1.10: Evoluţia productivităţii muncii
La data evaluării societatea are un număr de 32 de salariaţi cu contract permanent de
muncă repartizaţi pe puncte de lucru astfel (tabelul 1.10):
Tabelul 1.10 : Repartizarea salariaţilor pe puncte de lucru
Nr. crt. Punct de lucru Număr %
1 Sediu 4 13
2 Magazin cu amănuntul 7 22
3 Timişoara 6 19
4 Arad 4 12
5 Oradea 5 15
6 Deva aparate 6 19
7 Total 32 100
Structura personalului la 30.04.2004 pe categorii de personal (tabelul 1.11) este:
Tabelul 1.11 : Structura personalului pe categorii de personal
Nr. crt. Categorie de personal Număr %
1 Conducere 3 9
Pagina 14 din 207
2 Personal de specialitate 2 6
3 Personal tehnic productiv 27 85
Total 32 100
Se observă ponderea mare a personalului direct productiv.
Structura personalului după gradul de pregătire profesională (tabelul 1.12).
Tabelul 1.12 : Structura personalului după gradul de pregătire profesională
Nr. crt. Categorie de personal Număr %
1 Studii superioare 8 33
2 Din care conducere 3
3 Studii medii 24 66
Total 32 100
DOMENIUL FINANCIAR – CONTABIL
Din capitolele anterioare au rezultat o serie de amănunte legate de SC
INDPRODCOM prin care s-au confirmat performanţele sale financiare.
Pentru a evidenţia influenţa activităţii comercializării băuturilor calde, din
multitudinea indicatorilor economico-financiari, prezentăm următoarele :
1.Rentabilitatea financiară RF măsoară excedentul de resurse financiare creat de
functionarea intreprinderii (tabelul 1.13, respectiv figura 1.11)
Profit brut
RF = ----------------------- X 100
Total venituri
Tabelul 1.13 : Evoluţia rentabilităţii financiare
Pagina 15 din 207
MII LEI
Indicator 2000 2001 2002 2003
Profitul brut 1134417 71528 592946 1280741
Total venit 38727327 34439200 37318522 46338970
Rentabilitatea
financiară %
2,39 0,20 1,59 2,77
Figura 1.11 : Evoluţia rentabilităţii financiare
Datorită evoluţiei sale crescătoare, acest indicator exprimă starea de sănătate a afacerii
societăţii în cauză.
2. Rentabilitatea activităţii RA măsoară capacitatea intreprinderii de a-şi crea resurse
proprii de finanţare din activitate (tabelul 1.14, respectiv figura 1.12).
Capacitatea de autofinanţare
RA = -------------------------------------------------- X 100
Cifra de afaceri
CAF este surplusul financiar ce rămâne intreprinderii după plata partenerilor
(furnizori, salarii, impozite, dobânzi, dividende)
Pagina 16 din 207
CAF = Profit net +Cheltuieli amortizare + Cheltuieli cu active cedate – Venit din
cedare
Tabelul 1.14 : Rentabilitatea activităţii
MII LEI
Indicator 2000 2001 2002 2003
CAF 928286 190837 549108 3951727
CA 38699253 34402228 36936547 46075881
RA % 2,4 0,6 1,5 8,6
Figura 1.12 : Rentabilitatea activităţii
Privită în ansamblu, evoluţia crescătoare a acestui indicator reprezintă un punct
favorabil, valoarea lui însă rămâne sub valoarea acceptată de 10%.
Trendul mediu este oscilant cu tendintă de creştere.
Pagina 17 din 207
Pagina 18 din 207
Capitolul 2
FACILITĂŢI OLAP OFERITE DE ORACLE 9i
2.1. SCURT ISTORIC
Sistemele OLAP încă de la apariţia lor, au încercat să ofere un suport analitic adecvat
tuturor persoanelor cu putere de decizie de la orice nivel al companiei.
Cererile analitice sunt cereri complexe (de exemplu: „Cum se situează nivelul
vânzărilor pe luna curentă din judeţul Timiş faţă de planul prestabilit? Dar faţă de vânzările
din anul precedent?”), ce implică a alege date agregate, curente sau istorice.
Nivelul de procesare a datelor necesar pentru a răspunde unei cereri analitice este
fundamental diferit faţă de nivelul de procesare necesar răspunderii unei cereri tranzacţionale.
Următorul tabel evidenţiază principalele diferenţe (tabelul 2.1).
Tabelul 2.1: Principalele diferenţe între cererile tranzacţtionale şi cele analitice
Caracteristica Cereri tranzacţionale Cereri analitice
Operaţie tipică actualizare analiză
Vechimea datelor curente istorice
Nivel de analiză a datelor detaliu agregat
Volum date necesare minim extensiv
Tip interogare interogări individuale interogări iterative
Încă din anii ’70-’80, s-au dezvoltat sisteme informatice ce au permis analiza
multidimensională, înainte de a fi cunoscute sub numele de sisteme OLAP. Principalele
eforturi în dezvoltarea tehnologiei OLAP pot fi prezentate cronologic după cum urmează:
În 1962 Ken Iverson, în cartea sa „A programming language”, descrie primul limbaj
multidimensional, limbajul APL. Acest limbaj a fost implementat de IBM pe mainframe-uri,
la sfârşitul anilor 1960. Multe din conceptele acestui limbaj sunt folosite şi astăzi (de
exemplu, Adaytum Planning şi Lex 2000 folosesc limbajul APL).
La sfârşitul anilor 1960, John Little, doctor în fizică, Len Lodish, tânăr specialist în
marketing la Massachussetts Institute of Technology Sloan School şi Glen Urban, decanul de
Pagina 19 din 207
la Sloan School, au încercat să utilizeze calculatoarele în aplicaţii matematice şi analitice. Au
încercat utilizarea analiticului în marketing, în special în marketing-ul bunurilor de consum.
Aceasta era o arie ideală de investigaţie, deoarece exista un volum mare de date brute
neprelucrate şi procesul decizional putea fi îmbunătăţit prin înţelegerea mai bună a datelor.
Efortul lor a condus la apariţia sistemelor de gestiune a deciziilor (Management Decision
Systems), în 1974. MDS-urile erau utilizate în special pentru crearea de modele matematice
pentru analize de marketing. A fost o muncă complexă de programare în Fortran, care a avut
ca rezultat o bibliotecă de funcţii analitice şi facilităţi de stocare a matricilor pe disc. John
Wirts a considerat că biblioteca de subrutine ar putea fi generalizată şi că facilităţile analitice
ar putea fi îmbunătăţite mult, pentru utilizatorul final, prin adăugarea facilităţilor de gestiune
a datelor. Acesta a fost un important pas în dezvoltarea primelor sisteme OLAP.
În 1972 funcţiile analitice şi facilităţile de gestiune a datelor au fost integrate într-un
limbaj, limbajul Express. După 30 de ani Express rămâne una din principalele tehnologii
OLAP folosite, conceptul şi modelele de date fiind neschimbate.
La începutul anilor 1970, firma Comshare a ales analiza financiară ca o activitate
centrală. Firma a achiziţionat un limbaj de modelare financiară numit FCS de la o firmă de
software britanică (EPS Consultants). Specialiştii firmei au căutat să facă din limbajul FCS,
un limbaj care să satisfacă cerinţele utilizatorilor pentru analiza multidimensională.
În 1978-1979, Comshare a considerat necesară trecerea la o nouă generaţie de limbaj
de modelare financiară, realizată prin combinarea funcţiilor analitice de modelare cu
tehnologia gestiunii datelor, în scopul de a gestiona volume mult mai mari de date asociate cu
conceptul de multidimensionalitate. Instrumentul rezultat a fost System W DSS, primul
instrument OLAP pentru aplicaţii financiare, care folosea conceptul de hypercub. Principala
sa utilizare era ca suport decizional financiar, utilizat în activitatea bugetară, de previziune şi
de planificare strategică. A introdus multe concepte cum ar fi: reguli complet neprocedurale,
vizualizare multidimensională a datelor, integrare cu datele relaţionale etc. Aşa cum Express
a devenit un instrument important în aplicaţiile de analiză de piaţă, System W a devenit o
forţă în planificare, analiză şi aplicaţii de raportare financiară, în anii 1980. Hyperion
Essbase, deşi nu este un descendent direct al lui System W, foloseşte multe din conceptele
utilizate de acesta.
În 1984 a apărut primul instrument ROLAP, Methafor, folosit în analiza de
marketing. A introdus noi concepte, care au devenit populare în anii 90, cum ar fi: calcule
distribuite client/server, procesare multidimensională a datelor relaţionale.
Pagina 20 din 207
La mijlocul anilor ’80 a apărut termenul de EIS (Executive Information System). În
1985 apare Pilot Command Center, primul instrument OLAP stil EIS, cu arhitectură
client/server. Unele din aceste concepte au fost implementate în Pilot’s Analysis Server.
În 1990 Cognos Power Play devine primul instrument OLAP cu arhitectură desktop,
pentru Windows. Firma Cognos oferă şi versiuni pentru arhitectură client/server şi Web.
În 1991 Methafor este achiziţionat de consorţiul Apple-IBM Taligent.
Firma Arbor Software s-a constituit în 1991, cu scopul unic de a crea un server de
bază de date multidimensională şi multiutilizator, care s-a numit Essbase. Essbase a fost
introdus pe piaţă în 1992 şi s-a lansat şi sub sistemul de operare OS/2 şi Windows NT.
În 1993 Codd introduce termenul de OLAP şi cele 12 reguli referitoare la sistemele
OLAP. După ce a văzut Essbase, ca un exemplu de bază de date multidimensională, a ajuns
la concluzia că limbajul SQL nu a fost niciodată adecvat pentru analiza multidimensională. El
a afirmat că există o diferenţă semnificativă între tehnologia sistemelor multidimensionale şi
tehnologia sistemelor tranzacţionale.
În 1994 apare primul instrument ROLAP, Microstrategy DSS Agent, fără motor
multidimensional. Toată procesarea era executată cu limbajul SQL (multipass SQL), o
tehnică utilizată foarte des pentru baze de date foarte mari.
În 1995 apare primul OLAP hibrid, HOLOS 4.0 ce permite accesul atât la baze de
date relaţionale cât şi la multidimensionale. Multe din instrumentele OLAP folosesc această
arhitectură.
În 1995 Oracle achiziţionează Express. Ianuarie 1995 a marcat şi formarea consiliului
OLAP care a jucat un rol cheie în stabilirea sistemelor OLAP ca o categorie de software mai
bine înţeleasă şi cunoscută. Consiliul OLAP definea conceptul de OLAP ca „ o categorie de
instrumente software, care permit analiştilor, managerilor şi directorilor să înţeleagă esenţa
datelor printr-un acces rapid, consistent şi interactiv la o mare varietate de viziuni posibile ale
informaţiilor, care au fost obţinute prin transformarea datelor primare astfel încât să reflecte
dimensiunile reale ale intreprinderii aşa cum o percepe şi o întelege utilizatorul”.
În 1997 apare Microsoft OLEDB for OLAP, un standard OLAP API dezvoltat de
Microsoft, ca un set de obiecte COM şi interfeţe destinate de a oferi acces la sursele de date
multidimensionale prin OLEDB. OLEDB for OLAP dezvoltă un model pentru cuburi şi
dimensiuni, oferă un limbaj MDX (multidimensional expressions) pentru calcul şi vizualizare
a cuburilor.
Pagina 21 din 207
În 1997 apare standardul MDIS (Metadata Interchange Specification) propus de un
grup de firme (IBM, Sybase, Informix) care oferă un mecanism standard de acces şi o
interfaţă standard pentru a gestiona metadatele.
În 1998 apare IBM DB2 OLAP Server, o versiune a lui Essbase, care utilizează date
stocate în baze de date relaţionale (schema stea).
În 1999 apare Microsoft OLAP Services ce utilizează o tehnologie achiziţionată de la
Panorama Software Systems şi cu o arhitectură de stocare complexă
(ROLAP/MOLAP/HOLAP).
În 2000, Microsoft redenumeşte Microsoft OLAP Services ca Microsoft Analysis
Services.
În 2002 Oracle lansează Oracle 9i Release 2 OLAP care integrează toate facilităţile
OLAP în baza de date relaţională Oracle.
2.2. CONCEPTE DE BAZĂ
Am considerat necesar a prezenta o serie de concepte utilizate şi anume: hypercubul
(cub n-dimensional), multicubul, dimensiunile, ierarhiile, măsurile şi fenomenul de
împrăştiere. Consiliul OLAP a propus un glosar de termeni ce se doreşte standardizat, de
aceea în prezentarea acestor concepte de bază am utilizat şi definiţiile date de Consiliul
OLAP.
CONCEPTUL DE CUB N-DIMENSIONAL
Conceptul de hypercub sau cub cu mai mult de trei dimensiuni (cub n-dimensional)
sau structură multidimensională este fundamental pentru înţelegerea sistemelor OLAP şi a
modelului multidimensional. Instrumentele OLAP folosesc conceptul de hypercub în acelaşi
mod în care foile de calcul tabelar folosesc conceptul de foaie de lucru (worksheet) şi bazele
de date relaţionale conceptul de tabelă. Toate vizualizările, rapoartele şi analizele sunt făcute
în termeni de hypercuburi (cuburi n-dimensionale).
Pagina 22 din 207
Consiliul OLAP defineşte hypercubul ca “un grup de celule de date aranjate după
dimensiunile datelor. De exemplu o foaie de calcul tabelar exemplifică o matrice
bidimensională cu celulele de date aranjate în rânduri şi coloane, fiecare fiind o dimensiune.
O matrice tridimensională poate fi vizualizată ca un cub cu fiecare dimensiune formând o faţă
a cubului. Dimensiunile tipice ale datelor dintr-o intreprindere sunt timpul, măsurile,
produsele, regiunile geografice, canalele de distribuţie etc.”
CONCEPTUL DE DIMENSIUNE
Conceptul de dimensiune este definit de Consiliul OLAP ca “un atribut structural al
unui cub ce constă dintr-o listă de membrii, pe care utilizatorii îi percep ca fiind de acelaşi
tip. De exemplu, toate lunile, trimestrele, anii formează dimensiunea Timp... O dimensiune
acţionează ca un index pentru identificarea valorilor dintr-o matrice multidimensională...
Dimensiunile oferă un mod foarte concis, intuitiv de organizare şi selectare a datelor pentru
explorare şi analiză”.
Dimensiunile sunt atribute de identificare a evenimentelor măsurabile sau a lucrurilor
pe care le analizăm. Spre deosebire de dimensiunile fizice care sunt bazate pe unghiuri şi sunt
limitate la trei, dimensiunile logice nu au astfel de limite. Frecvent numărul de dimensiuni
într-un set de date depăşeşte cele trei dimensiuni fizice (rând, coloană, pagină) ale ecranului
de afişare. Abilitatea instrumentului OLAP de a modela multiple dimensiuni de informaţii îl
face mult mai potrivit pentru a lucra cu seturi complexe de date, decât bazele de date
relaţionale şi foile de calcul tabelar. Dimensiunile au următoarele caracteristici:
furnizează informaţii descriptive despre fiecare indicator (variabilă);
conţin în general date statistice şi sunt esenţiale pentru analiză. Un model
multidimensional ce oferă un număr mare de atribute dimensionale permite analize cât mai
complexe şi mai variate;
într-un cub n-dimensional o dimensiune este reprezentată printr-o axă;
într-o schemă stea sunt tabelele care se dispun radial în jurul tabelei de fapte şi se mai
numesc tabele de dimensiuni.
De exemplu, într-o bază de date pentru analiza vânzărilor se identifică următoarele
dimensiuni: Timp, Regiune/Locaţie, Client, Agent de vânzare, Produs.
Pagina 23 din 207
O dimensiune conţine mai mulţi membri. Un membru este “un nume distinct sau un
identificator folosit pentru a determina poziţia unui element de dată (în schema stea apare sub
denumirea de atribut dimensional)”. De exemplu, toate lunile, trimestrele şi anii formează
dimensiunea Timp şi toate oraşele, regiunile şi ţările dimensiunea Locaţie. Un membru poate
aparţine la una sau mai multe ierarhii sau poate să nu fie inclus într-o ierarhie (independent).
De exemplu, în dimensiunea Produs membrul “culoare” nu este inclus în nici o ierarhie.
CONCEPTUL DE IERARHIE
O ierarhie este un atribut al unei dimensiuni. Cele mai multe dimensiuni au o structură
multi-nivel sau ierarhică. Timpul este o dimensiune ierarhică multi-nivel (ore, zile,
săptămâni, luni, trimestre şi ani), Locaţia geografică este o dimensiune ierarhică (vecini,
oraşe, state şi ţări). În cele mai multe activităţi ale unei firme, ierarhiile sunt o necesitate. Ar
fi imposibil de a funcţiona o firmă, dacă toate datele sale ar fi limitate la nivel tranzacţional.
De exemplu, este necesar de a păstra informaţii despre volumul vânzărilor lunare, pe
trimestru, pe an, pentru a vedea care produse se vând mai bine şi care mai prost. Criteriile
după care datele sunt agregate pentru analiză şi raportare trebuie să fie aceleaşi cu factorii
folosiţi în procesul decizional.
Pentru a identifica poziţia unui membru într-o dimensiune se folosesc conceptele de
înălţime şi adâncime în ierarhie. Înălţimea se stabileşte de jos în sus. Din acest motiv nivelul
(L0) al ierarhiei reprezintă nodurile frunză ale ierarhiei (înălţimea cea mai mică). Adâncimea
în ierarhie este stabilită de sus în jos. Există posibilitatea ca doi membri, care au aceeaşi
înălţime, să aibă adâncimi diferite şi invers (structuri arborescente neechilibrate). Structurile
arborescente neechilibrate sunt implementate cu succes în bazele de date multidimensionale,
bazele de date relaţionale fiind necorespunzătoare.
Ierarhiile dimensionale pot fi simetrice sau asimetrice. În dimensiunea Timp există o
ierarhie simetrică. Cu ierarhiile simetrice se pot referi membrii prin nivelul lor ierarhic.
În glosarul de termeni OLAP se specifică că “membrii dimensiunilor pot fi organizaţi
pe baza relaţiilor de tip părinte-copil, unde un membru părinte reprezintă consolidarea
(agregarea) membrilor copil. Rezultatul este o ierarhie şi relaţiile părinte/copil sunt relaţii
ierarhice”.
Pagina 24 din 207
Într-o dimensiune pot exista mai multe ierarhii. Alegerea nivelurilor intermediare de
grupare sau agregare este importantă pentru înţelegerea şi abilitatea de a lua decizii, deoarece
datele au numai un nivel de detaliu, un nivel de agregare complet, dar multe niveluri
intermediare. Fiecare direcţie de agregare scoate în evidenţă unii factori şi-i ascunde pe alţii.
Numărul de niveluri intermediare, cum ar fi grupuri de produse după preţ, grupuri de produse
după profit, după tipul produsului şi producător, permite să experimentăm diferite moduri de
a privi şi înţelege datele. Aceasta este una din ariile de convergenţă între structurile
multidimensionale şi analiza statistică.
Ierarhiile sunt fundamentul pentru agregarea datelor şi pentru navigarea între
nivelurile de detaliu dintr-un cub n-dimensional. Deşi nu toate dimensiunile conţin ierarhii,
toate aplicaţiile din lumea reală implică dimensiuni ierarhice. Numărul de ierarhii distincte
într-o structură multidimensională este egal cu produsul dintre numărul de ierarhii din fiecare
dimensiune.
Unele instrumente OLAP permit numai o singură ierarhie pe dimensiune. În acest caz,
fiecare ierarhie este tratată ca o dimensiune separată.
Combinaţia de multiple dimensiuni şi multiple niveluri pe dimensiune constituie
esenţa unui cub n-dimensional sau hypercub.
O celulă într-un cub n-dimensional este definită de intersecţia unui membru din
fiecare dimensiune. Unele celule conţin date de intrare cum ar fi vânzările zilnice, altele
conţin date derivate. Valorile datelor derivate sunt definite cu ajutorul formulelor. Cu cât sunt
mai multe dimensiuni şi ierarhii în cub, cu atât este mai complexă vecinătatea din jurul unei
celule şi există mai multe direcţii după care se pot vizualiza datele. Într-un cub n-dimensional
(cu un nivel ierarhic pe dimensiune), fiecare celulă are 2n vecini imediaţi sau direcţii de
vizualizare. De exemplu, o celulă într-o foaie de calcul tabelar are patru vecini (patru celule
adiacente), iar o celulă într-un cub tridimensional are şase. Când se adaugă ierarhii, numărul
de direcţii de vizualizare creşte.
Ce tip de date pot fi stocate într-un cub n-dimensional? Deşi majoritatea datelor
stocate în cuburile n-dimensionale sunt numerice, orice tip de date de la text la grafice şi
chiar sunete pot fi multidimensionale. Multe instrumente OLAP oferă abilitatea de a popula
cuburile n-dimensionale cu date text. Datele numerice sunt mai potrivite pentru aplicaţiile
OLAP, deoarece au o organizare multidimensională şi se pot agrega. Alte tipuri de date pot
beneficia de organizarea multidimensională, dar apar probleme datorate agregării lor. Totuşi
cele mai multe date sursă, la nivel de intreprindere, sunt de tip caracter. Din acest motiv,
datele de tip şir de caractere vor deveni mult mai importante pentru instrumentele OLAP.
Pagina 25 din 207
Date cum ar fi: culoarea, adresa, tipul de ambalaj, tipul de client sunt factori esenţiali pentru
analiză.
CONCEPTUL DE MĂSURĂ
O măsură (variabilă) este un indicator de performanţă prin care se poate analiza
performanţa activităţii modelate (de regulă un atribut numeric al unui element din colecţia de
fapte). Valorile unui indicator se modifică continuu. Pentru fiecare combinaţie posibilă între
dimensiuni, există sau nu o valoare corespunzatoare a indicatorilor. Nu orice atribut numeric
este un indicator. De exemplu, “dimensiunea ambalajului” este un atribut numeric şi totusi nu
este un indicator ci un atribut dimensional. Dacă valoarea atributului numeric variază
continuu (de exemplu: costul de livrare, cantitatea vândută, volumul vânzărilor) atunci
atributul este un indicator, iar dacă atributul este perceput mai mult ca o constantă (de
exemplu: dimensiunea ambalajului, descriere produs, culoare) atunci este un atribut
dimensional. Indicatorii pot fi clasificaţi în:
- indicatori de bază (de exemplu: volumul vânzărilor, cantitatea vândută, costurile,
numărul de clienţi);
- indicatori derivaţi care se obţin prin combinarea indicatorilor de bază (de exemplu
profitul).
O altă clasificare este dată de Ralph Kimball în cartea sa “The Data Warehouse
Toolkit” şi anume după posibilitatea indicatorilor de a se însuma după dimensiuni:
- indicatori aditivi care se pot însuma după toate dimensiunile. De exemplu,
indicatorul “volumul vânzărilor” se poate calcula pentru o categorie de produse sau pentru o
anumită regiune sau pentru o anumită perioadă de timp. Volumul vânzărilor, cantitatea
vândută şi costurile sunt aditive. Aceasta înseamnă că are sens de a aduna lei sau cantităţi de-
a lungul oricărei combinaţii timp, produs, magazin.
- indicatori semiaditivi care se pot însuma numai după unele dimensiuni. De exemplu,
indicatorul “numărul de clienţi” este semiaditiv , deoarece se poate calcula numărul de clienţi
într-o anumită perioadă de timp sau pentru o anumită regiune, dar nu este aditiv de-a lungul
dimensiunii Produs. Dacă pentru fiecare produs (dintr-o categorie de produse) se cunoaşte
numărul de clienţi şi dorim să aflăm numărul de clienţi pentru categoria de produse, nu se pot
Pagina 26 din 207
aduna aceste numere. Rezultatul poate fi eronat, deoarece pot exista clienţi, care au cumpărat
mai multe tipuri de produse, din categoria respectivă.
- indicatori neaditivi care nu se pot însuma după nici o dimensiune (de exemplu
profitul marginal). Variabilele neaditive pot fi combinate cu alte variabile pentru a deveni
aditive.
CONCEPTUL DE MULTICUB
Un cub n-dimensional este de fapt un set de variabile ce utilizează aceleaşi dimensiuni
de identificare. Întrebarea care apare este dacă se poate adăuga un număr nelimitat de
dimensiuni la un cub n-dimensional şi dacă pentru modelarea unei activităţi complexe este
suficient un singur cub n-dimensional.
Figura 2.3: Model multicub
Cel mai simplu mod de reprezentare a datelor unei aplicaţii multidimensionale este cel
al unui spaţiu cartezian definit de toate dimensiunile aplicaţiei (spaţiul datelor). Totuşi datele
multidimensionale sunt împrăştiate şi celulele de date nu sunt distribuite în mod egal în
Pagina 27 din 207
spaţiul multidimensional. Proiectanţii de instrumente OLAP au adoptat o varietate de strategii
pentru a trata fenomenul de împrăştiere dar şi gruparea datelor. Instrumente ca Essbase,
Power Play utilizează structura hypercub, o structură logică de cub simplu, dar cu un model
sofisticat de compresie a datelor. Cealaltă structură, multicubul, este mai des întâlnită. În
aplicaţiile multicub, proiectanţii descompun baza de date într-un set de structuri
multidimensionale, fiecare fiind compusă dintr-un subset de dimensiuni ale bazei de date.
CONCEPTUL DE ÎMPRĂŞTIERE
Conceptul de împrăştiere este frecvent asociat cu datele multidimensionale. Termenul
de împrăştiere a fost utilizat cu semnificaţia de valoare lipsă, valoare inaplicabilă şi valoare
zero. Primele două cazuri sunt considerate date invalide (concept de null). Codd în cele 18
reguli pentru OLAP, sugerează ca modelele OLAP respectă regula privind valorile null, a
modelului relaţional. Existenţa unui număr mare de valori zero nu este totuşi un exemplu real
de împrăştiere. Valoarea zero este validă ca orice alt număr. Confuzia a apărut, deoarece în
aplicaţiile OLAP apare un număr mare de valori zero, precum şi volume mari de date lipsă şi
invalide. Tehnicile pentru optimizarea fizică a stocării unui număr mare de valori repetate
sunt similare şi uneori aceleaşi cu tehnicile pentru optimizarea fizică a stocării de volume
mari de date lipsă şi invalide. Totuşi valorile lipsă şi cele invalide nu sunt date valide. Ele nu
pot fi tratate în acelaşi mod ca orice altă valoare. De aceea, sunt necesare tehnici speciale
pentru aceste cazuri. Tratamentul impropriu al valorilor null poate cauza calcule incorecte.
Acurateţea calculelor este de o importanţă crucială pentru analiza oricărui set de date,
indiferent că este sau nu multidimensional. Problema tratării datelor împrăştiate este una
foarte importantă şi este frecvent dezbătută în lumea bazelor de date.
Logicienii au crezut că există numai două valori logice: adevărat şi fals. Regulile
logice, care se aplică la bazele de date, sunt exprimate în funcţie de aceste două valori.
Problema apare totuşi când se introduc date invalide. Dar conform logicii, o propoziţie şi
inversa sa nu pot avea ambele valoarea adevărat. Nu ştim dacă este adevărat sau fals,
deoarece datele sunt lipsă. Conceptul de “invalid” este similar cu conceptul de “lipsă” în
sensul că nu se poate prelucra ca o valoare validă, dar este diferit în sensul că ar putea fi
greşit introdusă o valoare în acel câmp. Datele lipsă şi cele invalide se introduc regulat în
toate tipurile de baze de date, inclusiv cele multidimensionale. Codd a schimbat semnificaţia
Pagina 28 din 207
termenului de negaţie. Pentru propoziţii adevărate şi false, negaţia unui termen produce un
termen diferit cu o valoare adevărată diferită. Negaţia lui adevărat este fals şi negaţia lui fals
este adevărat. Pentru propoziţii cu valori lipsă sau invalide, negaţia unui termen este el însuşi.
Deci negaţia unei valori lipsă este “lipsă” şi negaţia unei valori invalide este “invalid”.
Îmbunătăţirea proiectarii bazei de date ar putea elimina datele invalide. Cele două
tipuri de date (lipsă şi invalide) trebuie totuşi să fie tratate individual, deoarece ele afectează
calculele în diferite moduri.
2.3. REGULILE LUI CODD
Caracteristici de bază:
1. o viziune conceptuală multidimensională
Codd considera că viziunea utilizatorului asupra intreprinderii este multidimensională
şi de aceea viziunea conceptuală a modelelor OLAP trebuie să fie, de asemenea,
multidimensională.
2. manipularea intuitivă a datelor
Codd recomanda ca manipularea datelor (operaţiile de drill down, drill up, drill
across) să fie făcute direct în celulele unui model, fără a solicita utilizarea meniurilor.
Dimensiunile definite în modelul analitic ar trebui să conţină toate informaţiile pe baza cărora
utilizatorul să poată efectua diverse analize.
3. accesibilitate
Sistemele OLAP trebuie să prezinte o singură viziune logică a datelor din
intreprindere. Sursele de date în modelul OLAP trebuie să fie transparente la utilizator. Codd
considera că şi utilizatorii finali pot fi, de asemenea o sursă de date.
4. surse de date variate
Pagina 29 din 207
Codd considera că un sistem OLAP trebuie să fie capabil să lucreze cu date stocate fie
în baze de date multidimensionale (MOLAP) cât şi în baze de date relaţionale (ROLAP).
5. modele de analiză OLAP
Codd considera că instrumentele OLAP trebuie să suporte patru modele de analiză:
explicativ, direct, contemplativ şi formativ. Cu alte cuvinte instrumentele OLAP trebuie să
permită cel putin realizarea rapoartelor parametrizate, analize de tip „ce se întâmplă dacă?”
(simulare) şi de „urmărire a unui scop” (optimizare), operaţii de tip drill down, roll up, slice
şi dice.
6. arhitectură client/server
Un sistem OLAP trebuie să permită arhitectură client/server. Server-ul OLAP trebuie
să fie suficient de inteligent astfel încât diverşi clienţi să se poată conecta la el cu minimum
efort de integrare şi de programare.
transparenţă
Sistemele OLAP trebuie să conţină interfeţe pentru diverse instrumente client şi să
permită acces la tipuri de date eterogene.
8. suport multiutilizator
Instrumentele OLAP trebuie să asigure acces concurent, integritatea şi securitatea
datelor.
Caracteristici speciale:
9. denormalizarea datelor
Pagina 30 din 207
Codd sugerează că prelucrarea datelor într-un mediu OLAP nu trebuie să afecteze
datele externe ce servesc ca sursă. Instrumentele OLAP sunt folosite pentru a procesa colecţii
mari de date, actualizate periodic, de aceea trebuie să aibă abilitatea de a stabili legături
persistente cu sursele externe de date, pentru a asigura sincronizarea între sursele externe şi
hypercub (cubul de date). Deoarece sistemele OLAP sunt în general separate de sistemele
sursă, legăturile servesc ca funcţii de transformare. Ele indică cum se transformă datele din
tabele sau foi de calcul tabelar în date multidimensionale. Legăturile pot descrie relaţii
structurale, atributele membrilor sau conţinutul hypercuburilor. Legăturile oferă o
infrastructură persistentă pentru importarea şi exportarea datelor şi a metadatelor. Ele variază
în funcţie de tipul informaţiei adusă în cub şi de tipul sursei de date, de la care informaţia este
obţinută.
10. stocarea rezultatelor generate de instrumentul OLAP
Sistemele OLAP trebuie să stocheze datele separat de sistemele tranzacţionale.
Această cerinţă apare ca urmare a diferenţelor ce există între datele operaţionale şi cele
destinate suportului decizional.
11. manipularea valorilor lipsă
Valorile lipsă sunt diferite de valorile zero şi cele invalide. Termenul de împrăştiere a
fost utilizat cu semnificaţia de valoare lipsă, valoare inaplicabilă şi valoare zero. Primele
două cazuri sunt considerate date invalide (conceptul de null). Codd sugerează că modelele
OLAP respectă regula privind valorile null, a modelului relaţional. Existenţa unui număr
mare de valori zero nu este totuşi un exemplu real de împrăştiere. Valoarea zero este validă
ca orice alt număr. Problema tratării datelor împrăştiate este una foarte importantă şi este
frecvent dezbătută în domeniul bazelor de date. Cele două tipuri de date (lipsă şi invalide)
trebuie totuşi să fie tratate individual, deoarece ele afectează calculele în moduri diferite.
12. modul de tratare al valorilor lipsă
Valorile lipsă sunt ignorate de instrumentul OLAP, indiferent de sursa lor.
Pagina 31 din 207
Modul de prezentare al datelor:
13. flexibilitatea rapoartelor
Codd considera că orice subset de membri ai unei dimensiuni poate fi mapat la orice
rând, coloană sau pagină a ecranului de afişare. Cu alte cuvinte, aranjamentul axelor în
raportare trebuie să fie la libera alegere a utilizatorului.
14. performanţa raportării
Această regulă nu trebuie să varieze semnificativ cu numărul de dimensiuni sau cu
mărimea bazei de date. Principalii factori care afectează performanţa raportării sunt:
- modul cum sunt realizate calculele. Ele pot fi antecalculate sau sunt realizate la
momentul interogării.
- locul unde sunt procesate calculele (client/server).
Aceşti factori prezintă o importanţă mai mare decât mărimea bazei de date, numărul
de dimensiuni sau complexitatea raportării.
15. ajustarea automată a nivelului fizic
Codd cere sistemelor OLAP să-şi modifice automat schema fizică a bazei de date, în
funcţie de tipul modelului logic şi de volumul datelor.
Controlul dimensiunilor:
16. dimensionalitatea generică
Codd considera că dimensiunile trebuie să fie echivalente structural şi operaţional,
adică să permită ierarhii multiple, toate tipurile de operaţii multidimensionale şi în acelaşi
timp să poate fi actualizate.
17. dimensiuni şi niveluri de agregare nelimitate
Pagina 32 din 207
Din punct de vedere tehnic, un produs nu poate îndeplini această regulă, resursele
calculatorului fiind limitate. Puţine aplicaţii OLAP necesită mai mult de opt sau zece
dimensiuni şi puţine ierarhii conţin mai mult de şase nivele. Codd afirmă că ar trebui stabilit
un număr maxim de dimensiuni, 15-20 de dimensiuni.
18. operaţii între dimensiuni nerestrictive
În analiza multidimensională a datelor, toate dimensiunile sunt create şi tratate egal.
Limbajul de manipulare a instrumentelor OLAP trebuie să permită calcule şi să asigure
modalităţi de manipulare a datelor între orice număr de dimensiuni.
Aceste reguli au fost extinse în mai 1995 şi au fost structurate de Codd în patru grupe,
denumite „caracteristici”. Caracteristicile sunt rareori menţionate şi putin folosite.
EXEMPLE DE INSTRUMENTE OLAP
Business Objects Americans este lider în furnizarea de instrumente suport de decizie
incluzând interogare, raportare, analiza proceselor on-line, data mining şi administrare SSD
pentru arhitectură client/server şi mediu Internet:
Business Objects permite dezvoltarea de aplicaţii suport de decizie cu facilităţi de
interogare şi raportare. Asigură acces la diferite surse de date (depozite de date/centre de date,
baze de date multidimensionale, fişiere text, pachete de aplicaţii, sisteme SAP). Folosind
facilitatea VBA permite utilizatorilor să modifice şi să extindă nucleul funcţional al
produsului Business Objects (se pot crea noi funcţii, noi comenzi sau subprograme).
Developer Suite permite integrarea completă a lui Business Objects cu alte aplicaţii şi
cuprinde următoarele componente: Business Objects, WebIntelligence (server de Web),
Broadcast Agent şi o componentă pentru vizualizarea rapoartelor.
Cognos oferă instrumente pentru inteligenţa afacerii, medii de dezvoltare a
aplicaţiilor.
Power Play este un instrument de analiză şi raportare multidimensională folosit pentru
a oferi informaţii utile managerilor. Este un instrument foarte scalabil (până la câteva mii de
Pagina 33 din 207
utilizatori), cuburile pot fi create pe client sau pe servere Unix. Ele pot fi create ca fişiere într-
un sistem de gestiune de fişiere sau ca tabele într-o bază de date relaţională (Oracle sau
Sybase). Permite o metodologie de proiectare a aplicaţiilor iterativă.
Impromptu permite utilizatorilor să creeze rapoarte complexe fără să cunoască
limbajul SQL sau structura bazei de date. Power Play şi Impromptu se folosesc pentru
aplicaţii de analiză a vânzărilor, analiză financiară, controlul calităţii. Instrumentele pot
importa date din peste o sută de surse de date relaţionale şi multidimensionale.
Holistic Systems, Inc este un membru al grupului Seagate Software Information
Management şi este cel mai puternic furnizor de instrumente pentru inteligenţa afacerii.
Holistic Systems este complet dedicat pentru activitatea de marketing, fiind un lider în BI.
Holos este un mediu de dezvoltare pentru aplicaţii BI, încorporează facilităţi EIS, SSD şi
OLAP, cu o arhitectură pe trei niveluri, pentru firme de dimensiuni foarte mari. În versiunea
5.0 a fost introdusă facilitatea de data mining, bazată pe reţele neuronale, integrată cu nivelul
analitic foarte puternic al lui Holos.
Pilot Software, Inc este o firmă a corporaţiei The Dun & Bradstreet, care dezvoltă
instrumente suport de decizie interactive pentru manageri şi analişti. Pilot Decision Support
Suite constă din cinci componente:
Pilot Desktop este un mediu monoutilizator pentru analiză interactivă de afaceri cu un
set complet de instrumente multidimensionale, ce permit utilizatorilor să facă operaţii de drill
down, roll up şi pivotare prin datele agregate. Include un motor OLAP cu cunoştinţe de timp
şi instrumente pentru analiza de excepţii. Sursele de date pot fi relaţionale.
Pilot Analysis Server este un server OLAP multiutilizator ce oferă multe facilităţi de
modelare, include o bibliotecă de funcţii.
Pilot Designer este un instrument pentru crearea tuturor tipurilor de aplicaţii vizuale
de tip suport de decizie. Include un limbaj pentru scripturi ce este compatibil cu Visual Basic.
Pilot Analysis Library este o bibliotecă opţională de module de analiză ce permite
utilizatorilor să accelereze implementarea de soluţii suport de decizie complexe.
Pilot Excel Add-In este o componentă opţională ce permite utilizatorilor Excel de a
integra facilităţile mediului Pilot în soluţiile Excel.
MicroStrategy, Inc este lider în soluţii ROLAP şi oferă următoarele produse OLAP:
DSS Server (motor relaţional-OLAP), clienţi (DSS Agent Relational OLAP, DSS Objects
pentru dezvoltarea de aplicaţii OLAP, DSS Web Relational OLAP – client pentru Web), DSS
Administrator (client pentru depozite de date), DSS Executive EIS (instrument de proiectare).
Pagina 34 din 207
Kenan Systems Corp oferă soluţii pentru firmele din domeniul telecomunicaţiilor,
servicii financiare, comerţ. Oferă următoarele produse:
Acumate Server este un mediu de dezvoltare de aplicaţii, incluzând un limbaj
procedural multidimensional (MSPL) şi instrumente de analiză complexe. Serverul include
un set de instrumente de încărcare a datelor, pentru accesarea depozitelor de date şi a
sistemelor operaţionale eterogene.
Acutrieve este o aplicaţie suport de decizie optimizată pentru analişti.
Acumate Workbench este o interfaţă grafică ce permite utilizatorilor să folosească
avantajele mediului Windows, precum şi a limbajului multidimensional MSPL.
Acumate Web este un motor generator HTML ce poate fi utilizat pentru a permite
raportare ad-hoc şi statică folosind tehnologia Web.
Informix Software, Inc oferă următoarele produse OLAP:
INFORMIX MetaCube este un motor de analiză complex, ce transformă Informix
Online Dynamic Server într-un server OLAP foarte performant.
INFORMIX MetaCube Explorer este un instrument SSD pentru utilizatori ce oferă o
interfaţă simplă pentru acces la depozitele de date şi realizarea de rapoarte.
INFORMIX MetaCube Warehouse Manager este un instrument grafic pentru
administrarea metadatelor ce descriu depozitul de date.
INFORMIX MetaCube Warehouse Optimizer analizează automat depozitul de date
pentru a recomanda agregarea optimă şi strategii de performanţă.
INFORMIX MetaCube for Excel extinde mediul foaie de calcul tabelar pentru a oferi
acces de tip wizard la depozitul de date.
Arbor Software Corporation oferă instrumente OLAP pentru activitatea de planificare
şi analiză a afacerilor:
Essbase Analysis Server este un server de baze de date multidimensional optimizat
pentru operaţii de planificare şi analiză a afacerilor, cu următoarele caracteristici: arhitectură
client/server, acces concurent la citire/scriere, stochează volume mari de date, permite calcule
analitice complexe, navigare flexibilă prin date, timp de răspuns mic, permite aplicaţii OLAP
robuste ce accesează direct sisteme OLTP sau un centru de date.
Essbase Spreadsheet Add-In permite integrarea facilităţilor oferite de instrumentele de
tip foaie de calcul tabelar (Excel, Lotus) cu facilităţile OLAP.
Essbase Aplication Manager este folosit pentru a construi, modifica şi gestiona
modele analitice, securitatea accesului la date, reguli de încărcare a datelor.
Pagina 35 din 207
Wired for OLAP este un instrument de prezentare şi analiză ce operează atât pe client
cât şi pe server.
Essbase Objects este un instrument puternic ce permite dezvoltarea de aplicaţii
OLAP.
IBM Corporation:
Componenta de prezentare oferă un set de facilităţi de vizualizare, navigare şi
raportare. Motorul OLAP permite reprezentarea multidimensională a schemei stea, calcule
analitice complexe şi agregări. Unele soluţii OLAP includ şi un nivel suplimentar:
Componenta de aplicaţie. Această componentă oferă logica afacerii, specifică pentru
subiectul analizat (de exemplu marketing şi vânzări).
Oracle Corporation oferă următoarele produse OLAP:
Oracle Express Server/Oracle Personal Express este un server OLAP. Datele sunt
stocate într-o bază de date multidimensională. In 2002, Oracle lanseaza Oracle 9i Release 2
OLAP care integrează toate facilităţile OLAP în baza de date relaţională Oracle.
Oracle Express Administrator este un utilitar grafic pentru definirea, întreţinerea şi
popularea bazelor de date multidimensionale Express.
Oracle Express Relational Access Manager (RAM) permite ca Express Analyzer să
acceseze datele stocate într-o bază de date relaţională, care a fost configurată cu Oracle
Relational Acces Administrator (RAA).
Oracle Express Analyzer este un instrument OLAP folosit pentru analiza datelor şi
realizarea rapoartelor.
Oracle Express Objects permite crearea de aplicaţii OLAP şi briefing-uri complexe
care pot fi rulate în Express Analyzer, precum şi realizarea de programe în limbaj Express,
prin care se controlează comportamentul aplicaţiei. Este un element cheie în Oracle
Integrated Business Intelligence Tools, fiind integrat cu Oracle Discoverer.
Oracle Express Spreadsheet Add-In permite afişarea datelor multidimensionale într-o
foaie de tip calcul tabelar Excel.
Oracle Express Web Agent permite crearea de aplicaţii Express ce pot fi lansate în
execuţie folosind un browser Web.
Aplicaţiile Oracle Express (Oracle Sales Analyzer şi Oracle Financial Analyzer) sunt
aplicaţii preconstruite pentru analiza vânzărilor şi a pieţei şi analiză financiară.
SNAPI (structured N dimensional application programming interface) este o
bibliotecă de funcţii C care permite ca aplicaţiile client Windows să poată comunica cu
serverul Express. Local SNAPI permite clienţilor să se conecteze la Personal Express, iar
Pagina 36 din 207
Remote SNAPI la serverul Express. ExpressCommunication Arhitecture (XCA) permite
comunicarea între Personal Express şi Express Server şi între instanţe diferite ale serverului
Express.
2.5. ORACLE 9I OLAP
Oracle 9i OLAP integrează toate facilităţile analitice oferite de Oracle Express Server
în baza de date relaţională Oracle. Astfel putem afirma că SGBD Oracle 9i este un mediu
integrat relaţional-obiectual-multidimensional:
- Datele pot fi stocate într-un depozit de date sau într-un spaţiu de lucru analitic.
Tipul de analiză făcut de fiecare aplicaţie în parte determină cea mai bună alegere în
modul de depozitare a datelor. Trebuie examinate beneficiile fiecărei metode de stocare în
funcţie de aplicaţie şi trebuie decis care dintre acestea se potriveşte mai bine cu cerinţele.
Pentru stocarea informaţiilor, se poate opta pentru una din următoarele alternative:
În întregime în baze de date relaţionale. Informaţiile sunt stocate în întregime într-un
depozit de date şi puse la dispoziţie aplicaţiilor Java prin metadate. În timpul sesiunilor
utilizatorilor, informaţiile sunt selectate şi manipulate în baza de date relaţională. Această
soluţie este în mod obişnuit denumită Relational OLAP (ROLAP). Baza de date relaţională
este modul preferat de stocare a informaţiei pentru marea majoritate a aplicaţiilor de
interogare şi raportare care necesită acces de tip read-only la informaţie. Pentru aceste
aplicaţii, baza de date relaţională oferă scalabilitate în susţinerea eficientă a unor seturi foarte
mari de date printr-un singur set de instrumente administrative.
În întregime într-un spaţiu de lucru analitic multidimensional. Informaţiile sunt
încărcate în dimensiuni şi variabile în spaţiul de lucru. În timpul sesiunilor utilizator,
informaţiile sunt selectate şi manipulate în spaţiul de lucru analitic. Această soluţie este
denumită Multidimensional OLAP (MOLAP). Spaţiile de lucru analitice ar trebui folosite ca
un mod persistent de stocare a informaţiei pentru aplicaţiile ce suportă funcţii de analiză
predictivă precum modele, previziuni şi scenarii de tip “cum ar fi dacă...”. Alte opţiuni de
design, ca tipurile de ierarhii sau folosirea de metode non-aditive de agregare, ar putea face
ca spaţiul de lucru analitic să fie modul preferat pentru stocarea datelor.
Pagina 37 din 207
Distribuite între baza de date relaţională şi spaţiul de lucru analitic. Implementarea
acestui model poate, desigur, varia mult din moment ce reuneşte celelalte două soluţii. O
soluţie distribuită poate fi de dorit atunci când o aplicaţie necesită capacităţi de calcul
avansate şi viteza unei solutii MOLAP combinată cu eficienţa stocării într-o bază de date
relaţională. Această soluţie este denumită în mod obişnuit Hybrid OLAP (HOLAP).
Pe lângă alegerea locului de stocare a informaţiei se pune problema alegerii exacte a
ceea ce ar trebui stocat. Informaţiile agregate pot să fie generate şi stocate ca un pas în
mentenanţa datelor, sau pot să fie agregate de câte ori este necesar ca răspuns la o cerere.
Dacă informaţiile sunt deja puse la dispoziţie, atunci timpul de răspuns este mai rapid. În
orice caz, va fi nevoie de mai mult spaţiu de depozitare pentru a găzdui datele adiţionale.
Atunci când se decide ce anume se stochează trebuie luate în considerare influenţele a
mai mulţi factori: cât de frecvent este necesară data agregată; cât timp este necesar pentru
generarea datei; dacă timpul necesar pentru generarea datei se situează în limite acceptabile;
cât spatiu pe disc este necesar pentru depozitarea datei sau dacă există opţiunea extinderii
mediului de stocare.
- Serviciile OLAP oferă Java OLAP API, un motor pentru calcul şi un spaţiu de lucru
analitic. Aceste facilităţi permit construirea de aplicaţii analitice ce suportă calcule complexe
de tip statistic, matematic şi financiar alături de funcţii de analiză predictivă precum
previziune, modelare, consolidare, alocări şi scenarii manageriale.
Serviciile OLAP conţin următoarele componente: Oracle Java OLAP API, unul sau
mai multe servicii OLAP care rulează ca procese-fiu ale instanţei bazei de date, un depozit
pentru metadate pentru fiecare instanţă de bază de date şi instrumente incluse în Oracle
Enterprise Manager pentru a crea metadate OLAP şi pentru a lucra cu serviciile OLAP. Toate
instrumentele necesare pentru lucrul cu serviciile OLAP sunt integrate în Oracle Enterprise
Manager. Nu este necesară folosirea unui set separat de instrumente.
OLAP Services Instance Manager este principalul instrument în managementul
serviciilor OLAP.
Se poate folosi Instance Manager pentru a efectua următoarele sarcini în
administrarea sistemului:
pornirea şi oprirea serviciilor existente, cât şi crearea unor servicii adiţionale
Pagina 38 din 207
monitorizarea sesiunilor utilizatorilor
adăugarea sau ştergerea unor componente opţionale, pentru a le putea folosi pe cele
care sunt necesare utilizând cât mai puţine resurse
ajustarea cu fineţe a parametrilor de operare astfel încât serviciile OLAP să
funcţioneze optim într-un mediu unic de procesare a datelor
Componenta OLAP a Oracle Enterprise Manager generează metadate pentru uzul
aplicaţiilor. Aceste metadate sunt folosite pentru a identifica faptele disponibile pentru
analiză, cât şi pentru a crea şi popula obiectele multidimensionale. Aceste obiecte sunt
necesare pentru a procesa cererile analitice folosind date stocate permanent într-un depozit de
date.
Aplicaţiile OLAP pot interoga dicţionarul de metadate pentru a afla ce date sunt
disponibile pentru ele pentru a analiza şi a afişa. În timp ce datele sunt stocate în tabele într-
un depozit de date Oracle, metadatele identifică date în termeni de obiecte multidimensionale
aşa cum vor deveni prin serviciile OLAP: dimensiuni, măsuri şi atribute. Mai mult,
metadatele definesc ierarhiile dimensiunilor necesare pentru a agrega datele în nivele de
detaliu coerente.
- Oracle BI Beans completează serviciile OLAP punând la dispoziţie un set de
aplicaţii OLAP preconstruite. BI Beans poate fi folosit în Oracle JDeveloper sau în alte medii
de dezvoltare Java pentru construirea de aplicaţii analitice ce pot fi implementate drept clienţi
Java sau HTML.
Pentru a dezvolta aplicaţii OLAP, Oracle oferă programatorilor posibilitatea de a
alege metoda de interacţiune cu aceste metadate şi anume:
LIMBAJUL DE PROGRAMARE JAVA
Java este limbajul Internet-ului şi de asemenea este limbajul aplicaţiilor OLAP.
Folosind Java, un dezvoltator de aplicaţii poate scrie o aplicaţie de sine stătătoare sau un
“applet”, care este un program ce poate fi inclus într-o pagină HTML şi executat într-un
browser. Fiind un limbaj orientat obiect, independent de platforma pe care se lucrează,
Pagina 39 din 207
optimizat pentru reţea şi securizat, Java a început să câştige rapid teren în faţa unor limbaje ca
C++ şi Visual Basic, devenind limbajul preferat al programatorilor:
Orientat obiect. Java permite programatorilor să se concentreze asupra datelor şi
asupra metodelor de manipulare a datelor, în loc să se concentreze asupra unor proceduri
abstracte; programatorul defineşte obiectul necesar, în loc să definească paşii necesari pentru
a crea acel obiect. Aproape totul în Java este definit ca obiect.
Independent de platforma pe care se lucrează. Compilatorul Java crează cod byte care
este interpretat la momentul execuţiei de Java Virtual Machine (JVM). Ca rezultat, acelaşi
program poate fi rulat pe toate platformele Windows, Unix, Macintosh, unde JVM a fost
instalat. Toate browser-ele importante au JVM încorporat.
Optimizat pentru reţea. Java a fost conceput să funcţioneze într-o reţea, ceea ce
permite programelor Java să trateze resursele la distanţă la fel de uşor precum resursele
locale.
Securitate. Codul Java este de două tipuri: “acceptat” şi “neacceptat”, iar accesul la
resursele sistemului este determinat de această caracteristică. Codul local este considerat de
încredere sau “acceptat” pentru a avea acces complet la resursele sistemului, dar codul
descărcat de la distanţă (care este un “applet”) nu este de încredere. Modelul de securitate
Java de tip “sandbox” oferă un mediu foarte restrâns pentru codul “neacceptat”, care nu este
de încredere. De exemplu, codul “neacceptat” nu poate avea drept de citire/scriere către
fişierele aflate în sistemul local, nu poate rula/executa programe, nu poate încărca librării, nu
poate defini metode native sau face conexiuni în reţea exceptând calculatorul gazdă de
origine. Un manager de securitate determină resursele sistemului la care poate avea acces un
applet. Totuşi, un applet cu semnatură, care este identificat ca fiind de la o sursă sigură, are
acces complet la resursele sistemului la fel ca şi un cod local.
Pentru a dezvolta o aplicaţie OLAP se foloseşte limbajul de programare Java. Java
permite scrierea de aplicaţii ce sunt independente de platforma pe care se lucrează şi sunt
uşor de implementat pe Internet.
Java este limbajul de programare preferat pentru un număr din ce în ce mai mare de
profesionişti în dezvoltarea software. Pentru aceia care au lucrat cu C sau C++, trecerea la
Java este uşoară deoarece oferă un mediu familiar în timp ce se evită multe dintre deficienţele
limbajului de programare C. Creat de Sun Microsystems, Java este un limbaj securizat,
orientat obiect, portabil şi multithread.
Pagina 40 din 207
OLAP API este o interfaţă de tip aplicaţie Java ce oferă acces la date de tip
multidimensional pentru aplicaţii de tip analitic. OLAP API preia datele stocate într-o bancă
sau depozit de date (data warehouse) şi le depune în cache-ul multidimensional OLAP pentru
manipularea lor prin motorul său analitic. Clasele Java din OLAP API oferă toate funcţiile
necesare unei aplicaţii OLAP: conexiunea la o instanţă OLAP; autentificarea şi validarea
utilizatorilor; accesul la date în SGBDR Oracle, acces controlat de permisiunile pe care le au
acei utilizatori validaţi; selectarea şi manipularea datelor pentru analiza afacerii.
BI Beans simplifică dezvoltarea aplicaţiei oferind aceste funcţii ca JavaBeans. Mai
mult, BI Beans include JavaBeans pentru prezentarea informaţiei în grafice, tabele etc.
Odată cu dezvoltarea tehnologiei Internet, din ce în ce mai multe companii realizează
cât ar putea să câştige doar prin schimbarea modului în care le sunt implementate aplicaţiile.
Tradiţionalele aplicaţii “thick-client” (aplicaţii cu client performant) implementează multe
dintre funcţiile lor pe calculatorul utilizatorului, acest lucru necesitând o mare proporţie de
cod instalat. Totuşi, a trecut timpul când era necesară o întreagă echipă de tehnicieni pentru a
instala şi menţine aplicaţii software pe sute şi mii de calculatoare individuale pentru o gamă
largă de utilizatori. În opoziţie, aplicaţiile Java “thick-client” descarcă software-ul necesar pe
calculatoarele client în mod automat la momentul execuţiei aplicaţiei.
De asemenea, administratorii de sistem pot implementa aplicaţii “thin client”
(aplicaţii cu client de tip browser) care nu descarcă nici un fel de cod Java pe calculatoarele
client. Aceste aplicaţii rulează pe servere pe care utilizatorii din lumea întreagă le pot accesa
doar folosind un client java cum ar fi browser-ul lor Web.
Indiferent dacă se foloseşte o configuraţie de tip “thick-client” (client performant) sau
“thin-client” (client de tip browser) aplicaţiile Java oferă o soluţie imediată problemelor ce
intervin în lucrul cu o comunitate largă de utilizatori, care în mod obişnuit deţin o varietate de
platforme hardware şi software incompatibile.
UTILIZAREA MODULELOR JAVABEANS PENTRU INTELIGENŢA AFACERII
Modulele JavaBeans pot fi considerate blocuri de cod “prefabricate” folosite pentru
dezvoltarea aplicaţiei. Aceste blocuri sunt piese reutilizabile de cod Java care pot fi asamblate
repede şi uşor într-o aplicaţie.
Modulele BI Beans oferă principalele blocuri pentru o aplicaţie OLAP: conexiunea la
baza de date; autentificarea şi validarea utilizatorilor; selectarea şi preluarea datelor; afişarea
Pagina 41 din 207
datelor într-o mare varietate de tabele şi formate grafice. Folosind BI Beans, se pot crea
aplicaţii cu utilizabilitate şi interfaţă prietenoasă şi comună, permiţând utilizatorilor să câştige
experienţă rapid cu noul produs.
Sunt disponibile două grupe de BI Beans:
Beans de prezentare (Presentation BI Beans). Afişează date într-o bogată varietate de
formate, astfel încât variaţiile şi tendinţele pot fi detectate cu uşurinţă (de exemplu: Graph,
Table şi Crosstabs). Pot fi implementate atât pentru arhitecturi cu client performant cât şi
pentru cele cu client de tip browser. Arhitecturile cu client performant se pretează
utilizatorilor ce fac analize complexe, necesitând utilizarea sistemului pentru perioade extinse
de timp şi cu un volum mare de interacţiune (de exemplu utilizatori ce creează rapoarte).
Arhitecturile cu client de tip browser se potrivesc mai bine utilizatorilor la distanţă ce
folosesc o conexiune cu o lăţime de bandă joasă şi a căror nevoi analitice sunt reduse. Ele pot
fi incluse într-un portal sau un site web pentru aceşti utilizatori.
OLAP BI Beans preiau şi manipulează informaţiile. OLAP BI Beans foloseşte OLAP
API pentru conectarea la sursa de date, pentru definirea cererilor, pentru manipularea setului
de date rezultat şi returnarea rezultatelor către Presentation BI Beans pentru afişare.
BI Beans de prezentare suportă tehnici de navigare precum forare (“drilling”),
pivotare (“pivoting”) şi paginare (“paging”):
Forarea afisează valorile de pe nivelele inferioare, contribuind astfel la un agregat de
nivel înalt, cum ar fi, spre exemplu, oraşele ce contribuie la un total pe judeţ.
Pivotarea roteşte cubul de date astfel încât membrii dimensiunii ce apar pe axa X a
unui grafic vor apărea ulterior pe axa Y, sau membrii dimensiunii ce marcau coloanele într-
un tabel încrucişat (crosstab) vor marca acum rândurile. Spre exemplu, dacă rândurile indică
produsele şi coloanele indică regiunile, cubul poate fi pivotat astfel încât coloanele să indice
produsele şi rândurile să indice regiunile.
Paginarea se ocupă de dimensiuni adiţionale afişând fiecare membru separat într-un
grafic, tabel sau tabel încrucişat decât să le adune în coloane sau rânduri. De exemplu, un
utilizator ar putea să solicite vizualizarea separată a fiecarei perioade de timp în loc să i se
afişeze toate perioadele de timp pe acelaşi grafic.
BI Beans de prezentare permit schimbarea modului de afişare a unui anumit set de
date. În plus, chiar valorile datelor pot afecta acest mod de afişare.
Formatarea numerica. Afişarea numerică poate fi modificată schimbând mărimea,
numărul de zecimale şi de zero-uri, simbolul valutei de referinţă, notaţia de negativitate şi aşa
Pagina 42 din 207
mai departe. Simbolul valutei şi factorii de mărime pot fi afişaţi în capetele de
rânduri/coloane mai degrabă decât în fiecare celulă.
Formatarea “stoplight”. Culoarea, marginile, caracterele folosite şi asa mai departe
pentru celule pot fi corelate cu datele efective, astfel încât informaţiile problematice sau
excepţionale să fie aduse în prim plan în comparaţie cu celelalte informaţii.
Rang. În rapoartele bazate pe rang, este afişată valoarea rangului numeric al fiecărei
dimensiuni pe baza valorii măsurii.
Datele sunt prezentate utilizatorilor prin grafice bi sau tri-dimensionale de diverse
tipuri cum ar fi: bare, arii, linii, felii, inele, dispersii, baloane, piramide şi model “bursă de
valori”, bazat pe serii de câte 3 valori. Multe dintre graficele bidimensionale pot fi afişate
clustered, stivă, dual-Y, procentual, orizontale, verticale sau cu efect tridimensional.
Graficele de tip bară, linie şi arie pot fi combinate astfel încât rânduri individuale din
cubul de date să poată fi specificate ca unul dintre aceste tipuri de grafice. De asemenea se
pot specifica tipul şi forma marcajului, tipul liniilor, culoare şi dimensiune, culori de umplere
pentru o mai bună lizibilitate a listelor rând-cu-rând.
Imaginea graficului poate fi copiată în clipboard-ul sistemului şi exportat ca GIF sau
alte formate de imagine.
Utilizatorii pot face zoom în şi din afara ariei selectate dintr-un grafic şi de asemenea
pot face scroll pe axe.
De asemenea, informaţiile se pot prezenta şi sub forma unui tabel bidimensional,
similar unui spreadsheet. Mai multe dimensiuni pot fi aşezate de-a lungul rândurilor şi
coloanelor, iar dimensiunile adiţionale pot apărea ca pagini separate. Pentru personalizare
avem: stilul, marimea, culoarea şi sublinierea caractererelor, culori de fond individuale pentru
fiecare celulă, formate pentru margini, aliniere text.
Utilizatorii pot naviga prin informaţii fie cu mouse-ul, fie cu tastatura, pot adăuga
rânduri sau coloane pentru afişarea de rezultate şi pot edita celule pentru analize de tip “cum
ar fi dacă...”.
Informaţiile pot fi prezentate şi într-un format asemănător unei tabele, unde măsurile
sunt tratate individual.
BI Beans oferă facilităţi de tip wizard care pot fi folosite atât de dezvoltatorii
aplicaţiei în crearea mediului iniţial cât şi de utilizatorii finali în personalizarea aplicaţiei
pentru a se potrivi cu nevoile lor particulare:
Construirea unei cereri. Tabelele de fapte şi viziunile/tabelele virtuale conţin adesea
mai multe informaţii decât cele de care sunt direct interesaţi utilizatorii. Aducerea unor mari
Pagina 43 din 207
cantităţi de informaţii poate de asemenea degrada performanţele şi acest lucru nu e necesar.
În plus faţă de selectarea măsurilor, se poate limita volumul de date adus printr-o cerere
selectând membrii dimensiunii dintr-o listă sau folosind un set de condiţii. O selecţie poate fi
salvată şi folosită din nou doar prin selectarea numelui acesteia dintr-o listă.
Generarea de măsuri personalizate (“custom”). Se pot defini noi măsuri personalizate
ale căror valori sunt calculate din informaţiile stocate în baza de date. BI Beans oferă
utilizatorilor posibilitatea de a-şi crea propriile calcule, măsuri, tocmai datorită faptului că un
administrator de baze de date nu poate anticipa nevoile tuturor utilizatorilor.
ORACLE JDEVELOPER
Oracle JDeveloper oferă un mediu integrat de dezvoltare pentru dezvoltarea de
aplicaţii Java. JDeveloper se bucură de o integrare deplină cu baza de date Oracle şi cu BI
Beans Wizard. Iată câteva dintre facilităţile JDeveloper:
- Instrument de diagnosticare (debugger) la distanţă, în mod grafic, cu inspector,
watch-uri, puncte de stop.
- Interfaţă multi-document (MDI)
- Facilitate “Codecoach” ce ajută la optimizarea codului.
- Generare de aplicaţii 100% Java, applet-uri, servlet-uri, Javabeans etc. Codul
generat este lipsit de orice fel de însemne de proprietate sau marcaje.
- Browser de baze de date Oracle.
INTERFAŢA ORACLE OLAP API
Oracle OLAP API este o interfaţă de programare de aplicaţii Java pentru serviciile
OLAP. Este un limbaj de interogare care selectează şi manipulează datele dintr-un depozit de
date pentru a le afişa într-un client Java. Blocurile analitice BI Beans sunt construite folosind
acest API; se poate extinde (sau chiar înlocui) funcţionalitatea oferită de BI Beans folosind
clase Java.
Aplicaţiile OLAP au în mod obişnuit interfaţa utilizator orientată obiect, unde
utilizatorii manipulează obiecte ce reprezintă grupări organizate ale datelor/informaţiilor.
Astfel, există o legătură naturală între o interfaţă utilizator orientată obiect şi un API orientat
Pagina 44 din 207
obiect cum este Oracle OLAP API. OLAP API exploatează această legătură naturală oferind
acele obiecte necesare aplicaţiei ce se potrivesc comportamentului utilizatorilor finali.
Limbajele orientate obiect, cum ar fi Java, manipulează informaţiile prin aplicarea de
metode asupra obiectelor. Această abordare permite obiectelor să-şi menţină o stare curentă şi
să suporte modificări incrementale la acestă stare. Această abordare oferă un suport excelent
pentru acţiuni tipice OLAP cum ar fi forare şi rotaţie.
De exemplu, o activitate de bază pentru utilizatorii de aplicaţii OLAP este rafinarea
cererilor. Un utilizator are o întrebare în minte şi alcătuieşte o cerere pentru a afla răspunsul.
În cele mai multe situaţii, rezultatul iniţial al cererii îl forţează pe utilizator să caute mai în
profunzime pentru o soluţie, probabil prin forare (“drilling”), pentru a vedea mai multe
informaţii detaliate sau prin rotaţia raportului spre o mai bună corelare cu datele. OLAP API
este capabil să folosească acest rezultat al unei cereri ca dată de intrare pentru o altă cerere.
Cererile analitice sunt prin natura lor iterative. Un analist formulează o cerere,
studiază rezultatul şi apoi formează noi cereri pe baza acestui rezultat. De vreme ce într-o
analiză a afacerii probabilitatea de a avea nevoie de aceleaşi informaţii pentru a răspunde la
cereri succesive este foarte mare, OLAP API păstrează metadatele într-un cache astfel încât
să fie disponibile pe tot parcursul sesiunii de lucru. Folosind cursori multidimensionali,
OLAP API poate accesa aleator regiuni disparate ale setului de rezultate. Aceasta permite
unei aplicaţii să primească doar informaţiile de interes curent în loc de întreaga informaţie din
setul de rezultate.
Pentru primirea datelor dintr-un depozit de date, OLAP API generează instrucţiuni
SQL. În preluarea datelor se folosesc multe dintre cele mai noi inovaţii din Oracle 9i, inclusiv
rescrierea cererilor, rollup concatenat şi altele.
OLAP API generează comenzi SQL pentru a selecta şi manipula informaţiile stocate
în baza de date. Aceste comenzi SQL pot include funcţii “N-pass” cum ar fi: RANK,
PERCENTILE, TOPN, BOTTOMN, LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, şi
STDDEV.
OLAP API oferă facilităţi de calcul extinse în plus faţă de cele care pot fi folosite în
mod eficient în alte soluţii OLAP, cum ar fi:
suprimarea rândurilor, coloanelor sau paginilor cu valori nule, 0 sau NA (not
applicable).
calcule pe rânduri şi coloane
măsuri ca dimensiuni.
Pagina 45 din 207
Calculele adiţionale ca modelarea, previziunea şi scenariile de tip “cum ar fi dacă...”
pot fi făcute asupra datelor în spaţiul de lucru analitic.
LIMBAJUL DE MANIPULARE ORACLE OLAP (ORACLE OLAP DML)
Oracle OLAP DML este un limbaj de manipulare a datelor care extinde suportul
analitic al interfeţei OLAP API pentru a include facilităţi precum previziunea, modelarea şi
scenariile de tip “cum ar fi dacă...”. Operează asupra datelor care sunt stocate (permanent sau
temporar) în obiecte multidimensionale din spaţiul de lucru analitic.
Arhitectura unei aplicaţii OLAP:
ARHITECTURA UNEI APLICAŢII OLAP CU CLIENT PERFORMANT (“THICK-
CLIENT”)
Componentele unei aplicaţii OLAP cu client performant sunt grupate pe trei nivele ce
pot fi pe platforme separate sau pe aceeaşi platformă:
- Nivelul clientului Java. O aplicaţie Java poate să ruleze ori într-un browser ori direct
în Java Runtime Environment (JRE). BI Beans, care sunt dedicate prezentării datelor şi
metadatelor, rulează de asemenea pe acest nivel.
- Nivelul serverului de aplicaţii. “Creierul” aplicaţiei rulează pe acest nivel, care
include OLAP API şi OLAP BI Beans, acestea fiind construite utilizând OLAP API.
- Nivelul serverului de date. Acest nivel este format din SGBDR Oracle şi serviciile
OLAP, fiind nivelul unde sunt stocate informaţiile, selectate şi manipulate. Pe acest nivel
rulează şi o componentă OLAP API.
Pagina 46 din 207
Figura 2.1: Arhitectura unei aplicaţii OLAP cu client performant
ARHITECTURA UNEI APLICAŢII OLAP CU CLIENT DE TIP BROWSER
(“THIN-CLIENT”)
Componentele unei aplicaţii OLAP cu client de tip browser sunt grupate pe două
nivele ce pot fi pe platforme separate sau pe aceeaşi platformă:
- Nivelul serverului de aplicaţii. “Creierul” aplicaţiei rulează pe acest nivel, care
include un server web, OLAP API şi OLAP BI Beans, atât de prezentare cât şi analitice.
- Nivelul serverului de date. Acest nivel este format din SGBDR Oracle şi serviciile
OLAP, fiind nivelul unde informaţiile sunt stocate, selectate şi manipulate. Pe acest nivel
rulează şi o componentă OLAP API.
Pagina 47 din 207
Figura 2.2: Arhitectura unei aplicaţii OLAP cu client de tip browser
Tipuri de aplicaţii OLAP dezvoltate cu Oracle 9i:
Aplicaţiile ce suportă analiza activităţii se grupează în următoarele mari categorii:
Raportare standard şi ad-hoc
Raportare analitică
Analiză predictivă
Oracle pune la dispoziţie tehnologia pentru toate aceste tipuri de aplicaţii. Serviciile
OLAP şi instrumentele sale pentru dezvoltare sunt construite în mod special pentru aplicaţii
cu raportare analitică şi pentru aplicaţii cu analiză predictivă.
Aplicaţiile analitice pot suporta mai multe faţete ale unei activităţi de afaceri şi oferă
rezultatele aşteptate ale unei investiţii. Iată doar câteva exemple de aplicaţii analitice:
Contabilitate. Analiză pentru previziune, bugetare, costuri şi profitabilitate, şi
consolidare
Resurse umane. Consolidarea aptitudinilor, optimizarea şi planificarea muncii
Distribuţie. Planificare şi optimizare
Pagina 48 din 207
Automatizarea vânzărilor. Analiză teritorială
Marketing. Analize de piaţă
Producţie. Planificarea şi previziunea cererilor
Medicină. Analiza ieşirilor
Servicii financiare. Analiza şi managementul riscurilor.
Analiză comparativă între Oracle Express Server 6.x şi Oracle 9i OLAP
Tabelul 2.2: Facilităţi noi oferite de Oracle 9i OLAP faţă de Oracle Express Server
6.x
1. Oracle OLAP este instalat ca o opţiune în Oracle Enterprise Edition, şi este
acum integrat în baza de date relaţională Oracle. Oracle OLAP rulează în
nucleul bazei de date.
2. Spaţiu de lucru analitic. În Oracle 9i, termenul de “bază de date” se referă doar
la bazele de date relaţionale. Un spaţiu de lucru analitic este păstrat/stocat ca un
LOB într-o bază de date relaţională. Nu există fişiere cu extensia “.db”.
Sarcinile administrative pentru Oracle OLAP sunt unite cu setul de
instrumente pentru baza de date.
3. Oracle Enterprise Manager include instrumentele pentru administrarea Oracle
OLAP, oferind o interfaţă comună pentru toate platformele. Pachete variate de
PL/SQL extind funcţionalitatea curentă disponibilă prin Oracle Enterprise
Manager şi oferă o alternativă la folosirea acestuia.
Informaţiile de performanţă pot fi colectate într-un sistem de tabele asemănător
cum în alte baze de date Oracle se prezintă statisticile de performanţă.
OLAP Instance Manager, “oesmgr” şi “oescmd” nu sunt disponibile.
4. Oracle OLAP rulează în cadrul nucleului de bază de date Oracle. O sesiune
Oracle OLAP este în permanenţă conectată la baza de date, deschiderea unei
conexiuni nemaifiind astfel un pas separat sau opţional.
Transferul de date între obiectele unui spaţiu de lucru analitic (cum ar fi
Pagina 49 din 207
variabile sau dimensiuni) şi tabelele relaţionale se poate face în următoarele
moduri:
Comanda SQL a OLAP DML preia datele în dimensiuni şi variabile pentru
viitoare operaţii şi manipulări. O nouă comandă SQL IMPORT facilitează
transferul brut de date din tabelele relaţionale către spaţiul de lucru analitic, iar
o nouă comandă SQL INSERT DIRECT va facilita transferul de date din
spaţiul de lucru analitic în tabelele relaţionale.
Un pachet PL/SQL, CWM2_OLAP_AW_CREATE, oferă proceduri pentru
crearea unui spaţiu de lucru analitic din tabele relaţionale sau metadate din
OLAP Catalog cât şi pentru generarea de vizualizări ale spaţiului de lucru.
Folosind funcţii SQL pentru tabele, o aplicaţie SQL are acum posibilitatea de a
manipula şi a extrage informaţiile dintr-un spatiu de lucru analitic. Express
Server nu permitea ca transferul de date să fie iniţiat din extern.
ODBC nu este disponibil, şi deci accesul la baze de date de alt tip nu este
posibil direct din Oracle OLAP.
Oracle Express Relational Access Administrator şi Oracle Express Relational
Access Manager nu sunt disponibile.
5. Oracle OLAP permite aplicaţiilor să-şi poată accesa informaţiile
multidimensionale direct printr-un Java API sau SQL. Programele Express SPL
pot fi executate folosind oricare dintre metodele de programare. Trebuie
revăzute toate programele SPL pentru a înlătura comenzile care nu mai sunt
disponibile şi pentru a beneficia de avantajele noilor functionalităţi. Pachetul
CWM2_OLAP_AW_CREATE conţine proceduri pentru crearea de spaţii de
lucru analitice şi generarea de vizualizări ale acestora. Se pot crea metadate
OLAP Catalog pentru uzul OLAP API, sau se poate folosi SQL pentru a rula
direct în comparaţie cu aceste vizualizări ale datelor multidimensionale.
Nu se pot rula aplicaţii Windows C++, HTML sau Java care au fost proiectate
pentru folosirea cu Express Server.
6. Aplicaţiile pentru Oracle OLAP pot fi dezvoltate în Java folosind OLAP API.
OLAP Worksheet oferă un mediu interactiv pentru a dezvolta proceduri în
OLAP DML sau SQL. Procedura DBMS_AW execută o comandă OLAP DML
din interiorul unui program SQL.
Nu se poate face conectarea la Oracle OLAP folosind Express Administrator,
Pagina 50 din 207
Personal Express sau Express Connection Utility.
7. Oracle OLAP oferă conectivitate prin Oracle Call Interface (OCI) şi prin Java
Database Connectivity (JDBC).
OLAP Worksheet foloseşte XCA pentru comunicarea cu spaţiul de lucru
analitic. Totuşi, XCA nu poate fi folosit pentru aplicaţii dezvoltate de utilizatori
şi poate produce rezultate neaşteptate.
SNAPI nu mai este disponibil.
8. În Oracle OLAP, administratorul bazei de date defineşte obiecte
multidimensionale şi metadatele OLAP asociate în baza de date relaţională
folosind pachete PL/SQL pentru uzul OLAP API.
OLAP Worksheet permite administratorilor de baze de date cât şi
dezvoltatorilor de aplicaţii să creeze obiecte în spaţiul de lucru analitic prin
executarea de comenzi DML. Pentru ca aceste obiecte să poată fi accesate de
OLAP API trebuie definită o metadată potrivită în spaţiul analitic. Oracle
Express Administrator nu este disponibil în Oracle OLAP, iar metadata din
Oracle Express Objects generată nu poate fi folosită de OLAP API.
9. Odată cu trecerea la Oracle OLAP s-au efectuat numeroase schimbări asupra
Express Stored Procedure Language (acum denumit OLAP Data Manipulation
Language sau OLAP DML).
Comenzi noi. S-a adăugat suport la OLAP DML în următoarele direcţii:
Agregare paralelă
Alocare
Execuţie dinamică de modele
Transfer de date între spaţiul de lucru analitic şi tabelele relaţionale
Funcţii de manipulare la nivel de byte
Funcţii de conversie a datelor
Noi tipuri de date
Comenzi învechite. S-a renunţat la suport în următoarele direcţii:
EXTCALL
ODBC
Pagina 51 din 207
SNAPI
XCA
Comenzi ale sistemului de operare
Tabelul 2.2: Terminologii Express/Oracle 9i OLAP
Express Oracle 9i OLAP
oesdba olapdba
SNAPI Java OLAP API
Oracle Express Objects JDeveloper
Express Basic Java
Express Administrator AW Manager
OESCMD şi linia de comandă a administratorului OLAP Worksheet
Bază de date Express Spaţiu de lucru analitic
Oracle Express Server parte a Oracle 9i OLAP
Express Instance Manager parte a Oracle 9i OLAP
Express Agent OLAP Agent
Express SPL (sau 4GL) OLAP DML
RAA director OLAP în OEM
RAM automat (nu mai este necesară
folosirea RAM deoarece datele
relaţionale pot fi accesate direct)
Capitolul 3
INSTRUMENTE UTILIZATE PENTRU REALIZAREA
SISTEMULUI OLAP (ORACLE 9I JDEVELOPER)
Oracle Jdeveloper 10g este un mediu integrat de dezvoltare (IDE) pentru dezvoltarea
de aplicaţii şi servicii web, folosind ultimele standarde în domeniile Java, XML şi SQL.
Începând cu versiunea 9.0.1, JDeveloper este scris complet în Java, versiunile anterioare fiind
un hibrid capabil să ruleze numai pe platforme Windows. Oracle JDeveloper 10g, un
Pagina 52 din 207
instrument 100% bazat pe tehnologia Java, este un mediu integrat de dezvoltare multi-
platformă ce poate rula pe Windows, Linux şi diverse distribuţii de Unix.
Oracle JDeveloper 10g pune la dispoziţia programatorilor un set de instrumente bine
integrate în scopul de a dezvolta şi implementa în mod productiv servicii şi aplicatii la un cost
redus. Pentru a maximiza productivitatea dezvoltatorilor software, Oracle JDeveloper este
capabil să susţină o aplicaţie pe toată durata ciclului de dezvoltare, folosind instrumente
integrate pentru modelarea, codarea, depanarea, testarea, profilarea, ajustarea şi
implementarea acesteia.
Printre noile facilităţi oferite de JDeveloper se numără abordarea declarativă şi
vizuală a dezvoltării precum şi inovativa Oracle Application Development Framework
(Oracle ADF), ce contribuie la simplificarea procesului de dezvoltare şi reduce semnificativ
timpul alocat codării, oferind o productivitate neegalată şi o multitudine de posibilităţi în
privinţa alegerii tehnologiilor cu care se lucrează.
Oracle JDeveloper se axează pe dezvoltarea de aplicaţii Java folosind J2EE, J2SE sau
J2ME pentru dispozitive mici. J2EE este un set de specificaţii folosit în construirea de
aplicaţii multi-nivel folosind limbajul Java. J2EE este o platformă robustă, securizată şi
scalabilă ce constituie fundaţia pentru multe din aplicaţiile de astăzi.
În plus, noua versiune a JDeveloper pune la dispoziţia
dezvoltatorilor de aplicaţii XML facilităţi puternice precum XML Schema Modeler, accesul
direct la codul XML precum şi inspectorul de tag-uri XML. Pentru a completa setul de
instrumente necesare unui programator, Oracle JDeveloper pune la dispoziţie un mediu
complet de dezvoltare şi modelare pentru construirea de obiecte şi proceduri cu baza de date,
dovedind că este un mediu singular şi bine integrat, capabil să ofere programatorului o
interfaţă consistentă şi prietenoasă.
Figura 3.1: Java, XML şi SQL – o combinaţie excepţională
Scopul Oracle JDeveloper 10g este de a face programarea în J2EE mai simplă şi mai
accesibilă. Pentru a putea atinge acest scop, Oracle JDeveloper se concentrează pe abordarea
Pagina 53 din 207
progrămarii în J2EE atât în mediul vizual cât şi în mediul declarativ. Pentru a simplifica şi
mai mult problema, Oracle a creat o infrastructură de dezvoltare J2EE – Oracle Application
Development Framework (Oracle ADF) - ce implementează tipare de design, eliminând astfel
necesitatea codării unei infrastructuri.
Figura 3.2: Oracle JDeveloper 10g (10.1.2)
Un aspect distinctiv al Oracle JDeveloper constă în faptul că aceeaşi experienţă
productivă de dezvoltare poate fi folosită pe diverse stive de tehnologii. Spre exemplu,
programatorii pot alege să implementeze o aplicaţie OLAP folosind clase Java simple,
componentele de Business Intelligence din Oracle ADF sau serviciile Web. Indiferent de
tehnologia aleasă, Oracle JDeveloper va produce o cale declarativă de creare a acestui nivel
cât şi mecanisme vizuale pentru a uşura munca programatorilor.
Ajungând la concluzia că fiecare programator Java are un nivel de experienţă şi
cunoştinţe diferit cât şi propriul stil de abordare a dezvoltării, Oracle JDeveloper oferă o
multitudine de abordări de dezvoltare, ce includ Model Driven Architecture (MDA –
Arhitectură bazată pe modele), dezvoltare declarativă sau pur şi simplu codare manuală,
programatorii putând opta pentru metoda ce se potriveşte cel mai bine stilului lor.
Oracle JDeveloper oferă posibilitatea programatorilor de a folosi ultimele standarde
tehnologice în dezvoltarea aplicaţiilor ce pot rula pe platfome hardware şi software multiple.
Pagina 54 din 207
Aplicaţiile construite cu Oracle JDeveloper pot fi implementate pe orice server compatibil
J2EE şi pot accesa orice bază de date compatibilă JDBC.
În aceeaşi direcţie, Oracle încurajează instrumentele şi platformele open-source,
oferind funcţionalităţi pentru Struts, Ant, JUnit şi CVS. Această integrare dă posibilitatea
programatorilor de a folosi instrumentele open-source, optimizând astfel procesul de
dezvoltare.
JDeveloper pune de asemenea la dispoziţie un SDK (Software Developer’s Kit) de
extensie ce lasă programatorii să adauge posibilităţi noi şi să-şi personalizeze mediul de
dezvoltare. Oracle JDeveloper este construit ca un set de extensii peste o platformă IDE
nucleu. Programatorii pot să pornească sau să oprească aceste extensii după bunul lor plac,
personalizând astfel un IDE potrivit nevoilor fiecăruia. API-ul folosit de echipa JDeveloper în
dezvoltarea programului este pus în forma sa completă la dispoziţia programatorilor şi a
companiilor în domeniu care sunt interesate de integrarea sau îmbunătăţirea JDeveloper-ului.
De-a lungul anilor se observă că cele mai bune metode şi tipare de design au evoluat
pentru platforma J2EE. Problema care persistă însă în implementarea acestor metode este
necesitatea de a scrie mult cod de infrastructură. Oracle JDeveloper 10g încearcă să înlature
acest inconvenient.
Oracle JDeveloper 10g include Oracle Application Development Framework (Oracle
ADF). Acest cadru de lucru simplifică dezvoltarea în J2EE prin minimizarea necesităţii de a
scrie cod ce implementează tipare de design sau infrastructură a aplicaţiei. Oracle ADF le
pune la dispoziţie ca parte a cadrului de lucru şi conţine atât servicii în timpul execuţiei cât şi
funcţionalităţi de dezvoltare. Este un pas evolutiv, o îmbunătăţire şi o extensie a cadrelor de
lucru existente în versiunile anterioare de JDeveloper.
Oracle ADF este bazat pe tiparul de design Model-View-Controller (MVC). MVC
separă arhitectura unei aplicaţii pe 3 niveluri:
Model – se ocupă de interacţiunea cu sursele de date şi de logica afacerii,
View – se ocupă de interfaţa aplicaţiei cu utilizatorul,
Controller – se ocupă cu mersul fluent al aplicaţiei şi acţionează ca interfaţă între
nivelurile Model şi View.
Independenţa fiecărui nivel faţă de celelalte rezultă într-o arhitectură cuplată lejer,
fapt ce ajută la o mentenanţă mai uşoară şi creşte reuzabilitatea codului. Oracle ADF pune la
dispoziţie o metodă uşoară de a implementa arhitectura MVC.
Pagina 55 din 207
Oracle ADF este bazat pe 4 niveluri, lăsând programatorii să aleagă tehnologia
preferată în implementarea fiecăruia:
Business Services – asigură accesul la date din diferite surse şi se ocupă de logica
afacerii. Asigură servicii de persistenţă a datelor, managementul tranzacţiilor şi execuţie a
logicii afacerii. Poate fi implementat folosind simple clase Java, servicii Web sau
componentele pentru afaceri din Oracle ADF.
Model – asigură un nivel abstract deasupra nivelului Business Services, permiţând
nivelelor View şi Controller să lucreze în mod consistent cu diferite implementări ale
nivelului Business Services. Felul unic în care este implementat nivelul Model în Oracle ADF
conferă aplicaţiei puterea arhitecturilor orientate pe servicii. Nivelul Model permite
dezvoltarea cu uşurinţă a aplicaţiei ca un set de servicii ce pot fi refolosite în diferite aplicaţii.
Controller – pune la dispoziţie un mecanism pentru a controla mersul fluent al
aplicaţiei. De exemplu, aplicaţiile bazate pe interfaţă Web sunt compuse din multiple pagini
cu conţinut dinamic, pe acest nivel făcându-se trecerea de la o pagină la alta. Cea mai
proeminentă arhitectură pentru aplicaţii Web Java se bazează pe un servlet ce acţionează ca
un controller, ADF folosind Apache Jakarta Struts.
View – pune la dispoziţie interfaţa aplicaţiei cu utilizatorul, folosind pentru aceasta
HTML, componente Java sau variaţii de XML. Acest nivel poate fi implementat într-o
interfaţă web, una client-server sau chiar una pentru dispozitive wireless.
Oracle JDeveloper simplifică programarea J2EE prin oferirea de instrumente vizuale
şi declarative pentru fiecare nivel al Oracle ADF.
Oracle JDeveloper include o diagramă de clase UML care ajută la modelarea şi
generarea de clase Java simple, servicii Web, componente de afaceri pentru Oracle ADF etc.
Programatorii pot aduce tabele din browser-ul bazei de date în diagramă, generând în acelaşi
timp şi acele servicii ce vor realiza interfaţa Java către aceste tabele.
Componentele pentru afaceri din Oracle ADF reprezintă o infrastructură axată pe
crearea de obiecte ce implementează nivelul Business Services peste o bază de date, într-o
manieră declarativă. Este posibil astfel accesul la servicii precum managementul tranzacţiilor,
inspecţia resurselor sau declararea de reguli de validare.
Pagina 56 din 207
Pentrul nivelul Controller, Oracle JDeveloper asigură un modelator de ordonare a paginilor în
mersul aplicaţiei, bazat pe Jakarta Struts. Acest modelator aduce o interfaţă vizuală ce
simplifică procesul de planificare al mersului fluent al aplicaţiei. Programatorii pot să
modeleze ordinea paginilor printr-un simplu proces de drag-and-drop al componentelor Struts
în diagramă (figura 3.3).
Figura 3.3: Modelatorul de ordonare a paginilor (STRUTS)
Oracle JDeveloper pune la dispoziţie un editor vizual atât pentru aplicaţiile bazate pe
HTML cât şi pe cele clasice bazate pe componente Swing. Programatorii pot folosi paleta de
componente pentru a adăuga componente vizuale la interfaţa aplicaţiei cu utilizatorul. Paleta
de componente poate fi extinsă cu orice JavaBean standard sau librărie de tag-uri JSP.
Inspectorul de proprietăţi poate fi folosit pentru a defini în mod declarativ atributele
componentelor vizuale. Editorul vizual este sincronizat în orice moment cu codul sursă,
lăsând modul de editare preferat la alegerea fiecăruia.
Paleta de control a datelor oferă o perspectivă a nivelului Business Services, oferind
programatorilor posibilitatea de a lega la acest nivel diversele componente ale aplicaţiei
printr-un simplu drag-and-drop.
Pentru aplicaţiile bazate pe pagini Web există ADF UIX, un set de componente pentru
definirea de interfeţe cu utilizatorul avansate, folosind HTML.
Pagina 57 din 207
Oracle 9i JDeveloper oferă suport complet pentru intregul ciclu de viaţă al dezvoltării
aplicaţiei (figura 3.4).
Figura 3.4: Schema ciclului de viaţă al unei aplicaţii
În dezvoltarea unei aplicaţii vom întâlni întotdeauna mai multe etape decât cea de
codare efectivă. Oracle JDeveloper susţine prin diverse instrumente integrate toate etapele
necesare dezvoltării unei aplicaţii mature: modelare, depanare, testare, profilare, optimizare şi
implementare.
JDeveloper 10g oferă instrumente integrate pentru modelare UML, foarte importante
în conceperea şi analizarea aplicaţiei. Printre aceste instrumente amintim un modelator de
clase (Class Modeler), un modelator de utilizări (Use Case Modeler) şi un modelator de
activităţi (Activity Modeler), fiind folosite pentru modelare conceptuală şi consolidarea
documentaţiei aplicaţiei.
Programatorii pot folosi facilitatea Class Modeler pentru a vizualiza şi genera clase
Java. Funcţionalitatea de generare în două sensuri sincronizează codul şi modelul indiferent
dacă schimbările sunt făcute în editorul de cod sau în Class Modeler. Facilitatea de inginerie-
inversă permite programatorilor să construiască modele din codul existent deja. Class
Modeler implementează un profil UML pentru BC4J ce oferă programatorilor un mediu
Pagina 58 din 207
vizual de programare pentru definirea componentelor aplicaţiilor BC4J. Astfel de
componente includ obiecte-entitate, ce reprezintă obiectele persistente ale afacerii din
domeniul studiat.
Figura 3.5: Class Modeler (Diagrama de clase)
Activity Modeler este folosit pentru a modela procese de afaceri pentru integrarea în
aplicaţii e-business. Programatorii folosesc această facilitate pentru a vizualiza şi genera
integrarea între aplicaţiile e-business, fie că sunt într-un intranet al unei companii fie că ele
comunică prin Internet. Activity Modeler permite programatorilor să modeleze mersul
proceselor şi să capteze date semantice adiţionale ce definesc procesele executabile, rutarea şi
alinierea. Procesul este exprimat în termeni de activităţi, subsisteme (ce se ocupă de
activităţile din interiorul partiţiilor) şi rutare.
Modelarea în JDeveloper este completată de modelatorul Struts de ordonare a
paginilor şi de modelatorul de baze de date, folosit pentru generarea şi captura schemelor de
structură a bazei de date.
Depanarea codului este una din etapele esenţiale ale dezvoltării aplicaţiei, JDeveloper
incluzând un depanator (Debugger) rapid şi puternic ce oferă o metodă vizuală de a analiza
Pagina 59 din 207
codul. Depanatorul integrat suportă depanarea “la cald”, ceea ce înseamnă că programatorul
poate aduce modificări codului sursă chiar în timpul sesiunii de depanare. Se pot seta puncte
de întrerupere (breakpoints) şi se poate avansa înainte sau înapoi către orice punct al codului
sursă în timpul depanării. Depanatorul mai include şi o vizualizare a stivei de memorie.
JDeveloper pune la dispoziţia dezvoltatorilor de aplicaţii bazate pe Swing un
depanator al interfeţei cu utilizatorul (UI Debugger). Prin crearea de instantanee şi afişarea
ierarhică a obiectelor într-o interfaţă grafică, depanatorul oferă o metodă facilă de
monitorizare a interfeţei cu utilizatorul în timpul execuţiei.
Depanatorul JDeveloper include deasemenea capacitatea de a depana codul PL/SQL
din baze de date.
Depanarea se poate face local sau la distanţă, fiind posibilă examinarea codului în
timp ce acesta este executat pe un container J2EE aflat la distanţă. Programatorii de aplicaţii
J2EE pot folosi containerul ce vine integrat în Oracle JDeveloper pentru a-şi putea testa codul
JSP sau Servlet fară a fi nevoie să instaleze un server de aplicaţii de sine-stătător.
Jdeveloper oferă numeroase şi puternice instrumente pentru îmbunătăţirea calităţii
codului Java prin identificarea potenţialelor zone cu probleme, cum ar fi probleme de
performanţă, folosirea inadecvată a memoriei sau blocaje.
Execution Sampling Profiler. Este folosit pentru a localiza problemele de performanţă
prin determinarea acelor metode din interiorul codului care folosesc timpii cei mai lungi de
execuţie. Profilatorul ia o mostră la intervale regulate de timp şi înregistrează locul unde se
află firul de execuţie la momentul înregistrării. Mostrele sunt apoi analizate şi afişate la
sfârşitul sesiunii de profilare. Programatorii pot interacţiona cu informaţiile din fereastra
profilatorului analizând în profunzime zonele unde se presupune că se găsesc probleme de
performanţă. De asemenea există informaţii despre felul în care sunt accesate metodele
precum şi frecvenţa accesărilor. Astfel, folosind acest instrument, este foarte uşoară
identificarea cu exactitate a locului unde aplicaţia pierde intervale semnificative de timp.
Următorul pas este îmbunătăţirea codului. Aici este locul lui CodeCoach.
CodeCoach. Este un instrument ce oferă consultanţă în ceea ce priveşte calitatea şi
performanţa programelor Java. După folosirea profilatorului pentru identificarea zonelor cu
probleme, utilizatorul poate rula CodeCoach pe acest cod pentru a primi indicaţii practice în
îmbunătăţirea calităţii codului. Instrumentul poate chiar să rezolve probleme simple în mod
automat.
Pagina 60 din 207
Memory Profiler. Este un instrument puternic pentru depistarea pierderilor de
memorie. Ca şi Execution Sampling Profiler, acesta ia mostre la intervale regulate de timp şi
rata utilizatorului cum şi unde este alocată şi eliberată memoria pe parcursul execuţiei
programului. Pentru probleme complexe de memorie, combinaţia dintre Memory Profiler şi
instrumentele de depanare, cum ar fi fereastra HEAP şi fereastra de clase încărcate, poate
identifica cu exactitate sursa pierderilor de memorie.
Event Profiler. Este un instrument ce se dovedeşte foarte folositor atunci când
aplicaţia este construită pe mai multe nivele. La un nivel mai ridicat decât Execution
Sampling Profiler, acest profilator depistează lungimea unor evenimente specifice, indiferent
unde sunt executate. Spre exemplu, o aplicaţie JSP poate cere informaţii unei componente
BC4J care la rândul ei trimite o interogare către baza de date. Event Profiler poate face cu
uşurinţă un rezumat al timpilor cheltuiţi în execuţia unei astfel de cereri şi felul în care se
compară cu alte evenimente ale aplicaţiei.
Code Audit. Ajută organizaţiile în implementarea unor standarde de codare prin
analizarea codului Java şi confruntarea aderării acestuia la standardele de codare impuse.
Code Audit ajută la găsirea şi repararea devierilor de la regulile impuse. Există posibilitatea
adăugării unor noi reguli de audit peste cele deja existente în JDeveloper.
Code Metrics. Oferă o metodă uşoară de a evalua complexitatea şi structura codului
Java, analizând parametri precum adâncimea arborelui de moştenire, numărul instrucţiunilor
sau complexitatea buclelor codului.
Implementarea aplicaţiilor J2EE este mult simplificată de noul Oracle JDeveloper
10g. Există o metodă declarativă de a crea descriptorul de implementare al aplicaţiei.
Împachetarea este făcută cu ajutorul unui Wizard care creează fişiere standard WAR, EAR
sau JAR din proiect. Aceste fişiere standard pot fi implementate apoi către orice server de
aplicaţii compatibil J2EE. Este posibilă implementarea printr-un sigur click din IDE într-un
container ce poate fi Oracle Application Server, Apache Tomcat, Jboss etc.
Pentru aplicaţiile bazate pe Swing, JDeveloper pune la dispoziţie un Wizard care
împachetează aplicaţia într-o aplicaţie Java Web-Start, simplificând astfel procesul de
implementare pe maşinile client.
Oracle JDeveloper este integrat cu instrumente software de configurare şi
management al ciclului de viaţă al codului, oferind astfel posibilitatea lucrului în echipă.
Versiunea standard de Oracle JDeveloper 10g este integrată cu Oracle SCM, CVS şi
Rational ClearCase, aceste facilităţi putând fi aplelate prin Wizard sau prin opţiunile
Pagina 61 din 207
meniului. Programatorii pot adăuga sau şterge fişiere, controla istoricul versiunii, check-in,
check-out, bloca fişiere sau pot compara versiunile fişierelor.
Oracle JDeveloper oferă de asemenea şi suport WebDAV pentru sharing-ul fişierelor
pe protocolul HTTP.
JDeveloper ajută programatorii să construiască aplicaţii de afaceri şi comerţ electronic
utilizând Java, XML, HTML, SQL şi PL/SQL şi pune la dispoziţie diverse editoare şi
instrumente grafice pentru fiecare din aceste limbaje.
Oracle XML Developers Kit (XDK) este integrat în JDeveloper, oferind multiple
moduri de a manipula, crea şi transforma codul XML. Oracle JDeveloper are un nou editor de
XML asistat de scheme. O schemă XML defineşte structura unui document XML. O nouă
facilitate denumită Code Insight foloseşte schema XML pentru a valida codul XML şi oferă o
listă de alternative valide pentru atribute sau elemente XML pe măsură ce programatorul
tastează.
Alte facilităţi pentru lucrul cu XML se referă la colorarea sintaxei, verificarea
sintaxei, o vizualizare arborescentă a structurii şi manipularea prin intermediul Property
Inspector.
Oracle JDeveloper 10g oferă facilităţi extinse pentru managementul conexiunilor şi
vizualizarea elementelor componente ale unei baze de date, la toate acestea adăugându-se
suport îmbunătăţit pentru secvenţele PL/SQL şi un SQL Worksheet încorporat.
Managementul conexiunilor. Jdeveloper permite crearea de conexiuni reutilizabile,
menţinându-se detaliile unei conexiuni precum: utilizator, parolă, numărul portului,
calculatorul gazdă şi identificatorul bazei de date. Aceste conexiuni pot fi refolosite în diverse
stadii ale ciclului de dezvoltare atunci când:
Se vizualizează obiectele bazei de date
Se editează şi se compilează cod PL/SQL (proceduri, funcţii, pachete, declanşatoare,
etc.)
Se execută şi se modifică instrucţiuni SQL
Se accesează date dintr-o aplicaţie BC4J, JSP, DAC şi/sau XSQL
Se implementează cod Java în server
Vizualizarea obiectelor bazei de date. Conexiunile din Connection Navigator oferă o
vizualizare schematică a mai multor obiecte din baza de date:
Tabele şi tabele virtuale
Secvenţe
Sinonime
Pagina 62 din 207
Cod PL/SQL şi clase Java implementate
Obiecte Oracle
JDeveloper permite vizualizarea acestor tipuri de obiecte, inclusiv detalii despre
obiectul selectat (figura 3.6).
Figura 3.6: Vizualizarea obiectelor bazei de date
Editorul de cod PL/SQL. Editorul de cod din JDeveloper 10g permite programatorului
să editeze obiecte PL/SQL precum proceduri, funcţii şi pachete, fiind ajutat de facilităţi
precum colorarea sintaxei şi capacitatea de a rula sau depana aceste secvenţe direct din
JDeveloper. Editorul PL/SQL permite lucrul direct asupra codului sursă din baza de date.
Pentru a compila codul sursă PL/SQL, JDeveloper trimite noul cod sursă către baza de date şi
lasă serverul să se ocupe de compilare. Când apar eventuale erori, acestea sunt afişate în
JDeveloper.
SQL Worksheet. Incepând cu versiunea 10g, editorul de SQL este înlocuit de un SQL
Worksheet încorporat. În afara afişării rezultatelor execuţiei unei secvenţe de comenzi SQL,
editorul SQL poate afişa şi planul de execuţie al secvenţei, ajutând astfel la optimizarea
accesului la baza de date.
Pagina 63 din 207
Capitolul 4
PROIECTAREA ŞI REALIZAREA UNUI SISTEM OLAP PENTRU S.C.
INPRODCOM S.R.L.
4.1. STUDIUL ŞI ANALIZA PROCESULUI DECIZIONAL CURENT ŞI A
CERINŢELOR INFORMAŢIONALE
4.1.1. Studiul şi analiza procesului decizional curent
Din datele prezentate în capitolul 1, reiese clar că la data analizei 95% din cifra de
afaceri a SC INPRODCOM SRL DEVA o reprezintă veniturile realizate din vânzarea
băuturilor calde prin intermediul automatelor de băuturi.
Este de la sine înţeles ca în aceste condiţii, conducerea societăţii să fie interesată să
cunoască în orice moment evoluţia acestor vânzări, costurile aferente, rentabilitatea fiecărui
aparat şi implicit rentabilitatea unui contract încheiat cu un beneficiar, modul de încasare a
băuturilor calde, comportamentul fiecărui agent faţă de client, faţă de păstrarea şi întreţinerea
în bune condiţii a aparatelor şi a integrităţii gestiunii de ingrediente.
Societatea începe să desfăşoare această activitate, cod CAEN 5263 „Comerţ cu
amănuntul care nu se efectuează prin magazin” în luna februarie a anului 2002.
Anterior acestei date, societatea SC INPRODCOM SRL DEVA a fost selecţionată de
catre SC ELITE ROMÂNIA SA ca unic distribuitor pentru acest tip de activitate, alegere care
s-a făcut dintr-un număr destul de mare de societăţi.
Alegerea SC ELITE SA s-a bazat în principal pe următoarele:
experienţa de peste zece ani în comerţul en-gros şi cu amănuntul a SC INPRODCOM
SRL
cunoaşterea pieţei de desfacere pe raza judeţului Hunedoara
spaţii de depozitare mari
parcul auto bine dezvoltat
recomandările primite de SC INPRODCOM SRL din partea unor bănci şi instituţii ale
statului (Registrul Comerţului, Direcţia Generală a Finanţelor Publice Hunedoara etc.)
Pagina 64 din 207
Între cele două societăţi s-a încheiat un contract comercial care stipulează pe scurt
următoarele:
SC ELITE SA are următoarele obligaţii:
vinde cu plata în rate, lunar, într-o perioadă de cinci ani, în baza comenzii lansate de
SC INPRODCOM, automatele de băuturi calde;
vinde cu plata la treizeci de zile, în baza comenzilor lansate de SC INPRODCOM,
ingredientele (zahăr, cafea, ceai etc.) necesare producerii băuturilor calde;
pune la dispoziţia SC INPRODCOM , în baza comenzilor lansate contra cost, piesele
de schimb necesare reparaţiei şi întreţinerii automatelor de băuturi calde;
acordă asistenţă tehnică în instruirea personalului, cercetarea pieţei etc;
stabileşte că SC INPRODCOM este unic distribuitor pentru comercializarea
băuturilor calde pe raza judeţelor Hunedoara, Timiş, Arad, Oradea, Caraş Severin, iar printr-
un act adiţional încheiat la contractul semnat, începând cu aprilie 2004 şi judeţul Mehedinţi.
SC INPRODCOM SRL are următoarele obligaţii:
să achite contravaloarea automatelor de băuturi calde la termenele scadente (lunar),
într-o perioadă de cinci ani;
să achite contravaloarea ingredientelor în termen de treizeci de zile;
să organizeze reţeaua de distribuţie în judeţele nominalizate, în condiţii de maximă
rentabilitate, asigurând cu resurse proprii spaţii pentru birouri, spaţii de depozitare, parc auto
şi personal operativ;
să emită o scrisoare de garanţie bancară în favoarea SC ELITE SA în valoare de un
miliard lei, garanţie pentru automatele de băuturi calde care se plătesc eşalonat;
să se preocupe constant de creşterea vânzărilor de băuturi calde asfel încât volumul
tranzacţiilor cu ingrediente să aibă un trend ascendent;
să raporteze periodic volumul vânzărilor (cantitativ şi valoric), performanţele din
fiecare judeţ etc.
În figura 4.1 se prezintă structura organizatorică a activităţii analizate şi factorii
implicaţi:
Pagina 65 din 207
Figura 4.1: Structura organizatorică a activităţii de comercializare a băuturilor calde
O descriere succintă a modului în care se desfăşoară practic activitatea, o considerăm
utilă în vederea evidenţierii factorilor implicaţi (automate de cafea, agenţi, beneficiari etc).
În urma încheierii unui contract, în vederea comercializării băuturilor calde, la sediul
unui BENEFICIAR (societate comercială, instituţie publică, bancă, şcoală etc.) este instalat
un AUTOMAT DE BĂUTURI CALDE care va fi gestionat de un AGENT.
AUTOMATUL DE BĂUTURI CALDE este un echipament tehnic care produce în
mod automat maximum cincisprezece tipuri de băuturi calde (REŢETE):
cafea scurtă
cafea lungă
cafea cu lapte
cappucino
ciocolată caldă
cappucino cu ciocolată
cafea cu ciocolată
ceai
lapte
Pagina 66 din 207
cappucino french vanilla
cafea ness
ness cu lapte
cappucino cu ness
ciocolată cu lapte
ciocolată cu lapte şi ness,
consumând pe bază de reţete ingredientele depozitate.
Aparatul are în dotare CONTOARE , care afişează numărul băuturilor produse. Există
două tipuri de CONTOARE:
- CONTORGENERAL: instrument ce măsoară şi afişează numărul total de REŢETE
produse indiferent de tipul lor.
- CONTORPARŢIAL: instrument ce măsoară şi afişează numărul total de REŢETE
de un anumit tip (exemplu: contor parţial pentru cafea, contor parţial pentru ceai, contor
parţial pentru cappucino etc)
CONTORGENERAL este foarte important deoarece indică nivelul vânzărilor şi
implicit banii ce trebuie ridicaţi din APARAT.
În dotarea SC INPRODCOM SRL există mai multe TIPURI de automate de cafea:
model BRIO în două variante: BRIO 200 şi BRIO 250
model COLIBRI
model FUTUREMA
model KIKKO
model RHEA în două variante: RHEA XL şi RHEA XM
model SAECO
model SPAZIO.
Ultimul factor implicat în activitate este AGENTUL, care este o persoană angajată cu
contract de muncă, ce gestionează o parte din BENEFICIARI.
În esenţă un AGENT trebuie să studieze piaţa, să gasească noi BENEFICIARI, să
întreţină periodic AUTOMATELE de care răspunde, dar în primul rând să raporteze, pe baza
CONTOARELOR, numărul de băuturi consumate şi să încaseze banii din APARATE de la
BENEFICIARI. Toate aceste informaţii sunt consemnate zilnic în „Raport de gestiune
aparate”. Conţinutul acestui document îl putem grupa în:
Pagina 67 din 207
date generale:
număr matricol APARAT
locaţia aparatului (BENEFICIARULUI)
luna raportului
tipul APARATULUI (BRIO, COLIBRI etc.)
contor general la începutul lunii
contor general la sfârşit de lună.
date aferente fiecărei vizite la BENEFICIAR:
data vizitei
număr porţii încasate
preţul din contract
valoarea încasată
valoarea contorului general
număr de porţii pe tipuri de băutura (cafea lungă, cafea scurtă etc.)
4.1.2. Stabilirea cerinţelor informaţionale
Societatea doreşte analiza următorilor indicatori:
productivitatea unui AUTOMAT identificat prin MATRICOL:
numărul total de băuturi calde comercializate
productivitatea fiecărui tip de automat:
numărul total de băuturi calde comercializate, într-o lună sau an
pentru fiecare AGENT:
numărul total de BENEFICIARI deserviţi de fiecare agent, într-o lună sau an
numărul de băuturi calde comercializate, pe total şi pe tipuri, într-o lună sau an
pentru fiecare ORAŞ sau ZONĂ:
numărul de băuturi calde consumate pe total şi pe tipuri într-o lună sau an
Pagina 68 din 207
topul BENEFICIARILOR pe baza numărului de băuturi calde comercializate, într-o
lună sau an
topul AGENŢILOR pe baza numărului de băuturi calde comercializate, într-o lună
sau an
pentru total societate:
număr de băuturi calde consumate pe total şi pe tipuri într-o lună sau an
valoarea băuturilor comercializate
preţul mediu
topul BENEFICIARILOR pe baza numărului total de băuturi calde comercializate,
într-o lună sau an
topul AGENŢILOR pe baza numărului total de băuturi calde comercializate, într-o
lună sau an
topul AGENŢILOR pe baza numărului de beneficiari deserviţi, într-o lună sau an
4.2. PROIECTAREA MODELULUI MULTIDIMENSIONAL CONCEPTUAL
4.2.1. Identificarea variabilelor
În urma studiului cerinţelor informaţionale ale societăţii, se identifică următoarele
variabile:
număr de beneficiari (nr_benef): semiaditivă;
număr de băuturi calde comercializate (cant_vândută): aditivă;
preţ mediu jeton (preţ_jet): neaditivă;
Pentru fiecare variabilă se vor stabili factorii de care depinde sau în funcţie de care
variază (dimensiunile cubului) şi anume:
variabila număr de beneficiari (nr_benef) are ca dimensiuni: Timp, Agent.
variabila număr de băuturi calde comercializate (cant_vândută), are ca dimensiuni:
Timp, Aparat, Agent, Beneficiar, Tipbăutură.
Pagina 69 din 207
variabila preţ mediu jeton (pret_jet) are ca dimensiuni: Timp, Beneficiar.
Tipuri de analize:
numărul total de băuturi calde comercializate de un APARAT pe lună şi pe an, prin
agregare după TIMP;
număr total de băuturi calde comercializate, detaliat pe tipuri de automate pe lună şi
pe an, prin agregare după TIMP;
număr total de băuturi calde comercializate, detaliat pe tipuri de automate, pentru o
anumită locaţie geografică, pe lună şi pe an, prin agregare după TIMP;
număr total de băuturi calde comercializate de fiecare agent, pe lună şi pe an, prin
agregare după TIMP;
număr total de băuturi calde comercializate, detaliat pe tipuri de băuturi, pentru
fiecare locaţie geografică în parte, pe lună şi pe an, prin agregare după TIMP;
numărul total de beneficiari deserviti de un AGENT pe luna şi pe an, prin agregare
după TIMP;
Topul clienţilor, în funcţie de numărul total de băuturi comercializate, pe an şi lună;
Topul agenţilor, în funcţie de numărul total de băuturi comercializate, pe total firmă,
pe an şi lună;
Topul agenţilor, in funcţie de numărul total de beneficiari deserviţi;
valoarea băuturilor comercializate, pe total, pe lună şi pe an, prin agregare după
TIMP;
4.2.2. Identificarea dimensiunilor şi ierarhiilor
Se identifică urmatoarele dimensiuni ierarhice:
Dimensiunea AGENT are o structură ierarhică, cu nivelulurile: L1=Ţară (Ţara în care
activează agentul respectiv), L2=Judeţ (Judeţul în care activează agentul respectiv),
L3=Agent.
Pagina 70 din 207
Dimensiunea APARAT are o structură ierahică, cu nivelurile: L1=Categ (toate
aparatele), L2=Tip (tipuri aparate), L3=Matricol, L4=Ben (beneficiar), L5=Locaţie (oraş),
L6=Judeţ, L7=Ţară şi patru ierarhii: DUPA_BENEFICIAR (cu nivelurile L7, L6, L4, L3),
DUPĂ_JUDEŢ (cu nivelurile L7, L6, L3), DUPĂ_LOCAŢIE (cu nivelurile L7, L6, L5, L3)
şi STANDARD (L1, L2, L3).
Dimensiunea BENEFICIAR are o structură ierahică, cu nivelurile: L1=Top (toţi
beneficiarii), L2=Judeţ, L3=Locaţie (oraş), L4=Ben (beneficiar) şi două ierarhii: PE_JUDEŢ
(cu nivelurile L1, L2, L4) şi STANDARD (L1, L2, L3, L4).
Dimensiunea TIMP are o structură ierahică, cu nivelurile: An, Trim (trimestru), Lună.
Dimensiunea TIPBAUTURĂ are o structură ierahică, cu nivelurile: L1=Categ (toate
tipurile de băuturi calde), L2=Băutură (denumirile băuturilor calde).
4.2.3. Definirea cuburilor n-dimensionale sau a structurii multicub
Pentru a reduce fenomenul de împrăştiere s-a ales o structură multicub cu trei cuburi
n-dimensionale şi anume:
Cubul n-dimensional cu dimensiunile: Agent, Beneficiar, Tipbăutură, Aparat, Timp şi
variabila băuturi calde comercializate (cant_vândută).
Cubul n-dimensional cu dimensiunile: Agent, Timp şi variabila: număr de beneficiari
(nr_benef).
Cubul n-dimensional cu dimensiunile: Beneficiar, Timp şi variabila: preţ mediu al
unui jeton (preţ_jet).
Structura multicub are o singură dimensiune globală: Timp.
Pagina 71 din 207
4.2.4. Rafinarea modelului multidimensional
O componentă cheie a modelării multidimensionale este definirea formulelor, şi în
special al formulelor de agregare:
valoare băuturi calde comercializate (valoare) = cant_vândută * preţ_jet (preţul
mediu).
De asemenea, se vor realiza agregări după toate dimensiunile existente. Pentru fiecare
dimensiune se stabilesc nivelurile de granulaţie şi anume:
Dimeniunea Agent are nivelul de granulaţie: agent.
Dimeniunea Aparat are nivelul de granulaţie: matricol (matricolul automatului de
cafea).
Dimeniunea Beneficiar are nivelul de granulaţie: ben (beneficiar).
Dimeniunea Timp are nivelul de granulaţie: lună.
Dimeniunea Tipbăutură are nivelul de granulaţie: băutură.
Pentru fiecare variabilă din cuburile n-dimensionale se stabileşte metoda de agregare
a fiecărei dimensiuni din cub, după cum urmează:
Variabila cant_vândută este agregată după dimensiunile AGENT, APARAT,
BENEFICIAR, TIMP şi TIPBĂUTURĂ prin metoda SUM (sumă).
Variabila nr_benef este agregată după dimensiunile AGENT şi TIMP prin metoda
SUM (sumă).
Variabila preţ_jet este agregată după dimensiunile BENEFICIAR şi TIMP prin
metoda AVG (medie).
Pagina 72 din 207
4.3. PROIECTAREA LOGICĂ
S-au identificat următorele tabele de fapte:
Tabela de fapte FAPTE1 (TIMP_LEAVES, APARAT_LEAVES,
BAUTURĂ_LEAVES, BENEFICIAR_LEAVES, AGENT_LEAVES: varchar2(30),
CANT_VÂNDUTĂ: number(20), PREŢ_JET: number(20)) cu tabelele de dimensiuni Timp
(AN: varchar2(30), TRIM: varchar2(30), LUNĂ: varchar2(30)), Aparat (L1=CATEG:
varchar2(30), L2=TIP: varchar2(30), L3=MATRICOL: varchar2(30), L4=BEN:
varchar2(30), L5=LOCAŢIE: varchar2(30), L6=JUDEŢ: varchar2(30), L7=ŢARĂ:
varchar2(30)), Tipbăutură (L1=CATEG: varchar2(30), L2=BĂUTURĂ: varchar2(30)),
Beneficiar (L1=TOP: varchar2(30), L2=JUDEŢ: varchar2(30), L3=LOCAŢIE: varchar2(30),
L4=BEN: varchar2(30)), Agent (L1=ŢARĂ: varchar2(30), L2=JUDEŢ: varchar2(30),
L3=AGENT: varchar2(30));
Tabela de fapte FAPTE2 (TIMP_LEAVES, AGENT_LEAVES: varchar2(30),
NR_BENEF: number(20)) cu tabelele de dimensiuni Timp (AN: varchar2(30), TRIM:
varchar2(30), LUNĂ: varchar2(30)), Agent (L1=ŢARĂ: varchar2(30), L2=JUDEŢ:
varchar2(30), L3=AGENT: varchar2(30)).
Tabela de fapte FAPTE3 (TIMP_LEAVES, BENEFICIAR_LEAVES: varchar2(30),
PREŢ_JET: number(10)) cu tabelele de dimensiuni Timp (AN: varchar2(30), TRIM:
varchar2(30), LUNĂ: varchar2(30)), Beneficiar (L1=TOP: varchar2(30), L2=JUDEŢ:
varchar2(30), L3=LOCAŢIE: varchar2(30), L4=BEN: varchar2(30)).
4.4. PROIECTAREA FIZICĂ
Pentru stabilirea aproximativă a dimensiunii bazei de date relaţionale se utilizează
modul de calcul propus de Ralph Kimball, mod ce se bazează pe câteva premise. Considerăm
Pagina 73 din 207
că fiecare atribut are maxim 4Bytes. De asemenea considerăm că pentru tabelele de fapte ce
au un număr mic de atribute, dimensiunea indexului principal creat de cheia compusă este de
60-80% din tabela de fapte. Tabelele de dimensiuni şi indecşii asociaţi vor fi foarte mici în
comparaţie cu tabela de fapte şi indexul asociat.
În cazul nostru s-au folosit nivelurile de granulaţie stabilite anterior, iar dimensiunea
bazei de date relaţionale s-a calculat aproximativ astfel:
Dimensiunea AGENT: 31 de agenţi
Dimensiunea APARAT: 412 matricole
Dimensiunea BENEFICIAR: 546 beneficiari
Dimensiunea TIMP: 21 luni (din mai 2003 până în ianuarie 2005)
Dimensiunea TIPBĂUTURĂ: 15 tipuri de băuturi
Numărul de înregistrări din tabela de fapte FAPTE1 = 32721. Teoretic ar fi trebuit
introduse chiar şi liniile care agregate nu dau nici un rezultat, cum ar fi cuplarea unui agent ce
acţionează în judeţul Hunedoara cu un beneficiar din Timiş. Asta ar fi dus la un număr uriaş
de înregistrări, adică 31*412*546*21*15 = 2196656280. De aceea sunt introduse numai
cuplările coerente.
Numărul de atribute cheie pentru tabela de fapte FAPTE1: 5
Numărul de atribute din tabela de fapte FAPTE1: 1
Numărul total de atribute din tabela de fapte FAPTE1: 6
Dimensiunea tabelei de fapte FAPTE1 = 32721 * 6 atribute * 4Bytes/atribut =
785304Bytes.
Dimensiunea indexului principal pe cheia compusă a tabelei = 80% * 785304Bytes =
628243.2 Bytes.
Numărul de înregistrări din tabela de fapte FAPTE2 = 314. Din nou, sunt introduse
numai cuplările coerente, unii agenţi activând de-abia din anul 2004.
Numărul de atribute cheie pentru tabela de fapte FAPTE2: 2
Numărul de atribute din tabela de fapte FAPTE2: 1
Numărul total de atribute din tabela de fapte FAPTE2: 3
Dimensiunea tabelei de fapte FAPTE2 = 314 * 3 atribute * 4Bytes/atribut =
3768Bytes.
Pagina 74 din 207
Dimensiunea indexului principal pe cheia compusă a tabelei = 80% * 3768Bytes =
3014.4 Bytes.
Numărul de înregistrări din tabela de fapte FAPTE3 = 3914. Din nou, sunt introduse
numai cuplările coerente.
Numărul de atribute cheie pentru tabela de fapte FAPTE3: 2
Numărul de atribute din tabela de fapte FAPTE3: 1
Numărul total de atribute din tabela de fapte FAPTE3: 3
Dimensiunea tabelei de fapte FAPTE3 = 3914 * 3 atribute * 4Bytes/atribut =
46968Bytes.
Dimensiunea indexului principal pe cheia compusă a tabelei = 80% * 46968Bytes =
37574.4 Bytes.
Dimensiunea totală este deci de: 785304 + 628243.2 + 3768 + 3014.4 + 46968 +
37574.4 = 1504872Bytes, adica aproximativ 1469Kbytes ~ 1.5 MB.
4.5. CONSTRUIREA SISTEMULUI OLAP
Pentru realizarea sistemului OLAP s-a utilizat SGBD Oracle 9i:
1. S-a instalat Oracle 9i Release 2 (9.2.0.1) Enterprise Edition cu opţiunea de bază de
date iniţială de tip “General purpose” (sau cu “Data warehouse”) în directorul OraHome92.
La finele instalării s-a apăsat butonul: ”Password management” pentru a modifica parolele
pentru: SYS, SYSTEM, OLAPSYS, SH (de exemplu: pentru fiecare cont în parte am ales
parola “florea”) şi pentru a debloca (UNLOCK) ultimele două conturi mentţionate. Aceste
parole au fost notate pentru a fi folosite ulterior.
2. S-a descărcat patch set-ul 9.2.0.6: p3948480_9206_WINNT.zip de pe Metalink
(metalink.oracle.com) (pentru acest pas este necesară introducerea unui cont valid - utilizator,
parolă - pe Metalink).
Pagina 75 din 207
3. Pentru instalarea patch set-ului se opresc toate instanţele bazei de date Oracle 9i cu
prioritate normală sau imediată.
De asemenea, se opresc Listener-ul şi toate celelalte servicii ce rulează în directorul
ORACLE HOME (OraHome92) unde se va instala patch set-ul. Pe o platformă Windows se
va deshide Control Panel/Administrative Tools/Services şi se vor opri toate serviciile ce incep
cu “OraHome92”.
4. Se dezarhivează conţinutul patch-ului într-un director temporar.
5. Se lansează în execuţie setup.exe din directorul temporar. Acesta va porni Oracle
Universal Installer 10.1.0.3.
6. Se instalează patch set-ul în ORACLE HOME selectând sursa: fişierul temp_dir\
stage\products.jar
7. După instalarea patch set-ului:
a). Dacă Jserver este instalat se modifică dimensiunea spaţiului tabel SYSTEM
(minim 10MB spaţiu liber) utilizând instrumentul Oracle Enterprise Manager (Storage—
Tablespaces—SYSTEM) (figura 4.2).
Pagina 76 din 207
Figura 4.2: Spaţiul tabel SYSTEM
b). Se verifică spaţiul tabel XDB. Trebuie să fie cel puţin 50MB spaţiu liber. Se
modifică acest spaţiu în acelaşi mod ca şi pentru spaţiul tabel SYSTEM (figura 4.3).
Pagina 77 din 207
Figura 4.3: Spaţiul tabel XDB
c). Se modifică parametrii: SHARED_POOL_SIZE şi JAVA_POOL_SIZE din
fişierul de parametri ai bazei de date:
Se porneşte baza de date:
SQL> STARTUP
Dacă este necesar, se introduc următoarele comenzi pentru a determina dacă sistemul
foloseşte un fişier cu parametrii de iniţializare (initsid.ora) sau un fişier cu parametrii server-
ului (spfiledbname.ora):
SQL> SHOW PARAMETER PFILE;
Această comandă afişează numele şi locaţia fişierului cu parametrii server-ului sau
numele şi locaţia fişierului cu parametrii de iniţializare.
Se determină valorile curente ale acestor parametri:
SQL> SHOW PARAMETER SHARED_POOL_SIZE;
SQL> SHOW PARAMETER JAVA_POOL_SIZE;
Pagina 78 din 207
Dacă sistemul foloseşte un fişier cu parametrii serverului:
Dacă este necesar, se setează valoarea parametrului de iniţializare
SHARED_POOL_SIZE (la cel puţin 150MB):
SQL> ALTER SYSTEM SET SHARED_POOL_SIZE='150M' SCOPE=spfile;
Dacă este necesar, se setează valoarea parametrului de iniţializare
JAVA_POOL_SIZE (la cel puţin 150MB):
SQL> ALTER SYSTEM SET JAVA_POOL_SIZE='150M' SCOPE=spfile;
Dacă sistemul foloseşte un fişier cu parametrii de iniţializare, dacă este necesar, se vor
schimba valorile parametrilor SHARED_POOL_SIZE şi JAVA_POOL_SIZE (la cel puţin
150MB) în fişierul initsid.ora.
Se opreşte baza de date:
SQL> SHUTDOWN
d). După instalarea patch set-ului:
Utilizatorul membru al grupului administratorilor pe server-ul de baze de date va
parcurge următorii paşi:
Se va folosi SQL*Plus pentru conectarea la baza de date, iar conectarea se va face cu
utilizatorul SYS cu rol de SYSDBA:
sqlplus /NOLOG
CONNECT SYS/password AS SYSDBA
Se vor executa următoarele comenzi SQL*Plus:
SQL> STARTUP MIGRATE
SQL> SPOOL patch.log
SQL> @ORACLE_BASE\ORACLE_HOME\rdbms\admin\catpatch.sql
SQL> SPOOL OFF
Se reporneşte baza de date:
SQL> SHUTDOWN
SQL> STARTUP
Pagina 79 din 207
Se execută script-ul utlrp.sql pentru a recompila toate pachetele PL/SQL ce sunt
invalide. Acest pas este opţional, dar recomandat.
SQL> @ORACLE_BASE\ORACLE_HOME\rdbms\admin\utlrp.sql
8. Se instalează JDeveloper 10g 10.1.2 (se descarcă de pe OTN: www.oracle.com –
Technologies şi se dezarhivează într-un director, spre exemplu Jdev10. Nu este necesar ca
acesta să fie un ORACLE HOME).
9. Se instalează BI Beans 10.1.2 (se descarcă de pe OTN: www.oracle.com –
Technologies şi se dezarhivează în directorul Jdev10, scriind peste fişierele existente atunci
cand este cazul).
10. Se instalează schema BIBDEMO:
Se crează un director pe calculatorul pe care se află baza de date Oracle. Acest
director de instalare este locaţia unde se vor regăsi fişierele necesare pentru construirea
schemei BIBDEMO.
Se lansează în execuţie bibdemo.bat din fereastra Command Prompt, folosind
următoarea sintaxă:
bibdemo.bat <calea către fişierele bazei de date Oracle>
De exemplu:
bibdemo.bat e:\OraHome92\oradata\proiect
Trebuie introdusă acum parola pentru utilizatorul SYS ca SYSDBA.
Execuţia acestui program durează aproximativ 15-20 minute. Este normal ca acesta să
se oprească din când în când.
Apoi, se poate verifica conexiunea la OLAP:
bi_checkconfig.bat -h ana -po 1521 -sid proiect -u bibdemo -p bibdemo -q
returnează:
E:\JDev10\bibeans\bi_checkconfig>bi_checkconfig.bat -h ana -po 1521 -sid proiect
-u bibdemo -p bibdemo -q
Pagina 80 din 207
BI Beans Diagnostics(v1.0.2.0) 4/7/05
=============================================================
==================
JDEV_ORACLE_HOME .......................... = e:\jdev10
JAVA_HOME ................................. = e:\jdev10\jdk
JDeveloper version ........................ = 10.1.2.0.0.1811
BI Beans release description .............. = BI Beans 10.1.2 Production Release
BI Beans component number ................. = 10.1.2.52.0
BI Beans internal version ................. = 3.2.1.0.13
Connect to database ....................... = Successful
JDBC driver version ....................... = 10.1.0.3.0
JDBC JAR file location .................... = E:\JDev10\jdbc\lib
Database version .......................... = 9.2.0.6.0
OLAP Catalog version ...................... = 9.2.0.6.0
OLAP AW Engine version .................... = 9.2.0.6.0
OLAP API Server version ................... = 9.2.0.6.0
BI Beans Catalog version .................. = N/A; not installed in bibdemo
OLAP API JAR file version ................. = "10.1.0.3.0"
OLAP API JAR file location ................ = e:\jdev10\jdev\lib\ext
Load OLAP API metadata .................... = Successful
Number of metadata folders ................ = 3
Number of metadata measures ............... = 16
Number of metadata dimensions ............. = 13
Testing sample query for measures and dimensions
(S=Schema, C=Cube, M=Measure, D=Dimension)
------------------------------------------------
1/35) Measure PRET JET ................. = Successful
S=ANA, C=CUB1, M=PRET_JET
2/35) Dimension AGENT .................. = Successful
S=ANA, D=AGENT
3/35) Dimension BENEFICIAR ............. = Successful
Pagina 81 din 207
S=ANA, D=BENEFICIAR
4/35) Dimension TIMP ................... = Successful
S=ANA, D=TIMP
5/35) Dimension APARAT ................. = Successful
S=ANA, D=APARAT
6/35) Dimension TIPBAUTURA ............. = Successful
S=ANA, D=TIPBAUTURA
7/35) Measure CANT VANDUTA ............. = Successful
S=ANA, C=CUB1, M=CANT_VANDUTA
8/35) Measure NR BENEF ................. = Successful
S=ANA, C=CUB2, M=NR_BENEF
9/35) Measure PRET JET ................. = Successful
S=ANA, C=CUB3, M=PRET_JET
10/35) Dimension AGENT .................. = Successful
S=ANA, D=AGENT
11/35) Dimension APARAT ................. = Successful
S=ANA, D=APARAT
12/35) Dimension BENEFICIAR ............. = Successful
S=ANA, D=BENEFICIAR
13/35) Dimension TIMP ................... = Successful
S=ANA, D=TIMP
14/35) Dimension TIPBAUTURA ............. = Successful
S=ANA, D=TIPBAUTURA
15/35) Measure Budget ................... = Successful
S=BIBDEMO, C=BIBDEMO_BUDGET_CUBE, M=BUDGET
16/35) Measure Actual ................... = Successful
S=BIBDEMO, C=BIBDEMO_ACTUAL_CUBE, M=ACTUAL
17/35) Measure Close Price .............. = Successful
S=BIBDEMO, C=BIBDEMO_STKPRICE_CUBE, M=STKPRICE_CLOSE
18/35) Measure Stock Volume ............. = Successful
S=BIBDEMO, C=BIBDEMO_STKPRICE_CUBE, M=STKPRICE_VOLUME
19/35) Measure Open Price ............... = Successful
S=BIBDEMO, C=BIBDEMO_STKPRICE_CUBE, M=STKPRICE_OPEN
20/35) Measure High Price ............... = Successful
Pagina 82 din 207
S=BIBDEMO, C=BIBDEMO_STKPRICE_CUBE, M=STKPRICE_HIGH
21/35) Measure Low Price ................ = Successful
S=BIBDEMO, C=BIBDEMO_STKPRICE_CUBE, M=STKPRICE_LOW
22/35) Dimension Division ............... = Successful
S=BIBDEMO, D=DIVISION
23/35) Dimension Line Items ............. = Successful
S=BIBDEMO, D=LINE
24/35) Dimension Time ................... = Successful
S=BIBDEMO, D=TIME
25/35) Dimension Day .................... = Successful
S=BIBDEMO, D=DAY
26/35) Dimension Stock .................. = Successful
S=BIBDEMO, D=STOCK
27/35) Measure Costs .................... = Successful
S=BIBDEMO, C=ANALYTIC_CUBE, M=F.COSTS
28/35) Measure Promotion ................ = Successful
S=BIBDEMO, C=ANALYTIC_CUBE, M=F.PROMO
29/35) Measure Quota .................... = Successful
S=BIBDEMO, C=ANALYTIC_CUBE, M=F.QUOTA
30/35) Measure Units .................... = Successful
S=BIBDEMO, C=ANALYTIC_CUBE, M=F.UNITS
31/35) Measure Sales .................... = Successful
S=BIBDEMO, C=ANALYTIC_CUBE, M=F.SALES
32/35) Dimension Channel ................ = Successful
S=BIBDEMO, D=CHANNEL
33/35) Dimension Geography .............. = Successful
S=BIBDEMO, D=GEOGRAPHY
34/35) Dimension Product ................ = Successful
S=BIBDEMO, D=PRODUCT
35/35) Dimension Time ................... = Successful
S=BIBDEMO, D=TIME
Metadata output location .................. = E:\JDev10\bibeans\bi_checkconfig\b
i_metadata.txt
Pagina 83 din 207
De asemenea, se poate testa conexiunea la OLAP cu schema demo BIBDEMO din
JDeveloper, în felul următor:
Se selectează opţiunea JDeveloper / New Workspace
Se selectează opţiunea Project1 / New... / Business Inteligence / Designer
Se selectează BI Designer Wizard şi la: Step 2 of 4: OLAP Data Source: se face o
nouă conexiune OLAP. Apoi se parcurg următorii paşi:
Pas 1 (figura 4.4):
Figura 4.4: Crearea unei conexiuni OLAP – Pas 1
Pas 2 (figura 4.5):
Pagina 84 din 207
Figura 4.5: Crearea unei conexiuni OLAP – Pas 2
Pas 3 (figura 4.6):
Pagina 85 din 207
Figura 4.6: Crearea unei conexiuni OLAP – Pas 3
Pas 4 (figura 4.7):
Pagina 86 din 207
Figura 4.7: Crearea unei conexiuni OLAP – Pas 4
Pas 5 (figura 4.8):
Figura 4.8: Crearea unei conexiuni OLAP – Pas 5
Apoi:
1). S-au creat două spaţii tabel şi anume: un spaţiu tabel de tip permanent: ANA
(figura 4.9), de dimensiune 200MB; şi un spaţiu tabel de tip temporar: ANATEMP (figura
4.10), de dimensiune 50MB.
Pagina 87 din 207
Figura 4.9: Spaţiul tabel ANA
Figura 4.10: Spaţiul tabel ANATEMP
Pagina 88 din 207
2). S-a creat un nou utilizator: ANA (figura 4.11), utilizând opţiunea Create like...
asupra utilizatorului BIBDEMO. Rolurile acestuia se pot observa în figura 4.12.
Figura 4.11: Utilizatorul ANA
Figura 4.12: Rolurile utilizatorului ANA
Pagina 89 din 207
3). Sistemul OLAP va utiliza ca surse de date următoarele tabele:
a). Tabela AGENT (figura 4.13):
Figura 4.13: Tabela AGENT
Codul SQL pentru crearea tabelei AGENT:
CREATE TABLE "ANA"."AGENT" ("AGENT" VARCHAR2(30) NOT NULL,
"AGENT_LLABEL"
VARCHAR2(30) NOT NULL, "AGENT_SLABEL"
VARCHAR2(30) NOT NULL, "JUDET" VARCHAR2(30) NOT NULL,
"JUDET_LLABEL"
VARCHAR2(30) NOT NULL, "JUDET_SLABEL"
VARCHAR2(30) NOT NULL, "TARA" VARCHAR2(30) NOT NULL,
"TARA_LLABEL"
VARCHAR2(30) NOT NULL, "TARA_SLABEL"
VARCHAR2(30) NOT NULL, "TELEFONAG" VARCHAR2(10) NOT NULL,
"TIPCONTACT" VARCHAR2(30) NOT NULL, PRIMARY KEY("AGENT"))
Pagina 90 din 207
TABLESPACE "ANA";
create sequence seq_agent
start with 1
increment by 1
nomaxvalue;
create or replace TRIGGER trig_agent
before insert on agent
for each row
begin
select CONCAT('AG',LPAD(seq_agent.nextval,3,'0')),CONCAT('AGENT
',LPAD(seq_agent.nextval,3,'0')) into :new.agent, :new.agent_slabel from dual;
end;
/
b). Tabela TIPBĂUTURĂ (figura 4.14):
Figura 4.14: Tabela TIPBĂUTURĂ
Pagina 91 din 207
Codul SQL pentru crearea tabelei TIPBĂUTURĂ:
CREATE TABLE "ANA"."TIPBAUTURA" ("BAUTURA" VARCHAR2(30) NOT
NULL,
"BAUTURA_LLABEL" VARCHAR2(30) NOT NULL, "BAUTURA_SLABEL"
VARCHAR2(30) NOT NULL,
"CATEG" VARCHAR2(30) NOT NULL,
"CATEG_LLABEL" VARCHAR2(30) NOT NULL, "CATEG_SLABEL"
VARCHAR2(30) NOT NULL,
PRIMARY
KEY("BAUTURA"))
TABLESPACE "ANA";
c). Tabela APARAT (figura 4.15):
Figura 4.15: Tabela APARAT
Codul SQL pentru crearea tabelei APARAT:
Pagina 92 din 207
CREATE TABLE "ANA"."APARAT" ("MATRICOL" VARCHAR2(30) NOT
NULL,
"TIP" VARCHAR2(30) NOT NULL, "TIP_LLABEL" VARCHAR2(30) NOT
NULL, "TIP_SLABEL" VARCHAR2(30) NOT NULL,
"CATEG" VARCHAR2(30) NOT NULL, "CATEG_LLABEL" VARCHAR2(30)
NOT NULL, "CATEG_SLABEL" VARCHAR2(30) NOT NULL,
"BEN" VARCHAR2(30) NOT NULL, "LOCATIE" VARCHAR2(30) NOT NULL,
"LOCATIE_LLABEL" VARCHAR2(30) NOT NULL, "LOCATIE_SLABEL"
VARCHAR2(30) NOT NULL,
"JUDET" VARCHAR2(30) NOT NULL, "JUDET_LLABEL" VARCHAR2(32)
NOT NULL, "JUDET_SLABEL" VARCHAR2(30) NOT NULL,
"TARA" VARCHAR2(10) NOT NULL, "TARA_LLABEL" VARCHAR2(30) NOT
NULL, "TARA_SLABEL" VARCHAR2(30) NOT NULL,
PRIMARY KEY("MATRICOL"), FOREIGN KEY("BEN")
REFERENCES "ANA"."BENEFICIAR"("BEN"))
TABLESPACE "ANA";
d). Tabela TIMP (figura 4.16):
Pagina 93 din 207
Figura 4.16: Tabela TIMP
Codul SQL pentru crearea tabelei TIMP:
CREATE TABLE "ANA"."TIMP" ("TIMP_LUNA" VARCHAR2(30) NOT
NULL, "TIMP_LUNA_LLABEL" VARCHAR2(60), "TIMP_LUNA_SLABEL"
VARCHAR2(30), "TIMP_TRIM"
VARCHAR2(30), "TIMP_TRIM_LLABEL" VARCHAR2(60),
"TIMP_TRIM_SLABEL" VARCHAR2(30),
"TIMP_AN" VARCHAR2(30), "TIMP_AN_LLABEL" VARCHAR2(60),
"TIMP_AN_SLABEL" VARCHAR2(30),
"TIMP_SFARSIT_LUNA" DATE NOT NULL, "TIMP_SFARSIT_TRIM" DATE
NOT NULL, "TIMP_SFARSIT_AN" DATE NOT NULL,
"TIMP_DURATA_LUNA" NUMBER(2), "TIMP_DURATA_TRIM" NUMBER(2),
"TIMP_DURATA_AN" NUMBER(3), PRIMARY KEY("TIMP_LUNA"))
TABLESPACE "ANA";
e). Tabela BENEFICIAR (figura 4.17):
Figura 4.17: Tabela BENEFICIAR
Pagina 94 din 207
Codul SQL pentru crearea tabelei BENEFICIAR:
CREATE TABLE "ANA"."BENEFICIAR" ("BEN" VARCHAR2(30) NOT NULL,
"BEN_LLABEL" VARCHAR2(100) NOT NULL, "BEN_SLABEL"
VARCHAR2(30) NOT NULL, "LOCATIE" VARCHAR2(30) NOT NULL, "JUDET"
VARCHAR2(30) NOT NULL, "JUDET_LLABEL" VARCHAR2(60) NOT NULL,
"JUDET_SLABEL" VARCHAR2(30) NOT NULL, "TOP" VARCHAR2(30) NOT NULL,
"TOP_LLABEL" VARCHAR2(30) NOT NULL, "TOP_SLABEL" VARCHAR2(30) NOT
NULL,
"ADRESA" VARCHAR2(150) NOT NULL, "TELEFON" VARCHAR2(12) NOT
NULL, "PERSCONTACT" VARCHAR2(30) NOT NULL, "DATACONTRACTARE"
DATE NOT NULL, "AGENT" VARCHAR2(30) NOT NULL, "PRETJET"
NUMBER(10) NOT NULL, PRIMARY KEY("BEN"), FOREIGN KEY("AGENT")
REFERENCES "ANA"."AGENT"("AGENT")) TABLESPACE "ANA";
create sequence seq_beneficiar
start with 1
increment by 1
nomaxvalue;
create or replace TRIGGER trig_beneficiar
before insert on beneficiar
for each row
begin
select
CONCAT('BEN',LPAD(seq_beneficiar.nextval,5,'0')),CONCAT('BENEFICIAR
',LPAD(seq_beneficiar.nextval,5,'0')) into :new.ben, :new.ben_slabel from dual;
end;
4). Sistemul OLAP va utiliza scheme stea cu următoarele tabele de dimensiuni:
Stabilirea tabelelor de dimensiuni:
AGENT (figura 4.18):
Pagina 95 din 207
Figura 4.18: Dimensiunea AGENT
Dimensiunea AGENT este de tip normal, cu o structură ierahică pe trei nivele: Ţară,
Judeţ, Agent. Conţine numele agenţilor, judeţul şi ţara în care aceştia îşi desfăşoară
activitatea.
APARAT (figura 4.19):
Pagina 96 din 207
Figura 4.19: Dimensiunea APARAT
Dimensiunea APARAT este de tip normal, cu şapte nivele: L1=Categ (toate
aparatele), L2=Tip (tipuri aparate), L3=Matricol, L4=Ben (beneficiar), L5=Locaţie (oraş),
L6=Judeţ, L7=Ţară şi trei ierarhii: După_beneficiar (L7, L6, L5, L4, L3), După_judeţ (L7,
L6, L5, L3), Standard (L1, L2, L3).
BENEFICIAR (figura 4.20):
Figura 4.20: Dimensiunea BENEFICIAR
Dimensiunea BENEFICIAR este de tip normal, cu patru nivele: L1=Top (toţi
beneficiarii), L2=Judeţ, L3=Locaţie (oraş), L4=Ben (beneficiar) şi două ierarhii: Pe_judeţ
(L1, L2, L4), Standard (L1, L2, L3, L4).
Pagina 97 din 207
TIMP (figura 4.21):
Figura 4.21: Dimensiunea TIMP
Dimensiunea TIMP este de tip time, cu trei nivele: An, Lună, Trim (trimestru) şi o
ierarhie: Standard (An, Lună, Trim).
TIPBĂUTURĂ (figura 4.22):
Pagina 98 din 207
Figura 4.22: Dimensiunea TIPBĂUTURĂ
Dimensiunea TIPBĂUTURĂ este de tip normal, cu două nivele: L1=Categ (toate
tipurile de băuturi calde), L2=Băutură (denumirile băuturilor calde) şi o ierarhie: Standard
(L1, L2).
Tabelele de fapte:
FAPTE1 (figura 4.23)
Pagina 99 din 207
Figura 4.23: Tabela de fapte FAPTE1
Tabela FAPTE1 conţine toate combinaţiile posibile ale cheilor primare din tabelele
TIMP, APARAT, TIPBĂUTURĂ, BENEFICIAR şi AGENT, care astfel agregate returnează
o cantitate vândută nenulă. Este tabela folosită la crearea cubului CUB1, având
cheie primară compusă, iar coloanele CANT_VANDUTĂ şi PREŢ_JET reprezentând
măsurile cubului.
FAPTE2 (figura 4.24)
Figura 4.24: Tabela de fapte FAPTE2
Tabela FAPTE2 formează un produs cartezian cu cheile din tabelele TIMP şi
AGENT, fiind de o dimensiune mult mai redusă comparativ cu FAPTE1. Este tabela ce stă la
baza cubului CUB2, ce are ca măsură cuantumul beneficiarilor, evidenţiat de coloana
NR_BENEF.
FAPTE3 (figura 4.25)
Pagina 100 din 207
Figura 4.25: Tabela de fapte FAPTE3
Tabela FAPTE3 formează un produs cartezian cu cheile din tabelele TIMP şi
BENEFICIAR, fiind de o dimensiune mult mai redusă comparativ cu FAPTE1. Este tabela ce
stă la baza cubului CUB3, ce are ca măsură preţul mediu al unui jeton, evidenţiat de coloana
PREŢ_JET.
Cuburile n-dimensionale:
CUB1 (figura 4.26)
Figura 4.26: Schema topologică a cubului CUB1
Pagina 101 din 207
CUB2 (figura 4.27)
Figura 4.27: Schema topologică a cubului CUB2
CUB2 vine în completarea primului, aducând posibilitatea determinării unor statistici
coerente în funcţie de numărul de beneficiari, în funcţie de timp, agent constatator sau locaţie.
CUB3 (figura 4.28)
Figura 4.28: Schema topologică a cubului CUB3
CUB3 oferă posibilitatea determinării unor statistici coerente în funcţie de preţul
mediu al unui jeton, şi implicit valoarea băuturilor comercializate, în funcţie de timp şi
beneficiar.
Directorul măsurilor:
Odată cu crearea cubului se stabilesc şi măsurile ce fac parte din analiză. În mod
implicit, Oracle OLAP tratează drept măsuri toate coloanele de tip NUMBER ce nu sunt
cheie primară în tabela de fapte. Măsurile se depozitează într-un director aflat în Oracle
Enterprise Manager la secţiunea Warehouse / OLAP (figura 4.29), fie la crearea directorului,
fie manual ulterior.
Pagina 102 din 207
Figura 4.29: Directorul de măsuri DATE VÂNZĂRI
Interfaţa sistemului OLAP a fost construită utilizând instrumentul Jdeveloper 10g şi
este prezentată în figura 4.30.
Figura 4.30: Interfaţa sistemului OLAP
Sistemul OLAP permite următoarele tipuri de analize:
Evoluţia grafică a numărului de băuturi calde comercializate pe fiecare automat de
cafea în parte în anii 2003, 2004 şi 2005 (figura 4.31)
Pagina 103 din 207
Evoluţia grafică a numărului de băuturi calde comercializate pe tipuri de automate de
cafea, în anii analizaţi (figura 4.32)
Evoluţia grafică a numărului de băuturi calde comercializate pe zone geografice, pe
beneficiarii existenţi în fiecare din aceste zone şi pe fiecare automat de cafea în parte, în anii
analizaţi (figura 4.33)
Evoluţia grafică a numărului de băuturi calde comercializate pe fiecare agent în parte,
în anii analizaţi (figura 4.34)
Evoluţia grafică a numărului de băuturi calde comercializate pe fiecare agent în parte,
pe zone geografice şi pe fiecare tip de băutură, în anii analizaţi (figura 4.35)
Evoluţia grafică a numărului total de beneficiari deserviţi de un agent, în anii analizaţi
(figura 4.36)
Topul clienţilor, în funcţie de numărul total de băuturi comercializate, în anul 2003
(figura 4.37)
Topul clienţilor, în funcţie de numărul total de băuturi comercializate, în anul 2004
(figura 4.38)
Topul clienţilor, în funcţie de numărul total de băuturi comercializate, în anul 2005
(figura 4.39)
Topul agenţilor, în funcţie de numărul total de băuturi comercializate, în anul 2003
(figura 4.40)
Topul agenţilor, în funcţie de numărul total de băuturi comercializate, în anul 2004
(figura 4.41)
Topul agenţilor, în funcţie de numărul total de băuturi comercializate, în anul 2005
(figura 4.42)
Topul agenţilor, în funcţie de numărul de beneficiari deserviţi, în anul 2003 (figura
4.43)
Topul agenţilor, în funcţie de numărul de beneficiari deserviţi, în anul 2004 (figura
4.44)
Topul agenţilor, în funcţie de numărul de beneficiari deserviţi, în anul 2005 (figura
4.45)
Evoluţia grafică a valorii totale a băuturilor comercializate şi a preţului mediu al unui
jeton, în anii analizaţi (figura 4.46)
Pagina 104 din 207
Figura 4.31: Evoluţia numărului de băuturi calde comercializate /aparat /timp
Pagina 105 din 207
Figura 4.32: Evoluţia numărului de băuturi calde comercializate /tip aparat /timp
Pagina 106 din 207
Figura 4.33: Evoluţia numărului de băuturi calde comercializate /locaţie geografică
/beneficiar /aparat
Figura 4.34: Evoluţia numărului de băuturi calde comercializate /agent /timp
Pagina 107 din 207
Figura 4.35: Evoluţia numărului de băuturi calde comercializate /agent /locaţie
geografică /tip de băutură
Pagina 108 din 207
Figura 4.36: Numărul de beneficiari deserviţi de un agent /timp
Pagina 109 din 207
Figura 4.37: Topul clienţilor în anul 2003 în funcţie de numărul de băuturi calde
comercializate
Figura 4.38: Topul clienţilor în anul 2004 în funcţie de numărul de băuturi calde
comercializate
Pagina 110 din 207
Figura 4.39: Topul clienţilor în anul 2005 în funcţie de numărul de băuturi calde
comercializate
Pagina 111 din 207
Figura 4.40: Topul agenţilor în anul 2003 în funcţie de numărul de băuturi calde
comercializate
Pagina 112 din 207
Figura 4.41: Topul agenţilor în anul 2004 în funcţie de numărul de băuturi calde
comercializate
Pagina 113 din 207
Figura 4.42: Topul agenţilor în anul 2005 în funcţie de numărul de băuturi calde
comercializate
Pagina 114 din 207
Figura 4.43: Topul agenţilor în anul 2003 în funcţie de numărul de beneficiari
deserviţi
Pagina 115 din 207
Figura 4.44: Topul agenţilor în anul 2004 în funcţie de numărul de beneficiari
deserviţi
Pagina 116 din 207
Figura 4.45: Topul agenţilor în anul 2005 în funcţie de numărul de beneficiari
deserviţi
Pagina 117 din 207
Figura 4.46: Valoarea băuturilor comercializate şi preţul mediu
CONCLUZII
În această lucrare s-a proiectat şi s-a realizat un sistem OLAP. Pentru ca acest lucru să
fie posibil s-au studiat o serie de concepte necesare proiectării bazei de date. De asemenea,
pentru ca realizarea sistemului OLAP să fie posibilă s-au studiat şi “testat” instrumentele
Oracle Enterprise Manager cu al său OLAP Management şi JDeveloper 10g cu facilităţile
specifice pentru inteligenţa afacerii.
Oracle Enterprise Manager este un instrument uşor de utilizat atât pentru utilizatorii
experimentaţi cât şi pentru cei ce se află la început de drum. Oferă utilizatorilor wizard-uri
pentru crearea de dimensiuni, cuburi şi măsuri.
Cât despre JDeveloper 10g, acesta este un instrument bine integrat, uşor de
implementat şi cu o interfaţă prietenoasă. Nu necesită cunoştinţe avansate de Java, oferind
posibilitatea implementării în mod vizual. JDeveloper va genera o mare parte din cod,
Pagina 118 din 207
utilizatorul având deci posibilitatea să se concentreze în realizarea interfeţei, adăugând cu
uşurinţă elementele grafice necesare. De asemenea, sunt disponibile wizard-uri pentru crearea
de elemente vizuale ca: grafice, tabele sau tabele încrucişate. Iar pentru o şi mai mare
uşurinţă în dezvoltare, JDeveloper oferă wizard-uri pentru crearea de calcule, formule între
diferitele măsuri disponibile sau calcule pentru a evidenţia evoluţia anumitor măsuri într-o
perioadă de timp.
Lucrarea de faţă experimentează modul în care se poate realiza un sistem OLAP cu
noile instrumente şi tehnologii oferite de Oracle şi se doreşte a fi un ghid practic, deosebit de
necesar atât celor familiarizaţi cu vechiul Express Server, cât şi pentru aceia ce vor să
debuteze în domeniul depozitelor de date şi al inteligenţei afacerii prin utilizarea unor
instrumente de ultimă generaţie.
ANEXA 1
CODUL SURSĂ PENTRU CREAREA BAZEI DE DATE
Codul SQL şi PL/SQL folosit la crearea sistemului:
Pentru simplificarea instalării s-a creat un fişier executabil de tip BATCH,
ana_schema.bat, care se apelează din linia de comandă, primind ca parametru calea către
directorul care conţine fişierele bazei de date. În cazul de faţă:
ana_schema.bat E:\OraHome92\oradata\proiect
Conţinutul fişierului sursă ana_schema.bat cât şi al fişierelor SQL apelate din acesta
este detaliat în cele ce urmează:
ana_schema.bat – fişierul sursă de unde sunt apelate scripturile ce creează efectiv
@echo off
if "%1" == "" goto helptopic
set NLS_LANG_BIBSAVE=%NLS_LANG%
set NLS_NUMERIC_BIBSAVE=%NLS_NUMERIC_CHARACTERS%
Pagina 119 din 207
set NLS_DATE_BIBSAVE=%NLS_DATE_LANGUAGE%
set NLS_LANG=AMERICAN_AMERICA.UTF8
set NLS_NUMERIC_CHARACTERS=.,
set NLS_DATE_LANGUAGE=AMERICAN
echo \*\*\*
echo \*\*\* MAKE SURE your ORACLE_HOME, ORACLE_SID, PATH, and so on
are
echo \*\*\* set appropriately! This script must be able to utilize
echo \*\*\* sqlplus and sqlldr in order to load information into your
echo \*\*\* instance!
echo \*\*\*
echo \*\*\* This also assumes that CwMLite has already been installed.
echo \*\*\*
echo .
echo \*\*\* Next procedure will drop and recreate user ANA
echo \*\*\* Please enter the SYS AS SYSDBA password
sqlplus "sys as sysdba" @mkana.sql %1
echo Initializarea schemei ANA - creating TABLES
sqlplus ana/florea @tkgsxini1.sql
echo Incarcarea datelor in tabela AGENT
sqlplus ana/florea @loadAGENT.sql
echo Incarcarea datelor in tabela TIMP
sqlplus ana/florea @loadTIMP.sql
echo Incarcarea datelor in tabela TIPBAUTURA
sqlplus ana/florea @loadTIPBAUTURA.sql
echo Incarcarea datelor in tabela BENEFICIAR
sqlplus ana/florea @loadBENEFICIAR.sql
Pagina 120 din 207
echo Incarcarea datelor in tabela APARAT
sqlplus ana/florea @loadAPARAT.sql
echo Incarcarea datelor in tabela de fapte FAPTE1
sqlplus ana/florea @loadFAPTE1.sql
echo Incarcarea datelor in tabela de fapte FAPTE2
sqlplus ana/florea @loadFAPTE2.sql
echo Incarcarea datelor in tabela de fapte FAPTE3
sqlplus ana/florea @loadFAPTE3.sql
echo Initializarea schemei ANA - crearea DIMENSIUNILOR
sqlplus ana/florea @tkgsxini2.sql
echo Crearea cuburilor CUB1, CUB2 si CUB3 in CWM
echo sqlplus ana/florea @create_analytic_cube.sql
echo Running metadata refresh
echo \*\*\* Please enter the OLAPSYS password.
sqlplus olapsys @metadatafix.sql
echo
echo \*\*\*
echo \*\*\* DONE. Scriptul s-a terminat cu succes!
echo \*\*\*
goto end
:helptopic
echo .
echo Va rugam sa specificati locatia fisierului ce contine datele bazei cu care se
lucreaza.
echo exemplu:
Pagina 121 din 207
echo ana_schema E:\OraHome92\oradata\proiect
echo .
:end
mkana.sql – fişierul ce creează utilizatorul ANA cât şi spaţiile tabel ANA şi
ANATEMP
drop user ana cascade;
drop tablespace ana including contents;
drop tablespace anatemp including contents;
create tablespace ana datafile
'&1/ana_01.dbf' size 200M reuse autoextend on
next 16K maxsize unlimited extent management local autoallocate;
create temporary tablespace anatemp tempfile
'&1/anatemp_01.dbf' size 50M reuse autoextend
on next 10240K MAXSIZE 32767M EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 1024K;
create user ana identified by florea default tablespace ana
temporary tablespace anatemp quota unlimited on ana;
grant global query rewrite, query rewrite, unlimited tablespace,
connect, resource, dba, olap_dba, create materialized view to ana;
quit;
tkgsxini1.sql – fişierul ce creează toate tabelele, iar pentru AGENT şi BENEFICIAR
se creează câte o secvenţă şi un trigger ce ajută la auto-incrementarea cheilor primare din cele
două tabele.
Rem NAME
Rem tkgsxini1.sql - Initializarea schemei ANA
Rem
Rem DESCRIPTION
Pagina 122 din 207
Rem Crearea tabelelor si triggerelor/secventelor aferente.
Rem
CREATE TABLE "ANA"."AGENT" ("AGENT" VARCHAR2(30) NOT NULL,
"AGENT_LLABEL"
VARCHAR2(30) NOT NULL, "AGENT_SLABEL"
VARCHAR2(30) NOT NULL, "JUDET" VARCHAR2(30) NOT NULL,
"JUDET_LLABEL"
VARCHAR2(30) NOT NULL, "JUDET_SLABEL"
VARCHAR2(30) NOT NULL, "TARA" VARCHAR2(30) NOT NULL,
"TARA_LLABEL"
VARCHAR2(30) NOT NULL, "TARA_SLABEL"
VARCHAR2(30) NOT NULL, "TELEFONAG" VARCHAR2(10) NOT NULL,
"TIPCONTACT" VARCHAR2(30) NOT NULL, PRIMARY KEY("AGENT"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."BENEFICIAR" ("BEN" VARCHAR2(30) NOT NULL,
"BEN_LLABEL" VARCHAR2(100) NOT NULL, "BEN_SLABEL"
VARCHAR2(30) NOT NULL, "LOCATIE" VARCHAR2(30) NOT NULL,
"JUDET" VARCHAR2(30) NOT NULL, "JUDET_LLABEL" VARCHAR2(60)
NOT NULL, "JUDET_SLABEL" VARCHAR2(30) NOT NULL,
"TOP" VARCHAR2(30) NOT NULL, "TOP_LLABEL" VARCHAR2(30) NOT
NULL, "TOP_SLABEL" VARCHAR2(30) NOT NULL,
"ADRESA" VARCHAR2(150) NOT NULL, "TELEFON" VARCHAR2(12) NOT
NULL, "PERSCONTACT" VARCHAR2(30) NOT NULL, "DATACONTRACTARE"
DATE NOT NULL, "AGENT" VARCHAR2(30) NOT NULL, "PRETJET"
NUMBER(10) NOT NULL, PRIMARY
KEY("BEN"), FOREIGN KEY("AGENT")
REFERENCES "ANA"."AGENT"("AGENT"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."APARAT" ("MATRICOL" VARCHAR2(30) NOT
NULL,
Pagina 123 din 207
"TIP" VARCHAR2(30) NOT NULL, "TIP_LLABEL" VARCHAR2(30) NOT
NULL, "TIP_SLABEL" VARCHAR2(30) NOT NULL,
"CATEG" VARCHAR2(30) NOT NULL, "CATEG_LLABEL" VARCHAR2(30)
NOT NULL, "CATEG_SLABEL" VARCHAR2(30) NOT NULL,
"BEN" VARCHAR2(30) NOT NULL, "LOCATIE" VARCHAR2(30) NOT NULL,
"LOCATIE_LLABEL" VARCHAR2(30) NOT NULL, "LOCATIE_SLABEL"
VARCHAR2(30) NOT NULL,
"JUDET" VARCHAR2(30) NOT NULL, "JUDET_LLABEL" VARCHAR2(32)
NOT NULL, "JUDET_SLABEL" VARCHAR2(30) NOT NULL,
"TARA" VARCHAR2(10) NOT NULL, "TARA_LLABEL" VARCHAR2(30) NOT
NULL, "TARA_SLABEL" VARCHAR2(30) NOT NULL,
PRIMARY KEY("MATRICOL"), FOREIGN KEY("BEN")
REFERENCES "ANA"."BENEFICIAR"("BEN"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."TIMP" ("TIMP_LUNA" VARCHAR2(30) NOT
NULL, "TIMP_LUNA_LLABEL" VARCHAR2(60), "TIMP_LUNA_SLABEL"
VARCHAR2(30), "TIMP_TRIM"
VARCHAR2(30), "TIMP_TRIM_LLABEL" VARCHAR2(60),
"TIMP_TRIM_SLABEL" VARCHAR2(30),
"TIMP_AN" VARCHAR2(30), "TIMP_AN_LLABEL" VARCHAR2(60),
"TIMP_AN_SLABEL" VARCHAR2(30),
"TIMP_SFARSIT_LUNA" DATE NOT NULL, "TIMP_SFARSIT_TRIM" DATE
NOT NULL, "TIMP_SFARSIT_AN" DATE NOT NULL,
"TIMP_DURATA_LUNA" NUMBER(2), "TIMP_DURATA_TRIM" NUMBER(2),
"TIMP_DURATA_AN" NUMBER(3), PRIMARY KEY("TIMP_LUNA"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."TIPBAUTURA" ("BAUTURA" VARCHAR2(30) NOT
NULL,
"BAUTURA_LLABEL" VARCHAR2(30) NOT NULL, "BAUTURA_SLABEL"
VARCHAR2(30) NOT NULL,
"CATEG" VARCHAR2(30) NOT NULL,
Pagina 124 din 207
"CATEG_LLABEL" VARCHAR2(30) NOT NULL, "CATEG_SLABEL"
VARCHAR2(30) NOT NULL,
PRIMARY
KEY("BAUTURA"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."FAPTE1" ("TIMP_LEAVES" VARCHAR2(30) NOT
NULL,
"APARAT_LEAVES" VARCHAR2(30) NOT NULL ,
"BAUTURA_LEAVES" VARCHAR2(30) NOT NULL,
"BENEFICIAR_LEAVES" VARCHAR2(30) NOT NULL,
"AGENT_LEAVES" VARCHAR2(30) NOT NULL,
"CANT_VANDUTA" NUMBER(20) NOT NULL,
PRIMARY
KEY("TIMP_LEAVES","APARAT_LEAVES","BAUTURA_LEAVES",
"BENEFICIAR_LEAVES", "AGENT_LEAVES"),
CONSTRAINT "FK_BAUTURA" FOREIGN KEY("BAUTURA_LEAVES")
REFERENCES "ANA"."TIPBAUTURA"("BAUTURA"),
CONSTRAINT "FK_TIMP" FOREIGN KEY("TIMP_LEAVES")
REFERENCES "ANA"."TIMP"("TIMP_LUNA"),
CONSTRAINT "FK_BENEFICIAR" FOREIGN KEY("BENEFICIAR_LEAVES")
REFERENCES "ANA"."BENEFICIAR"("BEN"),
CONSTRAINT "FK_AGENT" FOREIGN KEY("AGENT_LEAVES")
REFERENCES "ANA"."AGENT"("AGENT"),
CONSTRAINT "FK_APARAT" FOREIGN KEY("APARAT_LEAVES")
REFERENCES "ANA"."APARAT"("MATRICOL"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."FAPTE2" ("TIMP_LEAVES" VARCHAR2(30) NOT
NULL,
"AGENT_LEAVES" VARCHAR2(30) NOT NULL,
"NR_BENEF" NUMBER(20) NOT NULL,
PRIMARY KEY("TIMP_LEAVES","AGENT_LEAVES"),
CONSTRAINT "FK_TIMP2" FOREIGN KEY("TIMP_LEAVES")
Pagina 125 din 207
REFERENCES "ANA"."TIMP"("TIMP_LUNA"),
CONSTRAINT "FK_AGENT2" FOREIGN KEY("AGENT_LEAVES")
REFERENCES "ANA"."AGENT"("AGENT"))
TABLESPACE "ANA";
CREATE TABLE "ANA"."FAPTE3" (
"BENEFICIAR_LEAVES" VARCHAR2(30) NOT NULL,
"TIMP_LEAVES" VARCHAR2(30) NOT NULL,
"PRET_JET" NUMBER(20,2) NOT NULL,
PRIMARY KEY("BENEFICIAR_LEAVES","TIMP_LEAVES"),
CONSTRAINT "FK_TIMP3" FOREIGN KEY("TIMP_LEAVES")
REFERENCES "ANA"."TIMP"("TIMP_LUNA"),
CONSTRAINT "FK_BENEFICIAR3" FOREIGN KEY("BENEFICIAR_LEAVES")
REFERENCES "ANA"."BENEFICIAR"("BEN"))
TABLESPACE "ANA";
Rem Triggers si sequences pentru autoincrementarea cheilor primare numerice
create sequence seq_agent
start with 1
increment by 1
nomaxvalue;
create or replace TRIGGER trig_agent
before insert on agent
for each row
begin
select CONCAT('AG',LPAD(seq_agent.nextval,3,'0')),CONCAT('AGENT
',LPAD(seq_agent.nextval,3,'0')) into :new.agent, :new.agent_slabel from dual;
end;
/
create sequence seq_beneficiar
start with 1
Pagina 126 din 207
increment by 1
nomaxvalue;
create or replace TRIGGER trig_beneficiar
before insert on beneficiar
for each row
begin
select
CONCAT('BEN',LPAD(seq_beneficiar.nextval,5,'0')),CONCAT('BENEFICIAR
',LPAD(seq_beneficiar.nextval,5,'0')) into :new.ben, :new.ben_slabel from dual;
end;
/
quit;
loadAGENT.sql – fişierul ce conţine liniile SQL necesare populării tabelei AGENT
INSERT INTO "ANA"."AGENT"
(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL,
TARA_SLABEL,TELEFONAG,TIPCONTACT) VALUES ('MUNTEAN
MARIAN','JUD_HUNEDOARA','Agentii din jud HUNEDOARA','HD','ROMANIA','Toti
agentii','RO','0723211301','angajat');
INSERT INTO "ANA"."AGENT"
(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL,
TARA_SLABEL,TELEFONAG,TIPCONTACT) VALUES ('KISS
OTO','JUD_HUNEDOARA','Agentii din jud HUNEDOARA','HD','ROMANIA','Toti
agentii','RO','0723211302','angajat');
INSERT INTO "ANA"."AGENT"
(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL,
TARA_SLABEL,TELEFONAG,TIPCONTACT) VALUES ('MIHUTIU
MARIUS','JUD_HUNEDOARA','Agentii din jud HUNEDOARA','HD','ROMANIA','Toti
agentii','RO','0723211303','angajat');
Pagina 127 din 207
INSERT INTO "ANA"."AGENT"
(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL,
TARA_SLABEL,TELEFONAG,TIPCONTACT) VALUES ('MARGINE
LAURENTIU','JUD_CARAS-SEVERIN','Agentii din jud CARAS-
SEVERIN','CS','ROMANIA','Toti agentii','RO','0723211331','angajat');
quit;
loadAPARAT.sql – fişierul ce conţine liniile SQL necesare populării tabelei
APARAT
INSERT INTO "ANA"."APARAT" (MATRICOL, TIP, TIP_LLABEL,
TIP_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL, BEN, LOCATIE,
LOCATIE_LLABEL, LOCATIE_SLABEL, JUDET, JUDET_LLABEL, JUDET_SLABEL,
TARA, TARA_LLABEL, TARA_SLABEL) VALUES ('10802122', 'COLIBRI', 'Model
COLIBRI', 'CO', 'AUTOMATE', 'Automate de cafea', 'AUTOMATE', 'BEN00138',
'DROBETA TR','Ap din DROBETA TR','Ap DROBETA','JUD_MEHEDINTI','Aparatele
din jud MEHEDINTI','Ap jud MH','ROMANIA','Toate aparatele','Toate');
INSERT INTO "ANA"."APARAT" (MATRICOL, TIP, TIP_LLABEL,
TIP_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL, BEN, LOCATIE,
LOCATIE_LLABEL, LOCATIE_SLABEL, JUDET, JUDET_LLABEL, JUDET_SLABEL,
TARA, TARA_LLABEL, TARA_SLABEL) VALUES ('10802199', 'COLIBRI', 'Model
COLIBRI', 'CO', 'AUTOMATE', 'Automate de cafea', 'AUTOMATE', 'BEN00140',
'DROBETA TR','Ap din DROBETA TR','Ap DROBETA','JUD_MEHEDINTI','Aparatele
din jud MEHEDINTI','Ap jud MH','ROMANIA','Toate aparatele','Toate');
INSERT INTO "ANA"."APARAT" (MATRICOL, TIP, TIP_LLABEL,
TIP_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL, BEN, LOCATIE,
LOCATIE_LLABEL, LOCATIE_SLABEL, JUDET, JUDET_LLABEL, JUDET_SLABEL,
TARA, TARA_LLABEL, TARA_SLABEL) VALUES ('12800134', 'BRIO 200', 'Model
BRIO 200', 'BR200', 'AUTOMATE', 'Automate de cafea', 'AUTOMATE', 'BEN00156',
Pagina 128 din 207
'TIMISOARA','Ap din TIMISOARA','Ap TIMISOARA','JUD_TIMIS','Aparatele din jud
TIMIS','Ap jud TM','ROMANIA','Toate aparatele','Toate');
INSERT INTO "ANA"."APARAT" (MATRICOL, TIP, TIP_LLABEL,
TIP_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL, BEN, LOCATIE,
LOCATIE_LLABEL, LOCATIE_SLABEL, JUDET, JUDET_LLABEL, JUDET_SLABEL,
TARA, TARA_LLABEL, TARA_SLABEL) VALUES ('12800146', 'BRIO 200', 'Model
BRIO 200', 'BR200', 'AUTOMATE', 'Automate de cafea', 'AUTOMATE', 'BEN00271',
'TIMISOARA','Ap din TIMISOARA','Ap TIMISOARA','JUD_TIMIS','Aparatele din jud
TIMIS','Ap jud TM','ROMANIA','Toate aparatele','Toate');
quit;
loadBENEFICIAR.sql – fişierul ce conţine liniile SQL necesare populării tabelei
BENEFICIAR
INSERT INTO "ANA"."BENEFICIAR" (BEN_LLABEL, LOCATIE, JUDET,
JUDET_LLABEL, JUDET_SLABEL, TOP, TOP_LLABEL, TOP_SLABEL, ADRESA,
TELEFON, PERSCONTACT, DATACONTRACTARE, AGENT, PRETJET) VALUES
('S.R.I. DEVA', 'DEVA', 'JUD_HUNEDOARA', 'Beneficiarii din jud HUNEDOARA', 'Benef
HD', 'ROMANIA', 'Toti beneficiarii', 'RO', 'STR.M.EMINESCU NR.130', '254/211250',
'DOBREANU VIOREL', '01-Jan-2003', 'AG001', 6000);
INSERT INTO "ANA"."BENEFICIAR" (BEN_LLABEL, LOCATIE, JUDET,
JUDET_LLABEL, JUDET_SLABEL, TOP, TOP_LLABEL, TOP_SLABEL, ADRESA,
TELEFON, PERSCONTACT, DATACONTRACTARE, AGENT, PRETJET) VALUES
('PRIMARIE DEVA', 'DEVA', 'JUD_HUNEDOARA', 'Beneficiarii din jud HUNEDOARA',
'Benef HD', 'ROMANIA', 'Toti beneficiarii', 'RO', 'PIATA UNIRII NR.4', '254/216916',
'MIRCIA MUNTEAN', '01-Jan-2003', 'AG001', 7000);
INSERT INTO "ANA"."BENEFICIAR" (BEN_LLABEL, LOCATIE, JUDET,
JUDET_LLABEL, JUDET_SLABEL, TOP, TOP_LLABEL, TOP_SLABEL, ADRESA,
TELEFON, PERSCONTACT, DATACONTRACTARE, AGENT, PRETJET) VALUES
('POMPIERI DEVA', 'DEVA', 'JUD_HUNEDOARA', 'Beneficiarii din jud HUNEDOARA',
'Benef HD', 'ROMANIA', 'Toti beneficiarii', 'RO', 'STR.G.COSBUC NR.26', '254/214220',
'CRISTEA', '01-Jan-2003', 'AG005', 6000);
Pagina 129 din 207
INSERT INTO "ANA"."BENEFICIAR" (BEN_LLABEL, LOCATIE, JUDET,
JUDET_LLABEL, JUDET_SLABEL, TOP, TOP_LLABEL, TOP_SLABEL, ADRESA,
TELEFON, PERSCONTACT, DATACONTRACTARE, AGENT, PRETJET) VALUES
('DANIELLE COMPANY DEVA', 'DEVA', 'JUD_HUNEDOARA', 'Beneficiarii din jud
HUNEDOARA', 'Benef HD', 'ROMANIA', 'Toti beneficiarii', 'RO', 'STR.RANDUNICII
NR.6', '254/222444', 'CIOCAN CRISTINA', '01-Jan-2003', 'AG001', 6000);
quit;
loadTIPBAUTURA.sql – fişierul ce conţine liniile SQL necesare populării tabelei
TIPBAUTURA
INSERT INTO "ANA"."TIPBAUTURA" (BAUTURA, BAUTURA_LLABEL,
BAUTURA_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL) VALUES ('scurta',
'Cafea scurta', 'Scurta', 'BAUTURI', 'Bauturi calde', 'BAUTURI');
INSERT INTO "ANA"."TIPBAUTURA" (BAUTURA, BAUTURA_LLABEL,
BAUTURA_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL) VALUES ('lunga',
'Cafea lunga', 'Lunga', 'BAUTURI', 'Bauturi calde', 'BAUTURI');
INSERT INTO "ANA"."TIPBAUTURA" (BAUTURA, BAUTURA_LLABEL,
BAUTURA_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL) VALUES
('culapte', 'Cafea cu lapte', 'Cu lapte', 'BAUTURI', 'Bauturi calde', 'BAUTURI');
INSERT INTO "ANA"."TIPBAUTURA" (BAUTURA, BAUTURA_LLABEL,
BAUTURA_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL) VALUES ('capp',
'Cappucino', 'Cappucino', 'BAUTURI', 'Bauturi calde', 'BAUTURI');
INSERT INTO "ANA"."TIPBAUTURA" (BAUTURA, BAUTURA_LLABEL,
BAUTURA_SLABEL, CATEG, CATEG_LLABEL, CATEG_SLABEL) VALUES
('ciocculapteness', 'Ciocolata cu lapte si ness', 'Cioc. cu lapte ness', 'BAUTURI', 'Bauturi
calde', 'BAUTURI');
quit;
Pagina 130 din 207
loadTIMP.sql – fişierul ce conţine liniile SQL necesare populării tabelei TIMP
INSERT INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL,
TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL,
TIMP_AN, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_LUNA,
TIMP_SFARSIT_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_LUNA,
TIMP_DURATA_TRIM, TIMP_DURATA_AN) VALUES ('MAY03','May
2003','05','TRIM2-03','Trimestrul 2 - 2003','Trim2 03','2003','2003','03','31-May-2003','30-
Jun-2003','31-Dec-2003',31,61,245);
INSERT INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL,
TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL,
TIMP_AN, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_LUNA,
TIMP_SFARSIT_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_LUNA,
TIMP_DURATA_TRIM, TIMP_DURATA_AN) VALUES ('JUN03','June
2003','06','TRIM2-03','Trimestrul 2 - 2003','Trim2 03','2003','2003','03','30-Jun-2003','30-Jun-
2003','31-Dec-2003',30,61,245);
INSERT INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL,
TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL,
TIMP_AN, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_LUNA,
TIMP_SFARSIT_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_LUNA,
TIMP_DURATA_TRIM, TIMP_DURATA_AN) VALUES ('JUL03','July
2003','07','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','31-Jul-2003','30-Sep-
2003','31-Dec-2003',31,92,245);
INSERT INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL,
TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL,
TIMP_AN, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_LUNA,
TIMP_SFARSIT_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_LUNA,
TIMP_DURATA_TRIM, TIMP_DURATA_AN) VALUES ('AUG03','August
2003','08','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','31-Aug-2003','30-
Sep-2003','31-Dec-2003',31,92,245);
Pagina 131 din 207
INSERT INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL,
TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL,
TIMP_AN, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_LUNA,
TIMP_SFARSIT_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_LUNA,
TIMP_DURATA_TRIM, TIMP_DURATA_AN) VALUES ('SEP03','September
2003','09','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','30-Sep-2003','30-
Sep-2003','31-Dec-2003',30,92,245);
quit;
loadFAPTE1.sql – fişierul ce conţine liniile SQL necesare populării tabelei de fapte
FAPTE1
INSERT INTO "ANA"."FAPTE1"
(TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG
ENT_LEAVES,CANT_VANDUTA) VALUES ('AUG03', '12800148', 'cafeacucioc',
'BEN00167', 'AG009', 73);
INSERT INTO "ANA"."FAPTE1"
(TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG
ENT_LEAVES,CANT_VANDUTA) VALUES ('AUG03', '12800148', 'cafeacucioc',
'BEN00167', 'AG010', 17);
INSERT INTO "ANA"."FAPTE1"
(TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG
ENT_LEAVES,CANT_VANDUTA) VALUES ('AUG03', '12800148', 'cafeacucioc',
'BEN00167', 'AG013', 1);
INSERT INTO "ANA"."FAPTE1"
(TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG
ENT_LEAVES,CANT_VANDUTA) VALUES ('AUG03', '12800148', 'capp', 'BEN00167',
'AG009', 12);
quit;
Pagina 132 din 207
loadFAPTE2.sql – fişierul ce conţine liniile SQL necesare populării tabelei de fapte
FAPTE2
INSERT INTO "ANA"."FAPTE2"
(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('AUG03','AG001',20);
INSERT INTO "ANA"."FAPTE2"
(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('DEC03','AG001',21);
INSERT INTO "ANA"."FAPTE2"
(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('JAN04','AG001',28);
INSERT INTO "ANA"."FAPTE2"
(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('JAN05','AG031',14);
quit;
loadFAPTE3.sql – fişierul ce conţine liniile SQL necesare populării tabelei de fapte
FAPTE3 - foloseşte un cursor ce preia datele necesare din tabelele FAPTE1 şi BENEFICIAR
DECLARE
vben fapte1.beneficiar_leaves%type;
vpret beneficiar.pretjet%type;
vtimp fapte1.timp_leaves%type;
CURSOR c1 IS SELECT DISTINCT beneficiar_leaves,timp_leaves,pretjet FROM
fapte1 A, beneficiar B WHERE A.beneficiar_leaves=B.ben;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO vben,vtimp,vpret;
EXIT WHEN c1%NOTFOUND;
Pagina 133 din 207
INSERT INTO fapte3 VALUES (vben,vtimp,vpret);
END LOOP;
CLOSE c1;
END;
/
commit;
quit;
tkgsxini2.sql – fişierul ce creează toate dimensiunile
Rem NAME
Rem tkgsxini2.sql - Initializarea schemei ANA
Rem
Rem DESCRIPTION
Rem Create dimensions, create indexes, analyze tables.
Rem
connect ana/florea
CREATE DIMENSION ANA.AGENT
LEVEL L1 IS AGENT.TARA
LEVEL L2 IS AGENT.JUDET
LEVEL L3 IS AGENT.AGENT
HIERARCHY STANDARD (L3 CHILD OF L2 CHILD OF L1)
ATTRIBUTE L1 DETERMINES (AGENT.TARA_LLABEL,
AGENT.TARA_SLABEL)
ATTRIBUTE L2 DETERMINES (AGENT.JUDET_LLABEL,
AGENT.JUDET_SLABEL)
ATTRIBUTE L3 DETERMINES (AGENT.AGENT_LLABEL,
AGENT.AGENT_SLABEL);
begin
Pagina 134 din 207
cwm_classify.remove_entity_descriptor_use(28, cwm_utility.DIMENSION_TYPE,
'ANA', 'AGENT');
cwm_olap_dimension.set_plural_name('ANA', 'AGENT', 'AGENT');
cwm_olap_dimension.set_default_display_hierarchy('ANA', 'AGENT',
'STANDARD');
cwm_olap_dimension.set_display_name('ANA', 'AGENT', 'AGENT');
cwm_olap_dimension.set_description('ANA', 'AGENT', 'Agent');
cwm_olap_level.set_display_name('ANA', 'AGENT', 'L1', 'L1');
cwm_olap_level.set_description('ANA', 'AGENT', 'L1', 'Toti agentii');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L1', 'TARA_LLABEL',
'TARA_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L1', 'TARA_SLABEL',
'TARA_SLABEL');
cwm_olap_level.set_display_name('ANA', 'AGENT', 'L2', 'L2');
cwm_olap_level.set_description('ANA', 'AGENT', 'L2', 'Agentii pe judete');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L2', 'JUDET_LLABEL',
'JUDET_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L2', 'JUDET_SLABEL',
'JUDET_SLABEL');
cwm_olap_level.set_display_name('ANA', 'AGENT', 'L3', 'L3');
cwm_olap_level.set_description('ANA', 'AGENT', 'L3', 'Agent');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L3', 'AGENT_LLABEL',
'AGENT_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'AGENT', 'L3', 'AGENT_SLABEL',
'AGENT_SLABEL');
cwm_olap_hierarchy.set_display_name('ANA', 'AGENT', 'STANDARD',
'STANDARD');
cwm_olap_hierarchy.set_description('ANA', 'AGENT', 'STANDARD', 'Ierarhia
Standard');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'AGENT',
'Dimensiunea_agentilor', 'Dimensiunea_agentilor', 'Dim AGENT');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'AGENT',
'Dimensiunea_agentilor');
Pagina 135 din 207
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'AGENT', 'Dim_ag',
'Dim_ag', 'Agent');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'Dim_ag');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT',
'Dimensiunea_agentilor', 'L1', 'TARA_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT', 'Dim_ag', 'L1',
'TARA_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT',
'Dimensiunea_agentilor', 'L2', 'JUDET_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT', 'Dim_ag', 'L2',
'JUDET_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT',
'Dimensiunea_agentilor', 'L3', 'AGENT_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'AGENT', 'Dim_ag', 'L3',
'AGENT_SLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L1', 'TARA_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L2', 'JUDET_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L3', 'AGENT_LLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L2', 'JUDET_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L1', 'TARA_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'L3', 'AGENT_SLABEL');
commit;
end;
/
CREATE DIMENSION ANA.BENEFICIAR
LEVEL L1 IS BENEFICIAR.TOP
Pagina 136 din 207
LEVEL L2 IS BENEFICIAR.JUDET
LEVEL L3 IS BENEFICIAR.LOCATIE
LEVEL L4 IS BENEFICIAR.BEN
HIERARCHY STANDARD (L4 CHILD OF L3 CHILD OF L2 CHILD OF L1)
HIERARCHY PE_JUDET (L4 CHILD OF L2 CHILD OF L1)
ATTRIBUTE L1 DETERMINES (BENEFICIAR.TOP_LLABEL,
BENEFICIAR.TOP_SLABEL)
ATTRIBUTE L2 DETERMINES (BENEFICIAR.JUDET_LLABEL,
BENEFICIAR.JUDET_SLABEL)
ATTRIBUTE L3 DETERMINES BENEFICIAR.LOCATIE
ATTRIBUTE L4 DETERMINES (BENEFICIAR.BEN_LLABEL,
BENEFICIAR.BEN_SLABEL);
begin
cwm_classify.remove_entity_descriptor_use(28, cwm_utility.DIMENSION_TYPE,
'ANA', 'BENEFICIAR');
cwm_olap_dimension.set_plural_name('ANA', 'BENEFICIAR', 'BENEFICIAR');
cwm_olap_dimension.set_default_display_hierarchy('ANA', 'BENEFICIAR',
'STANDARD');
cwm_olap_dimension.set_display_name('ANA', 'BENEFICIAR', 'BENEFICIAR');
cwm_olap_dimension.set_description('ANA', 'BENEFICIAR', 'Beneficiar');
cwm_olap_level.set_display_name('ANA', 'BENEFICIAR', 'L1', 'L1');
cwm_olap_level.set_description('ANA', 'BENEFICIAR', 'L1', 'Toti beneficiarii');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L1', 'TOP_LLABEL',
'TOP_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L1', 'TOP_SLABEL',
'TOP_SLABEL');
cwm_olap_level.set_display_name('ANA', 'BENEFICIAR', 'L2', 'L2');
cwm_olap_level.set_description('ANA', 'BENEFICIAR', 'L2', 'Beneficiarii pe judete');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L2', 'JUDET_LLABEL',
'JUDET_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L2', 'JUDET_SLABEL',
'JUDET_SLABEL');
cwm_olap_level.set_display_name('ANA', 'BENEFICIAR', 'L3', 'L3');
Pagina 137 din 207
cwm_olap_level.set_description('ANA', 'BENEFICIAR', 'L3', 'Beneficiarii pe
locatie');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L3', 'LOCATIE',
'LOCATIE');
cwm_olap_level.set_display_name('ANA', 'BENEFICIAR', 'L4', 'L4');
cwm_olap_level.set_description('ANA', 'BENEFICIAR', 'L4', 'Beneficiar');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L4', 'BEN_LLABEL',
'BEN_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'BENEFICIAR', 'L4', 'BEN_SLABEL',
'BEN_SLABEL');
cwm_olap_hierarchy.set_display_name('ANA', 'BENEFICIAR', 'STANDARD',
'STANDARD');
cwm_olap_hierarchy.set_description('ANA', 'BENEFICIAR', 'STANDARD', 'Ierarhia
Standard');
cwm_olap_hierarchy.set_display_name('ANA', 'BENEFICIAR', 'PE_JUDET',
'PE_JUDET');
cwm_olap_hierarchy.set_description('ANA', 'BENEFICIAR', 'PE_JUDET', 'Ierarhia
pe judete');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar', 'Dimensiunea_Beneficiar', 'Dim BENEFICIAR');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'BENEFICIAR',
'Dim_BENEF', 'Dim_BENEF', 'Beneficiar');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'Dim_BENEF');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar', 'L1', 'TOP_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR', 'Dim_BENEF',
'L1', 'TOP_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar', 'L2', 'JUDET_LLABEL');
Pagina 138 din 207
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR', 'Dim_BENEF',
'L2', 'JUDET_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar', 'L3', 'LOCATIE');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR', 'Dim_BENEF',
'L3', 'LOCATIE');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR',
'Dimensiunea_Beneficiar', 'L4', 'BEN_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR', 'Dim_BENEF',
'L4', 'BEN_SLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L1', 'TOP_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L2',
'JUDET_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L3', 'LOCATIE');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L4', 'BEN_LLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L1', 'TOP_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L2',
'JUDET_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L3', 'LOCATIE');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'BENEFICIAR', 'L4', 'BEN_SLABEL');
commit;
end;
/
CREATE DIMENSION ANA.TIMP
LEVEL AN IS TIMP.TIMP_AN
Pagina 139 din 207
LEVEL TRIM IS TIMP.TIMP_TRIM
LEVEL LUNA IS TIMP.TIMP_LUNA
HIERARCHY STANDARD (LUNA CHILD OF TRIM CHILD OF AN)
ATTRIBUTE AN DETERMINES (TIMP.TIMP_AN_LLABEL,
TIMP.TIMP_AN_SLABEL, TIMP.TIMP_SFARSIT_AN, TIMP.TIMP_DURATA_AN)
ATTRIBUTE TRIM DETERMINES (TIMP.TIMP_TRIM_LLABEL,
TIMP.TIMP_TRIM_SLABEL, TIMP.TIMP_SFARSIT_TRIM,
TIMP.TIMP_DURATA_TRIM)
ATTRIBUTE LUNA DETERMINES (TIMP.TIMP_LUNA_LLABEL,
TIMP.TIMP_LUNA_SLABEL, TIMP.TIMP_SFARSIT_LUNA,
TIMP.TIMP_DURATA_LUNA);
begin
cwm_classify.add_entity_descriptor_use(28, cwm_utility.DIMENSION_TYPE,
'ANA', 'TIMP');
cwm_olap_dimension.set_plural_name('ANA', 'TIMP', 'TIMP');
cwm_olap_dimension.set_default_display_hierarchy('ANA', 'TIMP', 'STANDARD');
cwm_olap_dimension.set_display_name('ANA', 'TIMP', 'TIMP');
cwm_olap_dimension.set_description('ANA', 'TIMP', 'Timp');
cwm_olap_level.set_display_name('ANA', 'TIMP', 'AN', 'AN');
cwm_olap_level.set_description('ANA', 'TIMP', 'AN', 'Ani');
cwm_classify.add_entity_descriptor_use(51, cwm_utility.LEVEL_TYPE, 'ANA',
'TIMP', 'AN');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'AN', 'TIMP_AN_LLABEL',
'TIMP_AN_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'AN', 'TIMP_AN_SLABEL',
'TIMP_AN_SLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'AN', 'TIMP_SFARSIT_AN',
'TIMP_SFARSIT_AN');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'AN', 'TIMP_DURATA_AN',
'TIMP_DURATA_AN');
cwm_olap_level.set_display_name('ANA', 'TIMP', 'TRIM', 'TRIM');
cwm_olap_level.set_description('ANA', 'TIMP', 'TRIM', 'Trimestre');
Pagina 140 din 207
cwm_classify.add_entity_descriptor_use(50, cwm_utility.LEVEL_TYPE, 'ANA',
'TIMP', 'TRIM');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'TRIM',
'TIMP_TRIM_LLABEL', 'TIMP_TRIM_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'TRIM',
'TIMP_TRIM_SLABEL', 'TIMP_TRIM_SLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'TRIM',
'TIMP_SFARSIT_TRIM', 'TIMP_SFARSIT_TRIM');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'TRIM',
'TIMP_DURATA_TRIM', 'TIMP_DURATA_TRIM');
cwm_olap_level.set_display_name('ANA', 'TIMP', 'LUNA', 'LUNA');
cwm_olap_level.set_description('ANA', 'TIMP', 'LUNA', 'Luni');
cwm_classify.add_entity_descriptor_use(49, cwm_utility.LEVEL_TYPE, 'ANA',
'TIMP', 'LUNA');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'LUNA',
'TIMP_LUNA_LLABEL', 'TIMP_LUNA_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'LUNA',
'TIMP_LUNA_SLABEL', 'TIMP_LUNA_SLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'LUNA',
'TIMP_SFARSIT_LUNA', 'TIMP_SFARSIT_LUNA');
cwm_olap_level_attribute.set_name('ANA', 'TIMP', 'LUNA',
'TIMP_DURATA_LUNA', 'TIMP_DURATA_LUNA');
cwm_olap_hierarchy.set_display_name('ANA', 'TIMP', 'STANDARD',
'STANDARD');
cwm_olap_hierarchy.set_description('ANA', 'TIMP', 'STANDARD', 'Ierarhia
STANDARD');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIMP',
'Dimensiunea_TIMP', 'Dimensiunea_TIMP', 'Dim TIMP');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'Dimensiunea_TIMP');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIMP', 'Dim_TIMP',
'Dim_TIMP', 'Timp');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'Dim_TIMP');
Pagina 141 din 207
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIMP', 'Data_sfarsit',
'Data_sfarsit', 'Sfarsitul intervalului');
cwm_classify.add_entity_descriptor_use(55,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'Data_sfarsit');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIMP',
'Durata_interval', 'Durata_interval', 'Durata intervalului');
cwm_classify.add_entity_descriptor_use(56,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'Durata_interval');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dimensiunea_TIMP',
'AN', 'TIMP_AN_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dim_TIMP', 'AN',
'TIMP_AN_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Data_sfarsit', 'AN',
'TIMP_SFARSIT_AN');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Durata_interval', 'AN',
'TIMP_DURATA_AN');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dimensiunea_TIMP',
'TRIM', 'TIMP_TRIM_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dim_TIMP', 'TRIM',
'TIMP_TRIM_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Data_sfarsit', 'TRIM',
'TIMP_SFARSIT_TRIM');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Durata_interval',
'TRIM', 'TIMP_DURATA_TRIM');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dimensiunea_TIMP',
'LUNA', 'TIMP_LUNA_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Dim_TIMP', 'LUNA',
'TIMP_LUNA_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Data_sfarsit', 'LUNA',
'TIMP_SFARSIT_LUNA');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIMP', 'Durata_interval',
'LUNA', 'TIMP_DURATA_LUNA');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'AN', 'TIMP_AN_LLABEL');
Pagina 142 din 207
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'TRIM',
'TIMP_TRIM_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'LUNA',
'TIMP_LUNA_LLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'AN', 'TIMP_AN_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'TRIM',
'TIMP_TRIM_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'LUNA',
'TIMP_LUNA_SLABEL');
cwm_classify.add_entity_descriptor_use(55,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'AN', 'TIMP_SFARSIT_AN');
cwm_classify.add_entity_descriptor_use(55,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'TRIM',
'TIMP_SFARSIT_TRIM');
cwm_classify.add_entity_descriptor_use(55,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'LUNA',
'TIMP_SFARSIT_LUNA');
cwm_classify.add_entity_descriptor_use(56,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'AN', 'TIMP_DURATA_AN');
cwm_classify.add_entity_descriptor_use(56,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'TRIM',
'TIMP_DURATA_TRIM');
cwm_classify.add_entity_descriptor_use(56,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'LUNA',
'TIMP_DURATA_LUNA');
commit;
end;
/
Pagina 143 din 207
CREATE DIMENSION ANA.APARAT
LEVEL L1 IS APARAT.CATEG
LEVEL L2 IS APARAT.TIP
LEVEL L3 IS APARAT.MATRICOL
LEVEL L4 IS APARAT.BEN
LEVEL L5 IS APARAT.LOCATIE
LEVEL L6 IS APARAT.JUDET
LEVEL L7 IS APARAT.TARA
HIERARCHY STANDARD (L3 CHILD OF L2 CHILD OF L1)
HIERARCHY DUPA_BENEFICIAR (L3 CHILD OF L4 CHILD OF L6 CHILD OF
L7)
HIERARCHY DUPA_LOCATIE (L3 CHILD OF L5 CHILD OF L6 CHILD OF L7)
HIERARCHY DUPA_JUDET (L3 CHILD OF L6 CHILD OF L7)
ATTRIBUTE L1 DETERMINES (APARAT.CATEG_LLABEL,
APARAT.CATEG_SLABEL)
ATTRIBUTE L2 DETERMINES (APARAT.TIP_LLABEL,
APARAT.TIP_SLABEL)
ATTRIBUTE L3 DETERMINES APARAT.MATRICOL
ATTRIBUTE L4 DETERMINES APARAT.BEN
ATTRIBUTE L5 DETERMINES (APARAT.LOCATIE_LLABEL,
APARAT.LOCATIE_SLABEL)
ATTRIBUTE L6 DETERMINES (APARAT.JUDET_LLABEL,
APARAT.JUDET_SLABEL)
ATTRIBUTE L7 DETERMINES (APARAT.TARA_LLABEL,
APARAT.TARA_SLABEL);
begin
cwm_classify.remove_entity_descriptor_use(28, cwm_utility.DIMENSION_TYPE,
'ANA', 'APARAT');
cwm_olap_dimension.set_plural_name('ANA', 'APARAT', 'APARAT');
cwm_olap_dimension.set_default_display_hierarchy('ANA', 'APARAT',
'STANDARD');
cwm_olap_dimension.set_display_name('ANA', 'APARAT', 'APARAT');
cwm_olap_dimension.set_description('ANA', 'APARAT', 'Dimensiunea APARAT');
Pagina 144 din 207
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L1', 'L1');
cwm_olap_level.set_description('ANA', 'APARAT', 'L1', 'Nivelul Categ');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L1', 'CATEG_LLABEL',
'CATEG_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L1', 'CATEG_SLABEL',
'CATEG_SLABEL');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L2', 'L2');
cwm_olap_level.set_description('ANA', 'APARAT', 'L2', 'Nivelul Tip');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L2', 'TIP_LLABEL',
'TIP_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L2', 'TIP_SLABEL',
'TIP_SLABEL');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L3', 'L3');
cwm_olap_level.set_description('ANA', 'APARAT', 'L3', 'Nivelul Matricol');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L3', 'MATRICOL',
'MATRICOL');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L4', 'L4');
cwm_olap_level.set_description('ANA', 'APARAT', 'L4', 'Nivelul Ben');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L4', 'BEN', 'BEN');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L5', 'L5');
cwm_olap_level.set_description('ANA', 'APARAT', 'L5', 'Nivelul Locatie');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L5', 'LOCATIE_LLABEL',
'LOCATIE_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L5', 'LOCATIE_SLABEL',
'LOCATIE_SLABEL');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L6', 'L6');
cwm_olap_level.set_description('ANA', 'APARAT', 'L6', 'Nivelul Judet');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L6', 'JUDET_LLABEL',
'JUDET_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L6', 'JUDET_SLABEL',
'JUDET_SLABEL');
cwm_olap_level.set_display_name('ANA', 'APARAT', 'L7', 'L7');
cwm_olap_level.set_description('ANA', 'APARAT', 'L7', 'Nivelul Tara');
Pagina 145 din 207
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L7', 'TARA_LLABEL',
'TARA_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'APARAT', 'L7', 'TARA_SLABEL',
'TARA_SLABEL');
cwm_olap_hierarchy.set_display_name('ANA', 'APARAT', 'STANDARD',
'STANDARD');
cwm_olap_hierarchy.set_description('ANA', 'APARAT', 'STANDARD', 'Ierarhia
STANDARD');
cwm_olap_hierarchy.set_display_name('ANA', 'APARAT', 'DUPA_BENEFICIAR',
'DUPA_BENEFICIAR');
cwm_olap_hierarchy.set_description('ANA', 'APARAT', 'DUPA_BENEFICIAR',
'Ierarhia dupa beneficiar');
cwm_olap_hierarchy.set_display_name('ANA', 'APARAT', 'DUPA_LOCATIE',
'DUPA_LOCATIE');
cwm_olap_hierarchy.set_description('ANA', 'APARAT', 'DUPA_LOCATIE',
'Ierarhia dupa Locatie');
cwm_olap_hierarchy.set_display_name('ANA', 'APARAT', 'DUPA_JUDET',
'DUPA_JUDET');
cwm_olap_hierarchy.set_description('ANA', 'APARAT', 'DUPA_JUDET', 'Ierarhia
dupa Judet');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'Dimensiunea_aparat', 'Aparate');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'Dimensiunea_aparat');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'APARAT',
'Dim_aparat', 'Dim_aparat', 'Aparate');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'Dim_aparat');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L1', 'CATEG_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L1',
'CATEG_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L2', 'TIP_LLABEL');
Pagina 146 din 207
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L2',
'TIP_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L3', 'MATRICOL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L3',
'MATRICOL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L4', 'BEN');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L4',
'BEN');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L5', 'LOCATIE_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L5',
'LOCATIE_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L6', 'JUDET_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L6',
'JUDET_SLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT',
'Dimensiunea_aparat', 'L7', 'TARA_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L7',
'TARA_SLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L4', 'BEN');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L1', 'CATEG_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L2', 'TIP_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L3', 'MATRICOL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L5', 'LOCATIE_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L6', 'JUDET_LLABEL');
Pagina 147 din 207
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L7', 'TARA_LLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L4', 'BEN');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L1', 'CATEG_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L2', 'TIP_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L3', 'MATRICOL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L5', 'LOCATIE_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L6', 'JUDET_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'APARAT', 'L7', 'TARA_SLABEL');
commit;
end;
/
CREATE DIMENSION ANA.TIPBAUTURA
LEVEL L1 IS TIPBAUTURA.CATEG
LEVEL L2 IS TIPBAUTURA.BAUTURA
HIERARCHY STANDARD (L2 CHILD OF L1)
ATTRIBUTE L1 DETERMINES (TIPBAUTURA.CATEG_LLABEL,
TIPBAUTURA.CATEG_SLABEL)
ATTRIBUTE L2 DETERMINES (TIPBAUTURA.BAUTURA_LLABEL,
TIPBAUTURA.BAUTURA_SLABEL);
begin
cwm_classify.remove_entity_descriptor_use(28, cwm_utility.DIMENSION_TYPE,
'ANA', 'TIPBAUTURA');
cwm_olap_dimension.set_plural_name('ANA', 'TIPBAUTURA', 'TIPBAUTURA');
Pagina 148 din 207
cwm_olap_dimension.set_default_display_hierarchy('ANA', 'TIPBAUTURA',
'STANDARD');
cwm_olap_dimension.set_display_name('ANA', 'TIPBAUTURA', 'TIPBAUTURA');
cwm_olap_dimension.set_description('ANA', 'TIPBAUTURA', 'Bautura');
cwm_olap_level.set_display_name('ANA', 'TIPBAUTURA', 'L1', 'L1');
cwm_olap_level.set_description('ANA', 'TIPBAUTURA', 'L1', 'Toate bauturile');
cwm_olap_level_attribute.set_name('ANA', 'TIPBAUTURA', 'L1',
'CATEG_LLABEL', 'CATEG_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIPBAUTURA', 'L1',
'CATEG_SLABEL', 'CATEG_SLABEL');
cwm_olap_level.set_display_name('ANA', 'TIPBAUTURA', 'L2', 'L2');
cwm_olap_level.set_description('ANA', 'TIPBAUTURA', 'L2', 'Bautura');
cwm_olap_level_attribute.set_name('ANA', 'TIPBAUTURA', 'L2',
'BAUTURA_LLABEL', 'BAUTURA_LLABEL');
cwm_olap_level_attribute.set_name('ANA', 'TIPBAUTURA', 'L2',
'BAUTURA_SLABEL', 'BAUTURA_SLABEL');
cwm_olap_hierarchy.set_display_name('ANA', 'TIPBAUTURA', 'STANDARD',
'STANDARD');
cwm_olap_hierarchy.set_description('ANA', 'TIPBAUTURA', 'STANDARD',
'Ierarhia STANDARD');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIPBAUTURA',
'Dimensiunea_BAUTURA', 'Dimensiunea_BAUTURA', 'Dim BAUTURA');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA',
'Dimensiunea_BAUTURA');
cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'TIPBAUTURA',
'Dim_BAUTURA', 'Dim_BAUTURA', 'Bautura');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA',
'Dim_BAUTURA');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIPBAUTURA',
'Dimensiunea_BAUTURA', 'L1', 'CATEG_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIPBAUTURA',
'Dim_BAUTURA', 'L1', 'CATEG_SLABEL');
Pagina 149 din 207
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIPBAUTURA',
'Dimensiunea_BAUTURA', 'L2', 'BAUTURA_LLABEL');
cwm_olap_dim_attribute.add_level_attribute('ANA', 'TIPBAUTURA',
'Dim_BAUTURA', 'L2', 'BAUTURA_SLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA', 'L1',
'CATEG_LLABEL');
cwm_classify.add_entity_descriptor_use(41,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA', 'L2',
'BAUTURA_LLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA', 'L1',
'CATEG_SLABEL');
cwm_classify.add_entity_descriptor_use(42,
cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIPBAUTURA', 'L2',
'BAUTURA_SLABEL');
commit;
end;
/
quit;
create_analytic_cube.sql – fişierul ce creează cuburile şi directorul de măsuri
set serveroutput on size 99999;
begin
dbms_output.put_line('Drop cube CUB1 prior to recreation');
cwm_olap_cube.drop_cube('ANA', 'CUB1');
dbms_output.put_line('Cube Dropped');
exception
when cwm_exceptions.cube_not_found then
dbms_output.put_line('No cube to drop');
end;
Pagina 150 din 207
/
begin
dbms_output.put_line('Drop cube CUB2 prior to recreation');
cwm_olap_cube.drop_cube('ANA', 'CUB2');
dbms_output.put_line('Cube Dropped');
exception
when cwm_exceptions.cube_not_found then
dbms_output.put_line('No cube to drop');
end;
/
begin
dbms_output.put_line('Drop cube CUB3 prior to recreation');
cwm_olap_cube.drop_cube('ANA', 'CUB3');
dbms_output.put_line('Cube Dropped');
exception
when cwm_exceptions.cube_not_found then
dbms_output.put_line('No cube to drop');
end;
/
declare
AGENT_DIM number;
APARAT_DIM number;
BENEFICIAR_DIM number;
TIMP_DIM number;
TIPBAUTURA_DIM number;
tmp number;
begin
CWM_OLAP_CUBE.Create_Cube('ANA', 'CUB1', 'CUB1', 'Cantitati vandute');
AGENT_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1', 'ANA',
'AGENT', 'AGENT');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB1', 'STANDARD',
'ANA', 'AGENT', 'AGENT');
Pagina 151 din 207
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB1', 'ANA', 'FAPTE1', 'FK_AGENT',
'L3', 'ANA', 'AGENT', 'AGENT');
APARAT_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1', 'ANA',
'APARAT', 'APARAT');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB1', 'STANDARD',
'ANA', 'APARAT', 'APARAT');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB1', 'ANA', 'FAPTE1', 'FK_APARAT',
'L3', 'ANA', 'APARAT', 'APARAT');
BENEFICIAR_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1',
'ANA', 'BENEFICIAR', 'BENEFICIAR');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB1', 'STANDARD',
'ANA', 'BENEFICIAR', 'BENEFICIAR');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB1', 'ANA', 'FAPTE1',
'FK_BENEFICIAR', 'L4', 'ANA', 'BENEFICIAR', 'BENEFICIAR');
TIMP_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1', 'ANA',
'TIMP', 'TIMP');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB1', 'STANDARD',
'ANA', 'TIMP', 'TIMP');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB1', 'ANA', 'FAPTE1', 'FK_TIMP',
'LUNA', 'ANA', 'TIMP', 'TIMP');
TIPBAUTURA_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1',
'ANA', 'TIPBAUTURA', 'TIPBAUTURA');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB1', 'STANDARD',
'ANA', 'TIPBAUTURA', 'TIPBAUTURA');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB1', 'ANA', 'FAPTE1',
'FK_BAUTURA', 'L2', 'ANA', 'TIPBAUTURA', 'TIPBAUTURA');
CWM_OLAP_MEASURE.Create_Measure('ANA', 'CUB1', 'CANT_VANDUTA',
'CANT VANDUTA', 'Numarul de bauturi vandute');
CWM_OLAP_MEASURE.Set_Column_Map('ANA', 'CUB1', 'CANT_VANDUTA',
'ANA', 'FAPTE1', 'CANT_VANDUTA');
tmp:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB1',
'CANT_VANDUTA', tmp, 'ANA', 'AGENT', 'AGENT');
tmp:= cwm_utility.create_function_usage('SUM');
Pagina 152 din 207
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB1',
'CANT_VANDUTA', tmp, 'ANA', 'APARAT', 'APARAT');
tmp:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB1',
'CANT_VANDUTA', tmp, 'ANA', 'BENEFICIAR', 'BENEFICIAR');
tmp:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB1',
'CANT_VANDUTA', tmp, 'ANA', 'TIMP', 'TIMP');
tmp:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB1',
'CANT_VANDUTA', tmp, 'ANA', 'TIPBAUTURA', 'TIPBAUTURA');
commit;
end;
/
declare
AGENT2_DIM number;
TIMP2_DIM number;
tmp2 number;
begin
CWM_OLAP_CUBE.Create_Cube('ANA', 'CUB2', 'CUB2', 'Numarul de
beneficiari');
AGENT2_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB2', 'ANA',
'AGENT', 'AGENT');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB2', 'STANDARD',
'ANA', 'AGENT', 'AGENT');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB2', 'ANA', 'FAPTE2', 'FK_AGENT2',
'L3', 'ANA', 'AGENT', 'AGENT');
TIMP2_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB2', 'ANA',
'TIMP', 'TIMP');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB2', 'STANDARD',
'ANA', 'TIMP', 'TIMP');
Pagina 153 din 207
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB2', 'ANA', 'FAPTE2', 'FK_TIMP2',
'LUNA', 'ANA', 'TIMP', 'TIMP');
CWM_OLAP_MEASURE.Create_Measure('ANA', 'CUB2', 'NR_BENEF', 'NR
BENEF', 'Numarul de beneficiari vizitati de un agent in unitatea de timp');
CWM_OLAP_MEASURE.Set_Column_Map('ANA', 'CUB2', 'NR_BENEF', 'ANA',
'FAPTE2', 'NR_BENEF');
tmp2:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB2', 'NR_BENEF',
tmp2, 'ANA', 'AGENT', 'AGENT');
tmp2:= cwm_utility.create_function_usage('SUM');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB2', 'NR_BENEF',
tmp2, 'ANA', 'TIMP', 'TIMP');
commit;
end;
/
declare
BENEFICIAR3_DIM number;
TIMP3_DIM number;
tmp3 number;
begin
CWM_OLAP_CUBE.Create_Cube('ANA', 'CUB3', 'CUB3', 'Pretul mediu al unui
jeton');
BENEFICIAR3_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB3',
'ANA', 'BENEFICIAR', 'BENEFICIAR');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB3', 'STANDARD',
'ANA', 'BENEFICIAR', 'BENEFICIAR');
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB3', 'ANA', 'FAPTE3',
'FK_BENEFICIAR3', 'L4', 'ANA', 'BENEFICIAR', 'BENEFICIAR');
TIMP3_DIM := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB3', 'ANA',
'TIMP', 'TIMP');
CWM_OLAP_CUBE.Set_Default_Calc_Hierarchy('ANA', 'CUB3', 'STANDARD',
'ANA', 'TIMP', 'TIMP');
Pagina 154 din 207
CWM_OLAP_CUBE.Map_Cube('ANA', 'CUB3', 'ANA', 'FAPTE3', 'FK_TIMP3',
'LUNA', 'ANA', 'TIMP', 'TIMP');
CWM_OLAP_MEASURE.Create_Measure('ANA', 'CUB3', 'PRET_JET', 'PRET
JET', 'Pretul mediu al unui jeton');
CWM_OLAP_MEASURE.Set_Column_Map('ANA', 'CUB3', 'PRET_JET', 'ANA',
'FAPTE3', 'PRET_JET');
tmp3:= cwm_utility.create_function_usage('AVG');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB3', 'PRET_JET',
tmp3, 'ANA', 'BENEFICIAR', 'BENEFICIAR');
tmp3:= cwm_utility.create_function_usage('AVG');
cwm_olap_measure.set_default_aggregation_method('ANA', 'CUB3', 'PRET_JET',
tmp3, 'ANA', 'TIMP', 'TIMP');
commit;
end;
/
declare
id number;
id2 number;
begin
id := CWM_CLASSIFY.Create_Catalog('DATE VANZARI', 'Masurile cantitate
vanduta si pret jeton', null);
CWM_CLASSIFY.Add_Catalog_Entity(id, 'ANA', 'CUB1', 'CANT_VANDUTA');
CWM_CLASSIFY.Add_Catalog_Entity(id, 'ANA', 'CUB2', 'NR_BENEF');
CWM_CLASSIFY.Add_Catalog_Entity(id, 'ANA', 'CUB3', 'PRET_JET');
commit;
end;
/
quit;
metadatafix.sql – fişierul ce apelează comanda de reactualizare a obiectelor OLAP,
fiind necesară apelarea manuală a acestuia de fiecare dată când se intervine asupra
dimensiunilor, cuburilor sau măsurilor
Pagina 155 din 207
execute cwm2_olap_metadata_refresh.mr_refresh;
commit;
quit;
Pagina 156 din 207
ANEXA 2
CODUL SCRIS ÎN LIMBAJUL JAVA
Interfaţa sistemului OLAP a fost realizată cu instrumentul JDeveloper 10g. În această
anexă sunt prezentate principalele frame-uri ale aplicaţiei, elementele lor componente,
precum şi codul scris în Java.
1. Frame-ul principal:
meniul aplicaţiei (figura a2.1)
Figura a2.1: Meniul aplicaţiei
codul scris în Java:
package mypackage1;
import java.awt.BorderLayout;
import java.awt.Dimension;
Pagina 157 din 207
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.util.Hashtable;
import java.util.Vector;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Icon;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import oracle.bali.ewt.olaf.OracleLookAndFeel;
import oracle.bali.ewt.dialog.JEWTDialog;
import oracle.bali.ewt.util.WindowUtils;
import oracle.bali.share.nls.StringUtils;
Pagina 158 din 207
import oracle.dss.appmodule.client.BISession;
import oracle.dss.bicontext.BIFilter;
import oracle.dss.bicontext.BISearchResult;
import oracle.dss.bicontext.BISearchControls;
import oracle.dss.bicontext.ManagerFactory;
import oracle.dss.calculation.client.calcBuilder.CalcBuilderStepStorage;
import oracle.dss.crosstab.Crosstab;
import oracle.dss.crosstab.CrosstabPrinter;
import oracle.dss.crosstab.UICrosstab;
import oracle.dss.dataSource.common.QueryException;
import oracle.dss.dataSource.common.Query;
import oracle.dss.dataSource.client.QueryManager;
import oracle.dss.datautil.QueryAccess;
import oracle.dss.datautil.QueryContext;
import oracle.dss.dataView.Dataview;
import oracle.dss.dataView.ViewPrinter;
import oracle.dss.dataView.gui.PrintDialog;
import oracle.dss.dataView.gui.ToolBar;
import oracle.dss.graph.Graph;
import oracle.dss.graph.GraphPrinter;
import oracle.dss.graph.gui.GraphLayout;
import oracle.dss.graph.gui.GraphToolBar;
import oracle.dss.gridView.UIGridView;
import oracle.dss.gridView.gui.ExportPanel;
import oracle.dss.gridView.gui.GridViewToolBar;
Pagina 159 din 207
import oracle.dss.metadataManager.common.MDMeasure;
import oracle.dss.metadataManager.common.MDRoot;
import oracle.dss.metadataManager.client.MetadataManager;
import oracle.dss.metadataManager.common.MetadataManagerException;
import oracle.dss.metadataManager.common.MM;
import oracle.dss.persistence.gui.PersistenceObjectChooser;
import oracle.dss.persistence.gui.PersistenceObjectFilter;
import oracle.dss.persistence.persistencemanager.common.PersistenceManager;
import oracle.dss.queryBuilder.QueryBuilder;
import oracle.dss.selection.Selection;
import oracle.dss.selection.SelectionException;
import oracle.dss.selection.step.InvalidStepArgException;
import oracle.dss.selection.step.MemberStep;
import oracle.dss.table.Table;
import oracle.dss.table.TablePrinter;
import oracle.dss.table.UITable;
import oracle.dss.util.BIException;
import oracle.dss.util.LayoutContext;
import oracle.dss.util.LayerMetadataMap;
import oracle.dss.util.gui.BIExceptionDialog;
import oracle.dss.util.gui.layout.CrosstabLayout;
import oracle.dss.util.gui.layout.Layout;
import oracle.dss.util.gui.layout.TableLayout;
import oracle.dss.util.persistence.PersistableConstants;
import oracle.dss.addins.runtime.beanRef.CrosstabRef;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import java.awt.Color;
import oracle.dss.addins.runtime.beanRef.GraphRef;
Pagina 160 din 207
import oracle.dss.addins.runtime.beanRef.DefinitionInfo;
import javax.swing.JButton;
import java.awt.Font;
import javax.swing.DefaultButtonModel;
import javax.swing.JToggleButton.ToggleButtonModel;
import java.awt.SystemColor;
public class BIApplication1 extends JFrame {
// All the menu title with the mnmonic keys.
// You can put these String into a resource files for
// international supoport.
private static final String FILE = "&Optiuni";
private static final String TOOLS = "&Tools";
private static final String HELP = "&Help";
private static final String FILE_OPEN = "&Deschide...";
private static final String FILE_SAVE = "&Salveaza";
private static final String FILE_SAVEAS = "S&alveaza ca...";
private static final String FILE_PRINT = "&Tipareste...";
private static final String FILE_EXPORT = "&Exporta...";
private static final String FILE_EXIT = "&Iesire";
private static final String TOOLS_QB = "Edit &Query...";
private static final String TOOLS_CB = "Insert &Calculation...";
public static final String DEFAULT_TITLE = "Aplicatie OLAP!!!";
// By passing in the config file to the BI Session you can externalize
// all the connection information in the specified config file. You can
// then call the getManagerFactory on the BI Session to get to the other
// managers like the QueryManager or the PersistenceManager. The BI Session
// will read the connection information from the config file, create the
// appropriate manager and return it to you. Search this class for
// 'getManagerFactory' for examples.
Pagina 161 din 207
String m_configFile = "/Project1OLAPConfig1.xml";
BISession m_biSession = new BISession(getConfigFile());
// By default we create and track a single Presentation in this class.
// Given that all the Presentation beans are derived from the Dataview
// class it makes it easier to use a single variable for any type
// of Presentation.
// Search for 'instance of' in this class for examples.
// these two variables keep track of the view that is displayed and
// it's relative path + name
Dataview m_activeView = null;
String m_activeViewPath = null;
boolean m_bMDMset = false;
boolean m_bConnected = false;
JPanel m_pnlBars = new JPanel();
JPanel m_pnlView = new JPanel();
ToolBar m_toolbarGraph = null;
ToolBar m_toolbarGridView = null;
JMenuBar m_menubar = new JMenuBar();
JMenu m_mnuFile = new JMenu();
JMenuItem m_mnuOpen = new JMenuItem();
JMenuItem m_mnuSave = new JMenuItem();
JMenuItem m_mnuSaveAs = new JMenuItem();
JMenuItem m_mnuPrint = new JMenuItem();
JMenuItem m_mnuExport = new JMenuItem();
JMenuItem m_mnuExit = new JMenuItem();
private JMenu jMenu1 = new JMenu();
private JMenuItem jMenuItem1 = new JMenuItem();
Frame frame1 = new Frame1();
Frame frame2 = new Frame2();
Frame frame3 = new Frame3();
Frame frame4 = new Frame4();
Pagina 162 din 207
Frame frame5 = new Frame5();
Frame frame6 = new Frame6();
Frame frame7 = new Frame7();
Frame frame8 = new Frame8();
Frame frame9 = new Frame9();
Frame frame10 = new Frame10();
Frame frame11 =new Frame11();
Frame frame12 =new Frame12();
Frame frame13 =new Frame13();
Frame frame14 =new Frame14();
Frame frame15 =new Frame15();
Frame frame16 =new Frame16();
private JMenuItem jMenuItem3 = new JMenuItem();
private JMenuItem jMenuItem4 = new JMenuItem();
private JMenuItem jMenuItem5 = new JMenuItem();
private JMenuItem jMenuItem6 = new JMenuItem();
private JMenuItem jMenuItem7 = new JMenuItem();
private JMenu jMenu2 = new JMenu();
private JMenuItem jMenuItem8 = new JMenuItem();
private JMenuItem jMenuItem12 = new JMenuItem();
private JMenuItem jMenuItem13 = new JMenuItem();
private JMenu jMenu3 = new JMenu();
private JMenuItem jMenuItem9 = new JMenuItem();
private JMenuItem jMenuItem14 = new JMenuItem();
private JMenuItem jMenuItem15 = new JMenuItem();
private JMenu jMenu4 = new JMenu();
private JMenuItem jMenuItem10 = new JMenuItem();
private JMenuItem jMenuItem11 = new JMenuItem();
private JMenuItem jMenuItem16 = new JMenuItem();
private JMenuItem jMenuItem17 = new JMenuItem();
public BIApplication1() {
try {
Pagina 163 din 207
// it's important to put all the UI hook up code into jbInit because
// then JDeveloper's UI Designer can allow visual editing of the UI.
jbInit();
}
catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
private void jbInit() throws Exception {
this.setSize(new Dimension(700, 700));
m_pnlView.setLayout(new GridLayout());
this.getContentPane().add(m_pnlView, null);
m_pnlBars.setLayout(new BorderLayout());
this.getContentPane().add(m_pnlBars, null);
this.setJMenuBar(m_menubar);
m_mnuFile.setText("Optiuni");
m_mnuFile.setMnemonic(StringUtils.getMnemonicKeyCode(FILE));
m_menubar.add(m_mnuFile);
jMenu1.add(jMenuItem1);
jMenu1.add(jMenuItem3);
jMenu1.add(jMenuItem4);
jMenu1.add(jMenuItem5);
jMenu1.add(jMenuItem6);
jMenu1.addSeparator();
jMenu1.add(jMenuItem7);
jMenu1.addSeparator();
jMenu2.add(jMenuItem8);
jMenu2.add(jMenuItem12);
jMenu2.add(jMenuItem13);
jMenu1.add(jMenu2);
jMenu1.addSeparator();
Pagina 164 din 207
jMenu3.add(jMenuItem9);
jMenu3.add(jMenuItem14);
jMenu3.add(jMenuItem15);
jMenu1.add(jMenu3);
jMenu4.add(jMenuItem10);
jMenu4.add(jMenuItem11);
jMenu4.add(jMenuItem16);
jMenu1.add(jMenu4);
jMenu1.addSeparator();
jMenu1.add(jMenuItem17);
m_menubar.add(jMenu1);
m_mnuOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuOpen_ActionPerformed(e);
}
}
);
m_mnuSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuSave_ActionPerformed(e);
}
}
);
m_mnuSaveAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuSaveAs_ActionPerformed(e);
}
}
);
m_mnuPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuPrint_ActionPerformed(e);
}
}
Pagina 165 din 207
);
m_mnuExport.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuExport_ActionPerformed(e);
}
}
);
m_mnuExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mnuExit_ActionPerformed(e);
}
}
);
m_mnuOpen.setText("Deschide...");
m_mnuOpen.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_OPEN));
m_mnuFile.add(m_mnuOpen);
m_mnuFile.addSeparator();
m_mnuSave.setText("Salveaza");
m_mnuSave.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_SAVE));
m_mnuFile.add(m_mnuSave);
m_mnuSaveAs.setText("Salveaza ca...");
m_mnuSaveAs.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_SAVEAS));
m_mnuFile.add(m_mnuSaveAs);
m_mnuFile.addSeparator();
m_mnuPrint.setText("Tipareste...");
m_mnuPrint.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_PRINT));
m_mnuFile.add(m_mnuPrint);
m_mnuFile.addSeparator();
m_mnuExport.setText("Exporta...");
m_mnuExport.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_EXPORT));
m_mnuFile.add(m_mnuExport);
m_mnuFile.addSeparator();
m_mnuExit.setText("Iesire");
m_mnuExit.setMnemonic(StringUtils.getMnemonicKeyCode(FILE_EXIT));
Pagina 166 din 207
m_mnuFile.add(m_mnuExit);
m_toolbarGraph = new GraphToolBar();
m_toolbarGridView = new GridViewToolBar();
jMenuItem17.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem17_actionPerformed(e);
}
});
jMenuItem16.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem16_actionPerformed(e);
}
});
jMenuItem11.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem11_actionPerformed(e);
}
});
jMenuItem10.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem10_actionPerformed(e);
}
});
jMenuItem16.setBorderPainted(true);
jMenuItem16.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem11.setBorderPainted(true);
Pagina 167 din 207
jMenuItem11.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem10.setBorderPainted(true);
jMenuItem10.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem15.setBorderPainted(true);
jMenuItem15.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem14.setBorderPainted(true);
jMenuItem14.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem9.setBorderPainted(true);
jMenuItem9.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem13.setBorderPainted(true);
jMenuItem13.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem12.setBorderPainted(true);
jMenuItem12.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem8.setBorderPainted(true);
jMenuItem17.setBorderPainted(true);
jMenuItem17.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenu4.setBorderPainted(true);
jMenu4.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenu3.setBorderPainted(true);
jMenu3.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenu2.setBorderPainted(true);
jMenu2.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem7.setBorderPainted(true);
jMenuItem7.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem6.setBorderPainted(true);
jMenuItem6.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem5.setBorderPainted(true);
jMenuItem5.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem4.setBorderPainted(true);
jMenuItem4.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem3.setBorderPainted(true);
jMenuItem3.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem1.setBorderPainted(true);
jMenuItem1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
Pagina 168 din 207
jMenu1.setBorderPainted(true);
m_mnuExit.setBorderPainted(true);
m_mnuExit.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuExport.setBorderPainted(true);
m_mnuExport.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuPrint.setBorderPainted(true);
m_mnuPrint.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuSaveAs.setBorderPainted(true);
m_mnuSaveAs.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuSave.setBorderPainted(true);
m_mnuSave.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuFile.setBorderPainted(true);
m_mnuOpen.setBorderPainted(true);
m_mnuOpen.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem16.setForeground(Color.white);
jMenuItem16.setFont(new Font("Tahoma", 1, 11));
jMenuItem16.setBackground(Color.gray);
jMenuItem11.setBackground(Color.gray);
jMenuItem11.setForeground(Color.white);
jMenuItem11.setFont(new Font("Tahoma", 1, 11));
jMenuItem10.setForeground(Color.white);
jMenuItem10.setFont(new Font("Tahoma", 1, 11));
jMenuItem10.setBackground(Color.gray);
jMenuItem17.setForeground(Color.white);
jMenuItem17.setFont(new Font("Tahoma", 1, 11));
jMenuItem17.setBackground(Color.darkGray);
jMenuItem17.setText("Pretul mediu si valoare bauturi comercializate");
jMenuItem16.setText("Topul agentilor in anul 2005 in functie de numarul de
beneficiari");
jMenuItem11.setText("Topul agentilor in anul 2004 in functie de numarul de
beneficiari");
jMenuItem10.setText("Topul agentilor in anul 2003 in functie de numarul de
beneficiari");
jMenu4.setBackground(Color.darkGray);
Pagina 169 din 207
jMenu4.setFont(new Font("Tahoma", 1, 11));
jMenu4.setForeground(Color.white);
jMenu4.setText("Topul agentilor in functie de numarul de beneficiari");
jMenuItem15.setForeground(Color.white);
jMenuItem15.setFont(new Font("Tahoma", 1, 11));
jMenuItem15.setBackground(Color.gray);
jMenuItem14.setForeground(Color.white);
jMenuItem14.setFont(new Font("Tahoma", 1, 11));
jMenuItem14.setBackground(Color.gray);
jMenuItem9.setForeground(Color.white);
jMenuItem9.setFont(new Font("Tahoma", 1, 11));
jMenuItem9.setBackground(Color.gray);
jMenuItem15.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem15_actionPerformed(e);
}
});
jMenuItem14.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem14_actionPerformed(e);
}
});
jMenuItem9.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem9_actionPerformed(e);
}
});
jMenuItem13.setForeground(Color.white);
Pagina 170 din 207
jMenuItem13.setFont(new Font("Tahoma", 1, 11));
jMenuItem12.setForeground(Color.white);
jMenuItem12.setFont(new Font("Tahoma", 1, 11));
jMenuItem8.setForeground(Color.white);
jMenuItem8.setFont(new Font("Tahoma", 1, 11));
jMenuItem13.setBackground(Color.gray);
jMenuItem12.setBackground(Color.gray);
jMenuItem8.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenuItem8.setBackground(Color.gray);
jMenuItem13.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem13_actionPerformed(e);
}
});
jMenuItem12.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem12_actionPerformed(e);
}
});
jMenuItem8.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem8_actionPerformed(e);
}
});
jMenuItem15.setText("Topul agentilor in anul 2005 in functie de numarul de bauturi
calde " + "comercializate");
jMenuItem14.setText("Topul agentilor in anul 2004 in functie de numarul de bauturi
calde " + "comercializate");
Pagina 171 din 207
jMenuItem9.setText("Topul agentilor in anul 2003 in functie de numarul de bauturi
calde " + "comercializate");
jMenu3.setBackground(Color.darkGray);
jMenu3.setFont(new Font("Tahoma", 1, 11));
jMenu3.setForeground(Color.white);
jMenu3.setText("Topul agentilor in functie de numarul de bauturi calde
comercializate");
jMenuItem13.setText("Topul clientilor in anul 2005 in functie de numarul de bauturi
calde " + "comercializate");
jMenuItem12.setText("Topul clientilor in anul 2004 in functie de numarul de bauturi
calde " + "comercializate");
jMenuItem8.setText("Topul clientilor in anul 2003 in functie de numarul de bauturi
calde " + "comercializate");
jMenu2.setBackground(Color.darkGray);
jMenu2.setFont(new Font("Tahoma", 1, 11));
jMenu2.setForeground(Color.white);
jMenu2.setText("Topul clientilor in functie de numarul de bauturi calde
comercializate");
m_toolbarGraph.setSize(new Dimension(550, 300));
jMenuItem7.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem7_actionPerformed(e);
}
});
this.setResizable(false);
jMenuItem6.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem6_actionPerformed(e);
}
});
Pagina 172 din 207
jMenuItem5.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem5_actionPerformed(e);
}
});
jMenuItem4.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem4_actionPerformed(e);
}
});
jMenuItem3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem3_actionPerformed(e);
}
});
m_mnuOpen.setBounds(new Rectangle(0, 0, 111, 17));
m_mnuSave.setBounds(new Rectangle(0, 0, 111, 17));
m_mnuSaveAs.setBounds(new Rectangle(0, 0, 111, 17));
m_mnuPrint.setBounds(new Rectangle(0, 0, 99, 17));
m_mnuExport.setBounds(new Rectangle(0, 0, 89, 17));
m_mnuExit.setBounds(new Rectangle(0, 0, 69, 17));
m_mnuFile.setLayout(null);
m_menubar.setBackground(Color.white);
m_menubar.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuFile.setModel(new DefaultButtonModel());
m_mnuFile.setToolTipText("null");
jMenuItem7.setForeground(Color.white);
jMenuItem7.setFont(new Font("Tahoma", 1, 11));
Pagina 173 din 207
jMenuItem7.setBackground(Color.darkGray);
jMenuItem6.setForeground(Color.white);
jMenuItem6.setFont(new Font("Tahoma", 1, 11));
jMenuItem6.setBackground(Color.darkGray);
jMenuItem5.setForeground(Color.white);
jMenuItem5.setFont(new Font("Tahoma", 1, 11));
jMenuItem5.setBackground(Color.darkGray);
jMenuItem4.setForeground(Color.white);
jMenuItem4.setFont(new Font("Tahoma", 1, 11));
jMenuItem4.setBackground(Color.darkGray);
jMenuItem3.setForeground(Color.white);
jMenuItem3.setFont(new Font("Tahoma", 1, 11));
jMenuItem3.setBackground(Color.darkGray);
jMenuItem1.setForeground(Color.white);
jMenuItem1.setFont(new Font("Tahoma", 1, 11));
jMenuItem1.setBackground(Color.darkGray);
jMenu1.setForeground(Color.gray);
jMenu1.setFont(new Font("Tahoma", 1, 11));
jMenu1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jMenu1.setBackground(Color.white);
m_mnuExit.setForeground(Color.white);
m_mnuExit.setFont(new Font("Tahoma", 1, 11));
m_mnuExit.setBackground(Color.darkGray);
m_mnuExport.setBackground(Color.darkGray);
m_mnuExport.setForeground(Color.white);
m_mnuExport.setFont(new Font("Tahoma", 1, 11));
m_mnuPrint.setForeground(Color.white);
m_mnuPrint.setFont(new Font("Tahoma", 1, 11));
m_mnuPrint.setBackground(Color.darkGray);
m_mnuSaveAs.setForeground(Color.white);
m_mnuSaveAs.setFont(new Font("Tahoma", 1, 11));
m_mnuSaveAs.setBackground(Color.darkGray);
m_mnuSave.setForeground(Color.white);
m_mnuSave.setFont(new Font("Tahoma", 1, 11));
Pagina 174 din 207
m_mnuSave.setBackground(Color.darkGray);
m_mnuFile.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_mnuOpen.setForeground(Color.white);
m_mnuOpen.setFont(new Font("Tahoma", 1, 11));
m_mnuOpen.setBackground(Color.darkGray);
m_mnuFile.setForeground(Color.gray);
m_mnuFile.setFont(new Font("Tahoma", 1, 11));
m_mnuFile.setBackground(Color.white);
jMenuItem7.setText("Numarul de beneficiari deserviti de un agent");
jMenuItem6.setText("Evolutia numarului de bauturi /tip de bautura /locatie
geografica");
jMenuItem5.setText("Evolutia numarului de bauturi calde /agent");
jMenuItem4.setText("Evolutia numarului de bauturi calde /locatie geografica
/beneficiar " + "/aparat");
jMenuItem3.setText("Evolutia numarului de bauturi calde /tip de aparat");
m_pnlView.setBounds(new Rectangle(0, 0, 590, 500));
m_pnlView.setMinimumSize(new Dimension(700, 700));
m_pnlView.setBackground(Color.white);
m_pnlView.setSize(new Dimension(500, 500));
this.setBackground(Color.lightGray);
jMenuItem1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jMenuItem1_actionPerformed(e);
}
});
jMenuItem1.setText("Evolutia numarului de bauturi calde /aparat");
jMenu1.setText("Tipuri de analize");
m_pnlView.setBorder(BorderFactory.createLineBorder(Color.black, 1));
m_pnlBars.setBounds(new Rectangle(0, 0, 550, 1));
this.getContentPane().setLayout(null);
m_pnlView.setPreferredSize(new Dimension(700, 700));
Pagina 175 din 207
setTitle("Aplicatie OLAP");
}
public JFrame getFrame() {
return this;
}
private BISession getBISession() {
return m_biSession;
}
private String getConfigFile() {
return m_configFile;
}
private Dataview getActiveDataview() {
return m_activeView;
}
private void setActiveDataviewPath(String strPath) {
m_activeViewPath = strPath;
updateTitle();
}
private String getActiveDataviewPath() {
return m_activeViewPath;
}
// getPersistenceManager should only be used for importing and exporting
// from the BI Beans catalog.
//
private PersistenceManager getPersistenceManager() throws Throwable{
Pagina 176 din 207
ManagerFactory mf = getBISession().getManagerFactory();
PersistenceManager pm = null;
if (mf != null) {
pm = (PersistenceManager) mf.lookupManager(
ManagerFactory.PERSISTENCE_MANAGER, null, true);
}
return pm;
}
private MDRoot getRootFolder() throws Throwable {
MetadataManager mdm = getMetadataManager();
return mdm.getMDRoot();
}
private MetadataManager getMetadataManager() throws Exception {
// By using a config file we can use the ManagerFactory on the
// BISession that will allow us to easily get at the individual
// pieces
ManagerFactory mf = getBISession().getManagerFactory();
MetadataManager mdm = null;
if (mf != null) {
mdm = (MetadataManager) mf.lookupManager(
ManagerFactory.METADATA_MANAGER, null, true);
// Attach should only be called once and it is only necessary
// for the MetadataManager
if (mdm != null) {
int iAttachStatus = mdm.getAttachStatus();
if ((iAttachStatus != MM.ATTACHED) &&
Pagina 177 din 207
(iAttachStatus != MM.ATTACHING))
mdm.attach();
}
m_bConnected = true;
}
return mdm;
}
private QueryManager getQueryManager() throws Throwable {
ManagerFactory mf = getBISession().getManagerFactory();
QueryManager qm = null;
if (mf != null) {
qm = (QueryManager) mf.lookupManager(
ManagerFactory.QUERY_MANAGER, null, true);
// for now we have to set the MDM the very first time
if (!m_bMDMset) {
MetadataManager mdm = getMetadataManager();
if (mdm != null)
qm.setMetadataManager(mdm);
m_bMDMset = true;
}
}
return qm;
}
public String[][] getParameterInfo() {
return null;
Pagina 178 din 207
}
public void displayView(String strPath, Dataview dv) {
m_pnlView.removeAll();
m_pnlView.add(dv);
m_pnlView.validate();
// update the state variables that track the active view
m_activeView = dv;
m_activeViewPath = strPath;
updateTitle();
m_pnlBars.remove(m_toolbarGraph);
m_pnlBars.remove(m_toolbarGridView);
if (dv instanceof Graph) {
m_toolbarGraph.setDataView(dv);
m_pnlBars.add(m_toolbarGraph, BorderLayout.SOUTH);
}
else {
m_toolbarGridView.setDataView(dv);
m_pnlBars.add(m_toolbarGridView, BorderLayout.SOUTH);
}
}
void updateTitle() {
// update the title of the frame to include the name of the
// application + the name of the currently opened view. Note that
// the path can be null in the case a new view is created
String strTitle = DEFAULT_TITLE;
String strPath = getActiveDataviewPath();
if (strPath != null)
strTitle += " - " + strPath;
Pagina 179 din 207
if (getFrame() != null)
getFrame().setTitle(strTitle);
}
void showErrorMessage(String strMsg, Throwable t) {
String strTitle = DEFAULT_TITLE;
if (getFrame() != null)
strTitle = getFrame().getTitle();
if (t != null) {
strMsg += "\n\n" + t.getMessage();
if ( t instanceof BIException ) {
Throwable cause = ((BIException)t).getBIRootCause();
strMsg += "\n" + cause.getLocalizedMessage();
}
BIExceptionDialog biExceptionDialog = new BIExceptionDialog(getFrame(),
t,
strTitle,
strMsg,
null);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
biExceptionDialog.setSize((int)(d.width * 0.8), (int)(d.height * 0.4));
biExceptionDialog.display();
biExceptionDialog.dispose();
biExceptionDialog = null;
t.printStackTrace();
}
else {
JOptionPane.showMessageDialog(getFrame(), strMsg, strTitle,
Pagina 180 din 207
JOptionPane.ERROR_MESSAGE);
}
}
// helpers for opening, saving, and doing a save as
boolean saveView(String strName, Dataview dv) {
try {
MetadataManager mdm = getMetadataManager();
// calling rebind will work even if the object specified by the path
// name specified in strName wasn't saved before. All the sub-folders
// must exist though
MDRoot root = getRootFolder();
root.rebind(strName, dv);
}
catch (Throwable t) {
String strMsg = "Incapabil sa salveze: " + strName;
showErrorMessage(strMsg, t);
return false;
}
return true;
}
boolean saveAsActiveView(String strName) {
if (strName == null || strName.length() == 0) {
String strMsg = "Nu ati specificat numele. Incapabil sa salveze.";
showErrorMessage(strMsg, null);
return false;
}
Pagina 181 din 207
if (getActiveDataview() == null) {
String strMsg = "Nu este nimic activ. Incapabil sa salveze.";
showErrorMessage(strMsg, null);
return false;
}
// if we can save the view to the new name then we update the internal
// state of the application
if (saveView(strName, getActiveDataview()))
setActiveDataviewPath(strName);
return true;
}
Dataview openView(String strName) {
Dataview dv = null;
try {
MetadataManager mdm = getMetadataManager();
Hashtable env = new Hashtable();
QueryManager qm = getQueryManager();
// qm can be null which implies that we are running with a config
// file that doesn't specify a connection to an OLAP source. We
// will use a static data source in that case.
// Via this mechanism we can tell the Persistence Manager about the
// Query Manager it should use to evaluate the query in the Presentation
// being loaded.
if (qm != null)
env.put(Query.QUERY_MANAGER, qm);
Pagina 182 din 207
// The reason for using the MetadataManager for loading
// a view is that the MetadataManager will automatically
// load any calculations that might be referenced by the
// query. The calculations need to be present before the
// query can be evaluated.
MDRoot root = getRootFolder();
dv = (Dataview) root.lookup(strName, env);
}
catch (Throwable t) {
String strMsg = "Incapabil sa deschida: " + strName;
showErrorMessage(strMsg, t);
}
return dv;
}
void mnuOpen_ActionPerformed(ActionEvent event) {
try {
MDRoot root = getRootFolder();
PersistenceObjectChooser chooser = new PersistenceObjectChooser(root);
PresentationFilter filter = new PresentationFilter();
chooser.addPersistenceObjectFilter(filter);
chooser.removePersistenceObjectFilter(PersistenceObjectChooser.ALL_TYPES);
chooser.setDefaultPersistenceObjectFilter(filter.getDisplayText());
int nRetVal = chooser.showOpenDialog(getFrame());
if (nRetVal != PersistenceObjectChooser.OK_OPTION)
return;
Pagina 183 din 207
String strName = chooser.getSelectedObjectPathName();
// getSelectedObjectPathName returns the full path name
// including the folders. Note that this is a JNDI path and
// is relative to the root that was specified in the configuration
// file.
Dataview dv = openView(strName);
if (dv != null)
displayView(strName, dv);
}
catch (Throwable t) {
String strMsg = "Incapabil sa deschida: ";
showErrorMessage(strMsg, t);
}
}
void mnuSave_ActionPerformed(ActionEvent event) {
if (getActiveDataview() == null) {
String strMsg = "Incapabil sa salveze.Nu este nimic activ";
showErrorMessage(strMsg, null);
return;
}
// if we have a path then we had opened a view to begin with
// otherwise we delegate to the Save As method
if (getActiveDataviewPath() == null)
mnuSaveAs_ActionPerformed(event);
else
saveView(getActiveDataviewPath(), getActiveDataview());
}
Pagina 184 din 207
void mnuSaveAs_ActionPerformed(ActionEvent event) {
if (getActiveDataview() == null) {
String strMsg = "Nu se poate salva pentru ca nu este nimic activ.";
showErrorMessage(strMsg, null);
return;
}
try {
MDRoot mdRoot = getRootFolder();
PersistenceObjectChooser chooser = new PersistenceObjectChooser(mdRoot);
PresentationFilter filter = new PresentationFilter();
chooser.addPersistenceObjectFilter(filter);
chooser.removePersistenceObjectFilter(PersistenceObjectChooser.ALL_TYPES);
chooser.setDefaultPersistenceObjectFilter(filter.getDisplayText());
int nRetVal = chooser.showSaveDialog(getFrame());
if (nRetVal != PersistenceObjectChooser.OK_OPTION)
return;
String strName = chooser.getSelectedObjectPathName();
saveAsActiveView(strName);
}
catch (Throwable t) {
String strMsg = "Incapabil sa afiseze dialogul Salveaza ca...";
showErrorMessage(strMsg, t);
}
}
Pagina 185 din 207
void mnuPrint_ActionPerformed(ActionEvent event) {
if (getActiveDataview() == null) {
String strMsg = "Nu se poate tipari pentru ca nu este nimic activ.";
showErrorMessage(strMsg, null);
return;
}
ViewPrinter printer = null;
Dataview dv = getActiveDataview();
if (dv instanceof Graph) {
printer = new GraphPrinter((Graph) dv);
}
else if (dv instanceof Table) {
printer = new TablePrinter((Table) dv);
}
else if (getActiveDataview() instanceof Crosstab) {
printer = new CrosstabPrinter((Crosstab) dv);
}
if (printer != null) {
PrintDialog dialog = new PrintDialog(getFrame(), printer);
dialog.show();
dialog.dispose();
dialog = null;
}
}
void mnuExport_ActionPerformed(ActionEvent event) {
if (getActiveDataview() == null) {
String strMsg = "Nu se poate exporta pentru ca nu este nimic activ.";
Pagina 186 din 207
showErrorMessage(strMsg, null);
return;
}
// Export is only supported for Table and Crosstab
Dataview dv = getActiveDataview();
if (dv instanceof Table ||
dv instanceof Crosstab) {
// JEWTDialog class makes it really easy to show a dialog and
// display buttons in it. If we used a JDialog we would have to write
// a lot more code and implement the displaying of buttons ourselves.
Frame parent = getFrame();
JEWTDialog jewtDialog = new JEWTDialog(parent,
"Exporta",
JEWTDialog.BUTTON_OK |
JEWTDialog.BUTTON_CANCEL);
ExportPanel exportPanel = new ExportPanel(parent,
(UIGridView) dv);
jewtDialog.setCenterOver(parent);
jewtDialog.setContent(exportPanel);
if (jewtDialog.runDialog()) {
// user hit ok...so do the actual export
exportPanel.apply();
}
jewtDialog.dispose();
jewtDialog = null;
}
}
Pagina 187 din 207
void mnuExit_ActionPerformed(ActionEvent event) {
// Prompt the user before closes
if (JOptionPane.showConfirmDialog(getFrame(), new String ("Sunteti sigur ca vreti
sa iesiti?"),
DEFAULT_TITLE, JOptionPane.YES_NO_OPTION) ==
JOptionPane.YES_OPTION) {
disconnect();
System.exit(0);
}
}
void mnuQB_ActionPerformed(ActionEvent event) {
try {
if (getActiveDataview() == null || getQueryManager() == null)
return;
QueryBuilder queryBuilder = new QueryBuilder(getFrame());
Dataview dv = getActiveDataview();
Query query = (Query) dv.getDataSource();
queryBuilder.setMode(QueryBuilder.TABBED);
queryBuilder.setMetadataManager(getMetadataManager());
queryBuilder.setQuery((QueryContext) query);
queryBuilder.setVisible(true);
Layout layout = null;
// Display the Right type of Layout panel for different
// view type
if (dv instanceof Graph) {
// Set Graph into the GraphLayout panel
layout = new GraphLayout();
((GraphLayout) layout).setGraph((Graph) dv);
Pagina 188 din 207
}
else if (dv instanceof UICrosstab) {
// Setting the Paging Control Attributes to the layout,
// so that the paging control of the crosstab will get updated
layout = new CrosstabLayout();
((CrosstabLayout) layout).setPagingControlAttributes(dv);
}
else if (dv instanceof UITable) {
// Setting the Paging Control Attributes to the layout,
// so that the paging control of the table will get updated
layout = new TableLayout();
((TableLayout) layout).setPagingControlAttributes(dv);
}
// Setting Layout context to the Layout panel,
// and set the Layout to QueryBuilder
if (layout != null) {
layout.setLayoutContext((LayoutContext) query);
queryBuilder.setViewLayoutPanel(layout);
}
queryBuilder.run();
}
catch (Throwable t) {
String strMsg = "Unable to display the Query Builder.";
showErrorMessage(strMsg, t);
}
}
void mnuCB_ActionPerformed(ActionEvent event) {
try {
if (getActiveDataview() == null || getQueryManager() == null)
return;
Pagina 189 din 207
// Create our CalcBuilder
QueryContext qc = (QueryContext) getActiveDataview().getDataSource();
MetadataManager mdm = getMetadataManager();
// CalcBuilderStepStorage does everything for creating a new Calc
// and adding it to the MeatadataManager
CalcBuilderStepStorage calcBuilderStepStorage =
new CalcBuilderStepStorage(null, /*component*/
null, /*mdObject*/
qc, /*queryContext*/
mdm/*metadataManager*/);
calcBuilderStepStorage.setParentFrame(getFrame());
// Invoke the CalcBuilder -- if the user press the OK button to create
// a new calc the calcBuliderStepStorage will do all the work for saving
// and making the calc appear in the Query Builder.
MDMeasure mdMeasure = (MDMeasure) calcBuilderStepStorage.invoke();
updateMeasures(mdMeasure);
}
catch (Throwable t) {
String strMsg = "Unable to display the Calculation Builder.";
showErrorMessage(strMsg, t);
return;
}
}
// Updates the measures based on the specified MDMeasure
private void updateMeasures(MDMeasure mdMeasure)
throws InvalidStepArgException, SelectionException,
QueryException, MetadataManagerException {
Pagina 190 din 207
if (getActiveDataview() == null || mdMeasure == null)
return;
Query viewQuery = (Query) getActiveDataview().getDataSource();
// Create a queryAccess in order to update query
QueryAccess queryAccess = viewQuery.createQueryAccess();
// Retrieve the name of the measure dimension
String strMeasureDimension =
queryAccess.getMeasureDimension(LayerMetadataMap.LAYER_METADATA_NA
ME);
// Retrieve the selection associated with the measure dimension
Selection selection =
queryAccess.getSelection(strMeasureDimension);
// Release our Query Access
if (queryAccess != null)
queryAccess.release();
// Verify that the selection is non-null
if (selection != null) {
// Retrieve the members associated with the step
MemberStep step = (MemberStep) selection.getStep(0);
Vector members = step.getMembers();
// Only add measure if it currently does not exist
String strMeasureID = mdMeasure.getUniqueID();
if ((strMeasureID != null) && !members.contains(strMeasureID)) {
// Add our new custom measure
Pagina 191 din 207
members.addElement(mdMeasure.getUniqueID());
step.setMembers(members);
// Set the action to be ADD for inserting a MemberStep.
step.setAction(oracle.dss.selection.step.Step.SELECT);
// Remove all steps from this selection.
selection.removeAllSteps();
// Add our newly created step which includes our new custom
// measure
selection.addStep(step);
}
if (strMeasureID != null)
// Attempt to update the query with the new measure selection
viewQuery.applySelection(selection);
}
}
protected void processWindowEvent (WindowEvent e) {
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
disconnect();
System.exit (0);
}
super.processWindowEvent (e);
}
public class PresentationFilter implements PersistenceObjectFilter {
public String getDisplayText() {
return "Prezentarile";
}
Pagina 192 din 207
public Icon getDisplayIcon() {
return null;
}
public String getFilterExpression() {
return null;
}
public Attributes getMatchingAttributes() {
return null;
}
public SearchControls getSearchControls() {
BISearchControls biControl = new BISearchControls();
biControl.setResultFilter(new BIPresentationFilter());
return biControl;
}
class BIPresentationFilter implements BIFilter {
public boolean evaluate(BISearchResult result) {
if (result.getObjectType().equals(PersistableConstants.FOLDER) ||
result.getObjectType().equals(PersistableConstants.GRAPH) ||
result.getObjectType().equals(PersistableConstants.TABLE) ||
result.getObjectType().equals(PersistableConstants.CROSSTAB))
return true;
else
return false;
}
}
}
static {
try {
Pagina 193 din 207
// We use the Oracle Look and Feel by default
UIManager.setLookAndFeel(new OracleLookAndFeel());
}
catch (Exception e) {
}
}
public static void main(String[] args) {
// Show Initialization Messages
JDialog dlg = new JDialog((JFrame) null, BIApplication1.DEFAULT_TITLE, false);
JLabel label = new JLabel("Aplicatia se incarca... Va rugam asteptati...");
label.setHorizontalAlignment(SwingConstants.CENTER);
dlg.getContentPane().setLayout(new GridBagLayout());
dlg.getContentPane().add(label, new GridBagConstraints(0, 0, 4, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 15,
15), 0, 0));
dlg.pack();
WindowUtils.centerWindow(dlg);
dlg.setVisible(true);
// Initialize application
final BIApplication1 appFrame = new BIApplication1();
// Dispose the Dialog
dlg.setVisible(false);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
appFrame.setSize(800, 620);
appFrame.setLocation(100,100);
// appFrame.setLocation((d.width - appFrame.getSize().width) / 2,
// (d.height - appFrame.getSize().height) / 2);
appFrame.setVisible(true);
}
Pagina 194 din 207
public void disconnect() {
if (m_bConnected) {
try {
MetadataManager mdm = getMetadataManager();
if (mdm != null) {
mdm.detach();
mdm.free();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
private void jMenuItem1_actionPerformed(ActionEvent e)
{
// toBack();
frame1.show();
// frame1.toFront();
//this.show();
}
private void jMenuItem3_actionPerformed(ActionEvent e)
{
// toBack();
frame2.show();
// frame2.toFront();
}
private void jMenuItem4_actionPerformed(ActionEvent e)
{
Pagina 195 din 207
// toBack();
frame3.show();
// frame3.toFront();
}
private void jMenuItem5_actionPerformed(ActionEvent e)
{
// toBack();
frame4.show();
// frame4.toFront();
}
private void jMenuItem6_actionPerformed(ActionEvent e)
{
//toBack();
frame5.show();
//frame5.toFront();
}
private void jMenuItem7_actionPerformed(ActionEvent e)
{
//toBack();
frame6.show();
//frame6.toFront();
}
private void jMenuItem8_actionPerformed(ActionEvent e)
{
//toBack();
frame7.show();
//frame7.toFront();
}
private void jMenuItem9_actionPerformed(ActionEvent e)
Pagina 196 din 207
{
//toBack();
frame8.show();
//frame8.toFront();
}
private void jMenuItem10_actionPerformed(ActionEvent e)
{
//toBack();
frame14.show();
//frame14.toFront();
}
private void jMenuItem11_actionPerformed(ActionEvent e)
{
//toBack();
frame15.show();
//frame15.toFront();
}
private void jMenuItem12_actionPerformed(ActionEvent e)
{
// toBack();
frame12.show();
//frame12.show();
}
private void jMenuItem13_actionPerformed(ActionEvent e)
{
//toBack();
frame13.show();
// frame13.show();
}
Pagina 197 din 207
private void jMenuItem14_actionPerformed(ActionEvent e)
{
// toBack();
frame9.show();
// frame9.toFront();
}
private void jMenuItem15_actionPerformed(ActionEvent e)
{
//toBack();
frame10.show();
//frame10.toFront();
}
private void jMenuItem16_actionPerformed(ActionEvent e)
{
//toBack();
frame16.show();
//frame16.toFront();
}
private void jMenuItem17_actionPerformed(ActionEvent e)
{
frame11.show();
}
}
2. Frame-urile secundare sunt asemănătoare. Prezentăm unul dintre acestea:
Frame-ul “Valoarea băuturilor calde comercializate şi preţul mediu”:
Pagina 198 din 207
package mypackage1;
import java.awt.Frame;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import oracle.dss.addins.runtime.beanRef.CrosstabRef;
import oracle.dss.addins.runtime.beanRef.DefinitionInfo;
import oracle.dss.addins.runtime.beanRef.GraphRef;
import java.awt.SystemColor;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import oracle.dss.crosstab.CrosstabPrinter;
import oracle.dss.dataView.gui.PrintDialog;
import oracle.dss.graph.GraphPrinter;
public class Frame11 extends JFrame
{
private JPanel jPanel1 = new JPanel();
private JPanel jPanel2 = new JPanel();
private JPanel jPanel3 = new JPanel();
private JPanel jPanel4 = new JPanel();
private JButton jButton1 = new JButton();
private JButton jButton2 = new JButton();
private JButton jButton3 = new JButton();
private JButton jButton4 = new JButton();
private JButton jButton5 = new JButton();
Pagina 199 din 207
private JTextArea jTextArea1 = new JTextArea();
private CrosstabRef crosstabRef1 = new CrosstabRef();
private GraphRef graphRef1 = new GraphRef();
private GraphRef graphRef2 = new GraphRef();
Frame diag16 = new Dialog16();
public Frame11()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(1100, 800));
this.setTitle("Valoarea bauturilor calde comercializate si pretul mediu");
this.setBackground(SystemColor.info);
this.setResizable(false);
this.setLocation(20,20);
jPanel1.setBounds(new Rectangle(0, 0, 700, 700));
jPanel1.setToolTipText("null");
jPanel1.setSize(new Dimension(1100, 800));
jPanel1.setBackground(SystemColor.info);
jPanel1.setLayout(null);
jPanel2.setBounds(new Rectangle(5, 5, 685, 395));
jPanel2.setLayout(null);
Pagina 200 din 207
jPanel2.setBackground(Color.white);
jPanel2.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jPanel3.setBounds(new Rectangle(5, 405, 325, 365));
jPanel3.setLayout(null);
jPanel3.setBackground(Color.white);
jPanel3.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jPanel4.setBounds(new Rectangle(335, 405, 585, 365));
jPanel4.setBackground(Color.white);
jPanel4.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jPanel4.setLayout(null);
jButton1.setText("Interpretare");
jButton1.setBounds(new Rectangle(945, 120, 145, 65));
jButton1.setBackground(SystemColor.activeCaption);
jButton1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jButton1.setFont(new Font("Tahoma", 1, 11));
jButton1.setForeground(Color.white);
jButton1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton1_actionPerformed(e);
}
});
jButton2.setText("Print tabel");
jButton2.setBounds(new Rectangle(965, 200, 125, 55));
jButton2.setBackground(Color.yellow);
jButton2.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jButton2.setFont(new Font("Tahoma", 1, 11));
jButton2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton2_actionPerformed(e);
}
Pagina 201 din 207
});
jButton3.setText("Print grafic 1");
jButton3.setBounds(new Rectangle(965, 260, 125, 55));
jButton3.setBackground(Color.yellow);
jButton3.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jButton3.setFont(new Font("Tahoma", 1, 11));
jButton3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton3_actionPerformed(e);
}
});
jButton4.setText("Print grafic 2");
jButton4.setBounds(new Rectangle(965, 320, 125, 55));
jButton4.setBackground(Color.yellow);
jButton4.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jButton4.setFont(new Font("Tahoma", 1, 11));
jButton4.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jButton4_actionPerformed(e);
}
});
jButton5.setText("Exit");
jButton5.setBounds(new Rectangle(980, 720, 110, 50));
jButton5.setBackground(Color.black);
jButton5.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jButton5.setFont(new Font("Tahoma", 1, 11));
jButton5.setForeground(Color.white);
jButton5.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
Pagina 202 din 207
{
jButton5_actionPerformed(e);
}
});
jTextArea1.setText("In stanga se prezinta tabelul si graficele cu valoarea bauturilor "
+ "comercializate si pretul mediu!!!");
jTextArea1.setBounds(new Rectangle(910, 5, 180, 110));
jTextArea1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jTextArea1.setFont(new Font("Arial", 1, 12));
jTextArea1.setLineWrap(true);
jTextArea1.setEditable(false);
jTextArea1.setWrapStyleWord(true);
crosstabRef1.setBounds(new Rectangle(5, 5, 675, 385));
crosstabRef1.setDefinition(new DefinitionInfo("/Project1OLAPConfig1.xml",
"Valoarepret"));
graphRef1.setBounds(new Rectangle(5, 5, 315, 355));
graphRef1.setDefinition(new DefinitionInfo("/Project1OLAPConfig1.xml",
"Pretmediugraf"));
graphRef2.setBounds(new Rectangle(5, 5, 575, 355));
graphRef2.setDefinition(new DefinitionInfo("/Project1OLAPConfig1.xml",
"Valoaregraf"));
jPanel1.add(jTextArea1, null);
jPanel1.add(jButton5, null);
jPanel1.add(jButton4, null);
jPanel1.add(jButton3, null);
jPanel1.add(jButton2, null);
jPanel1.add(jButton1, null);
jPanel4.add(graphRef2, null);
jPanel1.add(jPanel4, null);
jPanel2.add(crosstabRef1, null);
jPanel1.add(jPanel2, null);
jPanel3.add(graphRef1, null);
jPanel1.add(jPanel3, null);
this.getContentPane().add(jPanel1, null);
Pagina 203 din 207
}
private void jButton2_actionPerformed(ActionEvent e)
{
//create an instance of the GraphPrinter
CrosstabPrinter printer = new CrosstabPrinter(crosstabRef1);
//create a frame from which to display the print dialog
Frame frame = oracle.bali.ewt.util.WindowUtils.parentFrame(crosstabRef1);
//create an instance of the print dialog
PrintDialog dialog = new PrintDialog(frame, printer);
//display the dialog, so that users can set options and initiate printing
dialog.show();
//after the printing is completed or canceled, dispose of the dialog
dialog.dispose();
dialog = null;
}
private void jButton3_actionPerformed(ActionEvent e)
{
//create an instance of the GraphPrinter
GraphPrinter printer = new GraphPrinter(graphRef1);
//create a frame from which to display the print dialog
Frame frame = oracle.bali.ewt.util.WindowUtils.parentFrame(graphRef1);
//create an instance of the print dialog
PrintDialog dialog = new PrintDialog(frame, printer);
//display the dialog, so that users can set options and initiate printing
dialog.show();
//after the printing is completed or canceled, dispose of the dialog
dialog.dispose();
dialog = null;
}
private void jButton4_actionPerformed(ActionEvent e)
{
Pagina 204 din 207
//create an instance of the GraphPrinter
GraphPrinter printer = new GraphPrinter(graphRef2);
//create a frame from which to display the print dialog
Frame frame = oracle.bali.ewt.util.WindowUtils.parentFrame(graphRef2);
//create an instance of the print dialog
PrintDialog dialog = new PrintDialog(frame, printer);
//display the dialog, so that users can set options and initiate printing
dialog.show();
//after the printing is completed or canceled, dispose of the dialog
dialog.dispose();
dialog = null;
}
private void jButton5_actionPerformed(ActionEvent e)
{
if (JOptionPane.showConfirmDialog(this, new String ("Sunteti sigur ca vreti sa
iesiti?"),
"Exit", JOptionPane.YES_NO_OPTION) ==
JOptionPane.YES_OPTION) {
this.hide();
}
}
private void jButton1_actionPerformed(ActionEvent e)
{
diag16.show();
}
}
Pentru fiecare frame în parte, mai puţin cel principal, s-a creat un buton
“Interpretare”, prin intermediul căruia se accesează un alt frame. Pentru exemplul de frame
secundar de mai sus avem:
Pagina 205 din 207
package mypackage1;
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.JPanel;
import java.awt.Rectangle;
import javax.swing.JTextArea;
import javax.swing.BorderFactory;
import java.awt.Font;
public class Dialog16 extends JFrame
{
private JPanel jPanel1 = new JPanel();
private JTextArea jTextArea1 = new JTextArea();
public Dialog16()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 400));
this.setTitle("Interpretare");
this.setBackground(Color.darkGray);
Pagina 206 din 207
this.setResizable(false);
this.setLocation(700,400);
jPanel1.setBounds(new Rectangle(5, 5, 385, 365));
jPanel1.setBackground(Color.darkGray);
jPanel1.setLayout(null);
jTextArea1.setText("Se poate usor observa atat din tabel cat si din grafice ca in anul "
+ "2004 se inregistreaza cea mai mare valoare a bauturilor calde comercializate, " +
"respectiv 23,525,598,018.40 lei; iar pretul mediu al unui jeton este: " + "6556 (in anul 2003),
6642 (in anul 2004), respectiv 6661 (in anul " + "2005)!!!");
jTextArea1.setBounds(new Rectangle(120, 0, 265, 220));
jTextArea1.setBorder(BorderFactory.createLineBorder(Color.black, 1));
jTextArea1.setEditable(false);
jTextArea1.setFont(new Font("Arial", 1, 12));
jTextArea1.setLineWrap(true);
jTextArea1.setWrapStyleWord(true);
jPanel1.add(jTextArea1, null);
this.getContentPane().add(jPanel1, null);
}
}
Pagina 207 din 207