Cursores anidados...

10/06/2004 - 23:45 por rclaudior | Informe spam
Tengo que resolver un problema de anidamiento de cursores
ya que no he encontrado una sentencia que me permita
enfocar al cursor correctamente. El ejemplo sería:

DECLARE Depositos CURSOR
KEYSET
FOR SELECT FDEPOSITO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FDEPOSITO ORDER BY
FDEPOSITO

DECLARE Productos CURSOR
KEYSET
FOR SELECT FARTICULO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FARTICULO ORDER BY
FARTICULO


OPEN Productos

IF @@CURSOR_ROWS > 0
BEGIN
FETCH NEXT FROM Productos
INTO @vProducto


CLOSE Depositos
DEALLOCATE Depositos

DECLARE Depositos CURSOR
KEYSET
FOR SELECT FDEPOSITO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FDEPOSITO ORDER BY
FDEPOSITO

OPEN Depositos

IF @@CURSOR_ROWS > 0
BEGIN
FETCH NEXT FROM depositos
INTO @vDeposito

SELECT @vAcumula =( SELECT SUM(FCANTIDAD)
FROM ARTMOVTABLA WHERE FARTSELECCION = 'PESCA' AND
FARTICULO =@vProducto AND FDEPOSITO=@vDeposito)
SELECT @Sentencia = 'INSERT INTO
##PRODUCTOS VALUES ('+CHAR(39)+@vProducto+CHAR(39)
+', '+@vAcumula

WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM Depositos
INTO @vDeposito
IF @@FETCH_STATUS = 0
BEGIN
SELECT @vAcumula =( SELECT SUM
(FCANTIDAD) FROM ARTMOVTABLA WHERE FARTSELECCION
= 'PESCA' AND FARTICULO =@vProducto AND
FDEPOSITO=@vDeposito)
IF @vAcumula IS NULL
BEGIN
SELECT @vAcumula = 0
END
SELECT @Sentencia = @Sentencia
+ ',' + @vAcumula
END
END
END

SELECT @Sentencia = @Sentencia + ')'

Articulo con la cantidad por cada deposito
EXEC (@Sentencia)

PRINT 'Insert 1 en tabla: ##PRODUCTOS '+@vProducto
PRINT @Sentencia



WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM Productos
INTO @vProducto

IF @@FETCH_STATUS = 0

...


Muchas gracias anticipadas.

Claudio
 

Leer las respuestas

#1 Liliana Sorrentino
11/06/2004 - 17:27 | Informe spam
Hola Claudio,
No será algo así lo que necesitás?

SELECT Producto = farticulo, fdeposito, Cantidad = sum(fcantidad)
FROM #artmovtabla
WHERE fartseleccion = 'PESCA'
GROUP BY farticulo, fdeposito
ORDER BY 1, 2

Si no es esto, podrías explicarnos mejor para ayudarte a evitar el uso de
cursores?
Saludos... Liliana.

"" escribió en
el mensaje news:1ae4401c44f34$502a0000$
Tengo que resolver un problema de anidamiento de cursores
ya que no he encontrado una sentencia que me permita
enfocar al cursor correctamente. El ejemplo sería:

DECLARE Depositos CURSOR
KEYSET
FOR SELECT FDEPOSITO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FDEPOSITO ORDER BY
FDEPOSITO

DECLARE Productos CURSOR
KEYSET
FOR SELECT FARTICULO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FARTICULO ORDER BY
FARTICULO


OPEN Productos

IF @@CURSOR_ROWS > 0
BEGIN
FETCH NEXT FROM Productos
INTO @vProducto


CLOSE Depositos
DEALLOCATE Depositos

DECLARE Depositos CURSOR
KEYSET
FOR SELECT FDEPOSITO FROM ARTMOVTABLA WHERE
FARTSELECCION = 'PESCA' GROUP BY FDEPOSITO ORDER BY
FDEPOSITO

OPEN Depositos

IF @@CURSOR_ROWS > 0
BEGIN
FETCH NEXT FROM depositos
INTO @vDeposito

SELECT @vAcumula =( SELECT SUM(FCANTIDAD)
FROM ARTMOVTABLA WHERE FARTSELECCION = 'PESCA' AND
FARTICULO =@vProducto AND FDEPOSITO=@vDeposito)
SELECT @Sentencia = 'INSERT INTO
##PRODUCTOS VALUES ('+CHAR(39)+@vProducto+CHAR(39)
+', '+@vAcumula

WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM Depositos
INTO @vDeposito
IF @@FETCH_STATUS = 0
BEGIN
SELECT @vAcumula =( SELECT SUM
(FCANTIDAD) FROM ARTMOVTABLA WHERE FARTSELECCION
= 'PESCA' AND FARTICULO =@vProducto AND
FDEPOSITO=@vDeposito)
IF @vAcumula IS NULL
BEGIN
SELECT @vAcumula = 0
END
SELECT @Sentencia = @Sentencia
+ ',' + @vAcumula
END
END
END

SELECT @Sentencia = @Sentencia + ')'

Articulo con la cantidad por cada deposito
EXEC (@Sentencia)

PRINT 'Insert 1 en tabla: ##PRODUCTOS '+@vProducto
PRINT @Sentencia



WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM Productos
INTO @vProducto

IF @@FETCH_STATUS = 0

...


Muchas gracias anticipadas.

Claudio

Preguntas similares