Sunteți pe pagina 1din 206

Implementarea unui sistem OLAP in cadrul unei firme

Introducere Informaia este moneda democraiei spunea renumitul autor al Declaraiei de Independen, Thomas Jefferson, n secolul al XIX-lea, poate nebnuind valoarea acestei afirmaii astzi, dup aproape 200 de ani. Surs de conflicte, de invenii, de progres, informaia privat este i sursa marilor averi moderne. Orice economie puternic sau orice companie solid se bazeaz pe un flux continuu de informaie n ncercarea de a fi ntotdeauna cu un pas naintea celorlali. Este deci natural ca odat cu primele apariii ale calculatoarelor si ale reelelor moderne de comunicaii s apar un nou domeniu de activitate, acela al tehnologiei informaiei, hardware i software angrenate ntr-un proces de continu cercetare i dezvoltare, ntotdeauna existnd mai rapid, mai sigur, mai bine. Este momentul apariiei marilor companii din domeniu i momentul n care se traseaz direciile fiecreia. Una din direciile majore de implementare este cea a bazelor de date, acestea din urm fiind poate accepiunea cea mai apropiat de informaie 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 aplicaie Java potrivit acestui tip de stocare de date. Datele de intrare aparin S.C. INPRODCOM S.R.L. i reprezint date veridice din anii 2003, 2004, 2005 asupra activitii principale a firmei, evidena unor automate de cafea ntr-o anumit rspndire teritorial, acestea fiind detaliate n capitolul 1, alturi 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 relaionale 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 206

Domeniul tehnologiei informaiei a adus recent n prim-plan un nou instrument de dezvoltare a aplicaiilor ce interacioneaz cu baze de date, Oracle JDeveloper, care aprofundeaz i domeniul inteligenei afacerii. Caracteristicile i principalele faciliti ale acestuia sunt prezentate n capitolul 3. Capitolul 4 reprezint partea practic a lucrrii, construirea sistemului OLAP, utiliznd instrumentele prezentate n capitolele anterioare. Programele pentru definirea structurii bazei de date ct i cele folosite la realizarea interfeei sistemului sunt prezentate n anexe, ataate la sfritul lucrrii alturi de bibliografie.

Capitolul 1 PREZENTAREA INTREPRINDERII

1.1 ASPECTE GENERALE, ISTORIC

SC INDPRODCOM SRL este o societate cu rspundere limitat cu sediul n DEVA str.Grigorescu nr. 12. Societatea a fost nfiinat n anul 1992 i este nregistrat la Registrul Comerului sub numrul J20/1909/0408/992. n cursul lunii martie 2004 societatea a renunat la activitatea de comer en-gros urmnd s i desfoare numai activitatea de comer cu amnuntul prin magazinul de desfacere din Deva i comer cu amnuntul prin automate de cafea. Se poate aprecia c SC INDPRODCOM SRL, n perioada de la nfiintare i pn n prezent, a avut o evoluie bun n sensul c cifra de afaceri i profitul au avut un trend ascendent cu o singur excepie n anul fiscal 2001 cnd societatea a pierdut contractul de distribuie cu firma KRAFT JACOBS SUCHARD SA BRAOV. Evoluia 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: Evoluia cifrei de afaceri, profit din exploatare i profit brut MII LEI
Pagina 2 din 206

An / indicator CIFRA AFACERI PROFIT DIN EXPLOATARE PROFIT BRUT


1400000 1200000 1000000 800000 600000 400000 200000 0 2000 2001

2000 38697992 1.967.843 1.134.417

2001 34393911 1.212.858 71.528

2002 36936547 1.833.017 502.946

2003 46075881 2.629.909 1.280.741

PROFIT BRUT

2002

2003

Figura 1.1: Graficul evoluiei indicatorului profit brut

Pagina 3 din 206

50,000,000 40,000,000 30,000,000 CIFRA AFACERI 20,000,000 10,000,000 0 2000 2001 2002 2003

Figura 1.2: Graficul evoluiei indicatorului cifra de afaceri

DOMENIU STRATEGIC

nc din anul 1994 SC INDPRODCOM SRL Deva a avut o poziie privilegiat pe piaa en-gros a judeului Hunedoara ca urmare a contractului de unic distribuitor ncheiat n acel an cu SC KRAFT JACOBS SUCHARD SA BRAOV, contract care a durat pn n anul 2001. Ca urmare a acestui contract societatea analizat a trebuit s fac fa cerinelor impuse privind: - dezvoltarea parcului auto - amenajarea spaiilor de depozitare - personal calificat Este perioada n care societatea achiziioneaz mainile de transport, sediul firmei i spaiile de depozitare. n urma rezilierii contractului cu SC KRAFT JACOBS SUCHARD SA BRAOV societatea a fost nevoit s ncheie un nou contract de distribuitor unic de data aceasta cu firma KANDIA SA TIMIOARA. Contractul s-a ncheiat n data de 01.09.2001 i s-a derulat pn n luna martie 2004.

Pagina 4 din 206

Datorit faptului c cerina pe pia a produselor fabricate de KANDIA SA TIMIOARA a fost mai sczut, cifra de afaceri pentru comerul en-gros a sczut astfel nct n luna martie 2004 societatea a renunat la acest tip de activitate. n scopul diminurii consecinelor legate de rezilierea contractului de unic distribuitor cu SC KRAFT JACOBS SUCHARD SA BRAOV, societatea a achiziionat n luna mai 2001 un magazin n Deva n care desfoar activitatea de comer cu amnuntul a produselor alimentare i nealimentare. Poziia acestui magazin situat ntr-un cartier periferic al municipiului Deva lipsit de magazine alimentare mari, precum i interesul salariailor i a conducerii societii fac din aceast activitate o afacere sigur cu o evoluie ascendent lin, dar nu spectaculoas. La nceputul anului 2002 SC INPRODCOM SRL a ncheiat un contract de unic distribuitor cu societatea ELITE ROMANIA SA BUCURETI pentru activitatea de comercializare a buturilor calde prin intermediul automatelor de buturi calde (cafea, ceai, ciocolat etc). Conform acestui contract se asigur distribuie unic pe raza judeelor Hunedoara, Arad, Bihor, Timi, Cara Severin i ncepnd cu aprilie 2004 i Mehedini. Ca urmare a condiiilor stabilite prin acest contract, a managementului adecvat i a cerinelor crescnde pe pia a acestor produse, la ora actual este activitatea de baz a societii, avnd un aport de peste 95% la cifra de afaceri cu toate c pe pia exist concurena unor firme de renume precum SC HESS CAF SA BUCURETI, respectiv SC DALMAYS SA BRAOV precum i existena unei piee de comercializare second-hand a acestor automate.

DOMENIU COMERCIAL

1.3.1. Analiza vnzrilor innd cont de faptul c societatea desfoar mai multe tipuri de activiti, iar pentru comercializarea buturilor calde desfoar activiti pe raza mai multor judee, evoluia n timp a diferiilor indicatori s-a fcut n baza acestei structuri. Evoluia cifrei de afaceri pe activiti este prezentat n tabelul 1.2 i figura 1.3

Pagina 5 din 206

Tabelul 1.2 : Evoluia cifrei de afaceri pe activiti

Nr. crt. 1 2 3

An / activitate Comer en- gros Comer cu amnuntul Buturi calde


90000000 80000000 70000000 60000000 50000000 40000000 30000000 20000000 10000000 0

2000 88697992 -

2001 32316661 2077250 -

2002 26026071 5711200 5199276

2003 21608710 6575826 17891345

Comert en- gros Comert cu amanuntul Bauturi calde

2000

2001

2002

2003

Figura 1.3: Evoluia cifrei de afaceri pe activiti Analiza marjei comerciale pe activitile de baz rezult pe baza datelor prezentate n tabelul 1.3, respectiv figura 1.4 Marja comercial se definete ca diferena dintre veniturile realizate din vnzarea mrfurilor i costul acestora. Tabelul 1.3 : Marja comercial pe activiti MII LEI Nr. crt. 1 2 3 An / activitate Comer en gros Comer cu amanuntul Buturi calde Total 2000 4456307 4456307 2001 3993072 296023 4289095 2002 2695609 833286 2573862 6102757 2003 170051 951337 8283729 9405117

Pagina 6 din 206

100000000 90000000 80000000 70000000 60000000 50000000 40000000 30000000 20000000 10000000 0 2000 2001 2002 2003

Comert en- gros Comert cu amanuntul Bauturi calde

Figura 1.4 : Marja comercial pe activiti Analiza duratei de ncasare a creanelor n baza analizei indicatorilor cifrei de afaceri pe activiti i a marjei comerciale pe activiti i innd seama de termenele de ncasare pe activiti (en-gros 20-35 zile iar la automatele de cafea zilnic), conducerea societii a renunat la activitatea de en-gros ncepnd cu luna martie 2004. Influena acestei decizii este reliefat de evoluia indicatorului durata de ncasare creane clieni DIC prezentat n tabelul 1.4, respectiv figura 1.5 i calculat cu relaia:

Creane ( clieni ) DIC = ------------------------- X 360 zile Cifra de afaceri Tabelul 1.4 : Evoluia duratei de ncasare a creanelor MII LEI Nr. crt. 1 2 An / indicator Clieni Cifra de afaceri
Pagina 7 din 206

2000 3455942 38697992

2001 1639959 34393911

2002 1880353 36936547

2003 2426980 46075881

2004 461283 15415666

DIC(zile)

32

17

18

18

11

35 30 25 20 15 10 5 0 2000 2001 2002 2003 2004 DIC

Figura 1.5 : Evoluia duratei de ncasare a creanelor Analiza cifrei de afaceri pe judee pentru activitatea buturi calde rezult din tabelul 1.5, respectiv figura 1.6. Tabelul 1.5 : Cifra de afaceri pe judee MII LEI Nr. crt. 1 2 3 4 An / judee Hunedoara Timi Bihor Arad Total 2000 2001 2002 1793300 1945513 782741 677722 5199276 2003 4605688 5915999 3712942 3656716 17891345

Aceste cifre demonstreaz c n 2003 activitatea a fost mai intens n judeul Timi, urmat de judeul Hunedoara.

Pagina 8 din 206

6000000 5000000 4000000 3000000 2000000 1000000 0 2000 2001 2002 2003 Hunedoara Timis Bihor Arad

Figura 1.6 : Cifra de afaceri pe judee

Analiza pieei de aprovizionare n ceea ce privete piaa de aprovizionare, nc din anul 1994 aceasta a fost dominat rnd pe rnd de 3 firme mari: KRAFT JACOBS SUCHARD BRAOV, KANDIA TIMIOARA i actualmente ELITE ROMNIA SRL. Dac n cazul KRAFT JACOBS SUCHARD BRAOV contractul a fost reziliat din iniiativa acestuia cu consecine grave asupra activitii societii, n cazul KANDIA TIMIOARA contractul a fost reziliat din iniiativa SC INDPRODCOM SRL. Actualmente aprovizionarea cu marf se face n proporie de 99% de ctre firma ELITE ROMNIA SRL care este i furnizorul de echipamente (aparate de buturi calde) i apreciem c pe termen lung nu exist pericolul rezilierii acestui contract. Pentru a vedea modul n care societatea i-a achitat obligaiile ctre furnizorii cureni urmrim evoluia indicatorului durata de achitare a obligaiilor curente (furnizori) DAO ( tabelul 1.6, respectiv figura 1.7) calculat cu relaia:

Furnizori (marf + utiliti) DAO = ---------------------------------Cifra de afaceri

Pagina 9 din 206

Tabelul 1.6 : Durata de achitare a obligaiilor curente MII LEI Nr. crt. 1 2 3 An / indicator 2000 2001 3884568 34393911 41 2002 4595871 36936547 45 2003 4799089 46075881 37 2004 2485124 1541568 6 58

Furnizori 3958474 Cifra de afaceri 38697992 DAO(zile)


70 60 50 40 30 20 10 0 2000 2001 2002

37

DAO

2003

2004

Figura 1.7 : Durata de achitare a obligaiilor curente

Analiznd indicatorii durata de ncasare a creanelor i durata de achitare a datoriilor curente observm c evoluia acestora este favorabil societii n sensul c se ncaseaz clienii mult mai repede dect se pltesc furnizorii. Acest lucru a fcut posibil ca n cursul anului 2004 s se diminueze linia de credit de la 6.000.000 mii lei pn la 4.000.000 mii lei, linie de credit care n cursul lunii aprilie 2004 a ajuns s fie folosit numai n proporie de 25%.

1.4 DOMENIU TEHNIC

Pagina 10 din 206

La data analizei societatea are n proprietate 3 imobile cu terenul aferent (sediul administrativ, magazin de desfacere cu amnuntul i spaiul de depozitare) precum i un numr de 381 echipamente tehnologice (automate de buturi calde). n funcie de caracteristicile tehnice (capacitate de producie) 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 funcionare a acestor echipamente conform legislaiei este de 7 ani. Societatea aplic metoda de amortizare liniar. ncepnd cu achiziionrile din 2004 societatea a hotrt s aplice metoda de amortizare accelerat. Pentru a face fa ariei geografice extinse n care i desfoar activitatea societatea deine un numr de 19 mijloace de transport completat cu nc 6 autoturisme achiziionate n leasing operaional .

1.5 DOMENIUL RESURSELOR UMANE I AL MANAGEMENTULUI

n perioada analizat i n cursul anului 2004 societatea i desfoar activitatea numai cu personal angajat (salariai). Facem meniunea c asociatul unic are calitatea de angajat ndeplinind funcia de director general. Evoluia 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. Indicatori de comportament -numr mediu scriptic evoluia este prezentat n tabelul 1.7, respectiv figura 1.8.

Pagina 11 din 206

Tabelul 1.7 : Evoluia numrului mediu scriptic An / Element Numr mediu scriptic salariai
40 35 30 25 20 15 10 5 0 2000 2001 2002 2003 Numar mediu scriptic salariati

2000 28

2001 27

2002 30

2003 37

Figura 1.8: Evoluia numrului 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 Timp efectiv lucrat Timp max disponibil Gut 2000 50368 56896 89% 2001 48854 54864 89% 2002 53402 60960 87% 2003 67718 75184 90%

Pagina 12 din 206

91% 90% 89% 88% 87% 86% 85% 2000 2001 2002 2003 Gut

Figura 1.9 : Gradul de utilizare a timpului Timp max. disponibil = 254 zile dup ce se scad smbetele, duminicile i srbtorile legale Indicatori de eficien a muncii productivitatea muncii W calculat funcie de cifra de afaceri este analizat n tabelul 1.9, respectiv figura 1.10. Cifra de afaceri W = ------------------------------------Numr mediu personal Tabelul 1.9: Evoluia productivitii muncii An / Element Cifra de afaceri Numr mediu personal W mii lei / pers 2000 38697992 28 1382071 2001 34393911 27 1273849 2002 36936547 30 1231218 2003 46075881 37 1245294

Pagina 13 din 206

1400000 1350000 1300000 W mii lei / pers 1250000 1200000 1150000 2000 2001 2002 2003

Figura 1.10: Evoluia productivitii muncii La data evalurii societatea are un numr de 32 de salariai cu contract permanent de munc repartizai pe puncte de lucru astfel (tabelul 1.10): Tabelul 1.10 : Repartizarea salariailor pe puncte de lucru Nr. crt. 1 2 3 4 5 6 7 Punct de lucru Sediu Magazin cu amnuntul Timioara Arad Oradea Deva aparate Total Numr 4 7 6 4 5 6 32 % 13 22 19 12 15 19 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 1 Conducere 2 Personal de specialitate 3 Personal tehnic productiv Total Numr 3 2 27 32 % 9 6 85 100

Pagina 14 din 206

Se observ ponderea mare a personalului direct productiv. Structura personalului dup gradul de pregtire profesional (tabelul 1.12). Tabelul 1.12 : Structura personalului dup gradul de pregtire profesional Nr. crt. 1 2 3 Categorie de personal Studii superioare Din care conducere Studii medii Total Numr 8 3 24 32 % 33 66 100

DOMENIUL FINANCIAR CONTABIL

Din capitolele anterioare au rezultat o serie de amnunte legate de SC INDPRODCOM prin care s-au confirmat performanele sale financiare. Pentru a evidenia influena activitii comercializrii buturilor calde, din multitudinea indicatorilor economico-financiari, prezentm urmtoarele : 1.Rentabilitatea financiar RF msoar 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 : Evoluia rentabilitii financiare MII LEI Indicator Profitul brut Total venit Rentabilitatea financiar % 2000 1134417 38727327 2,39 2001 71528 34439200 0,20 2002 592946 37318522 1,59 2003 1280741 46338970 2,77

Pagina 15 din 206

3 2.5 2 1.5 1 0.5 0 2000 2001 2002 2003 Rentabilitatea financiara %

Figura 1.11 : Evoluia rentabilitii financiare Datorit evoluiei sale cresctoare, acest indicator exprim starea de sntate a afacerii societii n cauz. 2. Rentabilitatea activitii RA msoar capacitatea intreprinderii de a-i crea resurse proprii de finanare din activitate (tabelul 1.14, respectiv figura 1.12).

Capacitatea de autofinanare RA = -------------------------------------------------- X 100 Cifra de afaceri CAF este surplusul financiar ce rmne intreprinderii dup plata partenerilor (furnizori, salarii, impozite, dobnzi, dividende) CAF = Profit net +Cheltuieli amortizare + Cheltuieli cu active cedate Venit din cedare Tabelul 1.14 : Rentabilitatea activitii MII LEI Indicator CAF 2000 928286 2001 190837 2002 549108 2003 3951727

Pagina 16 din 206

CA RA %

38699253 2,4

34402228 0,6

36936547 1,5

46075881 8,6

10 9 8 7 6 5 4 3 2 1 0 2000 2001 2002 2003

RA

Figura 1.12 : Rentabilitatea activitii Privit n ansamblu, evoluia cresctoare a acestui indicator reprezint un punct favorabil, valoarea lui ns rmne sub valoarea acceptat de 10%. Trendul mediu este oscilant cu tendint de cretere.

Pagina 17 din 206

Pagina 18 din 206

Capitolul 2 FACILITI OLAP OFERITE DE ORACLE 9i

2.1. SCURT ISTORIC

Sistemele OLAP nc de la apariia 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 vnzrilor pe luna curent din judeul Timi fa de planul prestabilit? Dar fa de vnzrile din anul precedent?), ce implic a alege date agregate, curente sau istorice. Nivelul de procesare a datelor necesar pentru a rspunde unei cereri analitice este fundamental diferit fa de nivelul de procesare necesar rspunderii unei cereri tranzacionale. Urmtorul tabel evideniaz principalele diferene (tabelul 2.1). Tabelul 2.1: Principalele diferene ntre cererile tranzactionale i cele analitice Caracteristica Operaie tipic Vechimea datelor Nivel de analiz a datelor Volum date necesare Tip interogare Cereri tranzacionale actualizare curente detaliu minim interogri individuale Cereri analitice analiz istorice agregat extensiv interogri 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 sfritul anilor 1960. Multe din conceptele acestui limbaj sunt folosite i astzi (de exemplu, Adaytum Planning i Lex 2000 folosesc limbajul APL). La sfritul anilor 1960, John Little, doctor n fizic, Len Lodish, tnr specialist n marketing la Massachussetts Institute of Technology Sloan School i Glen Urban, decanul de la Sloan School, au ncercat s utilizeze calculatoarele n aplicaii matematice i analitice. Au ncercat utilizarea analiticului n marketing, n special n marketing-ul bunurilor de consum.

Pagina 19 din 206

Aceasta era o arie ideal de investigaie, deoarece exista un volum mare de date brute neprelucrate i procesul decizional putea fi mbuntit prin nelegerea mai bun a datelor. Efortul lor a condus la apariia 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 funcii analitice i faciliti de stocare a matricilor pe disc. John Wirts a considerat c biblioteca de subrutine ar putea fi generalizat i c facilitile analitice ar putea fi mbuntite mult, pentru utilizatorul final, prin adugarea facilitilor de gestiune a datelor. Acesta a fost un important pas n dezvoltarea primelor sisteme OLAP. n 1972 funciile analitice i facilitile de gestiune a datelor au fost integrate ntr-un limbaj, limbajul Express. Dup 30 de ani Express rmne 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 achiziionat un limbaj de modelare financiar numit FCS de la o firm de software britanic (EPS Consultants). Specialitii firmei au cutat s fac din limbajul FCS, un limbaj care s satisfac cerinele utilizatorilor pentru analiza multidimensional. n 1978-1979, Comshare a considerat necesar trecerea la o nou generaie de limbaj de modelare financiar, realizat prin combinarea funciilor 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 aplicaii 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 relaionale etc. Aa cum Express a devenit un instrument important n aplicaiile de analiz de pia, System W a devenit o for n planificare, analiz i aplicaii de raportare financiar, n anii 1980. Hyperion Essbase, dei nu este un descendent direct al lui System W, folosete multe din conceptele utilizate de acesta. n 1984 a aprut 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 relaionale. La mijlocul anilor 80 a aprut 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 Pilots Analysis Server.
Pagina 20 din 206

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 achiziionat de consoriul 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 vzut 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 tranzacionale. n 1994 apare primul instrument ROLAP, Microstrategy DSS Agent, fr 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 att la baze de date relaionale ct i la multidimensionale. Multe din instrumentele OLAP folosesc aceast arhitectur. n 1995 Oracle achiziioneaz 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 neleas i cunoscut. Consiliul OLAP definea conceptul de OLAP ca o categorie de instrumente software, care permit analitilor, managerilor i directorilor s neleag esena datelor printr-un acces rapid, consistent i interactiv la o mare varietate de viziuni posibile ale informaiilor, care au fost obinute prin transformarea datelor primare astfel nct s reflecte dimensiunile reale ale intreprinderii aa 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 interfee 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. 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 relaionale (schema stea).
Pagina 21 din 206

n 1999 apare Microsoft OLAP Services ce utilizeaz o tehnologie achiziionat de la Panorama Software Systems i cu o arhitectur de stocare complex (ROLAP/MOLAP/HOLAP). n 2000, Microsoft redenumete Microsoft OLAP Services ca Microsoft Analysis Services. n 2002 Oracle lanseaz Oracle 9i Release 2 OLAP care integreaz toate facilitile OLAP n baza de date relaional 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, msurile i fenomenul de mprtiere. Consiliul OLAP a propus un glosar de termeni ce se dorete standardizat, de aceea n prezentarea acestor concepte de baz am utilizat i definiiile 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 nelegerea sistemelor OLAP i a modelului multidimensional. Instrumentele OLAP folosesc conceptul de hypercub n acelai mod n care foile de calcul tabelar folosesc conceptul de foaie de lucru (worksheet) i bazele de date relaionale conceptul de tabel. Toate vizualizrile, rapoartele i analizele sunt fcute n termeni de hypercuburi (cuburi n-dimensionale). Consiliul OLAP definete 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 rnduri i coloane, fiecare fiind o dimensiune. O matrice tridimensional poate fi vizualizat ca un cub cu fiecare dimensiune formnd o fa a cubului. Dimensiunile tipice ale datelor dintr-o intreprindere sunt timpul, msurile, produsele, regiunile geografice, canalele de distribuie etc.
Pagina 22 din 206

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 acelai tip. De exemplu, toate lunile, trimestrele, anii formeaz dimensiunea Timp... O dimensiune acioneaz 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 msurabile sau a lucrurilor pe care le analizm. Spre deosebire de dimensiunile fizice care sunt bazate pe unghiuri i sunt limitate la trei, dimensiunile logice nu au astfel de limite. Frecvent numrul de dimensiuni ntr-un set de date depete cele trei dimensiuni fizice (rnd, coloan, pagin) ale ecranului de afiare. Abilitatea instrumentului OLAP de a modela multiple dimensiuni de informaii l face mult mai potrivit pentru a lucra cu seturi complexe de date, dect bazele de date relaionale i foile de calcul tabelar. Dimensiunile au urmtoarele caracteristici: furnizeaz informaii descriptive despre fiecare indicator (variabil); conin n general date statistice i sunt eseniale pentru analiz. Un model multidimensional ce ofer un numr mare de atribute dimensionale permite analize ct 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 vnzrilor se identific urmtoarele dimensiuni: Timp, Regiune/Locaie, Client, Agent de vnzare, Produs. O dimensiune conine mai muli membri. Un membru este un nume distinct sau un identificator folosit pentru a determina poziia 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 oraele, regiunile i rile dimensiunea Locaie. Un membru poate aparine 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.

Pagina 23 din 206

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, sptmni, luni, trimestre i ani), Locaia geografic este o dimensiune ierarhic (vecini, orae, state i ri). n cele mai multe activiti ale unei firme, ierarhiile sunt o necesitate. Ar fi imposibil de a funciona o firm, dac toate datele sale ar fi limitate la nivel tranzacional. De exemplu, este necesar de a pstra informaii despre volumul vnzrilor lunare, pe trimestru, pe an, pentru a vedea care produse se vnd mai bine i care mai prost. Criteriile dup care datele sunt agregate pentru analiz i raportare trebuie s fie aceleai cu factorii folosii n procesul decizional. Pentru a identifica poziia unui membru ntr-o dimensiune se folosesc conceptele de nlime i adncime n ierarhie. nlimea se stabilete de jos n sus. Din acest motiv nivelul (L0) al ierarhiei reprezint nodurile frunz ale ierarhiei (nlimea cea mai mic). Adncimea n ierarhie este stabilit de sus n jos. Exist posibilitatea ca doi membri, care au aceeai nlime, s aib adncimi diferite i invers (structuri arborescente neechilibrate). Structurile arborescente neechilibrate sunt implementate cu succes n bazele de date multidimensionale, bazele de date relaionale fiind necorespunztoare. 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 organizai pe baza relaiilor de tip printe-copil, unde un membru printe reprezint consolidarea (agregarea) membrilor copil. Rezultatul este o ierarhie i relaiile printe/copil sunt relaii ierarhice. ntr-o dimensiune pot exista mai multe ierarhii. Alegerea nivelurilor intermediare de grupare sau agregare este important pentru nelegerea i abilitatea de a lua decizii, deoarece datele au numai un nivel de detaliu, un nivel de agregare complet, dar multe niveluri intermediare. Fiecare direcie de agregare scoate n eviden unii factori i-i ascunde pe alii. Numrul de niveluri intermediare, cum ar fi grupuri de produse dup pre, grupuri de produse dup profit, dup tipul produsului i productor, permite s experimentm diferite moduri de a privi i nelege datele. Aceasta este una din ariile de convergen ntre structurile multidimensionale i analiza statistic.
Pagina 24 din 206

Ierarhiile sunt fundamentul pentru agregarea datelor i pentru navigarea ntre nivelurile de detaliu dintr-un cub n-dimensional. Dei nu toate dimensiunile conin ierarhii, toate aplicaiile din lumea real implic dimensiuni ierarhice. Numrul de ierarhii distincte ntr-o structur multidimensional este egal cu produsul dintre numrul 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. Combinaia de multiple dimensiuni i multiple niveluri pe dimensiune constituie esena unui cub n-dimensional sau hypercub. O celul ntr-un cub n-dimensional este definit de intersecia unui membru din fiecare dimensiune. Unele celule conin date de intrare cum ar fi vnzrile zilnice, altele conin date derivate. Valorile datelor derivate sunt definite cu ajutorul formulelor. Cu ct sunt mai multe dimensiuni i ierarhii n cub, cu att este mai complex vecintatea din jurul unei celule i exist mai multe direcii dup care se pot vizualiza datele. ntr-un cub n-dimensional (cu un nivel ierarhic pe dimensiune), fiecare celul are 2n vecini imediai sau direcii 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. Cnd se adaug ierarhii, numrul de direcii de vizualizare crete. Ce tip de date pot fi stocate ntr-un cub n-dimensional? Dei 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 aplicaiile OLAP, deoarece au o organizare multidimensional i se pot agrega. Alte tipuri de date pot beneficia de organizarea multidimensional, dar apar probleme datorate agregrii lor. Totui 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. Date cum ar fi: culoarea, adresa, tipul de ambalaj, tipul de client sunt factori eseniali pentru analiz.

CONCEPTUL DE MSUR

Pagina 25 din 206

O msur (variabil) este un indicator de performan prin care se poate analiza performana activitii modelate (de regul un atribut numeric al unui element din colecia de fapte). Valorile unui indicator se modific continuu. Pentru fiecare combinaie 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 vndut, volumul vnzrilor) 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 clasificai n: - indicatori de baz (de exemplu: volumul vnzrilor, cantitatea vndut, costurile, numrul de clieni); - indicatori derivai care se obin 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 vnzrilor se poate calcula pentru o categorie de produse sau pentru o anumit regiune sau pentru o anumit perioad de timp. Volumul vnzrilor, cantitatea vndut i costurile sunt aditive. Aceasta nseamn c are sens de a aduna lei sau cantiti dea lungul oricrei combinaii timp, produs, magazin. - indicatori semiaditivi care se pot nsuma numai dup unele dimensiuni. De exemplu, indicatorul numrul de clieni este semiaditiv , deoarece se poate calcula numrul de clieni 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 cunoate numrul de clieni i dorim s aflm numrul de clieni pentru categoria de produse, nu se pot aduna aceste numere. Rezultatul poate fi eronat, deoarece pot exista clieni, care au cumprat 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
Pagina 26 din 206

Un cub n-dimensional este de fapt un set de variabile ce utilizeaz aceleai dimensiuni de identificare. ntrebarea care apare este dac se poate aduga un numr nelimitat de dimensiuni la un cub n-dimensional i dac pentru modelarea unei activiti complexe este suficient un singur cub n-dimensional.

Figura 2.3: Model multicub Cel mai simplu mod de reprezentare a datelor unei aplicaii multidimensionale este cel al unui spaiu cartezian definit de toate dimensiunile aplicaiei (spaiul datelor). Totui datele multidimensionale sunt mprtiate i celulele de date nu sunt distribuite n mod egal n spaiul multidimensional. Proiectanii de instrumente OLAP au adoptat o varietate de strategii pentru a trata fenomenul de mprtiere 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 ntlnit. n aplicaiile multicub, proiectanii descompun baza de date ntr-un set de structuri multidimensionale, fiecare fiind compus dintr-un subset de dimensiuni ale bazei de date.

Pagina 27 din 206

CONCEPTUL DE MPRTIERE

Conceptul de mprtiere este frecvent asociat cu datele multidimensionale. Termenul de mprtiere a fost utilizat cu semnificaia 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 relaional. Existena unui numr mare de valori zero nu este totui un exemplu real de mprtiere. Valoarea zero este valid ca orice alt numr. Confuzia a aprut, deoarece n aplicaiile OLAP apare un numr mare de valori zero, precum i volume mari de date lips i invalide. Tehnicile pentru optimizarea fizic a stocrii unui numr mare de valori repetate sunt similare i uneori aceleai cu tehnicile pentru optimizarea fizic a stocrii de volume mari de date lips i invalide. Totui valorile lips i cele invalide nu sunt date valide. Ele nu pot fi tratate n acelai mod ca orice alt valoare. De aceea, sunt necesare tehnici speciale pentru aceste cazuri. Tratamentul impropriu al valorilor null poate cauza calcule incorecte. Acurateea calculelor este de o importan crucial pentru analiza oricrui set de date, indiferent c este sau nu multidimensional. Problema tratrii datelor mprtiate este una foarte important i este frecvent dezbtut n lumea bazelor de date. Logicienii au crezut c exist numai dou valori logice: adevrat i fals. Regulile logice, care se aplic la bazele de date, sunt exprimate n funcie de aceste dou valori. Problema apare totui cnd se introduc date invalide. Dar conform logicii, o propoziie i inversa sa nu pot avea ambele valoarea adevrat. Nu tim dac este adevrat 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 greit introdus o valoare n acel cmp. Datele lips i cele invalide se introduc regulat n toate tipurile de baze de date, inclusiv cele multidimensionale. Codd a schimbat semnificaia termenului de negaie. Pentru propoziii adevrate i false, negaia unui termen produce un termen diferit cu o valoare adevrat diferit. Negaia lui adevrat este fals i negaia lui fals este adevrat. Pentru propoziii cu valori lips sau invalide, negaia unui termen este el nsui. Deci negaia unei valori lips este lips i negaia unei valori invalide este invalid. mbuntirea proiectarii bazei de date ar putea elimina datele invalide. Cele dou tipuri de date (lips i invalide) trebuie totui s fie tratate individual, deoarece ele afecteaz calculele n diferite moduri.

Pagina 28 din 206

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 (operaiile de drill down, drill up, drill across) s fie fcute direct n celulele unui model, fr a solicita utilizarea meniurilor. Dimensiunile definite n modelul analitic ar trebui s conin toate informaiile pe baza crora 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 Codd considera c un sistem OLAP trebuie s fie capabil s lucreze cu date stocate fie n baze de date multidimensionale (MOLAP) ct i n baze de date relaionale (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
Pagina 29 din 206

permit cel putin realizarea rapoartelor parametrizate, analize de tip ce se ntmpl dac? (simulare) i de urmrire a unui scop (optimizare), operaii 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 nct diveri clieni s se poat conecta la el cu minimum efort de integrare i de programare.

transparen Sistemele OLAP trebuie s conin interfee 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 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 colecii mari de date, actualizate periodic, de aceea trebuie s aib abilitatea de a stabili legturi 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, legturile servesc ca funcii de transformare. Ele indic cum se transform datele din tabele sau foi de calcul tabelar n date multidimensionale. Legturile pot descrie relaii structurale, atributele membrilor sau coninutul hypercuburilor. Legturile ofer o infrastructur persistent pentru importarea i exportarea datelor i a metadatelor. Ele variaz
Pagina 30 din 206

n funcie de tipul informaiei adus n cub i de tipul sursei de date, de la care informaia este obinut.

10. stocarea rezultatelor generate de instrumentul OLAP Sistemele OLAP trebuie s stocheze datele separat de sistemele tranzacionale. Aceast cerin apare ca urmare a diferenelor ce exist ntre datele operaionale i cele destinate suportului decizional. 11. manipularea valorilor lips Valorile lips sunt diferite de valorile zero i cele invalide. Termenul de mprtiere a fost utilizat cu semnificaia 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 relaional. Existena unui numr mare de valori zero nu este totui un exemplu real de mprtiere. Valoarea zero este valid ca orice alt numr. Problema tratrii datelor mprtiate este una foarte important i este frecvent dezbtut n domeniul bazelor de date. Cele dou tipuri de date (lips i invalide) trebuie totui 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.

Modul de prezentare al datelor: 13. flexibilitatea rapoartelor Codd considera c orice subset de membri ai unei dimensiuni poate fi mapat la orice rnd, coloan sau pagin a ecranului de afiare. Cu alte cuvinte, aranjamentul axelor n raportare trebuie s fie la libera alegere a utilizatorului.

Pagina 31 din 206

14. performana raportrii Aceast regul nu trebuie s varieze semnificativ cu numrul de dimensiuni sau cu mrimea bazei de date. Principalii factori care afecteaz performana raportrii sunt: - modul cum sunt realizate calculele. Ele pot fi antecalculate sau sunt realizate la momentul interogrii. - locul unde sunt procesate calculele (client/server). Aceti factori prezint o importan mai mare dect mrimea bazei de date, numrul de dimensiuni sau complexitatea raportrii. 15. ajustarea automat a nivelului fizic Codd cere sistemelor OLAP s-i modifice automat schema fizic a bazei de date, n funcie de tipul modelului logic i de volumul datelor.

Controlul dimensiunilor: 16. dimensionalitatea generic Codd considera c dimensiunile trebuie s fie echivalente structural i operaional, adic s permit ierarhii multiple, toate tipurile de operaii multidimensionale i n acelai timp s poate fi actualizate. 17. dimensiuni i niveluri de agregare nelimitate Din punct de vedere tehnic, un produs nu poate ndeplini aceast regul, resursele calculatorului fiind limitate. Puine aplicaii OLAP necesit mai mult de opt sau zece dimensiuni i puine ierarhii conin mai mult de ase nivele. Codd afirm c ar trebui stabilit un numr maxim de dimensiuni, 15-20 de dimensiuni. 18. operaii ntre dimensiuni nerestrictive

Pagina 32 din 206

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 modaliti de manipulare a datelor ntre orice numr de dimensiuni.

Aceste reguli au fost extinse n mai 1995 i au fost structurate de Codd n patru grupe, denumite caracteristici. Caracteristicile sunt rareori menionate i putin folosite.

EXEMPLE DE INSTRUMENTE OLAP

Business Objects Americans este lider n furnizarea de instrumente suport de decizie incluznd interogare, raportare, analiza proceselor on-line, data mining i administrare SSD pentru arhitectur client/server i mediu Internet: Business Objects permite dezvoltarea de aplicaii suport de decizie cu faciliti de interogare i raportare. Asigur acces la diferite surse de date (depozite de date/centre de date, baze de date multidimensionale, fiiere text, pachete de aplicaii, sisteme SAP). Folosind facilitatea VBA permite utilizatorilor s modifice i s extind nucleul funcional al produsului Business Objects (se pot crea noi funcii, noi comenzi sau subprograme). Developer Suite permite integrarea complet a lui Business Objects cu alte aplicaii i cuprinde urmtoarele componente: Business Objects, WebIntelligence (server de Web), Broadcast Agent i o component pentru vizualizarea rapoartelor. Cognos ofer instrumente pentru inteligena afacerii, medii de dezvoltare a aplicaiilor. Power Play este un instrument de analiz i raportare multidimensional folosit pentru a oferi informaii utile managerilor. Este un instrument foarte scalabil (pn la cteva mii de utilizatori), cuburile pot fi create pe client sau pe servere Unix. Ele pot fi create ca fiiere ntrun sistem de gestiune de fiiere sau ca tabele ntr-o baz de date relaional (Oracle sau Sybase). Permite o metodologie de proiectare a aplicaiilor iterativ. Impromptu permite utilizatorilor s creeze rapoarte complexe fr s cunoasc limbajul SQL sau structura bazei de date. Power Play i Impromptu se folosesc pentru aplicaii de analiz a vnzrilor, analiz financiar, controlul calitii. Instrumentele pot importa date din peste o sut de surse de date relaionale i multidimensionale.
Pagina 33 din 206

Holistic Systems, Inc este un membru al grupului Seagate Software Information Management i este cel mai puternic furnizor de instrumente pentru inteligena afacerii. Holistic Systems este complet dedicat pentru activitatea de marketing, fiind un lider n BI. Holos este un mediu de dezvoltare pentru aplicaii BI, ncorporeaz faciliti 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 reele neuronale, integrat cu nivelul analitic foarte puternic al lui Holos. Pilot Software, Inc este o firm a corporaiei The Dun & Bradstreet, care dezvolt instrumente suport de decizie interactive pentru manageri i analiti. 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 operaii de drill down, roll up i pivotare prin datele agregate. Include un motor OLAP cu cunotine de timp i instrumente pentru analiza de excepii. Sursele de date pot fi relaionale. Pilot Analysis Server este un server OLAP multiutilizator ce ofer multe faciliti de modelare, include o bibliotec de funcii. Pilot Designer este un instrument pentru crearea tuturor tipurilor de aplicaii vizuale de tip suport de decizie. Include un limbaj pentru scripturi ce este compatibil cu Visual Basic. Pilot Analysis Library este o bibliotec opional de module de analiz ce permite utilizatorilor s accelereze implementarea de soluii suport de decizie complexe. Pilot Excel Add-In este o component opional ce permite utilizatorilor Excel de a integra facilitile mediului Pilot n soluiile Excel. MicroStrategy, Inc este lider n soluii ROLAP i ofer urmtoarele produse OLAP: DSS Server (motor relaional-OLAP), clieni (DSS Agent Relational OLAP, DSS Objects pentru dezvoltarea de aplicaii OLAP, DSS Web Relational OLAP client pentru Web), DSS Administrator (client pentru depozite de date), DSS Executive EIS (instrument de proiectare). Kenan Systems Corp ofer soluii pentru firmele din domeniul telecomunicaiilor, servicii financiare, comer. Ofer urmtoarele produse: Acumate Server este un mediu de dezvoltare de aplicaii, incluznd un limbaj procedural multidimensional (MSPL) i instrumente de analiz complexe. Serverul include un set de instrumente de ncrcare a datelor, pentru accesarea depozitelor de date i a sistemelor operaionale eterogene. Acutrieve este o aplicaie suport de decizie optimizat pentru analiti.

Pagina 34 din 206

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 urmtoarele 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 operaii de planificare i analiz a afacerilor, cu urmtoarele caracteristici: arhitectur client/server, acces concurent la citire/scriere, stocheaz volume mari de date, permite calcule analitice complexe, navigare flexibil prin date, timp de rspuns mic, permite aplicaii OLAP robuste ce acceseaz direct sisteme OLTP sau un centru de date. Essbase Spreadsheet Add-In permite integrarea facilitilor oferite de instrumentele de tip foaie de calcul tabelar (Excel, Lotus) cu facilitile OLAP. Essbase Aplication Manager este folosit pentru a construi, modifica i gestiona modele analitice, securitatea accesului la date, reguli de ncrcare a datelor. Wired for OLAP este un instrument de prezentare i analiz ce opereaz att pe client ct i pe server. Essbase Objects este un instrument puternic ce permite dezvoltarea de aplicaii OLAP. IBM Corporation: Componenta de prezentare ofer un set de faciliti de vizualizare, navigare i raportare. Motorul OLAP permite reprezentarea multidimensional a schemei stea, calcule analitice complexe i agregri. Unele soluii OLAP includ i un nivel suplimentar:
Pagina 35 din 206

Componenta de aplicaie. Aceast component ofer logica afacerii, specific pentru subiectul analizat (de exemplu marketing i vnzri). Oracle Corporation ofer urmtoarele 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 facilitile OLAP n baza de date relaional Oracle. Oracle Express Administrator este un utilitar grafic pentru definirea, ntreinerea 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 relaional, 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 aplicaii 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 aplicaiei. Este un element cheie n Oracle Integrated Business Intelligence Tools, fiind integrat cu Oracle Discoverer. Oracle Express Spreadsheet Add-In permite afiarea datelor multidimensionale ntr-o foaie de tip calcul tabelar Excel. Oracle Express Web Agent permite crearea de aplicaii Express ce pot fi lansate n execuie folosind un browser Web. Aplicaiile Oracle Express (Oracle Sales Analyzer i Oracle Financial Analyzer) sunt aplicaii preconstruite pentru analiza vnzrilor i a pieei i analiz financiar. SNAPI (structured N dimensional application programming interface) este o bibliotec de funcii C care permite ca aplicaiile client Windows s poat comunica cu serverul Express. Local SNAPI permite clienilor s se conecteze la Personal Express, iar Remote SNAPI la serverul Express. ExpressCommunication Arhitecture (XCA) permite comunicarea ntre Personal Express i Express Server i ntre instane diferite ale serverului Express.

2.5. ORACLE 9I OLAP

Pagina 36 din 206

Oracle 9i OLAP integreaz toate facilitile analitice oferite de Oracle Express Server n baza de date relaional Oracle. Astfel putem afirma c SGBD Oracle 9i este un mediu integrat relaional-obiectual-multidimensional: - Datele pot fi stocate ntr-un depozit de date sau ntr-un spaiu de lucru analitic. Tipul de analiz fcut de fiecare aplicaie n parte determin cea mai bun alegere n modul de depozitare a datelor. Trebuie examinate beneficiile fiecrei metode de stocare n funcie de aplicaie i trebuie decis care dintre acestea se potrivete mai bine cu cerinele. Pentru stocarea informaiilor, se poate opta pentru una din urmtoarele alternative: n ntregime n baze de date relaionale. Informaiile sunt stocate n ntregime ntr-un depozit de date i puse la dispoziie aplicaiilor Java prin metadate. n timpul sesiunilor utilizatorilor, informaiile sunt selectate i manipulate n baza de date relaional. Aceast soluie este n mod obinuit denumit Relational OLAP (ROLAP). Baza de date relaional este modul preferat de stocare a informaiei pentru marea majoritate a aplicaiilor de interogare i raportare care necesit acces de tip read-only la informaie. Pentru aceste aplicaii, baza de date relaional ofer scalabilitate n susinerea eficient a unor seturi foarte mari de date printr-un singur set de instrumente administrative.

n ntregime ntr-un spaiu de lucru analitic multidimensional. Informaiile sunt ncrcate n dimensiuni i variabile n spaiul de lucru. n timpul sesiunilor utilizator, informaiile sunt selectate i manipulate n spaiul de lucru analitic. Aceast soluie este denumit Multidimensional OLAP (MOLAP). Spaiile de lucru analitice ar trebui folosite ca un mod persistent de stocare a informaiei pentru aplicaiile ce suport funcii de analiz predictiv precum modele, previziuni i scenarii de tip cum ar fi dac.... Alte opiuni de design, ca tipurile de ierarhii sau folosirea de metode non-aditive de agregare, ar putea face ca spaiul de lucru analitic s fie modul preferat pentru stocarea datelor.

Distribuite ntre baza de date relaional i spaiul de lucru analitic. Implementarea acestui model poate, desigur, varia mult din moment ce reunete celelalte dou soluii. O soluie distribuit poate fi de dorit atunci cnd o aplicaie necesit capaciti de calcul avansate i viteza unei solutii MOLAP combinat cu eficiena stocrii ntr-o baz de date relaional. Aceast soluie este denumit n mod obinuit Hybrid OLAP (HOLAP).

Pagina 37 din 206

Pe lng alegerea locului de stocare a informaiei se pune problema alegerii exacte a ceea ce ar trebui stocat. Informaiile agregate pot s fie generate i stocate ca un pas n mentenana datelor, sau pot s fie agregate de cte ori este necesar ca rspuns la o cerere. Dac informaiile sunt deja puse la dispoziie, atunci timpul de rspuns este mai rapid. n orice caz, va fi nevoie de mai mult spaiu de depozitare pentru a gzdui datele adiionale. Atunci cnd se decide ce anume se stocheaz trebuie luate n considerare influenele a mai muli factori: ct de frecvent este necesar data agregat; ct timp este necesar pentru generarea datei; dac timpul necesar pentru generarea datei se situeaz n limite acceptabile; ct spatiu pe disc este necesar pentru depozitarea datei sau dac exist opiunea extinderii mediului de stocare. - Serviciile OLAP ofer Java OLAP API, un motor pentru calcul i un spaiu de lucru analitic. Aceste faciliti permit construirea de aplicaii analitice ce suport calcule complexe de tip statistic, matematic i financiar alturi de funcii de analiz predictiv precum previziune, modelare, consolidare, alocri i scenarii manageriale. Serviciile OLAP conin urmtoarele componente: Oracle Java OLAP API, unul sau mai multe servicii OLAP care ruleaz ca procese-fiu ale instanei 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 urmtoarele sarcini n administrarea sistemului: pornirea i oprirea serviciilor existente, ct i crearea unor servicii adiionale monitorizarea sesiunilor utilizatorilor adugarea sau tergerea unor componente opionale, pentru a le putea folosi pe cele care sunt necesare utiliznd ct mai puine resurse ajustarea cu finee a parametrilor de operare astfel nct serviciile OLAP s funcioneze optim ntr-un mediu unic de procesare a datelor Componenta OLAP a Oracle Enterprise Manager genereaz metadate pentru uzul aplicaiilor. Aceste metadate sunt folosite pentru a identifica faptele disponibile pentru analiz, ct i pentru a crea i popula obiectele multidimensionale. Aceste obiecte sunt
Pagina 38 din 206

necesare pentru a procesa cererile analitice folosind date stocate permanent ntr-un depozit de date. Aplicaiile OLAP pot interoga dicionarul de metadate pentru a afla ce date sunt disponibile pentru ele pentru a analiza i a afia. n timp ce datele sunt stocate n tabele ntrun depozit de date Oracle, metadatele identific date n termeni de obiecte multidimensionale aa cum vor deveni prin serviciile OLAP: dimensiuni, msuri i atribute. Mai mult, metadatele definesc ierarhiile dimensiunilor necesare pentru a agrega datele n nivele de detaliu coerente.

- Oracle BI Beans completeaz serviciile OLAP punnd la dispoziie un set de aplicaii OLAP preconstruite. BI Beans poate fi folosit n Oracle JDeveloper sau n alte medii de dezvoltare Java pentru construirea de aplicaii analitice ce pot fi implementate drept clieni Java sau HTML.

Pentru a dezvolta aplicaii OLAP, Oracle ofer programatorilor posibilitatea de a alege metoda de interaciune cu aceste metadate i anume:

LIMBAJUL DE PROGRAMARE JAVA Java este limbajul Internet-ului i de asemenea este limbajul aplicaiilor OLAP. Folosind Java, un dezvoltator de aplicaii poate scrie o aplicaie de sine stttoare 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, optimizat pentru reea i securizat, Java a nceput s ctige rapid teren n faa 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 definete obiectul necesar, n loc s defineasc paii 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 execuiei de Java Virtual Machine (JVM). Ca rezultat, acelai
Pagina 39 din 206

program poate fi rulat pe toate platformele Windows, Unix, Macintosh, unde JVM a fost instalat. Toate browser-ele importante au JVM ncorporat. Optimizat pentru reea. Java a fost conceput s funcioneze ntr-o reea, ceea ce permite programelor Java s trateze resursele la distan la fel de uor 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 descrcat de la distan (care este un applet) nu este de ncredere. Modelul de securitate Java de tip sandbox ofer un mediu foarte restrns pentru codul neacceptat, care nu este de ncredere. De exemplu, codul neacceptat nu poate avea drept de citire/scriere ctre fiierele aflate n sistemul local, nu poate rula/executa programe, nu poate ncrca librrii, nu poate defini metode native sau face conexiuni n reea exceptnd calculatorul gazd de origine. Un manager de securitate determin resursele sistemului la care poate avea acces un applet. Totui, 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 aplicaie OLAP se folosete limbajul de programare Java. Java permite scrierea de aplicaii ce sunt independente de platforma pe care se lucreaz i sunt uor de implementat pe Internet. Java este limbajul de programare preferat pentru un numr din ce n ce mai mare de profesioniti n dezvoltarea software. Pentru aceia care au lucrat cu C sau C++, trecerea la Java este uoar deoarece ofer un mediu familiar n timp ce se evit multe dintre deficienele limbajului de programare C. Creat de Sun Microsystems, Java este un limbaj securizat, orientat obiect, portabil i multithread. OLAP API este o interfa de tip aplicaie Java ce ofer acces la date de tip multidimensional pentru aplicaii 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 su analitic. Clasele Java din OLAP API ofer toate funciile necesare unei aplicaii 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 validai; selectarea i manipularea datelor pentru analiza afacerii. BI Beans simplific dezvoltarea aplicaiei oferind aceste funcii ca JavaBeans. Mai mult, BI Beans include JavaBeans pentru prezentarea informaiei n grafice, tabele etc.
Pagina 40 din 206

Odat cu dezvoltarea tehnologiei Internet, din ce n ce mai multe companii realizeaz ct ar putea s ctige doar prin schimbarea modului n care le sunt implementate aplicaiile. Tradiionalele aplicaii thick-client (aplicaii cu client performant) implementeaz multe dintre funciile lor pe calculatorul utilizatorului, acest lucru necesitnd o mare proporie de cod instalat. Totui, a trecut timpul cnd era necesar o ntreag echip de tehnicieni pentru a instala i menine aplicaii software pe sute i mii de calculatoare individuale pentru o gam larg de utilizatori. n opoziie, aplicaiile Java thick-client descarc software-ul necesar pe calculatoarele client n mod automat la momentul execuiei aplicaiei. De asemenea, administratorii de sistem pot implementa aplicaii thin client (aplicaii cu client de tip browser) care nu descarc nici un fel de cod Java pe calculatoarele client. Aceste aplicaii 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 folosete o configuraie de tip thick-client (client performant) sau thin-client (client de tip browser) aplicaiile Java ofer o soluie imediat problemelor ce intervin n lucrul cu o comunitate larg de utilizatori, care n mod obinuit dein o varietate de platforme hardware i software incompatibile.

UTILIZAREA MODULELOR JAVABEANS PENTRU INTELIGENA AFACERII Modulele JavaBeans pot fi considerate blocuri de cod prefabricate folosite pentru dezvoltarea aplicaiei. Aceste blocuri sunt piese reutilizabile de cod Java care pot fi asamblate repede i uor ntr-o aplicaie. Modulele BI Beans ofer principalele blocuri pentru o aplicaie OLAP: conexiunea la baza de date; autentificarea i validarea utilizatorilor; selectarea i preluarea datelor; afiarea datelor ntr-o mare varietate de tabele i formate grafice. Folosind BI Beans, se pot crea aplicaii cu utilizabilitate i interfa prietenoas i comun, permind utilizatorilor s ctige experien rapid cu noul produs. Sunt disponibile dou grupe de BI Beans: Beans de prezentare (Presentation BI Beans). Afieaz date ntr-o bogat varietate de formate, astfel nct variaiile i tendinele pot fi detectate cu uurin (de exemplu: Graph, Table i Crosstabs). Pot fi implementate att pentru arhitecturi cu client performant ct i pentru cele cu client de tip browser. Arhitecturile cu client performant se preteaz
Pagina 41 din 206

utilizatorilor ce fac analize complexe, necesitnd utilizarea sistemului pentru perioade extinse de timp i cu un volum mare de interaciune (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 lime de band joas i a cror nevoi analitice sunt reduse. Ele pot fi incluse ntr-un portal sau un site web pentru aceti utilizatori. OLAP BI Beans preiau i manipuleaz informaiile. OLAP BI Beans folosete OLAP API pentru conectarea la sursa de date, pentru definirea cererilor, pentru manipularea setului de date rezultat i returnarea rezultatelor ctre Presentation BI Beans pentru afiare. 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, oraele ce contribuie la un total pe jude. Pivotarea rotete cubul de date astfel nct membrii dimensiunii ce apar pe axa X a unui grafic vor aprea ulterior pe axa Y, sau membrii dimensiunii ce marcau coloanele ntrun tabel ncruciat (crosstab) vor marca acum rndurile. Spre exemplu, dac rndurile indic produsele i coloanele indic regiunile, cubul poate fi pivotat astfel nct coloanele s indice produsele i rndurile s indice regiunile. Paginarea se ocup de dimensiuni adiionale afind fiecare membru separat ntr-un grafic, tabel sau tabel ncruciat dect s le adune n coloane sau rnduri. De exemplu, un utilizator ar putea s solicite vizualizarea separat a fiecarei perioade de timp n loc s i se afieze toate perioadele de timp pe acelai grafic. BI Beans de prezentare permit schimbarea modului de afiare a unui anumit set de date. n plus, chiar valorile datelor pot afecta acest mod de afiare. Formatarea numerica. Afiarea numeric poate fi modificat schimbnd mrimea, numrul de zecimale i de zero-uri, simbolul valutei de referin, notaia de negativitate i aa mai departe. Simbolul valutei i factorii de mrime pot fi afiai n capetele de rnduri/coloane mai degrab dect n fiecare celul. Formatarea stoplight. Culoarea, marginile, caracterele folosite i asa mai departe pentru celule pot fi corelate cu datele efective, astfel nct informaiile problematice sau excepionale s fie aduse n prim plan n comparaie cu celelalte informaii. Rang. n rapoartele bazate pe rang, este afiat valoarea rangului numeric al fiecrei dimensiuni pe baza valorii msurii. 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
Pagina 42 din 206

valori, bazat pe serii de cte 3 valori. Multe dintre graficele bidimensionale pot fi afiate clustered, stiv, dual-Y, procentual, orizontale, verticale sau cu efect tridimensional. Graficele de tip bar, linie i arie pot fi combinate astfel nct rnduri 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 rnd-cu-rnd. 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, informaiile se pot prezenta i sub forma unui tabel bidimensional, similar unui spreadsheet. Mai multe dimensiuni pot fi aezate de-a lungul rndurilor i coloanelor, iar dimensiunile adiionale pot aprea 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 informaii fie cu mouse-ul, fie cu tastatura, pot aduga rnduri sau coloane pentru afiarea de rezultate i pot edita celule pentru analize de tip cum ar fi dac.... Informaiile pot fi prezentate i ntr-un format asemntor unei tabele, unde msurile sunt tratate individual. BI Beans ofer faciliti de tip wizard care pot fi folosite att de dezvoltatorii aplicaiei n crearea mediului iniial ct i de utilizatorii finali n personalizarea aplicaiei pentru a se potrivi cu nevoile lor particulare: Construirea unei cereri. Tabelele de fapte i viziunile/tabelele virtuale conin adesea mai multe informaii dect cele de care sunt direct interesai utilizatorii. Aducerea unor mari cantiti de informaii poate de asemenea degrada performanele i acest lucru nu e necesar. n plus fa de selectarea msurilor, se poate limita volumul de date adus printr-o cerere selectnd membrii dimensiunii dintr-o list sau folosind un set de condiii. O selecie poate fi salvat i folosit din nou doar prin selectarea numelui acesteia dintr-o list. Generarea de msuri personalizate (custom). Se pot defini noi msuri personalizate ale cror valori sunt calculate din informaiile stocate n baza de date. BI Beans ofer utilizatorilor posibilitatea de a-i crea propriile calcule, msuri, tocmai datorit faptului c un administrator de baze de date nu poate anticipa nevoile tuturor utilizatorilor.

Pagina 43 din 206

ORACLE JDEVELOPER Oracle JDeveloper ofer un mediu integrat de dezvoltare pentru dezvoltarea de aplicaii Java. JDeveloper se bucur de o integrare deplin cu baza de date Oracle i cu BI Beans Wizard. Iat cteva dintre facilitile 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 aplicaii 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.

INTERFAA ORACLE OLAP API Oracle OLAP API este o interfa de programare de aplicaii Java pentru serviciile OLAP. Este un limbaj de interogare care selecteaz i manipuleaz datele dintr-un depozit de date pentru a le afia ntr-un client Java. Blocurile analitice BI Beans sunt construite folosind acest API; se poate extinde (sau chiar nlocui) funcionalitatea oferit de BI Beans folosind clase Java. Aplicaiile OLAP au n mod obinuit interfaa utilizator orientat obiect, unde utilizatorii manipuleaz obiecte ce reprezint grupri organizate ale datelor/informaiilor. Astfel, exist o legtur natural ntre o interfa utilizator orientat obiect i un API orientat obiect cum este Oracle OLAP API. OLAP API exploateaz aceast legtur natural oferind acele obiecte necesare aplicaiei ce se potrivesc comportamentului utilizatorilor finali. Limbajele orientate obiect, cum ar fi Java, manipuleaz informaiile prin aplicarea de metode asupra obiectelor. Aceast abordare permite obiectelor s-i menin o stare curent i s suporte modificri incrementale la acest stare. Aceast abordare ofer un suport excelent pentru aciuni tipice OLAP cum ar fi forare i rotaie. De exemplu, o activitate de baz pentru utilizatorii de aplicaii OLAP este rafinarea cererilor. Un utilizator are o ntrebare n minte i alctuiete o cerere pentru a afla rspunsul. n cele mai multe situaii, rezultatul iniial al cererii l foreaz pe utilizator s caute mai n
Pagina 44 din 206

profunzime pentru o soluie, probabil prin forare (drilling), pentru a vedea mai multe informaii detaliate sau prin rotaia 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 aceleai informaii pentru a rspunde la cereri succesive este foarte mare, OLAP API pstreaz metadatele ntr-un cache astfel nct 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 aplicaii s primeasc doar informaiile de interes curent n loc de ntreaga informaie din setul de rezultate. Pentru primirea datelor dintr-un depozit de date, OLAP API genereaz instruciuni SQL. n preluarea datelor se folosesc multe dintre cele mai noi inovaii din Oracle 9i, inclusiv rescrierea cererilor, rollup concatenat i altele. OLAP API genereaz comenzi SQL pentru a selecta i manipula informaiile stocate n baza de date. Aceste comenzi SQL pot include funcii N-pass cum ar fi: RANK, PERCENTILE, TOPN, BOTTOMN, LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, i STDDEV. OLAP API ofer faciliti de calcul extinse n plus fa de cele care pot fi folosite n mod eficient n alte soluii OLAP, cum ar fi: suprimarea rndurilor, coloanelor sau paginilor cu valori nule, 0 sau NA (not applicable). calcule pe rnduri i coloane msuri ca dimensiuni. Calculele adiionale ca modelarea, previziunea i scenariile de tip cum ar fi dac... pot fi fcute asupra datelor n spaiul 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 interfeei OLAP API pentru a include faciliti precum previziunea, modelarea i scenariile de tip cum ar fi dac.... Opereaz asupra datelor care sunt stocate (permanent sau temporar) n obiecte multidimensionale din spaiul de lucru analitic.
Pagina 45 din 206

Arhitectura unei aplicaii OLAP: ARHITECTURA UNEI APLICAII OLAP CU CLIENT PERFORMANT (THICKCLIENT) Componentele unei aplicaii OLAP cu client performant sunt grupate pe trei nivele ce pot fi pe platforme separate sau pe aceeai platform: - Nivelul clientului Java. O aplicaie Java poate s ruleze ori ntr-un browser ori direct n Java Runtime Environment (JRE). BI Beans, care sunt dedicate prezentrii datelor i metadatelor, ruleaz de asemenea pe acest nivel. - Nivelul serverului de aplicaii. Creierul aplicaiei ruleaz pe acest nivel, care include OLAP API i OLAP BI Beans, acestea fiind construite utiliznd OLAP API. - Nivelul serverului de date. Acest nivel este format din SGBDR Oracle i serviciile OLAP, fiind nivelul unde sunt stocate informaiile, selectate i manipulate. Pe acest nivel ruleaz i o component OLAP API.

Pagina 46 din 206

Figura 2.1: Arhitectura unei aplicaii OLAP cu client performant

ARHITECTURA UNEI APLICAII OLAP CU CLIENT DE TIP BROWSER (THIN-CLIENT) Componentele unei aplicaii OLAP cu client de tip browser sunt grupate pe dou nivele ce pot fi pe platforme separate sau pe aceeai platform: - Nivelul serverului de aplicaii. Creierul aplicaiei ruleaz pe acest nivel, care include un server web, OLAP API i OLAP BI Beans, att de prezentare ct i analitice. - Nivelul serverului de date. Acest nivel este format din SGBDR Oracle i serviciile OLAP, fiind nivelul unde informaiile sunt stocate, selectate i manipulate. Pe acest nivel ruleaz i o component OLAP API.

Pagina 47 din 206

Figura 2.2: Arhitectura unei aplicaii OLAP cu client de tip browser Tipuri de aplicaii OLAP dezvoltate cu Oracle 9i: Aplicaiile ce suport analiza activitii se grupeaz n urmtoarele mari categorii: Raportare standard i ad-hoc Raportare analitic Analiz predictiv Oracle pune la dispoziie tehnologia pentru toate aceste tipuri de aplicaii. Serviciile OLAP i instrumentele sale pentru dezvoltare sunt construite n mod special pentru aplicaii cu raportare analitic i pentru aplicaii cu analiz predictiv. Aplicaiile analitice pot suporta mai multe faete ale unei activiti de afaceri i ofer rezultatele ateptate ale unei investiii. Iat doar cteva exemple de aplicaii analitice: Contabilitate. Analiz pentru previziune, bugetare, costuri i profitabilitate, i consolidare Resurse umane. Consolidarea aptitudinilor, optimizarea i planificarea muncii Distribuie. Planificare i optimizare Automatizarea vnzrilor. Analiz teritorial Marketing. Analize de pia Producie. Planificarea i previziunea cererilor Medicin. Analiza ieirilor Servicii financiare. Analiza i managementul riscurilor.

Analiz comparativ ntre Oracle Express Server 6.x i Oracle 9i OLAP

Tabelul 2.2: Faciliti noi oferite de Oracle 9i OLAP fa de Oracle Express Server 6.x 1. Oracle OLAP este instalat ca o opiune n Oracle Enterprise Edition, i este acum integrat n baza de date relaional Oracle. Oracle OLAP ruleaz n 2. nucleul bazei de date. Spaiu de lucru analitic. n Oracle 9i, termenul de baz de date se refer doar la bazele de date relaionale. Un spaiu de lucru analitic este pstrat/stocat ca un

Pagina 48 din 206

LOB ntr-o baz de date relaional. Nu exist fiiere cu extensia .db. Sarcinile administrative pentru Oracle OLAP sunt unite cu setul de instrumente 3. pentru baza de date. Oracle Enterprise Manager include instrumentele pentru administrarea Oracle OLAP, oferind o interfa comun pentru toate platformele. Pachete variate de PL/SQL extind funcionalitatea curent disponibil prin Oracle Enterprise Manager i ofer o alternativ la folosirea acestuia. Informaiile de performan pot fi colectate ntr-un sistem de tabele asemntor 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 opional. Transferul de date ntre obiectele unui spaiu de lucru analitic (cum ar fi variabile sau dimensiuni) i tabelele relaionale se poate face n urmtoarele moduri: Comanda SQL a OLAP DML preia datele n dimensiuni i variabile pentru viitoare operaii i manipulri. O nou comand SQL IMPORT faciliteaz transferul brut de date din tabelele relaionale ctre spaiul de lucru analitic, iar o nou comand SQL INSERT DIRECT va facilita transferul de date din spaiul de lucru analitic n tabelele relaionale. Un pachet PL/SQL, CWM2_OLAP_AW_CREATE, ofer proceduri pentru crearea unui spaiu de lucru analitic din tabele relaionale sau metadate din OLAP Catalog ct i pentru generarea de vizualizri ale spaiului de lucru. Folosind funcii SQL pentru tabele, o aplicaie SQL are acum posibilitatea de a manipula i a extrage informaiile dintr-un spatiu de lucru analitic. Express Server nu permitea ca transferul de date s fie iniiat 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 aplicaiilor s-i poat accesa informaiile

Pagina 49 din 206

multidimensionale direct printr-un Java API sau SQL. Programele Express SPL pot fi executate folosind oricare dintre metodele de programare. Trebuie revzute toate programele SPL pentru a nltura comenzile care nu mai sunt disponibile i pentru a beneficia de avantajele noilor functionaliti. Pachetul CWM2_OLAP_AW_CREATE conine proceduri pentru crearea de spaii de lucru analitice i generarea de vizualizri ale acestora. Se pot crea metadate OLAP Catalog pentru uzul OLAP API, sau se poate folosi SQL pentru a rula direct n comparaie cu aceste vizualizri ale datelor multidimensionale. Nu se pot rula aplicaii Windows C++, HTML sau Java care au fost proiectate 6. pentru folosirea cu Express Server. Aplicaiile 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, Personal Express sau Express Connection Utility. 7. Oracle OLAP ofer conectivitate prin Oracle Call Interface (OCI) i prin Java Database Connectivity (JDBC). OLAP Worksheet folosete XCA pentru comunicarea cu spaiul de lucru analitic. Totui, XCA nu poate fi folosit pentru aplicaii dezvoltate de utilizatori i poate produce rezultate neateptate. SNAPI nu mai este disponibil. 8. n Oracle OLAP, administratorul bazei de date definete obiecte multidimensionale i metadatele OLAP asociate n baza de date relaional folosind pachete PL/SQL pentru uzul OLAP API. OLAP Worksheet permite administratorilor de baze de date ct i dezvoltatorilor de aplicaii s creeze obiecte n spaiul 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 spaiul 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 schimbri asupra

Pagina 50 din 206

Express Stored Procedure Language (acum denumit OLAP Data Manipulation Language sau OLAP DML). Comenzi noi. S-a adugat suport la OLAP DML n urmtoarele direcii: Agregare paralel Alocare Execuie dinamic de modele Transfer de date ntre spaiul de lucru analitic i tabelele relaionale Funcii de manipulare la nivel de byte Funcii de conversie a datelor Noi tipuri de date Comenzi nvechite. S-a renunat la suport n urmtoarele direcii: EXTCALL ODBC SNAPI XCA Comenzi ale sistemului de operare

Tabelul 2.2: Terminologii Express/Oracle 9i OLAP Express oesdba SNAPI Oracle Express Objects Express Basic Express Administrator OESCMD i linia de comand a administratorului Baz de date Express Oracle Express Server Express Instance Manager Express Agent Express SPL (sau 4GL) RAA RAM Oracle 9i OLAP olapdba Java OLAP API JDeveloper Java AW Manager OLAP Worksheet Spaiu de lucru analitic parte a Oracle 9i OLAP parte a Oracle 9i OLAP OLAP Agent OLAP DML director OLAP n OEM automat (nu mai este necesar folosirea RAM deoarece datele relaionale pot fi accesate direct) Capitolul 3

Pagina 51 din 206

INSTRUMENTE UTILIZATE PENTRU REALIZAREA SISTEMULUI OLAP (ORACLE 9I JDEVELOPER)

Oracle Jdeveloper 10g este un mediu integrat de dezvoltare (IDE) pentru dezvoltarea de aplicaii i servicii web, folosind ultimele standarde n domeniile Java, XML i SQL. ncepnd 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 instrument 100% bazat pe tehnologia Java, este un mediu integrat de dezvoltare multiplatform ce poate rula pe Windows, Linux i diverse distribuii de Unix. Oracle JDeveloper 10g pune la dispoziia 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 susin o aplicaie pe toat durata ciclului de dezvoltare, folosind instrumente integrate pentru modelarea, codarea, depanarea, testarea, profilarea, ajustarea i implementarea acesteia. Printre noile faciliti oferite de JDeveloper se numr abordarea declarativ i vizual a dezvoltrii precum i inovativa Oracle Application Development Framework (Oracle ADF), ce contribuie la simplificarea procesului de dezvoltare i reduce semnificativ timpul alocat codrii, oferind o productivitate neegalat i o multitudine de posibiliti n privina alegerii tehnologiilor cu care se lucreaz. Oracle JDeveloper se axeaz pe dezvoltarea de aplicaii Java folosind J2EE, J2SE sau J2ME pentru dispozitive mici. J2EE este un set de specificaii folosit n construirea de aplicaii multi-nivel folosind limbajul Java. J2EE este o platform robust, securizat i scalabil ce constituie fundaia pentru multe din aplicaiile de astzi.

n plus, noua versiune a JDeveloper pune la dispoziia dezvoltatorilor de aplicaii XML faciliti 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 dispoziie un mediu
Pagina 52 din 206

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 combinaie excepional 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 progrmarii n J2EE att n mediul vizual ct 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, eliminnd astfel necesitatea codrii unei infrastructuri.

Figura 3.2: Oracle JDeveloper 10g (10.1.2) Un aspect distinctiv al Oracle JDeveloper const n faptul c aceeai experien productiv de dezvoltare poate fi folosit pe diverse stive de tehnologii. Spre exemplu, programatorii pot alege s implementeze o aplicaie OLAP folosind clase Java simple, componentele de Business Intelligence din Oracle ADF sau serviciile Web. Indiferent de

Pagina 53 din 206

tehnologia aleas, Oracle JDeveloper va produce o cale declarativ de creare a acestui nivel ct i mecanisme vizuale pentru a uura munca programatorilor. Ajungnd la concluzia c fiecare programator Java are un nivel de experien i cunotine diferit ct i propriul stil de abordare a dezvoltrii, Oracle JDeveloper ofer o multitudine de abordri de dezvoltare, ce includ Model Driven Architecture (MDA Arhitectur bazat pe modele), dezvoltare declarativ sau pur i simplu codare manual, programatorii putnd opta pentru metoda ce se potrivete cel mai bine stilului lor. Oracle JDeveloper ofer posibilitatea programatorilor de a folosi ultimele standarde tehnologice n dezvoltarea aplicaiilor ce pot rula pe platfome hardware i software multiple. Aplicaiile construite cu Oracle JDeveloper pot fi implementate pe orice server compatibil J2EE i pot accesa orice baz de date compatibil JDBC. n aceeai direcie, Oracle ncurajeaz instrumentele i platformele open-source, oferind funcionaliti pentru Struts, Ant, JUnit i CVS. Aceast integrare d posibilitatea programatorilor de a folosi instrumentele open-source, optimiznd astfel procesul de dezvoltare. JDeveloper pune de asemenea la dispoziie un SDK (Software Developers Kit) de extensie ce las programatorii s adauge posibiliti 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, personaliznd astfel un IDE potrivit nevoilor fiecruia. API-ul folosit de echipa JDeveloper n dezvoltarea programului este pus n forma sa complet la dispoziia programatorilor i a companiilor n domeniu care sunt interesate de integrarea sau mbuntirea 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 necesitii de a scrie cod ce implementeaz tipare de design sau infrastructur a aplicaiei. Oracle ADF le pune la dispoziie ca parte a cadrului de lucru i conine att servicii n timpul execuiei ct i funcionaliti de dezvoltare. Este un pas evolutiv, o mbuntire 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 aplicaii pe 3 niveluri:
Pagina 54 din 206

Model se ocup de interaciunea cu sursele de date i de logica afacerii, View se ocup de interfaa aplicaiei cu utilizatorul, Controller se ocup cu mersul fluent al aplicaiei i acioneaz ca interfa ntre nivelurile Model i View. Independena fiecrui nivel fa de celelalte rezult ntr-o arhitectur cuplat lejer, fapt ce ajut la o mentenan mai uoar i crete reuzabilitatea codului. Oracle ADF pune la dispoziie o metod uoar de a implementa arhitectura MVC. Oracle ADF este bazat pe 4 niveluri, lsnd programatorii s aleag tehnologia preferat n implementarea fiecruia: Business Services asigur accesul la date din diferite surse i se ocup de logica afacerii. Asigur servicii de persisten a datelor, managementul tranzaciilor i execuie 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, permind nivelelor View i Controller s lucreze n mod consistent cu diferite implementri ale nivelului Business Services. Felul unic n care este implementat nivelul Model n Oracle ADF confer aplicaiei puterea arhitecturilor orientate pe servicii. Nivelul Model permite dezvoltarea cu uurin a aplicaiei ca un set de servicii ce pot fi refolosite n diferite aplicaii. Controller pune la dispoziie un mecanism pentru a controla mersul fluent al aplicaiei. De exemplu, aplicaiile bazate pe interfa Web sunt compuse din multiple pagini cu coninut dinamic, pe acest nivel fcndu-se trecerea de la o pagin la alta. Cea mai proeminent arhitectur pentru aplicaii Web Java se bazeaz pe un servlet ce acioneaz ca un controller, ADF folosind Apache Jakarta Struts. View pune la dispoziie interfaa aplicaiei cu utilizatorul, folosind pentru aceasta HTML, componente Java sau variaii 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, genernd n acelai timp i acele servicii ce vor realiza interfaa Java ctre aceste tabele.
Pagina 55 din 206

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 tranzaciilor, inspecia resurselor sau declararea de reguli de validare.

Pentrul nivelul Controller, Oracle JDeveloper asigur un modelator de ordonare a paginilor n mersul aplicaiei, bazat pe Jakarta Struts. Acest modelator aduce o interfa vizual ce simplific procesul de planificare al mersului fluent al aplicaiei. 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 dispoziie un editor vizual att pentru aplicaiile bazate pe HTML ct i pe cele clasice bazate pe componente Swing. Programatorii pot folosi paleta de componente pentru a aduga componente vizuale la interfaa aplicaiei cu utilizatorul. Paleta de componente poate fi extins cu orice JavaBean standard sau librrie de tag-uri JSP. Inspectorul de proprieti poate fi folosit pentru a defini n mod declarativ atributele componentelor vizuale. Editorul vizual este sincronizat n orice moment cu codul surs, lsnd modul de editare preferat la alegerea fiecruia.

Pagina 56 din 206

Paleta de control a datelor ofer o perspectiv a nivelului Business Services, oferind programatorilor posibilitatea de a lega la acest nivel diversele componente ale aplicaiei printr-un simplu drag-and-drop. Pentru aplicaiile bazate pe pagini Web exist ADF UIX, un set de componente pentru definirea de interfee cu utilizatorul avansate, folosind HTML.

Oracle 9i JDeveloper ofer suport complet pentru intregul ciclu de via al dezvoltrii aplicaiei (figura 3.4).

Figura 3.4: Schema ciclului de via al unei aplicaii

n dezvoltarea unei aplicaii vom ntlni ntotdeauna mai multe etape dect cea de codare efectiv. Oracle JDeveloper susine prin diverse instrumente integrate toate etapele necesare dezvoltrii unei aplicaii mature: modelare, depanare, testare, profilare, optimizare i implementare. JDeveloper 10g ofer instrumente integrate pentru modelare UML, foarte importante n conceperea i analizarea aplicaiei. Printre aceste instrumente amintim un modelator de clase (Class Modeler), un modelator de utilizri (Use Case Modeler) i un modelator de activiti (Activity Modeler), fiind folosite pentru modelare conceptual i consolidarea documentaiei aplicaiei.

Pagina 57 din 206

Programatorii pot folosi facilitatea Class Modeler pentru a vizualiza i genera clase Java. Funcionalitatea de generare n dou sensuri sincronizeaz codul i modelul indiferent dac schimbrile sunt fcute n editorul de cod sau n Class Modeler. Facilitatea de inginerieinvers permite programatorilor s construiasc modele din codul existent deja. Class Modeler implementeaz un profil UML pentru BC4J ce ofer programatorilor un mediu vizual de programare pentru definirea componentelor aplicaiilor 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 aplicaii e-business. Programatorii folosesc aceast facilitate pentru a vizualiza i genera integrarea ntre aplicaiile 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 adiionale ce definesc procesele executabile, rutarea i alinierea. Procesul este exprimat n termeni de activiti, subsisteme (ce se ocup de activitile din interiorul partiiilor) i rutare.

Pagina 58 din 206

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 eseniale ale dezvoltrii aplicaiei, JDeveloper incluznd un depanator (Debugger) rapid i puternic ce ofer o metod vizual de a analiza codul. Depanatorul integrat suport depanarea la cald, ceea ce nseamn c programatorul poate aduce modificri codului surs chiar n timpul sesiunii de depanare. Se pot seta puncte de ntrerupere (breakpoints) i se poate avansa nainte sau napoi ctre orice punct al codului surs n timpul depanrii. Depanatorul mai include i o vizualizare a stivei de memorie. JDeveloper pune la dispoziia dezvoltatorilor de aplicaii bazate pe Swing un depanator al interfeei cu utilizatorul (UI Debugger). Prin crearea de instantanee i afiarea ierarhic a obiectelor ntr-o interfa grafic, depanatorul ofer o metod facil de monitorizare a interfeei cu utilizatorul n timpul execuiei. 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 aplicaii 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 aplicaii de sine-stttor. Jdeveloper ofer numeroase i puternice instrumente pentru mbuntirea calitii codului Java prin identificarea potenialelor 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 execuie. Profilatorul ia o mostr la intervale regulate de timp i nregistreaz locul unde se afl firul de execuie la momentul nregistrrii. Mostrele sunt apoi analizate i afiate la sfritul sesiunii de profilare. Programatorii pot interaciona cu informaiile din fereastra profilatorului analiznd n profunzime zonele unde se presupune c se gsesc probleme de performan. De asemenea exist informaii despre felul n care sunt accesate metodele precum i frecvena accesrilor. Astfel, folosind acest instrument, este foarte uoar identificarea cu exactitate a locului unde aplicaia pierde intervale semnificative de timp. Urmtorul pas este mbuntirea codului. Aici este locul lui CodeCoach.

Pagina 59 din 206

CodeCoach. Este un instrument ce ofer consultan n ceea ce privete calitatea i performana programelor Java. Dup folosirea profilatorului pentru identificarea zonelor cu probleme, utilizatorul poate rula CodeCoach pe acest cod pentru a primi indicaii practice n mbuntirea calitii codului. Instrumentul poate chiar s rezolve probleme simple n mod automat. 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 execuiei programului. Pentru probleme complexe de memorie, combinaia dintre Memory Profiler i instrumentele de depanare, cum ar fi fereastra HEAP i fereastra de clase ncrcate, poate identifica cu exactitate sursa pierderilor de memorie. Event Profiler. Este un instrument ce se dovedete foarte folositor atunci cnd aplicaia este construit pe mai multe nivele. La un nivel mai ridicat dect Execution Sampling Profiler, acest profilator depisteaz lungimea unor evenimente specifice, indiferent unde sunt executate. Spre exemplu, o aplicaie JSP poate cere informaii unei componente BC4J care la rndul ei trimite o interogare ctre baza de date. Event Profiler poate face cu uurin un rezumat al timpilor cheltuii n execuia unei astfel de cereri i felul n care se compar cu alte evenimente ale aplicaiei. Code Audit. Ajut organizaiile n implementarea unor standarde de codare prin analizarea codului Java i confruntarea aderrii acestuia la standardele de codare impuse. Code Audit ajut la gsirea i repararea devierilor de la regulile impuse. Exist posibilitatea adugrii unor noi reguli de audit peste cele deja existente n JDeveloper. Code Metrics. Ofer o metod uoar de a evalua complexitatea i structura codului Java, analiznd parametri precum adncimea arborelui de motenire, numrul instruciunilor sau complexitatea buclelor codului. Implementarea aplicaiilor J2EE este mult simplificat de noul Oracle JDeveloper 10g. Exist o metod declarativ de a crea descriptorul de implementare al aplicaiei. mpachetarea este fcut cu ajutorul unui Wizard care creeaz fiiere standard WAR, EAR sau JAR din proiect. Aceste fiiere standard pot fi implementate apoi ctre orice server de aplicaii compatibil J2EE. Este posibil implementarea printr-un sigur click din IDE ntr-un container ce poate fi Oracle Application Server, Apache Tomcat, Jboss etc.

Pagina 60 din 206

Pentru aplicaiile bazate pe Swing, JDeveloper pune la dispoziie un Wizard care mpacheteaz aplicaia ntr-o aplicaie Java Web-Start, simplificnd astfel procesul de implementare pe mainile 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 faciliti putnd fi aplelate prin Wizard sau prin opiunile meniului. Programatorii pot aduga sau terge fiiere, controla istoricul versiunii, check-in, check-out, bloca fiiere sau pot compara versiunile fiierelor. Oracle JDeveloper ofer de asemenea i suport WebDAV pentru sharing-ul fiierelor pe protocolul HTTP. JDeveloper ajut programatorii s construiasc aplicaii de afaceri i comer electronic utiliznd Java, XML, HTML, SQL i PL/SQL i pune la dispoziie 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 definete structura unui document XML. O nou facilitate denumit Code Insight folosete schema XML pentru a valida codul XML i ofer o list de alternative valide pentru atribute sau elemente XML pe msur ce programatorul tasteaz. Alte faciliti 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 faciliti extinse pentru managementul conexiunilor i vizualizarea elementelor componente ale unei baze de date, la toate acestea adugndu-se suport mbuntit pentru secvenele PL/SQL i un SQL Worksheet ncorporat. Managementul conexiunilor. Jdeveloper permite crearea de conexiuni reutilizabile, meninndu-se detaliile unei conexiuni precum: utilizator, parol, numrul portului, calculatorul gazd i identificatorul bazei de date. Aceste conexiuni pot fi refolosite n diverse stadii ale ciclului de dezvoltare atunci cnd: Se vizualizeaz obiectele bazei de date Se editeaz i se compileaz cod PL/SQL (proceduri, funcii, pachete, declanatoare, etc.) Se execut i se modific instruciuni SQL
Pagina 61 din 206

Se acceseaz date dintr-o aplicaie 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 Secvene Sinonime 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, funcii i pachete, fiind ajutat de faciliti precum colorarea sintaxei i capacitatea de a rula sau depana aceste secvene 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 ctre baza de date i las serverul s se ocupe de compilare. Cnd apar eventuale erori, acestea sunt afiate n JDeveloper.
Pagina 62 din 206

SQL Worksheet. Incepnd cu versiunea 10g, editorul de SQL este nlocuit de un SQL Worksheet ncorporat. n afara afirii rezultatelor execuiei unei secvene de comenzi SQL, editorul SQL poate afia i planul de execuie al secvenei, ajutnd astfel la optimizarea accesului la baza de date.

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 CERINELOR INFORMAIONALE

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 vnzarea buturilor calde prin intermediul automatelor de buturi. Este de la sine neles ca n aceste condiii, conducerea societii s fie interesat s cunoasc n orice moment evoluia acestor vnzri, costurile aferente, rentabilitatea fiecrui aparat i implicit rentabilitatea unui contract ncheiat cu un beneficiar, modul de ncasare a buturilor calde, comportamentul fiecrui agent fa de client, fa de pstrarea i ntreinerea n bune condiii a aparatelor i a integritii gestiunii de ingrediente. Societatea ncepe s desfoare aceast activitate, cod CAEN 5263 Comer cu amnuntul care nu se efectueaz prin magazin n luna februarie a anului 2002. Anterior acestei date, societatea SC INPRODCOM SRL DEVA a fost selecionat de catre SC ELITE ROMNIA SA ca unic distribuitor pentru acest tip de activitate, alegere care s-a fcut dintr-un numr destul de mare de societi. Alegerea SC ELITE SA s-a bazat n principal pe urmtoarele:

Pagina 63 din 206

experiena de peste zece ani n comerul en-gros i cu amnuntul a SC INPRODCOM SRL cunoaterea pieei de desfacere pe raza judeului Hunedoara spaii de depozitare mari parcul auto bine dezvoltat recomandrile primite de SC INPRODCOM SRL din partea unor bnci i instituii ale statului (Registrul Comerului, Direcia General a Finanelor Publice Hunedoara etc.) ntre cele dou societi s-a ncheiat un contract comercial care stipuleaz pe scurt urmtoarele:

SC ELITE SA are urmtoarele obligaii: vinde cu plata n rate, lunar, ntr-o perioad de cinci ani, n baza comenzii lansate de SC INPRODCOM, automatele de buturi calde; vinde cu plata la treizeci de zile, n baza comenzilor lansate de SC INPRODCOM, ingredientele (zahr, cafea, ceai etc.) necesare producerii buturilor calde; pune la dispoziia SC INPRODCOM , n baza comenzilor lansate contra cost, piesele de schimb necesare reparaiei i ntreinerii automatelor de buturi calde; acord asisten tehnic n instruirea personalului, cercetarea pieei etc; stabilete c SC INPRODCOM este unic distribuitor pentru comercializarea buturilor calde pe raza judeelor Hunedoara, Timi, Arad, Oradea, Cara Severin, iar printrun act adiional ncheiat la contractul semnat, ncepnd cu aprilie 2004 i judeul Mehedini.

SC INPRODCOM SRL are urmtoarele obligaii: s achite contravaloarea automatelor de buturi calde la termenele scadente (lunar), ntr-o perioad de cinci ani; s achite contravaloarea ingredientelor n termen de treizeci de zile; s organizeze reeaua de distribuie n judeele nominalizate, n condiii de maxim rentabilitate, asigurnd cu resurse proprii spaii pentru birouri, spaii de depozitare, parc auto i personal operativ; s emit o scrisoare de garanie bancar n favoarea SC ELITE SA n valoare de un miliard lei, garanie pentru automatele de buturi calde care se pltesc ealonat;
Pagina 64 din 206

s se preocupe constant de creterea vnzrilor de buturi calde asfel nct volumul tranzaciilor cu ingrediente s aib un trend ascendent; s raporteze periodic volumul vnzrilor (cantitativ i valoric), performanele din fiecare jude etc. n figura 4.1 se prezint structura organizatoric a activitii analizate i factorii implicai:

Figura 4.1: Structura organizatoric a activitii de comercializare a buturilor calde O descriere succint a modului n care se desfoar practic activitatea, o considerm util n vederea evidenierii factorilor implicai (automate de cafea, ageni, beneficiari etc). n urma ncheierii unui contract, n vederea comercializrii buturilor calde, la sediul unui BENEFICIAR (societate comercial, instituie public, banc, coal etc.) este instalat un AUTOMAT DE BUTURI CALDE care va fi gestionat de un AGENT. AUTOMATUL DE BUTURI CALDE este un echipament tehnic care produce n mod automat maximum cincisprezece tipuri de buturi calde (REETE): cafea scurt
Pagina 65 din 206

cafea lung cafea cu lapte cappucino ciocolat cald cappucino cu ciocolat cafea cu ciocolat ceai lapte cappucino french vanilla cafea ness ness cu lapte cappucino cu ness ciocolat cu lapte ciocolat cu lapte i ness, consumnd pe baz de reete ingredientele depozitate. Aparatul are n dotare CONTOARE , care afieaz numrul buturilor produse. Exist dou tipuri de CONTOARE: - CONTORGENERAL: instrument ce msoar i afieaz numrul total de REETE produse indiferent de tipul lor. - CONTORPARIAL: instrument ce msoar i afieaz numrul total de REETE de un anumit tip (exemplu: contor parial pentru cafea, contor parial pentru ceai, contor parial pentru cappucino etc) CONTORGENERAL este foarte important deoarece indic nivelul vnzrilor i implicit banii ce trebuie ridicai 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.
Pagina 66 din 206

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 piaa, s gaseasc noi BENEFICIARI, s ntrein periodic AUTOMATELE de care rspunde, dar n primul rnd s raporteze, pe baza CONTOARELOR, numrul de buturi consumate i s ncaseze banii din APARATE de la BENEFICIARI. Toate aceste informaii sunt consemnate zilnic n Raport de gestiune aparate. Coninutul acestui document l putem grupa n: date generale: numr matricol APARAT locaia aparatului (BENEFICIARULUI) luna raportului tipul APARATULUI (BRIO, COLIBRI etc.) contor general la nceputul lunii contor general la sfrit de lun. date aferente fiecrei vizite la BENEFICIAR: data vizitei numr porii ncasate preul din contract valoarea ncasat valoarea contorului general numr de porii pe tipuri de butura (cafea lung, cafea scurt etc.)

4.1.2. Stabilirea cerinelor informaionale

Societatea dorete analiza urmtorilor indicatori: productivitatea unui AUTOMAT identificat prin MATRICOL: numrul total de buturi calde comercializate productivitatea fiecrui tip de automat:
Pagina 67 din 206

numrul total de buturi calde comercializate, ntr-o lun sau an pentru fiecare AGENT: numrul total de BENEFICIARI deservii de fiecare agent, ntr-o lun sau an numrul de buturi calde comercializate, pe total i pe tipuri, ntr-o lun sau an pentru fiecare ORA sau ZON: numrul de buturi calde consumate pe total i pe tipuri ntr-o lun sau an topul BENEFICIARILOR pe baza numrului de buturi calde comercializate, ntr-o lun sau an topul AGENILOR pe baza numrului de buturi calde comercializate, ntr-o lun sau an pentru total societate: numr de buturi calde consumate pe total i pe tipuri ntr-o lun sau an valoarea buturilor comercializate preul mediu topul BENEFICIARILOR pe baza numrului total de buturi calde comercializate, ntr-o lun sau an topul AGENILOR pe baza numrului total de buturi calde comercializate, ntr-o lun sau an topul AGENILOR pe baza numrului de beneficiari deservii, ntr-o lun sau an

4.2. PROIECTAREA MODELULUI MULTIDIMENSIONAL CONCEPTUAL

4.2.1. Identificarea variabilelor

n urma studiului cerinelor informaionale ale societii, se identific urmtoarele variabile: numr de beneficiari (nr_benef): semiaditiv; numr de buturi calde comercializate (cant_vndut): aditiv;
Pagina 68 din 206

pre mediu jeton (pre_jet): neaditiv; Pentru fiecare variabil se vor stabili factorii de care depinde sau n funcie de care variaz (dimensiunile cubului) i anume: variabila numr de beneficiari (nr_benef) are ca dimensiuni: Timp, Agent. variabila numr de buturi calde comercializate (cant_vndut), are ca dimensiuni: Timp, Aparat, Agent, Beneficiar, Tipbutur. variabila pre mediu jeton (pret_jet) are ca dimensiuni: Timp, Beneficiar. Tipuri de analize: numrul total de buturi calde comercializate de un APARAT pe lun i pe an, prin agregare dup TIMP; numr total de buturi calde comercializate, detaliat pe tipuri de automate pe lun i pe an, prin agregare dup TIMP; numr total de buturi calde comercializate, detaliat pe tipuri de automate, pentru o anumit locaie geografic, pe lun i pe an, prin agregare dup TIMP; numr total de buturi calde comercializate de fiecare agent, pe lun i pe an, prin agregare dup TIMP; numr total de buturi calde comercializate, detaliat pe tipuri de buturi, pentru fiecare locaie geografic n parte, pe lun i pe an, prin agregare dup TIMP; numrul total de beneficiari deserviti de un AGENT pe luna i pe an, prin agregare dup TIMP; Topul clienilor, n funcie de numrul total de buturi comercializate, pe an i lun; Topul agenilor, n funcie de numrul total de buturi comercializate, pe total firm, pe an i lun; Topul agenilor, in funcie de numrul total de beneficiari deservii; valoarea buturilor comercializate, pe total, pe lun i pe an, prin agregare dup TIMP;

4.2.2. Identificarea dimensiunilor i ierarhiilor

Pagina 69 din 206

Se identific urmatoarele dimensiuni ierarhice: Dimensiunea AGENT are o structur ierarhic, cu nivelulurile: L1=ar (ara n care activeaz agentul respectiv), L2=Jude (Judeul n care activeaz agentul respectiv), L3=Agent. Dimensiunea APARAT are o structur ierahic, cu nivelurile: L1=Categ (toate aparatele), L2=Tip (tipuri aparate), L3=Matricol, L4=Ben (beneficiar), L5=Locaie (ora), L6=Jude, L7=ar i patru ierarhii: DUPA_BENEFICIAR (cu nivelurile L7, L6, L4, L3), DUP_JUDE (cu nivelurile L7, L6, L3), DUP_LOCAIE (cu nivelurile L7, L6, L5, L3) i STANDARD (L1, L2, L3). Dimensiunea BENEFICIAR are o structur ierahic, cu nivelurile: L1=Top (toi beneficiarii), L2=Jude, L3=Locaie (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 buturi calde), L2=Butur (denumirile buturilor calde).

4.2.3. Definirea cuburilor n-dimensionale sau a structurii multicub

Pentru a reduce fenomenul de mprtiere s-a ales o structur multicub cu trei cuburi n-dimensionale i anume: Cubul n-dimensional cu dimensiunile: Agent, Beneficiar, Tipbutur, Aparat, Timp i variabila buturi calde comercializate (cant_vndut). Cubul n-dimensional cu dimensiunile: Agent, Timp i variabila: numr de beneficiari (nr_benef).
Pagina 70 din 206

Cubul n-dimensional cu dimensiunile: Beneficiar, Timp i variabila: pre mediu al unui jeton (pre_jet).

Structura multicub are o singur dimensiune global: Timp.

4.2.4. Rafinarea modelului multidimensional

O component cheie a modelrii multidimensionale este definirea formulelor, i n special al formulelor de agregare: valoare buturi calde comercializate (valoare) = cant_vndut * pre_jet (preul mediu). De asemenea, se vor realiza agregri dup toate dimensiunile existente. Pentru fiecare dimensiune se stabilesc nivelurile de granulaie i anume: Dimeniunea Agent are nivelul de granulaie: agent. Dimeniunea Aparat are nivelul de granulaie: matricol (matricolul automatului de cafea).

Dimeniunea Beneficiar are nivelul de granulaie: ben (beneficiar). Dimeniunea Timp are nivelul de granulaie: lun. Dimeniunea Tipbutur are nivelul de granulaie: butur. Pentru fiecare variabil din cuburile n-dimensionale se stabilete metoda de agregare a fiecrei dimensiuni din cub, dup cum urmeaz:
Pagina 71 din 206

Variabila cant_vndut este agregat dup dimensiunile AGENT, APARAT, BENEFICIAR, TIMP i TIPBUTUR 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).

4.3. PROIECTAREA LOGIC

S-au identificat urmtorele tabele de fapte: Tabela de fapte FAPTE1 (TIMP_LEAVES, APARAT_LEAVES, varchar2(30),

BAUTUR_LEAVES,

BENEFICIAR_LEAVES,

AGENT_LEAVES:

CANT_VNDUT: 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), varchar2(30), L2=TIP: varchar2(30), L3=MATRICOL: L6=JUDE: varchar2(30), varchar2(30), L4=BEN: L7=AR: L5=LOCAIE: varchar2(30),

varchar2(30)), Tipbutur (L1=CATEG: varchar2(30), L2=BUTUR: varchar2(30)), Beneficiar (L1=TOP: varchar2(30), L2=JUDE: varchar2(30), L3=LOCAIE: 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=LOCAIE: varchar2(30), L4=BEN: varchar2(30)).
Pagina 72 din 206

4.4. PROIECTAREA FIZIC

Pentru stabilirea aproximativ a dimensiunii bazei de date relaionale se utilizeaz modul de calcul propus de Ralph Kimball, mod ce se bazeaz pe cteva premise. Considerm c fiecare atribut are maxim 4Bytes. De asemenea considerm c pentru tabelele de fapte ce au un numr mic de atribute, dimensiunea indexului principal creat de cheia compus este de 60-80% din tabela de fapte. Tabelele de dimensiuni i indecii asociai vor fi foarte mici n comparaie cu tabela de fapte i indexul asociat. n cazul nostru s-au folosit nivelurile de granulaie stabilite anterior, iar dimensiunea bazei de date relaionale s-a calculat aproximativ astfel: Dimensiunea AGENT: 31 de ageni Dimensiunea APARAT: 412 matricole Dimensiunea BENEFICIAR: 546 beneficiari Dimensiunea TIMP: 21 luni (din mai 2003 pn n ianuarie 2005) Dimensiunea TIPBUTUR: 15 tipuri de buturi Numrul de nregistrri 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 acioneaz n judeul Hunedoara cu un beneficiar din Timi. Asta ar fi dus la un numr uria de nregistrri, adic 31*412*546*21*15 = 2196656280. De aceea sunt introduse numai cuplrile coerente. Numrul de atribute cheie pentru tabela de fapte FAPTE1: 5 Numrul de atribute din tabela de fapte FAPTE1: 1 Numrul 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.

Pagina 73 din 206

Numrul de nregistrri din tabela de fapte FAPTE2 = 314. Din nou, sunt introduse numai cuplrile coerente, unii ageni activnd de-abia din anul 2004. Numrul de atribute cheie pentru tabela de fapte FAPTE2: 2 Numrul de atribute din tabela de fapte FAPTE2: 1 Numrul total de atribute din tabela de fapte FAPTE2: 3 Dimensiunea tabelei de fapte FAPTE2 = 314 * 3 atribute * 4Bytes/atribut = 3768Bytes. Dimensiunea indexului principal pe cheia compus a tabelei = 80% * 3768Bytes = 3014.4 Bytes. Numrul de nregistrri din tabela de fapte FAPTE3 = 3914. Din nou, sunt introduse numai cuplrile coerente. Numrul de atribute cheie pentru tabela de fapte FAPTE3: 2 Numrul de atribute din tabela de fapte FAPTE3: 1 Numrul 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 opiunea de baz de date iniial de tip General purpose (sau cu Data warehouse) n directorul OraHome92. La finele instalrii s-a apsat butonul: Password management pentru a modifica parolele pentru: SYS, SYSTEM, OLAPSYS, SH (de exemplu: pentru fiecare cont n parte am ales

Pagina 74 din 206

parola florea) i pentru a debloca (UNLOCK) ultimele dou conturi mentionate. Aceste parole au fost notate pentru a fi folosite ulterior. 2. S-a descrcat 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). 3. Pentru instalarea patch set-ului se opresc toate instanele 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 coninutul patch-ului ntr-un director temporar. 5. Se lanseaz n execuie setup.exe din directorul temporar. Acesta va porni Oracle Universal Installer 10.1.0.3. 6. Se instaleaz patch set-ul n ORACLE HOME selectnd sursa: fiierul temp_dir\stage\products.jar 7. Dup instalarea patch set-ului: a). Dac Jserver este instalat se modific dimensiunea spaiului tabel SYSTEM (minim 10MB spaiu liber) utiliznd instrumentul Oracle Enterprise Manager (Storage TablespacesSYSTEM) (figura 4.2).

Pagina 75 din 206

Figura 4.2: Spaiul tabel SYSTEM b). Se verific spaiul tabel XDB. Trebuie s fie cel puin 50MB spaiu liber. Se modific acest spaiu n acelai mod ca i pentru spaiul tabel SYSTEM (figura 4.3).

Pagina 76 din 206

Figura 4.3: Spaiul tabel XDB c). Se modific parametrii: SHARED_POOL_SIZE i JAVA_POOL_SIZE din fiierul de parametri ai bazei de date: Se pornete baza de date: SQL> STARTUP Dac este necesar, se introduc urmtoarele comenzi pentru a determina dac sistemul folosete un fiier cu parametrii de iniializare (initsid.ora) sau un fiier cu parametrii serverului (spfiledbname.ora): SQL> SHOW PARAMETER PFILE; Aceast comand afieaz numele i locaia fiierului cu parametrii server-ului sau numele i locaia fiierului cu parametrii de iniializare. Se determin valorile curente ale acestor parametri: SQL> SHOW PARAMETER SHARED_POOL_SIZE; SQL> SHOW PARAMETER JAVA_POOL_SIZE;

Pagina 77 din 206

Dac sistemul folosete un fiier cu parametrii serverului: Dac este necesar, se seteaz valoarea parametrului de iniializare SHARED_POOL_SIZE (la cel puin 150MB): SQL> ALTER SYSTEM SET SHARED_POOL_SIZE='150M' SCOPE=spfile; Dac este necesar, se seteaz valoarea parametrului de iniializare

JAVA_POOL_SIZE (la cel puin 150MB): SQL> ALTER SYSTEM SET JAVA_POOL_SIZE='150M' SCOPE=spfile; Dac sistemul folosete un fiier cu parametrii de iniializare, dac este necesar, se vor schimba valorile parametrilor SHARED_POOL_SIZE i JAVA_POOL_SIZE (la cel puin 150MB) n fiierul initsid.ora. Se oprete 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 urmtorii pai: 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 urmtoarele comenzi SQL*Plus: SQL> STARTUP MIGRATE SQL> SPOOL patch.log SQL> @ORACLE_BASE\ORACLE_HOME\rdbms\admin\catpatch.sql SQL> SPOOL OFF Se repornete baza de date: SQL> SHUTDOWN SQL> STARTUP
Pagina 78 din 206

Se execut script-ul utlrp.sql pentru a recompila toate pachetele PL/SQL ce sunt invalide. Acest pas este opional, 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 fiierele 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 locaia unde se vor regsi fiierele necesare pentru construirea schemei BIBDEMO. Se lanseaz n execuie bibdemo.bat din fereastra Command Prompt, folosind urmtoarea sintax: bibdemo.bat <calea ctre fiierele bazei de date Oracle> De exemplu: bibdemo.bat e:\OraHome92\oradata\proiect Trebuie introdus acum parola pentru utilizatorul SYS ca SYSDBA. Execuia acestui program dureaz aproximativ 15-20 minute. Este normal ca acesta s se opreasc din cnd n cnd.

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 79 din 206

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 80 din 206

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 81 din 206

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 82 din 206

De asemenea, se poate testa conexiunea la OLAP cu schema demo BIBDEMO din JDeveloper, n felul urmtor: Se selecteaz opiunea JDeveloper / New Workspace Se selecteaz opiunea 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 urmtorii pai: Pas 1 (figura 4.4):

Figura 4.4: Crearea unei conexiuni OLAP Pas 1 Pas 2 (figura 4.5):

Pagina 83 din 206

Figura 4.5: Crearea unei conexiuni OLAP Pas 2 Pas 3 (figura 4.6):

Pagina 84 din 206

Figura 4.6: Crearea unei conexiuni OLAP Pas 3 Pas 4 (figura 4.7):

Pagina 85 din 206

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 spaii tabel i anume: un spaiu tabel de tip permanent: ANA (figura 4.9), de dimensiune 200MB; i un spaiu tabel de tip temporar: ANATEMP (figura 4.10), de dimensiune 50MB.

Pagina 86 din 206

Figura 4.9: Spaiul tabel ANA

Figura 4.10: Spaiul tabel ANATEMP

Pagina 87 din 206

2). S-a creat un nou utilizator: ANA (figura 4.11), utiliznd opiunea 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 88 din 206

3). Sistemul OLAP va utiliza ca surse de date urmtoarele 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) "JUDET_LLABEL" VARCHAR2(30) NOT NULL, "JUDET_SLABEL" VARCHAR2(30) "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")) NOT NULL, "TARA" VARCHAR2(30) NOT NULL, NOT NULL, "JUDET" VARCHAR2(30) NOT NULL,

Pagina 89 din 206

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 end; / CONCAT('AG',LPAD(seq_agent.nextval,3,'0')),CONCAT('AGENT ',LPAD(seq_agent.nextval,3,'0')) into :new.agent, :new.agent_slabel from dual;

b). Tabela TIPBUTUR (figura 4.14):

Figura 4.14: Tabela TIPBUTUR


Pagina 90 din 206

Codul SQL pentru crearea tabelei TIPBUTUR: 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, PRIMARY KEY("BAUTURA")) TABLESPACE "ANA"; VARCHAR2(30) NOT NULL, "CATEG_SLABEL"

c). Tabela APARAT (figura 4.15):

Figura 4.15: Tabela APARAT Codul SQL pentru crearea tabelei APARAT:

Pagina 91 din 206

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 92 din 206

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_AN" "TIMP_TRIM_LLABEL" "TIMP_AN_LLABEL" VARCHAR2(60), VARCHAR2(60), "TIMP_TRIM_SLABEL" VARCHAR2(30), VARCHAR2(30), "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 93 din 206

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 urmtoarele tabele de dimensiuni: Stabilirea tabelelor de dimensiuni: AGENT (figura 4.18):

Pagina 94 din 206

Figura 4.18: Dimensiunea AGENT Dimensiunea AGENT este de tip normal, cu o structur ierahic pe trei nivele: ar, Jude, Agent. Conine numele agenilor, judeul i ara n care acetia i desfoar activitatea. APARAT (figura 4.19):

Pagina 95 din 206

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=Locaie (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 (toi beneficiarii), L2=Jude, L3=Locaie (ora), L4=Ben (beneficiar) i dou ierarhii: Pe_jude (L1, L2, L4), Standard (L1, L2, L3, L4).

Pagina 96 din 206

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). TIPBUTUR (figura 4.22):

Pagina 97 din 206

Figura 4.22: Dimensiunea TIPBUTUR Dimensiunea TIPBUTUR este de tip normal, cu dou nivele: L1=Categ (toate tipurile de buturi calde), L2=Butur (denumirile buturilor calde) i o ierarhie: Standard (L1, L2). Tabelele de fapte: FAPTE1 (figura 4.23)

Pagina 98 din 206

Figura 4.23: Tabela de fapte FAPTE1 Tabela FAPTE1 conine toate combinaiile posibile ale cheilor primare din tabelele TIMP, APARAT, TIPBUTUR, BENEFICIAR i AGENT, care astfel agregate returneaz o cantitate vndut nenul. Este tabela folosit la crearea cubului CUB1, avnd cheie primar compus, iar coloanele CANT_VANDUT i PRE_JET reprezentnd msurile 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 msur cuantumul beneficiarilor, evideniat de coloana NR_BENEF. FAPTE3 (figura 4.25)

Pagina 99 din 206

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 msur preul mediu al unui jeton, evideniat de coloana PRE_JET.

Cuburile n-dimensionale: CUB1 (figura 4.26)

Figura 4.26: Schema topologic a cubului CUB1

Pagina 100 din 206

CUB2 (figura 4.27)

Figura 4.27: Schema topologic a cubului CUB2 CUB2 vine n completarea primului, aducnd posibilitatea determinrii unor statistici coerente n funcie de numrul de beneficiari, n funcie de timp, agent constatator sau locaie. CUB3 (figura 4.28)

Figura 4.28: Schema topologic a cubului CUB3 CUB3 ofer posibilitatea determinrii unor statistici coerente n funcie de preul mediu al unui jeton, i implicit valoarea buturilor comercializate, n funcie de timp i beneficiar.

Directorul msurilor: Odat cu crearea cubului se stabilesc i msurile ce fac parte din analiz. n mod implicit, Oracle OLAP trateaz drept msuri toate coloanele de tip NUMBER ce nu sunt cheie primar n tabela de fapte. Msurile se depoziteaz ntr-un director aflat n Oracle Enterprise Manager la seciunea Warehouse / OLAP (figura 4.29), fie la crearea directorului, fie manual ulterior.

Pagina 101 din 206

Figura 4.29: Directorul de msuri DATE VNZRI Interfaa sistemului OLAP a fost construit utiliznd instrumentul Jdeveloper 10g i este prezentat n figura 4.30.

Figura 4.30: Interfaa sistemului OLAP Sistemul OLAP permite urmtoarele tipuri de analize: Evoluia grafic a numrului de buturi calde comercializate pe fiecare automat de cafea n parte n anii 2003, 2004 i 2005 (figura 4.31)

Pagina 102 din 206

Evoluia grafic a numrului de buturi calde comercializate pe tipuri de automate de cafea, n anii analizai (figura 4.32) Evoluia grafic a numrului de buturi calde comercializate pe zone geografice, pe beneficiarii existeni n fiecare din aceste zone i pe fiecare automat de cafea n parte, n anii analizai (figura 4.33) Evoluia grafic a numrului de buturi calde comercializate pe fiecare agent n parte, n anii analizai (figura 4.34) Evoluia grafic a numrului de buturi calde comercializate pe fiecare agent n parte, pe zone geografice i pe fiecare tip de butur, n anii analizai (figura 4.35) Evoluia grafic a numrului total de beneficiari deservii de un agent, n anii analizai (figura 4.36) Topul clienilor, n funcie de numrul total de buturi comercializate, n anul 2003 (figura 4.37) Topul clienilor, n funcie de numrul total de buturi comercializate, n anul 2004 (figura 4.38) Topul clienilor, n funcie de numrul total de buturi comercializate, n anul 2005 (figura 4.39) Topul agenilor, n funcie de numrul total de buturi comercializate, n anul 2003 (figura 4.40) Topul agenilor, n funcie de numrul total de buturi comercializate, n anul 2004 (figura 4.41) Topul agenilor, n funcie de numrul total de buturi comercializate, n anul 2005 (figura 4.42) Topul agenilor, n funcie de numrul de beneficiari deservii, n anul 2003 (figura 4.43) Topul agenilor, n funcie de numrul de beneficiari deservii, n anul 2004 (figura 4.44) Topul agenilor, n funcie de numrul de beneficiari deservii, n anul 2005 (figura 4.45) Evoluia grafic a valorii totale a buturilor comercializate i a preului mediu al unui jeton, n anii analizai (figura 4.46)

Pagina 103 din 206

Figura 4.31: Evoluia numrului de buturi calde comercializate /aparat /timp

Pagina 104 din 206

Figura 4.32: Evoluia numrului de buturi calde comercializate /tip aparat /timp

Pagina 105 din 206

Figura 4.33: Evoluia numrului de buturi calde comercializate /locaie geografic /beneficiar /aparat

Figura 4.34: Evoluia numrului de buturi calde comercializate /agent /timp

Pagina 106 din 206

Figura 4.35: Evoluia numrului de buturi calde comercializate /agent /locaie geografic /tip de butur

Pagina 107 din 206

Figura 4.36: Numrul de beneficiari deservii de un agent /timp

Pagina 108 din 206

Figura 4.37: Topul clienilor n anul 2003 n funcie de numrul de buturi calde comercializate

Figura 4.38: Topul clienilor n anul 2004 n funcie de numrul de buturi calde comercializate

Pagina 109 din 206

Figura 4.39: Topul clienilor n anul 2005 n funcie de numrul de buturi calde comercializate

Pagina 110 din 206

Figura 4.40: Topul agenilor n anul 2003 n funcie de numrul de buturi calde comercializate

Pagina 111 din 206

Figura 4.41: Topul agenilor n anul 2004 n funcie de numrul de buturi calde comercializate

Pagina 112 din 206

Figura 4.42: Topul agenilor n anul 2005 n funcie de numrul de buturi calde comercializate

Pagina 113 din 206

Figura 4.43: Topul agenilor n anul 2003 n funcie de numrul de beneficiari deservii

Pagina 114 din 206

Figura 4.44: Topul agenilor n anul 2004 n funcie de numrul de beneficiari deservii

Pagina 115 din 206

Figura 4.45: Topul agenilor n anul 2005 n funcie de numrul de beneficiari deservii

Pagina 116 din 206

Figura 4.46: Valoarea buturilor comercializate i preul 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 proiectrii bazei de date. De asemenea, pentru ca realizarea sistemului OLAP s fie posibil s-au studiat i testat instrumentele Oracle Enterprise Manager cu al su OLAP Management i JDeveloper 10g cu facilitile specifice pentru inteligena afacerii. Oracle Enterprise Manager este un instrument uor de utilizat att pentru utilizatorii experimentai ct i pentru cei ce se afl la nceput de drum. Ofer utilizatorilor wizard-uri pentru crearea de dimensiuni, cuburi i msuri. Ct despre JDeveloper 10g, acesta este un instrument bine integrat, uor de implementat i cu o interfa prietenoas. Nu necesit cunotine avansate de Java, oferind posibilitatea implementrii n mod vizual. JDeveloper va genera o mare parte din cod,

Pagina 117 din 206

utilizatorul avnd deci posibilitatea s se concentreze n realizarea interfeei, adugnd cu uurin elementele grafice necesare. De asemenea, sunt disponibile wizard-uri pentru crearea de elemente vizuale ca: grafice, tabele sau tabele ncruciate. Iar pentru o i mai mare uurin n dezvoltare, JDeveloper ofer wizard-uri pentru crearea de calcule, formule ntre diferitele msuri disponibile sau calcule pentru a evidenia evoluia anumitor msuri 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 dorete a fi un ghid practic, deosebit de necesar att celor familiarizai cu vechiul Express Server, ct i pentru aceia ce vor s debuteze n domeniul depozitelor de date i al inteligenei afacerii prin utilizarea unor instrumente de ultim generaie.

ANEXA 1 CODUL SURS PENTRU CREAREA BAZEI DE DATE

Codul SQL i PL/SQL folosit la crearea sistemului: Pentru simplificarea instalrii s-a creat un fiier executabil de tip BATCH, ana_schema.bat, care se apeleaz din linia de comand, primind ca parametru calea ctre directorul care conine fiierele bazei de date. n cazul de fa: ana_schema.bat E:\OraHome92\oradata\proiect Coninutul fiierului surs ana_schema.bat ct i al fiierelor SQL apelate din acesta este detaliat n cele ce urmeaz: ana_schema.bat fiierul 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 118 din 206

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 119 din 206

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 120 din 206

echo ana_schema E:\OraHome92\oradata\proiect echo . :end mkana.sql fiierul ce creeaz utilizatorul ANA ct i spaiile 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 fiierul ce creeaz toate tabelele, iar pentru AGENT i BENEFICIAR se creeaz cte 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 121 din 206

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) "JUDET_LLABEL" VARCHAR2(30) NOT NULL, "JUDET_SLABEL" VARCHAR2(30) "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, NOT NULL, "TARA" VARCHAR2(30) NOT NULL, NOT NULL, "JUDET" VARCHAR2(30) NOT NULL,

Pagina 122 din 206

"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_AN" "TIMP_TRIM_LLABEL" "TIMP_AN_LLABEL" VARCHAR2(60), VARCHAR2(60), "TIMP_TRIM_SLABEL" VARCHAR2(30), VARCHAR2(30), "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 123 din 206

"CATEG_LLABEL" VARCHAR2(30) NOT NULL, PRIMARY KEY("BAUTURA")) TABLESPACE "ANA";

VARCHAR2(30)

NOT

NULL,

"CATEG_SLABEL"

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 124 din 206

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 end; / create sequence seq_beneficiar start with 1
Pagina 125 din 206

CONCAT('AG',LPAD(seq_agent.nextval,3,'0')),CONCAT('AGENT

',LPAD(seq_agent.nextval,3,'0')) into :new.agent, :new.agent_slabel from dual;

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 fiierul ce conine liniile SQL necesare populrii tabelei AGENT INSERT INTO VALUES "ANA"."AGENT" ('MUNTEAN

(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL, TARA_SLABEL,TELEFONAG,TIPCONTACT) agentii','RO','0723211301','angajat'); INSERT INTO VALUES "ANA"."AGENT" ('KISS (AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL, TARA_SLABEL,TELEFONAG,TIPCONTACT) OTO','JUD_HUNEDOARA','Agentii agentii','RO','0723211302','angajat'); INSERT INTO VALUES "ANA"."AGENT" ('MIHUTIU (AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL, TARA_SLABEL,TELEFONAG,TIPCONTACT) agentii','RO','0723211303','angajat'); MARIUS','JUD_HUNEDOARA','Agentii din jud HUNEDOARA','HD','ROMANIA','Toti din jud HUNEDOARA','HD','ROMANIA','Toti MARIAN','JUD_HUNEDOARA','Agentii din jud HUNEDOARA','HD','ROMANIA','Toti

Pagina 126 din 206

INSERT

INTO VALUES din

"ANA"."AGENT" ('MARGINE jud CARAS-

(AGENT_LLABEL,JUDET,JUDET_LLABEL,JUDET_SLABEL,TARA,TARA_LLABEL, TARA_SLABEL,TELEFONAG,TIPCONTACT) LAURENTIU','JUD_CARAS-SEVERIN','Agentii quit;

SEVERIN','CS','ROMANIA','Toti agentii','RO','0723211331','angajat');

loadAPARAT.sql fiierul ce conine liniile SQL necesare populrii tabelei APARAT INSERT TIP_SLABEL, INTO CATEG, "ANA"."APARAT" CATEG_LLABEL, (MATRICOL, TIP, TIP_LLABEL, LOCATIE,

CATEG_SLABEL,

BEN,

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 TIP_SLABEL, INTO CATEG, "ANA"."APARAT" CATEG_LLABEL, (MATRICOL, TIP, TIP_LLABEL, LOCATIE, CATEG_SLABEL, BEN,

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 TIP_SLABEL,

INTO CATEG,

"ANA"."APARAT" CATEG_LLABEL,

(MATRICOL,

TIP,

TIP_LLABEL, LOCATIE,

CATEG_SLABEL,

BEN,

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 127 din 206

'TIMISOARA','Ap din TIMISOARA','Ap TIMISOARA','JUD_TIMIS','Aparatele din jud TIMIS','Ap jud TM','ROMANIA','Toate aparatele','Toate'); INSERT TIP_SLABEL, INTO CATEG, "ANA"."APARAT" CATEG_LLABEL, (MATRICOL, TIP, TIP_LLABEL, LOCATIE, CATEG_SLABEL, BEN,

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 fiierul ce conine liniile SQL necesare populrii 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 128 din 206

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 fiierul ce conine liniile SQL necesare populrii 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, calde', 'BAUTURI'); quit;


Pagina 129 din 206

CATEG,

CATEG_LLABEL,

CATEG_SLABEL)

VALUES

('ciocculapteness', 'Ciocolata cu lapte si ness', 'Cioc. cu lapte ness', 'BAUTURI', 'Bauturi

loadTIMP.sql fiierul ce conine liniile SQL necesare populrii tabelei TIMP INSERT TIMP_AN, INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL, TIMP_SFARSIT_LUNA, TIMP_DURATA_LUNA, VALUES ('MAY03','May

TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_TRIM, TIMP_DURATA_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_AN)

2003','05','TRIM2-03','Trimestrul 2 - 2003','Trim2 03','2003','2003','03','31-May-2003','30Jun-2003','31-Dec-2003',31,61,245); INSERT TIMP_AN, INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL, TIMP_SFARSIT_LUNA, TIMP_DURATA_LUNA, VALUES ('JUN03','June TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_TRIM, TIMP_DURATA_TRIM, 2003','31-Dec-2003',30,61,245); INSERT TIMP_AN, INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL, TIMP_SFARSIT_LUNA, TIMP_DURATA_LUNA, VALUES ('JUL03','July TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_TRIM, TIMP_DURATA_TRIM, 2003','31-Dec-2003',31,92,245); INSERT TIMP_AN, INTO "ANA"."TIMP" (TIMP_LUNA, TIMP_LUNA_LLABEL, TIMP_SFARSIT_LUNA, TIMP_DURATA_LUNA, VALUES ('AUG03','August TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_TRIM, TIMP_DURATA_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_AN) TIMP_SFARSIT_AN, TIMP_DURATA_AN) TIMP_SFARSIT_AN, TIMP_DURATA_AN)

2003','06','TRIM2-03','Trimestrul 2 - 2003','Trim2 03','2003','2003','03','30-Jun-2003','30-Jun-

2003','07','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','31-Jul-2003','30-Sep-

2003','08','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','31-Aug-2003','30Sep-2003','31-Dec-2003',31,92,245);

Pagina 130 din 206

INSERT TIMP_AN,

INTO

"ANA"."TIMP"

(TIMP_LUNA,

TIMP_LUNA_LLABEL, TIMP_SFARSIT_LUNA, TIMP_DURATA_LUNA, ('SEP03','September

TIMP_LUNA_SLABEL, TIMP_TRIM, TIMP_TRIM_LLABEL, TIMP_TRIM_SLABEL, TIMP_AN_LLABEL, TIMP_AN_SLABEL, TIMP_SFARSIT_TRIM, TIMP_DURATA_TRIM, TIMP_SFARSIT_AN, TIMP_DURATA_AN)

VALUES

2003','09','TRIM3-03','Trimestrul 3 - 2003','Trim3 03','2003','2003','03','30-Sep-2003','30Sep-2003','31-Dec-2003',30,92,245); quit;

loadFAPTE1.sql fiierul ce conine liniile SQL necesare populrii tabelei de fapte FAPTE1 INSERT ENT_LEAVES,CANT_VANDUTA) 'BEN00167', 'AG009', 73); INSERT ENT_LEAVES,CANT_VANDUTA) 'BEN00167', 'AG010', 17); INSERT ENT_LEAVES,CANT_VANDUTA) 'BEN00167', 'AG013', 1); INTO VALUES ('AUG03', "ANA"."FAPTE1" '12800148', 'cafeacucioc', (TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG INTO VALUES ('AUG03', "ANA"."FAPTE1" '12800148', 'cafeacucioc', (TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG INTO VALUES ('AUG03', "ANA"."FAPTE1" '12800148', 'cafeacucioc',

(TIMP_LEAVES,APARAT_LEAVES,BAUTURA_LEAVES,BENEFICIAR_LEAVES,AG

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 131 din 206

loadFAPTE2.sql fiierul ce conine liniile SQL necesare populrii tabelei de fapte FAPTE2 INSERT INSERT INSERT INTO INTO INTO "ANA"."FAPTE2" "ANA"."FAPTE2" "ANA"."FAPTE2"

(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('AUG03','AG001',20); (TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('DEC03','AG001',21); (TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('JAN04','AG001',28);

INSERT quit;

INTO

"ANA"."FAPTE2"

(TIMP_LEAVES,AGENT_LEAVES,NR_BENEF) VALUES('JAN05','AG031',14);

loadFAPTE3.sql fiierul ce conine liniile SQL necesare populrii tabelei de fapte FAPTE3 - folosete 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 132 din 206

INSERT INTO fapte3 VALUES (vben,vtimp,vpret); END LOOP; CLOSE c1; END; / commit; quit;

tkgsxini2.sql fiierul 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 AGENT.TARA_SLABEL) ATTRIBUTE AGENT.JUDET_SLABEL) ATTRIBUTE L3 DETERMINES (AGENT.AGENT_LLABEL, AGENT.AGENT_SLABEL); begin L2 DETERMINES (AGENT.JUDET_LLABEL, L1 DETERMINES (AGENT.TARA_LLABEL,

Pagina 133 din 206

cwm_classify.remove_entity_descriptor_use(28, 'ANA', 'AGENT');

cwm_utility.DIMENSION_TYPE,

cwm_olap_dimension.set_plural_name('ANA', 'AGENT', 'AGENT'); cwm_olap_dimension.set_default_display_hierarchy('ANA', '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', 'TARA_LLABEL'); cwm_olap_level_attribute.set_name('ANA', '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', 'JUDET_LLABEL'); cwm_olap_level_attribute.set_name('ANA', '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_SLABEL'); cwm_olap_hierarchy.set_display_name('ANA', 'STANDARD'); cwm_olap_hierarchy.set_description('ANA', Standard'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'Dimensiunea_agentilor', 'Dimensiunea_agentilor', 'Dim AGENT'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'Dimensiunea_agentilor');
Pagina 134 din 206

'AGENT',

'AGENT', 'AGENT',

'L1', 'L1',

'TARA_LLABEL', 'TARA_SLABEL',

'AGENT', 'AGENT',

'L2', 'L2',

'JUDET_LLABEL', 'JUDET_SLABEL',

'AGENT',

'L3',

'AGENT_SLABEL', 'STANDARD', 'Ierarhia 'AGENT',

'AGENT', 'AGENT',

'STANDARD',

'ANA',

'AGENT',

cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'Dim_ag', 'Agent'); cwm_classify.add_entity_descriptor_use(42,

'AGENT',

'Dim_ag',

cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'AGENT', 'Dim_ag'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dimensiunea_agentilor', 'L1', 'TARA_LLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'TARA_SLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dimensiunea_agentilor', 'L2', 'JUDET_LLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'JUDET_SLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dimensiunea_agentilor', 'L3', 'AGENT_LLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', '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 135 din 206

'AGENT', 'AGENT', 'Dim_ag', 'L1',

'AGENT', 'AGENT', 'Dim_ag', 'L2',

'AGENT', 'AGENT', 'Dim_ag', 'L3',

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 ATTRIBUTE L1 L2 DETERMINES DETERMINES (BENEFICIAR.TOP_LLABEL, (BENEFICIAR.JUDET_LLABEL, BENEFICIAR.TOP_SLABEL) 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, 'ANA', 'BENEFICIAR'); cwm_olap_dimension.set_plural_name('ANA', 'BENEFICIAR', 'BENEFICIAR'); cwm_olap_dimension.set_default_display_hierarchy('ANA', '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 136 din 206

cwm_utility.DIMENSION_TYPE,

'BENEFICIAR',

cwm_olap_level.set_description('ANA', locatie');

'BENEFICIAR',

'L3',

'Beneficiarii 'L3',

pe

cwm_olap_level_attribute.set_name('ANA', 'LOCATIE');

'BENEFICIAR',

'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', 'STANDARD'); cwm_olap_hierarchy.set_description('ANA', 'BENEFICIAR', 'STANDARD', 'Ierarhia Standard'); cwm_olap_hierarchy.set_display_name('ANA', 'PE_JUDET'); cwm_olap_hierarchy.set_description('ANA', 'BENEFICIAR', 'PE_JUDET', 'Ierarhia pe judete'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'Dimensiunea_Beneficiar', 'Dimensiunea_Beneficiar', 'Dim BENEFICIAR'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'Dimensiunea_Beneficiar'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', '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', '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', 'Dimensiunea_Beneficiar', 'L2', 'JUDET_LLABEL'); 'BENEFICIAR', 'BENEFICIAR', 'BENEFICIAR', 'ANA', 'BENEFICIAR', 'BENEFICIAR', 'BENEFICIAR', 'PE_JUDET', 'BENEFICIAR', 'STANDARD',

Pagina 137 din 206

cwm_olap_dim_attribute.add_level_attribute('ANA', 'BENEFICIAR', 'Dim_BENEF', 'L2', 'JUDET_SLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', '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', '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, '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, '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 138 din 206

'BENEFICIAR',

'BENEFICIAR',

'ANA',

'BENEFICIAR',

'L2',

'ANA',

'BENEFICIAR',

'L2',

LEVEL TRIM IS TIMP.TIMP_TRIM LEVEL LUNA IS TIMP.TIMP_LUNA HIERARCHY STANDARD (LUNA CHILD OF TRIM CHILD OF AN) ATTRIBUTE ATTRIBUTE AN TRIM DETERMINES DETERMINES (TIMP.TIMP_AN_LLABEL, (TIMP.TIMP_TRIM_LLABEL, TIMP.TIMP_SFARSIT_TRIM, DETERMINES (TIMP.TIMP_LUNA_LLABEL, TIMP.TIMP_SFARSIT_LUNA, TIMP.TIMP_AN_SLABEL, TIMP.TIMP_SFARSIT_AN, TIMP.TIMP_DURATA_AN) TIMP.TIMP_TRIM_SLABEL, TIMP.TIMP_DURATA_TRIM) ATTRIBUTE LUNA TIMP.TIMP_LUNA_SLABEL, TIMP.TIMP_DURATA_LUNA); begin cwm_classify.add_entity_descriptor_use(28, '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, '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'); cwm_utility.LEVEL_TYPE, 'ANA', cwm_utility.DIMENSION_TYPE,

Pagina 139 din 206

cwm_classify.add_entity_descriptor_use(50, 'TIMP', 'TRIM'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_TRIM_LLABEL', 'TIMP_TRIM_LLABEL'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_TRIM_SLABEL', 'TIMP_TRIM_SLABEL'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_SFARSIT_TRIM', 'TIMP_SFARSIT_TRIM'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_DURATA_TRIM', 'TIMP_DURATA_TRIM');

cwm_utility.LEVEL_TYPE, 'TIMP', 'TIMP', 'TIMP', 'TIMP',

'ANA', 'TRIM', 'TRIM', 'TRIM', '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, 'TIMP', 'LUNA'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_LUNA_LLABEL', 'TIMP_LUNA_LLABEL'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_LUNA_SLABEL', 'TIMP_LUNA_SLABEL'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_SFARSIT_LUNA', 'TIMP_SFARSIT_LUNA'); cwm_olap_level_attribute.set_name('ANA', 'TIMP_DURATA_LUNA', 'TIMP_DURATA_LUNA'); cwm_olap_hierarchy.set_display_name('ANA', 'STANDARD'); cwm_olap_hierarchy.set_description('ANA', STANDARD'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', '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', 'Dim_TIMP', 'Timp'); cwm_classify.add_entity_descriptor_use(42, cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'Dim_TIMP');
Pagina 140 din 206

cwm_utility.LEVEL_TYPE, 'TIMP', 'TIMP', 'TIMP', 'TIMP', 'TIMP', 'TIMP',

'ANA', 'LUNA', 'LUNA', 'LUNA', 'LUNA',

'STANDARD', 'Ierarhia 'TIMP',

'STANDARD',

'TIMP',

'Dim_TIMP',

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', '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_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', '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', 'LUNA', 'TIMP_DURATA_LUNA'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'ANA', 'TIMP', 'AN', 'TIMP_AN_LLABEL');
Pagina 141 din 206

'TIMP',

'TIMP',

'Dim_TIMP',

'AN',

'TIMP',

'Durata_interval',

'TIMP',

'Durata_interval',

cwm_classify.add_entity_descriptor_use(41, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'TIMP_TRIM_LLABEL'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.LEVEL_ATTRIBUTE_TYPE, '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, 'TIMP_TRIM_SLABEL'); cwm_classify.add_entity_descriptor_use(42, cwm_utility.LEVEL_ATTRIBUTE_TYPE, '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, 'TIMP_SFARSIT_TRIM'); cwm_classify.add_entity_descriptor_use(55, cwm_utility.LEVEL_ATTRIBUTE_TYPE, '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, 'TIMP_DURATA_TRIM'); cwm_classify.add_entity_descriptor_use(56, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'TIMP_DURATA_LUNA'); commit; end; / 'ANA', 'TIMP', 'LUNA', 'ANA', 'TIMP', 'TRIM', 'ANA', 'TIMP', 'LUNA', 'ANA', 'TIMP', 'TRIM', 'ANA', 'TIMP', 'LUNA', 'ANA', 'TIMP', 'TRIM', 'ANA', 'TIMP', 'LUNA', 'ANA', 'TIMP', 'TRIM',

Pagina 142 din 206

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 ATTRIBUTE APARAT.TIP_SLABEL) ATTRIBUTE L3 DETERMINES APARAT.MATRICOL ATTRIBUTE L4 DETERMINES APARAT.BEN ATTRIBUTE ATTRIBUTE ATTRIBUTE L5 L6 L7 DETERMINES DETERMINES DETERMINES (APARAT.LOCATIE_LLABEL, (APARAT.JUDET_LLABEL, (APARAT.TARA_LLABEL, APARAT.LOCATIE_SLABEL) APARAT.JUDET_SLABEL) APARAT.TARA_SLABEL); begin cwm_classify.remove_entity_descriptor_use(28, 'ANA', 'APARAT'); cwm_olap_dimension.set_plural_name('ANA', 'APARAT', 'APARAT'); cwm_olap_dimension.set_default_display_hierarchy('ANA', 'STANDARD'); cwm_olap_dimension.set_display_name('ANA', 'APARAT', 'APARAT'); cwm_olap_dimension.set_description('ANA', 'APARAT', 'Dimensiunea APARAT');
Pagina 143 din 206

L1 L2

DETERMINES DETERMINES

(APARAT.CATEG_LLABEL, (APARAT.TIP_LLABEL,

APARAT.CATEG_SLABEL)

cwm_utility.DIMENSION_TYPE,

'APARAT',

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', 'TIP_LLABEL'); cwm_olap_level_attribute.set_name('ANA', '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', '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'); 'APARAT', 'L3', 'MATRICOL', 'APARAT', 'L2', 'TIP_SLABEL', 'APARAT', 'L2', 'TIP_LLABEL',

Pagina 144 din 206

cwm_olap_level_attribute.set_name('ANA', 'TARA_LLABEL'); cwm_olap_level_attribute.set_name('ANA', 'TARA_SLABEL');

'APARAT', 'APARAT',

'L7', 'L7',

'TARA_LLABEL', 'TARA_SLABEL', 'STANDARD',

cwm_olap_hierarchy.set_display_name('ANA', 'STANDARD');

'APARAT',

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', 'Ierarhia dupa beneficiar'); cwm_olap_hierarchy.set_display_name('ANA', 'DUPA_LOCATIE'); cwm_olap_hierarchy.set_description('ANA', 'Ierarhia dupa Locatie'); cwm_olap_hierarchy.set_display_name('ANA', 'DUPA_JUDET'); cwm_olap_hierarchy.set_description('ANA', 'APARAT', 'DUPA_JUDET', 'Ierarhia dupa Judet'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', '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', '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', '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', 'Dimensiunea_aparat', 'L2', 'TIP_LLABEL');
Pagina 145 din 206

'APARAT',

'DUPA_BENEFICIAR', 'DUPA_LOCATIE', 'DUPA_LOCATIE', 'DUPA_JUDET',

'APARAT', 'APARAT', 'APARAT',

'APARAT',

'APARAT',

'APARAT',

'APARAT',

cwm_olap_dim_attribute.add_level_attribute('ANA', 'APARAT', 'Dim_aparat', 'L2', 'TIP_SLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', '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', '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', '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', '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', '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 146 din 206

'APARAT',

'APARAT',

'APARAT',

'APARAT',

'APARAT',

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 ATTRIBUTE L1 L2 DETERMINES DETERMINES (TIPBAUTURA.CATEG_LLABEL, (TIPBAUTURA.BAUTURA_LLABEL, TIPBAUTURA.CATEG_SLABEL) TIPBAUTURA.BAUTURA_SLABEL); begin cwm_classify.remove_entity_descriptor_use(28, 'ANA', 'TIPBAUTURA'); cwm_olap_dimension.set_plural_name('ANA', 'TIPBAUTURA', 'TIPBAUTURA'); cwm_utility.DIMENSION_TYPE,

Pagina 147 din 206

cwm_olap_dimension.set_default_display_hierarchy('ANA', 'STANDARD');

'TIPBAUTURA',

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', 'CATEG_LLABEL', 'CATEG_LLABEL'); cwm_olap_level_attribute.set_name('ANA', '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', 'BAUTURA_LLABEL', 'BAUTURA_LLABEL'); cwm_olap_level_attribute.set_name('ANA', 'BAUTURA_SLABEL', 'BAUTURA_SLABEL'); cwm_olap_hierarchy.set_display_name('ANA', 'STANDARD'); cwm_olap_hierarchy.set_description('ANA', 'Ierarhia STANDARD'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', cwm_classify.add_entity_descriptor_use(41, cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'Dimensiunea_BAUTURA'); cwm_olap_dim_attribute.create_dimension_attribute('ANA', 'Dim_BAUTURA', 'Dim_BAUTURA', 'Bautura'); cwm_classify.add_entity_descriptor_use(42, cwm_utility.DIMENSION_ATTRIBUTE_TYPE, 'Dim_BAUTURA'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dimensiunea_BAUTURA', 'L1', 'CATEG_LLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dim_BAUTURA', 'L1', 'CATEG_SLABEL');
Pagina 148 din 206

'TIPBAUTURA', 'TIPBAUTURA',

'L1', 'L1',

'TIPBAUTURA', 'TIPBAUTURA', 'TIPBAUTURA', 'TIPBAUTURA',

'L2', 'L2',

'STANDARD', 'STANDARD', 'TIPBAUTURA',

'Dimensiunea_BAUTURA', 'Dimensiunea_BAUTURA', 'Dim BAUTURA'); 'ANA', 'TIPBAUTURA', 'TIPBAUTURA',

'ANA',

'TIPBAUTURA', 'TIPBAUTURA', 'TIPBAUTURA',

cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dimensiunea_BAUTURA', 'L2', 'BAUTURA_LLABEL'); cwm_olap_dim_attribute.add_level_attribute('ANA', 'Dim_BAUTURA', 'L2', 'BAUTURA_SLABEL'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'CATEG_LLABEL'); cwm_classify.add_entity_descriptor_use(41, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'BAUTURA_LLABEL'); cwm_classify.add_entity_descriptor_use(42, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'CATEG_SLABEL'); cwm_classify.add_entity_descriptor_use(42, cwm_utility.LEVEL_ATTRIBUTE_TYPE, 'BAUTURA_SLABEL'); commit; end; / quit; 'ANA', 'ANA', 'ANA', 'ANA',

'TIPBAUTURA', 'TIPBAUTURA',

'TIPBAUTURA',

'L1',

'TIPBAUTURA',

'L2',

'TIPBAUTURA',

'L1',

'TIPBAUTURA',

'L2',

create_analytic_cube.sql fiierul ce creeaz cuburile i directorul de msuri 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 149 din 206

/ 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 150 din 206

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', TIMP_DIM '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', 'CANT_VANDUTA', tmp, 'ANA', 'AGENT', 'AGENT'); tmp:= cwm_utility.create_function_usage('SUM');
Pagina 151 din 206

'CUB1',

'ANA',

'FAPTE1', 'ANA',

'FK_BENEFICIAR', 'L4', 'ANA', 'BENEFICIAR', 'BENEFICIAR'); := CWM_OLAP_CUBE.Add_Dimension('ANA', 'CUB1',

'CUB1',

cwm_olap_measure.set_default_aggregation_method('ANA', 'CANT_VANDUTA', tmp, 'ANA', 'APARAT', 'APARAT'); tmp:= cwm_utility.create_function_usage('SUM'); cwm_olap_measure.set_default_aggregation_method('ANA', 'CANT_VANDUTA', tmp, 'ANA', 'BENEFICIAR', 'BENEFICIAR'); tmp:= cwm_utility.create_function_usage('SUM'); cwm_olap_measure.set_default_aggregation_method('ANA', 'CANT_VANDUTA', tmp, 'ANA', 'TIMP', 'TIMP'); tmp:= cwm_utility.create_function_usage('SUM'); cwm_olap_measure.set_default_aggregation_method('ANA', 'CANT_VANDUTA', tmp, 'ANA', 'TIPBAUTURA', 'TIPBAUTURA'); commit; end; / declare AGENT2_DIM number; TIMP2_DIM number; tmp2 number; begin CWM_OLAP_CUBE.Create_Cube('ANA', beneficiari'); 'CUB2', 'CUB2',

'CUB1',

'CUB1',

'CUB1',

'CUB1',

'Numarul

de

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 152 din 206

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 153 din 206

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 fiierul ce apeleaz comanda de reactualizare a obiectelor OLAP, fiind necesar apelarea manual a acestuia de fiecare dat cnd se intervine asupra dimensiunilor, cuburilor sau msurilor
Pagina 154 din 206

execute cwm2_olap_metadata_refresh.mr_refresh; commit; quit;

Pagina 155 din 206

ANEXA 2 CODUL SCRIS N LIMBAJUL JAVA

Interfaa sistemului OLAP a fost realizat cu instrumentul JDeveloper 10g. n aceast anex sunt prezentate principalele frame-uri ale aplicaiei, elementele lor componente, precum i codul scris n Java. 1. Frame-ul principal: meniul aplicaiei (figura a2.1)

Figura a2.1: Meniul aplicaiei codul scris n Java: package mypackage1; import java.awt.BorderLayout; import java.awt.Dimension;

Pagina 156 din 206

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 157 din 206

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 158 din 206

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 159 din 206

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 160 din 206

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 161 din 206

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 162 din 206

// 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 163 din 206

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 164 din 206

); 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 165 din 206

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 166 din 206

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 167 din 206

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 168 din 206

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 169 din 206

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 170 din 206

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 171 din 206

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 172 din 206

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 173 din 206

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 174 din 206

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 175 din 206

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 176 din 206

(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 177 din 206

} 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 178 din 206

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 179 din 206

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 180 din 206

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 181 din 206

// 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 182 din 206

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 183 din 206

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 184 din 206

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 185 din 206

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 186 din 206

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 187 din 206

} 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 188 din 206

// 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 189 din 206

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 190 din 206

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 191 din 206

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 192 din 206

// 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 193 din 206

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 194 din 206

// 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 195 din 206

{ //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 196 din 206

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 asemntoare. Prezentm unul dintre acestea: Frame-ul Valoarea buturilor calde comercializate i preul mediu:
Pagina 197 din 206

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 198 din 206

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 199 din 206

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 200 din 206

}); 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 201 din 206

{ 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 "Valoarepret")); graphRef1.setBounds(new Rectangle(5, 5, 315, 355)); graphRef1.setDefinition(new "Pretmediugraf")); graphRef2.setBounds(new Rectangle(5, 5, 575, 355)); graphRef2.setDefinition(new "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 202 din 206

DefinitionInfo("/Project1OLAPConfig1.xml",

DefinitionInfo("/Project1OLAPConfig1.xml",

DefinitionInfo("/Project1OLAPConfig1.xml",

} 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 203 din 206

//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 puin cel principal, s-a creat un buton Interpretare, prin intermediul cruia se acceseaz un alt frame. Pentru exemplul de frame secundar de mai sus avem:

Pagina 204 din 206

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 205 din 206

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 206 din 206

S-ar putea să vă placă și