reports lab

21
CURS ORACLE REPORTS SCOP: prezentarea principalelor facilitati oferite de Report Builder pentru dezvoltarea rapoartelor. 1. Elemente componente ale unui raport: data model, layout model, objects navigator se construieste un raport cu ajutorul wizard-ului : - tema: afisarea tuturor magaziilor din companie: stor_cd, stor_name, pk_stores (SELECT ALL STORES.STOR_CD, STORES.STOR_NAME, STORES.PK_STORES FROM STORES) - format: raport tabelar Prezentare: se prezinta instrumentul wizard de devoltare a rapoartelor: pagini componente, query builder, displayed fields, totals, labels, template; componenta DATA MODEL: butoane utile componenta LAYOUT MODEL: se maresc frame-urile componente ale layout-ului si se explica rolul fiecaruia (frame, repeating frame, field) - se vizualizeaza simultan fereastra layout-ului si fereastra objects navigator pentru identificarea corecta a unui frame specific din arborele layoutului - utilizarea butonului “select parent frame” 2. Modele de baza ale rapoartelor Group above: se construieste un raport ce afiseaza magaziile si articolele corespunzatoare fiecarei magazii; pentru fiecare articol se afiseaza cantitatea libera, rezervata, blocata (frozen) si pretul - pentru limitarea numarului de pagini se selecteaza numai 2 magazii care se citesc din primul raport (vezi raportul “stores items above 2.rdf”) - se prezinta data model cu grupurile aferente, se modifica numele gruparilor la G_MAGAZIE, G_ARTICOL Group left: se salveaza raportul precedent si se

Upload: tfemilian

Post on 08-Dec-2015

32 views

Category:

Documents


2 download

DESCRIPTION

rtytry

TRANSCRIPT

CURS ORACLE REPORTS

SCOP: prezentarea principalelor facilitati oferite de Report Builder pentru dezvoltarea rapoartelor.

1. Elemente componente ale unui raport: data model, layout model, objects navigator

se construieste un raport cu ajutorul wizard-ului : - tema: afisarea tuturor magaziilor din companie: stor_cd, stor_name,

pk_stores (SELECT ALL STORES.STOR_CD, STORES.STOR_NAME, STORES.PK_STORES FROM STORES)

- format: raport tabelarPrezentare:

se prezinta instrumentul wizard de devoltare a rapoartelor: pagini componente, query builder, displayed fields, totals, labels, template;

componenta DATA MODEL: butoane utile componenta LAYOUT MODEL: se maresc frame-urile componente ale layout-

ului si se explica rolul fiecaruia (frame, repeating frame, field)- se vizualizeaza simultan fereastra layout-ului si fereastra objects navigator

pentru identificarea corecta a unui frame specific din arborele layoutului- utilizarea butonului “select parent frame”

2. Modele de baza ale rapoartelor Group above: se construieste un raport ce afiseaza magaziile si articolele

corespunzatoare fiecarei magazii; pentru fiecare articol se afiseaza cantitatea libera, rezervata, blocata (frozen) si pretul

- pentru limitarea numarului de pagini se selecteaza numai 2 magazii care se citesc din primul raport (vezi raportul “stores items above 2.rdf”)

- se prezinta data model cu grupurile aferente, se modifica numele gruparilor la G_MAGAZIE, G_ARTICOL

Group left: se salveaza raportul precedent si se modifica cu ajutorul wizard-ului in modelul group left

- se prezinta data model cu grupurile aferente, se modifica numele gruparilor la G_MAGAZIE, G_ARTICOL

Matrix: - rows: articole- cols: magazii- cells: sum(cantitate)

3. Construirea manuala a rapoartelor se construieste manual un raport care sa afiseze denumirea magaziei , articolele

din magazie si cantitatea fiecarui articol :SELECT STORES.STOR_NAME, STORES.STOR_CD, STORES.PK_STORES, STORES_ITEMS.IS_FREE_QTY Cantitate, ITEM_.ITEM_SHORT Descriere,

STORES_ITEMS.UNIT_PRICE PretFROM STORES, STORES_ITEMS, ITEM_ where stores.stor_cd in ('17','18')-- WHERE STORES.STOR_NAME like :p_magazie AND ((STORES_ITEMS.IS_STOR_CD = STORES.STOR_CD) AND (STORES_ITEMS.S_STORES_ITEM = STORES.PK_STORES) AND (STORES_ITEMS.S_ITEM_STORES = ITEM_.PK_ITEM_) AND (ITEM_.MAIN_STORE = STORES.STOR_CD)) -- order by &p_order_by

- se formeaza in data model doua grupari numite G_MAGAZIE si G_ARTICOLE :

fig.1. data model- in layout se includ texte pentru titlurile de coloana si fields-uri pentru

afisarea valorilor : denumire magazie, denumire articol, cantitate, pret :

fig.2. layout model

- se explica facilitatea grid spacing in scopul alinierii obiectelor- cofine mode si flex mode in layout- ce este un repeating frame si proprietatile sale (elasticity)- proprietatile textelor si ale fieldurilor , folosesc proprietatea “all pages’

pentru denumirea magaziilor si titlurilor de coloane - proprietatile de aliniere, zecimale- butoanele “header section”, “Trailer section”, “main section” si “edit

margin” din layout- Formula column: se introduce o noua coloana de tip formula in care se

afiseaza valoarea unui articol: pret* cantitate- limitez numarul articolelor afisate la 10 (filter in data maodel) si calculez

suma valorii pe fiecare magazie prin summary column (observ ca suma se realizeaza numai pentru articolele afisate)

- formez titlul raportului : SC ALEX SRL , Lista articolelor din magaziile ..... la data de ......; lista magaziilor este un place holder (lista_magaziilor) completat de formula column din grupul magaziilor prin urmatorul cod: :lista_magaziilor := :lista_magaziilor || :stor_name ||chr(10);

- afisez in grupul magaziilor articolul care are valoarea maxima (denumire si valoare); pentru valoare pot folosi formula column cu max, dar pentru denumire trebuie utilizat un place holder

- afisez valoarea maxima pe raport: nume articol, valoare, magazie

fig.3. model raport

4. Parametri de intrare

- se introduce parametrul P_MAGAZIE de tip bind prin care se selecteaza magazia ce trebuie vizualizata. Acest parametru are atasata o lista de valori dinamica (LOV) formata printr-o instructiune select : select stor_name from

stores- al doilea parametru de tip lexical numit P_ORDER_BY prin care se

stabileste modul de ordonare a articolelor . Parametrul are atasat o lista de valori statica formata din optiunile: descriere asc , pret desc , cantitate asc

5. Implementarea raportului FISA DE MAGAZIE

Se realizeaza un raport care sa afiseze pentru fiecare magazie primita ca parametru toate articolele din magazie impreuna cu tranzactiile efectuate intr-un interval de timp dat. Calculeaza de asemenea stocul initial la inceputul perioadei mentionate si stocul final dupa perioada de timp afisata.Formatul raportului trebuie sa fie similar cu cel afisat mai jos:

fig.4 raportul “fisa de magazie”

5.1. Afisarea magaziei si articolelor din magazie se porneste un nou raport in mod manual si se completeaza mai intai forma de

parametri. Aceasta trebuie sa includa urmatoarele date de intrare (fig.4):- p_nume_magazie : stabileste magazia pentru care se afiseaza fisa ( trebuie sa

contina un nume valid de magazie)- p_pk_articol: limiteaza articolele afisate la un set dat de optiunea like ... (implicit

este % adica toate articolele)- p_data_start : fixeaza data de inceput a perioadei de afisare- p_data_end : stabileste sfarsitul perioadei de afisare

fig.5 Forma de parametri

in data model se construieste un query care sa selecteze toate articolele din magazia primita ca parametru cu urmatoarele coloane: cod_magazie, nume_magazie, pk_magazie si pk_articol, pret_actual pentru articol, cantitate_ actuala. Selectul este listat in continuare:

SELECT ALL STORES.STOR_CD cod_magazie, STORES.STOR_NAME nume_magazie, STORES.PK_STORES pk_magazie, sum(STORES_ITEMS.IS_RES_QTY +STORES_ITEMS.IS_FREE_QTY+ STORES_ITEMS.IS_FROZ_QTY) cantitate_actuala, STORES_ITEMS.S_ITEM_STORES pk_articol, STORES_ITEMS.UNIT_PRICE pret_actualFROM STORES, STORES_ITEMSWHERE STORES_ITEMS.IS_STOR_CD = STORES.STOR_CD AND STORES_ITEMS.S_STORES_ITEM = STORES.PK_STORES and stores.stor_name = :p_nume_magazie and stores_items.s_item_stores like :p_pk_articolgroup by stores.stor_cd, stores.stor_name, stores.pk_stores, stores_items.s_item_stores, stores_items.unit_price

Am utilizat numai doua tabele stores si stores_items de aceea nu s-a putut selecta si numele articolului care este in tabela item_. Acest nume se aduce printr-o coloana de tip formula column (numita nume_articol) care construieste un cursor cu selectul corespunzator: function nume_articolFormula return Char isv_nume varchar2(50);cursor c_nume(pk_articol in number) is

select item_short from item_

where pk_item_ = pk_articol;begin

open c_nume(:pk_articol);fetch c_nume into v_nume;

return v_nume;end;

In data model se formeaza doua grupari: una superioara ce contine datele despre magazie si una inferioara cu datele despre articol:

fig.6 ierarhia gruparilor in pagina de layout se stabileste formatul paginii (file, page setup,landscape) si in

object navigator, sectiunea layout, capitolul main section se modifica proprietatile pentru landscape (width=11’’ , height=8.5’’ direction=landscape).Se construiesc apoi frame-urile repetitive pentru magazie si pentru articole iar in interiorul frame-ului magazie se construieste un cap de tabel care sa explice coloanele afisate pentru fiecare articol.

fig.7 layout cap tabel

fig.8 layout model pentru frame-urile magazie si articol

5.2. Afisarea tranzactiilor

Afisarea intrarilor: intrarile in magazie pot fi de doua tipuri: intrari din exterior date de tabela RCT_ITEMS si intrari realizate prin transfer de la alta magazie date de tabela TRANSFER_. Legatura intre tabela STORES_ITEMS care furnizeaza magazia si tabela RCT_ITEMS se face prin doua tabele intermediare : LOCATION_ si RCT_LOC_INT :

fig.9 legatura intre RCT_ITEMS si STORES_ITEMS

Pentru a selecta intrarile prin RCT_ITEMS intr-o magazie data pentru un articol specificat, se construieste un al doilea select dupa modelul:SELECT data_tranzactie , cantitate , valoare , pk_magazie , pk_articol , tip_tranzactie

from (select dateconversions.getdatefromjulian( rct_items.dt_rct_items ) data_tranzactie, sum( rct_loc_int.rct_loc_qty ) cantitate, rct_items.rct_val valoare, stores_items.s_stores_item pk_magazie, stores_items.s_item_stores pk_articol, 'intrare_rct' tip_tranzactiefrom rct_items, rct_loc_int , location_, stores_itemswhere rct_items.pk_rct_items = rct_loc_int.s_rct_item_loc and rct_loc_int.s_loc_rct_item = location_.pk_location_ and location_.s_stores_item_loc = stores_items.pk_stores_items

group by dateconversions.getdatefromjulian( rct_items.dt_rct_items ) , rct_items.rct_val , stores_items.s_stores_item , stores_items.s_item_stores , 'intrare_rct' ) INTRARIorder by data_tranzactie

Acest select trebuie subordonat de primul care stabileste magazia si articolul. Subordonarea se face prin butonul data link cu care se unesc coloanele pk_magazie si pk_articol din cele doua selecturi.

Selectul anterior trebuie completat cu intrarile provenite prin transfer astfel incat intrebarea de selectie se modifica in modul urmator:....... stores_items.s_item_stores , 'intrare_rct'

UNION ALL

select dateconversions.getdatefromjulian( transfer_.tr_date ) data_tranzactie , tr_items.tr_qty cantitate , tr_items.tr_value valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'intrare_transfer' tip_tranzactiefrom transfer_, tr_items, stores_items, location_where ((tr_items.s_tr_item = transfer_.pk_transfer_) and (tr_items.s_loc_src = location_.pk_location_) and (tr_items.s_loc_trg = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items)) ) INTRARIorder by data_tranzactie

Se revine in data model si se introduce pentru fiecare coloana din capul de tabel cate un place holder care sa contina valoarea curenta pentru acea coloana. Se introduc mai intai urmatoarele coloane: cantitate_intrare, pret_intrare, valoare_intrare, cantitate_iesire, pret_ iesire, valoare_ iesire, cantitate_stoc, pret_ stoc, valoare_ stoc :

fig.10 coloane tip place holder

Completarea valorilor pentru aceste coloane se face printr-o coloana de tip formula column care contine urmatorul cod PLSQL:function Completeaza_valoriFormula return Number isbegin if :TIP_TRANZACTIE like 'intrare%' then :Cantitate_intrare := :Cantitate ; :Valoare_intrare := :Valoare;

if :Cantitate != 0 then :Pret_intrare := :Valoare/:Cantitate; else :Pret_intrare := 0; end if;

:Cantitate_iesire := 0; :Valoare_iesire := 0; :Pret_iesire := 0; end if; if :TIP_TRANZACTIE like 'iesire%' then :Cantitate_intrare := 0 ; :Valoare_intrare := 0; :Pret_intrare := 0; :Cantitate_iesire := :Cantitate; :Valoare_iesire := :Valoare; if :Cantitate != 0 then :Pret_iesire := :Valoare/:Cantitate; else :Pret_iesire := 0; end if; end if;

return 1;end;

Completare layout : in layout model se introduce un nou frame repetitiv numit R_TRANZACTII in interiorul frame-ului R_ARTICOL. Acest nou frame se va repeta pentru fiecare tranzactie gasita pentru articolul respectiv. Frame-ul va include cate un field pentru fiecare coloana definita in data model. Field-urile vor fi aliniate cu rubricile corespunzatoare din capul de tabel.

Afisarea iesirilor : iesirile din magazie sunt contorizate in tabelele ISS_ITEMS si TR_ITEMS. Acelasi tabel TR_ITEMS este utilizat si pentru iesiri, singura deosebire consta in coloana de legatura intre TR_ITEMS si LOCATION_ : pentru intrari tr_items foloseste coloana S_LOC_TRG , iar pentru iesiri foloseste coloana S_LOC_SRC. Dupa completarea tranzactiilor de iesire , forma finala a selectului tranzactii este urmatoarea:SELECT data_tranzactie , cantitate , valoare , pk_magazie , pk_articol , tip_tranzactiefrom (select /* --------------- intrari prin RCT_ITEMS --------------------------------------------------------- */ dateconversions.getdatefromjulian( rct_items.dt_rct_items ) data_tranzactie, sum( rct_loc_int.rct_loc_qty ) cantitate, rct_items.rct_val valoare, stores_items.s_stores_item pk_magazie, stores_items.s_item_stores pk_articol, 'intrare_rct' tip_tranzactiefrom rct_items, rct_loc_int , location_, stores_itemswhere rct_items.pk_rct_items = rct_loc_int.s_rct_item_loc and rct_loc_int.s_loc_rct_item = location_.pk_location_ and location_.s_stores_item_loc = stores_items.pk_stores_items

group by dateconversions.getdatefromjulian( rct_items.dt_rct_items ) , rct_items.rct_val , stores_items.s_stores_item , stores_items.s_item_stores , 'intrare_rct'

UNION ALL /* --------------- intrari prin TR_ITEMS ----------------------------------------------- */

select dateconversions.getdatefromjulian( transfer_.tr_date ) data_tranzactie , tr_items.tr_qty cantitate , tr_items.tr_value valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'intrare_transfer' tip_tranzactiefrom transfer_, tr_items, stores_items, location_where ((tr_items.s_tr_item = transfer_.pk_transfer_)

and (tr_items.s_loc_trg = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items))

UNION ALL /* --------------- iesiri prin ISS_ITEMS ----------------------------------------------------- */

select dateconversions.getdatefromjulian( iss_items.dt_iss_items ) data_tranzactie , dem_loc_int.dem_loc_qty cantitate , dem_loc_int.iss_loc_val valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'iesire_iss' tip_tranzactiefrom iss_items, dem_loc_int, location_, stores_itemswhere ((dem_loc_int.s_iss_loc_int = iss_items.pk_iss_items) and (dem_loc_int.s_loc_dem_int = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items))

UNION ALL /* --------------- iesiri prin TR_ITEMS ------------------------------------------------ */

select dateconversions.getdatefromjulian( transfer_.tr_date ) data_tranzactie , tr_items.tr_qty cantitate , tr_items.tr_value valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'iesire_transfer' tip_tranzactiefrom transfer_, tr_items, stores_items, location_where ((tr_items.s_tr_item = transfer_.pk_transfer_) and (tr_items.s_loc_src = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items))

) INTRARI_IESIRIorder by data_tranzactie

5.3. Calcularea stocului

Raportul trebuie sa afiseze pentru fiecare articol stocul initial de la inceputul perioadei de tranzactie si stocul final evaluat dupa efectuarea tranzactiilor. Pentru o anumita zi specificata, stocul se calculeaza pornind de la stocul actual (gasit in tabela stores_items) la care se adauga sau se scad cantitatile date de iesirile si intrarile in magazie pentru articolul respectiv care s-au derulat in perioada cuprinsa intre ziua specificata si cea actuala. Se scrie o functie numita Calculeaza_stoc ce primeste ca parametru de intrare data la care trebuie calculat stocul si returneaza o structura care include valoarea, pretul si cantitatea stocului calculat. Mai intai se defineste structura cu cele trei campuri. Pentru aceasta se defineste un nou package in Program Units numit Structuri_client care include la specificatii urmatorul tip de date:TYPE CANT_PRET_VAL IS RECORD ( cantitate number, pret number,

valoare number );

Tot in Program Units se defineste o noua functie numita Calculeaza_stoc care are urmatoarea structura:

FUNCTION calculeaza_stoc(p_data date) RETURN structuri_client.cant_pret_val IS

stoc structuri_client.cant_pret_val; cantitate_intrata number :=0;cantitate_iesita number :=0;valoare_intrata number :=0;valoare_iesita number :=0;cantitate_stoc number :=0;valoare_stoc number :=0;pret_stoc number :=0;valoare_actuala number :=0;cantitate_actuala number :=0;pret_actual number :=0;

cursor c_intrari(p_data date) is select nvl(sum(cantitate),0) ,

nvl(sum(valoare),0) from (

select /* --------------- intrari prin RCT_ITEMS ----------------------------------------------------- */ dateconversions.getdatefromjulian( rct_items.dt_rct_items ) data_tranzactie, sum( rct_loc_int.rct_loc_qty ) cantitate, rct_items.rct_val valoare, stores_items.s_stores_item pk_magazie, stores_items.s_item_stores pk_articol, 'intrare_rct' tip_tranzactiefrom rct_items, rct_loc_int , location_, stores_itemswhere rct_items.pk_rct_items = rct_loc_int.s_rct_item_loc and rct_loc_int.s_loc_rct_item = location_.pk_location_ and location_.s_stores_item_loc = stores_items.pk_stores_items

group by dateconversions.getdatefromjulian( rct_items.dt_rct_items ) , rct_items.rct_val , stores_items.s_stores_item , stores_items.s_item_stores , 'intrare_rct'

UNION ALL /* --------------- intrari prin TR_ITEMS --------------------------------------------------- */

select dateconversions.getdatefromjulian( transfer_.tr_date ) data_tranzactie , tr_items.tr_qty cantitate , tr_items.tr_value valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'intrare_transfer' tip_tranzactiefrom transfer_, tr_items, stores_items, location_

where ((tr_items.s_tr_item = transfer_.pk_transfer_) and (tr_items.s_loc_trg = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items)) ) INTRARI

where pk_articol = :pk_articoland pk_magazie = :pk_magazieand data_tranzactie >= p_data

group by pk_magazie, pk_articol

;-- ****************************************************************************cursor c_iesiri (P_DATA date) is

select nvl(sum(cantitate),0) ,nvl(sum(valoare),0) from (select

dateconversions.getdatefromjulian( iss_items.dt_iss_items ) data_tranzactie , dem_loc_int.dem_loc_qty cantitate , dem_loc_int.iss_loc_val valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'iesire_iss' tip_tranzactiefrom iss_items, dem_loc_int, location_, stores_itemswhere ((dem_loc_int.s_iss_loc_int = iss_items.pk_iss_items) and (dem_loc_int.s_loc_dem_int = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items))

UNION ALL /* --------------- iesiri prin TR_ITEMS ---------------------------------------------------- */

select dateconversions.getdatefromjulian( transfer_.tr_date ) data_tranzactie , tr_items.tr_qty cantitate , tr_items.tr_value valoare , stores_items.s_stores_item pk_magazie , stores_items.s_item_stores pk_articol , 'intrare_transfer' tip_tranzactiefrom transfer_, tr_items, stores_items, location_where ((tr_items.s_tr_item = transfer_.pk_transfer_) and (tr_items.s_loc_src = location_.pk_location_) and (location_.s_stores_item_loc = stores_items.pk_stores_items))

) IESIRIwhere pk_articol = :pk_articol

and pk_magazie = :pk_magazieand data_tranzactie >= p_data

group by pk_magazie, pk_articol;-- ******************************************************************************cursor c_actual is

select sum((location_.loc_free_qty +location_.loc_res_qty +location_.loc_frozen_qty )) CANT_ACTUALA, stores_items.unit_price PRET_ACTUAL from location_, stores, stores_items

where stores.pk_stores = stores_items.s_stores_item and stores_items.pk_stores_items = location_.s_stores_item_loc and stores.pk_stores = :pk_magazie and location_.s_item_loc = :PK_ARTICOL group by stores_items.unit_price ;--****************************************************************************begin

open c_intrari(P_DATA);open c_iesiri(P_DATA);open c_actual;fetch c_actual into cantitate_actuala, pret_actual;

valoare_actuala := cantitate_actuala * pret_actual;fetch c_intrari into cantitate_intrata, valoare_intrata;fetch c_iesiri into cantitate_iesita, valoare_iesita;close c_actual;close c_intrari;close c_iesiri;

valoare_stoc := valoare_actuala - valoare_intrata + valoare_iesita ;cantitate_stoc := cantitate_actuala - cantitate_intrata + cantitate_iesita ;if cantitate_stoc != 0 then

pret_stoc := valoare_stoc/cantitate_stoc;else

pret_stoc := 0;end if;

stoc.cantitate := cantitate_stoc;stoc.pret := pret_stoc;stoc.valoare := valoare_stoc;

return stoc;END;

Se adauga in grupul G_articol coloane tip place holder care sa memoreze valorile stocului initial si final pentru fiecare articol in parte: valoare_stoc_initial, pret_stoc_initial, cantitate_stoc_initial, valoare_stoc_final, pret_stoc_final, cantitate_stoc_final. Valorile vor fi calculate si salvate in aceste coloane de o coloana tip formula care are urmatorul cod PLSQL:function completeaza_stoc_initial_final return Number is stoc structuri_client.cant_pret_val;begin

stoc := calculeaza_stoc(:P_DATA_START);:cantitate_stoc_initial := stoc.cantitate;:valoare_stoc_initial := stoc.valoare;:pret_stoc_initial := stoc.pret;

stoc := calculeaza_stoc(:P_DATA_END);:cantitate_stoc_final := stoc.cantitate;:valoare_stoc_final := stoc.valoare;:pret_stoc_final := stoc.pret;

return 1;end;

Se introduc in layout campuri corespunzatoare coloanelor create, astfel incat data model si layout model trebuie sa fie ca-n figurile urmatoare:

fig.11 data model final

fig.12 layout finalColoana Nr. crt. (numar curent) se completeaza formand o coloana de tip summary care are functia de contorizare a liniilor. Ea trebuie resetata la fiecare nou articol, deci sincron cu grupul G_articol, astfel incat sa afiseze numarul curent al liniei de tranzactie pentru fiecare articol.Stocul curent calculat dupa fiecare tranzactie se determina prin adunarea sau scaderea valorilor intrate sau iesite la stocul anterior tranzactiei. Pentru prima tranzactie, stocul anterior este dat de stocul initial calculat de coloana “completeaza_stoc_initial_final”. Se adauga la functia “completeaza_valori” din grupul G_tranzactii cu liniile necesare calcularii stocului curent. Functia completa este listata in continuare:

function Completeaza_valoriFormula return Number isbegin

if :TIP_TRANZACTIE like 'intrare%' then :Cantitate_intrare := :Cantitate ; :Valoare_intrare := :Valoare;

if :Cantitate != 0 then :Pret_intrare := :Valoare/:Cantitate; else :Pret_intrare := 0; end if;

:Cantitate_iesire := 0; :Valoare_iesire := 0; :Pret_iesire := 0; end if; if :TIP_TRANZACTIE like 'iesire%' then :Cantitate_intrare := 0 ; :Valoare_intrare := 0; :Pret_intrare := 0; :Cantitate_iesire := :Cantitate; :Valoare_iesire := :Valoare; if :Cantitate != 0 then :Pret_iesire := :Valoare/:Cantitate; else :Pret_iesire := 0; end if; end if; -- Calculez stocul curent -------------------------------------------------

if :NRC = 1 then:Cantitate_stoc := :Cantitate_stoc_initial;:Valoare_stoc := :Valoare_stoc_initial;:Pret_stoc := :Pret_stoc_initial;

end if;

if :TIP_TRANZACTIE like 'intrare%' then :Cantitate_stoc := :Cantitate_stoc + :Cantitate; :Valoare_stoc := :Valoare_stoc + :Valoare; end if; if :TIP_TRANZACTIE like 'iesire%' then

:Cantitate_stoc := :Cantitate_stoc - :Cantitate; :Valoare_stoc := :Valoare_stoc - :Valoare; end if; if :Cantitate_stoc != 0 then :Pret_stoc := :Valoare_stoc/:Cantitate_stoc; end if; return 1;end;