CISA FotoGallery

Statistiche

Tot. visite contenuti : 914064
Home Articoli tecnici HowTo Calcolare Giacenza on the fly

Calcolare Giacenza on the fly

 Il calcolo della giacenza è sempre molto dispendioso dal punto di vista delle prestazioni per un db.

Se abbiamo un magazzino con numerosi articoli e vogliamo vederli tutti in una sottomaschera o in una listbox, dobbiamo operare una scelta di fondo: o salviamo il valore in un campo della tabella articoli o ce la calcoliamo on the fly.

Il maggior pregio della prima soluzione è quello di impegnare molto meno il nostro Jet, il quale ci dovrà semplicemente restituire tuti record di una sola tabella; inoltre nel caso di una sottomaschera i record saranno di lettura scrittura. Lo svantaggio è quello di dover stare bene attenti ad aggiornare di volta in volta il valore e quindi ogni volta che aggiungiamo o cancelliamo un record della tabella movimentazione con il record collegato lato molti.

Calcolandocelo invece con una query noi avremo il grande vantaggio che se cancelliamo o aggiungiamo un record non dobbiamo preoccuparci di nulla, ma lo svantaggio che sarà una sottomaschera di sola lettura e certamente un calo prestazionale considerevole.

Al lettore la scelta del metodo più comodo.

Partiamo anzitutto col dire che in entrambi i casi partiamo con la stessa struttura:
- una tabella tblarticoli e leghiamo il tutto al campo idarticolo (contatore)
- una tabella tblmovimentazione con quindi il campo rif_Idartcolo legato uno a molti con idarticolo ed un campo Motivazione.

Nel caso della prima soluzione quindi ad ogni operazione interessata dovremo lanciare l'aggiornamento attaverso la seguente funzione:

Function fctAggiorna (Num as Integer)
Dim dbs as DAO.Recordset
Dim rstArt as DAO.Recordset
Dim rstCar as DAO.Recordset
Dim rstScar as DAO.Recordset

Dim sngCar as Single
Dim sngScar as Single

set dbs = CurrentDb
set rstArt = dbs.openrecordset("Select * from tblArticoli where idarticolo = " & Num)
'Mi seleziono l'articolo da aggiornare

set rstCar = dbs.openrecordset("Select sum(qtà) as Carico fromtblMovimenti where Motivazione = 'Carico' and rif_idarticolo = " & Num)

if rstCar.recordcount>0 then
sngCar = rstCar!Carico
else
sngCar = 0
end if

set rstScar = dbs.openrecordset("Select sum(qtà) as Scarico fromtblMovimenti where Motivazione = 'Scarico' and rif_idarticolo = " & Num)

if rstScar.recordcount>0 then
sngScar = rstScar!Scarico
Else
sngScar = 0
End If

With rstArt
.Edit
!Giacenza = sngCar-sngScar
.Update
End With

rstArt.close: set rstArt = nothing
rstCar.close: set rstCar = nothing
rstScar.close: set rstScar = nothing

End Function


Se invece vogliamo usare una query dovremo usare la tecnica delle subquery

"select idarticolo, descrArticolo, (Select sum(qtà) as Carico fromtblMovimenti where Motivazione = 'Carico' and rif_idarticolo = tblarticoli.idarticolo) as Carico, (Select sum(qtà) as Scarico fromtblMovimenti where Motivazione = 'Scarico' and rif_idarticolo = tblArtcoli.idarticolo) as Scarico, ([Carico]-[Scarico]) as Giacenza from tblArticoli"