ideas para un procedimiento almacenado

12/05/2006 - 14:05 por Alex Bibiano | Informe spam
Necesito hacer un procedimiento almacenado, pero no veo la forma. Lo tengo
hecho pero va muy lento y no se como enforalo.

Detallo mi problema de forma resumida

Tengo una tabla de entradas (Articulo, Cantidad, NumeroEntrada,Fecha)

y una tabla de salidas (Articulo, Cantidad, NumeroSalida)

La idea es crear un procedimiento que me devuelva una consulta con todas las
salidas, y asignando a cada salida una entrada si existe.

Pongo un ejemplo para que os hagais una idea:

Salidas:
Articulo Cantidad NumeroSalida
A 5 Num1
A 4 Num2
A 3 Num3
B 2 Num4
C 7 Num5
C 3 Num6

Entradas:
Articulo Cantidad NumeroEntrada Fecha
A 7 Ent1 01/01/2006
A 2 Ent2 02/01/2006
B 1 Ent3 01/01/2006
C 10 Ent4 01/01/2006

El resultado que quiero es:
Articulo Cantidad NumeroSalida Asignados NumeroEntrada
A 5 Num1 5 Ent1
A 4 Num2 4 Ent2
A 3 Num3 0 -
B 2 Num4 0 -
C 7 Num5 7 Ent4
C 3 Num6 3 Ent4

Como veis, para cada salida busco por orden en la tabla de entradas si hay
alguna entrada para el artículo. Si existe y tiene cantidad suficiente, se
la asigno. Si no hay suficiente, miro si hay más entradas del artículo y así
succesivamente.

Cualquier sugerencia será bienvenida.

Lo he intentado con 2 cursores, pero al estar el segundo anidado, no acaba
de funcionar.
 

Leer las respuestas

#1 Ele
12/05/2006 - 17:54 | Informe spam
HOLA INTENTE COMPRENDER LO QUE QUIERES HACER CHECA SI TE SIRVE
Create Table #Entradas (Articulo Char(1), Cantidad float, NumeroEntrada int,
Fecha smalldatetime)
Create Table #Salidas (Articulo Char(1), Cantidad float, NumeroSalida int)

Declare @cArticulo Char(1), @fCantidad float, @nNumeroSalida int,
@cArticuloAnterior Char(1), @nNumeroEntrada int, @nNumeroEntradaAnt int,
@fExistencia float, @fAsignados float

Insert Into #Salidas
Values('A',5,1)
Insert Into #Salidas
Values('A',4,2)
Insert Into #Salidas
Values('A',3,3)
Insert Into #Salidas
Values('B',2,4)
Insert Into #Salidas
Values('C',7,5)
Insert Into #Salidas
Values('C',3,6)

Insert Into #Entradas
Values('A',7,1,'20060101')
Insert Into #Entradas
Values('A',2,2,'20060102')
Insert Into #Entradas
Values('B',1,3,'20060101')
Insert Into #Entradas
Values('C',10,4,'20060101')

Declare cCursor Cursor
For Select
Articulo,
Cantidad,
NumeroSalida
From #Salidas
Order By NumeroSalida
Open cCursor

Fetch Next From cCursor INTO @cArticulo, @fCantidad, @nNumeroSalida
Select @cArticuloAnterior = @cArticulo, @nNumeroEntrada = 0, @fExistencia 0

While @@FETCH_STATUS != -1
Begin
If @cArticuloAnterior != @cArticulo
Select @fExistencia = 0, @nNumeroEntrada = 0, @nNumeroEntradaAnt = Null

Select @nNumeroEntrada = IsNull(Min(NumeroEntrada),0)
From #Entradas
Where Articulo = @cArticulo
And NumeroEntrada > @nNumeroEntrada

Select @fExistencia = @fExistencia + Cantidad - @fCantidad
From #Entradas
Where Articulo = @cArticulo
And NumeroEntrada = @nNumeroEntrada

If @fExistencia < 0
Select @nNumeroEntrada = Null

If @fExistencia > 0 And @nNumeroEntrada = 0
Select @nNumeroEntrada = @nNumeroEntradaAnt

If @fExistencia >= 0 And @nNumeroEntrada > 0
Select @fAsignados = @fCantidad
Else
Select @fAsignados = 0

Select Articulo=@cArticulo, Cantidad=@fCantidad,
NumeroSalida=@nNumeroSalida, Asignados=@fAsignados,
NumeroEntrada=@nNumeroEntrada

Select @cArticuloAnterior = @cArticulo, @nNumeroEntradaAnt @nNumeroEntrada
Fetch Next From cCursor INTO @cArticulo, @fCantidad, @nNumeroSalida
End

Close cCursor

Deallocate cCursor
Drop Table #Entradas
Drop Table #Salidas

Preguntas similares