Originariamente inviato da valeria75
....
vorrei creare una stored procedure per gestire l'utilizzo dei lotti di produzione, mi spiego: partendo da una quantità richiesta in un ordine, io devo andare a recupeare le quantità dai lotti presenti a magazzino.

Quindi, procedo per steps:

Recupero tutte le mie disponibilità di lotti
SELECT LottoProduzione, (Qta-QtaConsumataLotto) AS Qta FROM TabLotti WHERE (IDArt = XXXX) ORDER BY Data ASC

Faccio (Qta-QtaConsumataLotto) AS Qta perchè per ogni lotto caricato a magazzino indico anche le quantità già utilizzate nell'evasione di altri ordini (QtaConsumataLotto)


In funzione di una variabile che passerò alla Stored procedure

@QtRichiesta int

conosco la quantità richiesta per uno specifico articolo (dato che eseguirò questa SP per ogni articolo dell'ordine)

Devo fare un insert (in una seconda tabella) di tutte le righe, ad esaurimento, che raggiungono la mia @QtRichiesta

Quindi praticamente:

se la prima select mi ritorna dei record di questo tipo

Lotto - Qt
00012006 4
00052006 2

vuol dire che per l'articolo indicato ho 6 disponibilità di 2 lotti differenti

se la mia @QtRichiesta è 5

devo inserire nella mia tabella di appoggio
00012006 4
00052006 1

partendo ovviamente dal record (lotto) piu vecchio (00012006) fino al piu recente (infatti ho ordinato la select in questo modo)

tutto questo per sapere quali lotti utilizzare e le quantità da utilizzare per ogni lotto
.....
Grazie per l'aiuto
Ciao valeria75,

Puoi usare un cursore (cerca DECLARE CURSOR nei BOL e troverai molti esempi esaustivi)
oppure puoi provare con un approccio più 'set based' come quello che segue
(da provare nel Query Analizer);

...vedi tu quale sia il migliore e come adattarlo al meglio nel tuo caso

codice:
Use TempDb

go

-- creazione e popolamento tabella di test
create table dbo.TabLotti
(
 Lotto varchar(10), 
 Articolo varchar(10), 
 Data datetime, 
 QtaProdotta int,  
 QtaImpegnata int
)

go

insert dbo.TabLotti values('Lotto01','art1', '20060101',5,2) 
insert dbo.TabLotti values('Lotto01','art1', '20060102',2,2)
insert dbo.TabLotti values('Lotto02', 'art1','20060101',4,3)
insert dbo.TabLotti values('Lotto02', 'art1','20060102',6,2)
insert dbo.TabLotti values('Lotto05', 'art1','20060101',3,2)
insert dbo.TabLotti values('Lotto05', 'art1','20060102',3,2)

go

Create Function dbo.fnProgQtaDisponibile
--Funzione di utilità per il calcolo Progressivo disponibilità 
(
 @Art varchar(10),
 @Lotto varchar(10),
 @Data DateTime,
 @QtaDispGiornoLotto int
)
Returns int
AS
Begin 
 Return
 (
       (
        select IsNull(sum(T2.QtaProdotta-T2.QtaImpegnata),0) 
        from tabLotti T2 
        where T2.Articolo=@Art
          and ((T2.Data<=@Data and T2.Lotto<@Lotto) or (T2.Data<@Data))
       ) + @QtaDispGiornoLotto 
  )
End

go

-- corpo sp principale da creare
-- N.B. non verifica se la disponibiltà copre interamente la richiesta 

declare  @Art varchar(10) -- articolo
declare  @QtaRic int      -- qta richiesta

set @Art='art1'

--set @QtaRic= 1
--set @QtaRic= 4
--set @QtaRic= 5
set @QtaRic= 6


select T1.Data,
       T1.Lotto,
       T1.QtaProdotta,
       T1.QtaImpegnata,
       (T1.QtaProdotta-T1.QtaImpegnata) as QtaDisponibile,
       --dbo.fnProgQtaDisponibile(@Art,T1.Lotto,T1.Data,(T1.QtaProdotta-T1.QtaImpegnata)) as ProgressivoQtaDisponibile,
       (case when 
         dbo.fnProgQtaDisponibile(@Art,T1.Lotto,T1.Data,(T1.QtaProdotta-T1.QtaImpegnata))<=@QtaRic
        then 
         (T1.QtaProdotta-T1.QtaImpegnata)
       else 
	 @QtaRic - dbo.fnProgQtaDisponibile(@Art,T1.Lotto,T1.Data,0)
        end) as QtaDaImpegnare
from tabLotti T1
where (T1.Articolo=@Art) 
  and (T1.QtaProdotta > T1.QtaImpegnata)
  and (case when 
         dbo.fnProgQtaDisponibile(@Art,T1.Lotto,T1.Data,(T1.QtaProdotta-T1.QtaImpegnata))<=@QtaRic
       then 
         (T1.QtaProdotta-T1.QtaImpegnata)
       else 
	 @QtaRic - dbo.fnProgQtaDisponibile(@Art,T1.Lotto,T1.Data,0)
       end)> 0  
order by T1.Data,T1.Lotto

go

-- pulizia
drop Function dbo.fnProgQtaDisponibile
drop table dbo.TabLotti
Ciao sspintux