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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 rclaudior
14/06/2004 - 16:29 | Informe spam
Gracias Liliana por tu respuesta pero lo que necesito es
generar una gran matriz que permita mostrar una gran
cuadricula con valores 0 (cero) ya que en algunos casos
la sentencia Select ... no devuelve nada porque no existe
nada. Algo así:

Productos/Depósitos DA DB DC DE
PA 100 0 15 65
PB 240 1 25 68
PB 25 0 3 18

Como ves en este ejemplo la intersección del Depósito DB
y el Producto PB no existe pero debo mostrar '0' al igual
que PB y DB.

Es por ese motivo que armo dos cursores uno recorriendo
todos los depósitos y otro los productos. Si se te ocurre
algo muy agradecido.

Saludos, Claudio.

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



.

Respuesta Responder a este mensaje
#3 Liliana Sorrentino
14/06/2004 - 18:05 | Informe spam
Claudio,

Suponiendo que tenés una tabla de Productos, otra de Depósitos y una de
Movimientos, sería un cross-table variable.
Te mando un ejemplo de lo que podrías usar adaptándolo con tu información.
Si tenés dudas, te damos una mano, solo mandanos las estructuras y algunos
datos para pruebas.
Saludos... Liliana.


create table Libros
(id_libro smallint,
titulo char(20),
autor char(20))
insert Libros values (1, 'Tit1', 'yo')
insert Libros values (2, 'Tit2', 'tu')

create table Categorias
(idCategoria smallint,
nombre char(20))
insert categorias values (1, 'asp')
insert categorias values (2, 'ado')
insert categorias values (3, 'xml')

create table librosCategorias
(idCategoria smallint,
idLibro smallint)
insert librosCategorias values (1, 1)
insert librosCategorias values (2, 1)
insert librosCategorias values (1, 2)
insert librosCategorias values (3, 2)


id_libro titulo Categorias
1 tit1 asp, ado
2 tit2 asp, xml


DROP Procedure proc_Query_Pivot_1
GO
CREATE Procedure proc_Query_Pivot_1
@Base_Data_SQL varchar(2000), -- Table to use as recordsource to build
final crosstab qry
@Row_Headings varchar(200), -- Comma-separated list of rows to use as
groupings of data
@Column_Heading varchar(200), -- Column to use as heading
@Column_Head_SQL varchar(2000), -- SQL that returns set of possible
column headings
@Operation varchar(10), -- SUM, PRODUCT, etc
@Op_Argument varchar(200), -- Column to use as argument in operation
@Add_Row_Summary char(1) -- 'S' to include summary, 'N' to omit

AS

Declare @SQL varchar(2000),
@Summary_SQL varchar(2000) -- to summarize each row

Set @SQL = 'SELECT ' + @Row_Headings + ', '
Set @Summary_SQL = ''


CREATE TABLE #Col_Heads
(
Col_ID int identity(1,1),
Col_Head varchar(200) NULL
)
Exec ('INSERT INTO #Col_Heads(Col_Head) ' + @Column_Head_SQL)

DECLARE @Col_ID_Curr int, -- column being checked
@Col_ID_Old int,
@Curr_Col_Head varchar(200),
@Pivot_SQL varchar(200) -- pivot SQL for current column


SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head = Col_Head
FROM #Col_Heads ORDER BY Col_ID

IF (@Col_ID_Curr IS NOT NULL )
BEGIN

Set @Col_ID_Old = @Col_ID_Curr - 1

WHILE (@Col_ID_Old <> @Col_ID_Curr)
BEGIN

Set @Pivot_SQL = char(13) + @Operation
+ '(CASE ' + @Column_Heading
+ ' WHEN ''' + @Curr_Col_Head + ''' THEN ' + @Op_Argument
+ ' ELSE SPACE(2) END) AS ' + @Curr_Col_Head

Set @SQL = @SQL + ' ' + @Pivot_SQL

If (@Add_Row_Summary='S')
Set @Summary_SQL = @Summary_SQL + 'Pivot_Data.' + @Curr_Col_Head

Set @Col_ID_Old = @Col_ID_Curr
SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head = Col_Head
FROM #Col_Heads
WHERE Col_ID > @Col_ID_Curr
ORDER BY Col_ID

IF (@Col_ID_Old <> @Col_ID_Curr)
Begin
Set @SQL = @SQL + ', '
Set @Summary_SQL = @Summary_SQL + ' + '
End
END
END



DROP TABLE #Col_Heads

Set @SQL = @SQL + char(13) + 'FROM (' + @Base_Data_SQL + ') AS Base_Data '
+ char(13) + 'GROUP BY ' + @Row_Headings

If (@Add_Row_Summary='S')
Begin
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' (' + @Summary_SQL + ') AS RowTotal ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data'
End


Print @SQL
Exec (@SQL)
go


exec proc_Query_Pivot_1
micondicion"
'SELECT id_libro, titulo, nombre
FROM librosCategorias
INNER JOIN categorias ON categorias.idcategoria librosCategorias.idcategoria
INNER JOIN libros on idLibro = id_libro
',
'id_libro, titulo',
'nombre',
'SELECT nombre FROM categorias',
'MAX',
quiero mostrar 'Si'
"'Si'",
'N'


"" escribió en
el mensaje news:1c1e001c4521b$f59abd10$
Gracias Liliana por tu respuesta pero lo que necesito es
generar una gran matriz que permita mostrar una gran
cuadricula con valores 0 (cero) ya que en algunos casos
la sentencia Select ... no devuelve nada porque no existe
nada. Algo así:

Productos/Depósitos DA DB DC DE
PA 100 0 15 65
PB 240 1 25 68
PB 25 0 3 18

Como ves en este ejemplo la intersección del Depósito DB
y el Producto PB no existe pero debo mostrar '0' al igual
que PB y DB.

Es por ese motivo que armo dos cursores uno recorriendo
todos los depósitos y otro los productos. Si se te ocurre
algo muy agradecido.

Saludos, Claudio.

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



.

Respuesta Responder a este mensaje
#4 rclaudior
14/06/2004 - 19:53 | Informe spam
Liliana: Muchas gracias por tu ayuda. Es justo lo que
necesitaba.
Saludos, Claudio
Claudio,

Suponiendo que tenés una tabla de Productos, otra de


Depósitos y una de
Movimientos, sería un cross-table variable.
Te mando un ejemplo de lo que podrías usar adaptándolo


con tu información.
Si tenés dudas, te damos una mano, solo mandanos las


estructuras y algunos
datos para pruebas.
Saludos... Liliana.


create table Libros
(id_libro smallint,
titulo char(20),
autor char(20))
insert Libros values (1, 'Tit1', 'yo')
insert Libros values (2, 'Tit2', 'tu')

create table Categorias
(idCategoria smallint,
nombre char(20))
insert categorias values (1, 'asp')
insert categorias values (2, 'ado')
insert categorias values (3, 'xml')

create table librosCategorias
(idCategoria smallint,
idLibro smallint)
insert librosCategorias values (1, 1)
insert librosCategorias values (2, 1)
insert librosCategorias values (1, 2)
insert librosCategorias values (3, 2)


id_libro titulo Categorias
1 tit1 asp, ado
2 tit2 asp, xml


DROP Procedure proc_Query_Pivot_1
GO
CREATE Procedure proc_Query_Pivot_1
@Base_Data_SQL varchar(2000), -- Table to use as


recordsource to build
final crosstab qry
@Row_Headings varchar(200), -- Comma-separated list


of rows to use as
groupings of data
@Column_Heading varchar(200), -- Column to use as


heading
@Column_Head_SQL varchar(2000), -- SQL that returns


set of possible
column headings
@Operation varchar(10), -- SUM, PRODUCT, etc
@Op_Argument varchar(200), -- Column to use as


argument in operation
@Add_Row_Summary char(1) -- 'S' to include


summary, 'N' to omit

AS

Declare @SQL varchar(2000),
@Summary_SQL varchar(2000) -- to summarize each row

Set @SQL = 'SELECT ' + @Row_Headings + ', '
Set @Summary_SQL = ''


CREATE TABLE #Col_Heads
(
Col_ID int identity(1,1),
Col_Head varchar(200) NULL
)
Exec ('INSERT INTO #Col_Heads(Col_Head) ' +


@Column_Head_SQL)

DECLARE @Col_ID_Curr int, -- column being checked
@Col_ID_Old int,
@Curr_Col_Head varchar(200),
@Pivot_SQL varchar(200) -- pivot SQL for current


column


SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head =


Col_Head
FROM #Col_Heads ORDER BY Col_ID

IF (@Col_ID_Curr IS NOT NULL )
BEGIN

Set @Col_ID_Old = @Col_ID_Curr - 1

WHILE (@Col_ID_Old <> @Col_ID_Curr)
BEGIN



@Curr_Col_Head -- debug check
Set @Pivot_SQL = char(13) + @Operation
+ '(CASE ' + @Column_Heading
+ ' WHEN ''' + @Curr_Col_Head + ''' THEN ' +


@Op_Argument
+ ' ELSE SPACE(2) END) AS ' + @Curr_Col_Head

Set @SQL = @SQL + ' ' + @Pivot_SQL

If (@Add_Row_Summary='S')
Set @Summary_SQL = @Summary_SQL + 'Pivot_Data.' +


@Curr_Col_Head



select returns
the while loop)
Set @Col_ID_Old = @Col_ID_Curr
SELECT TOP 1 @Col_ID_Curr = Col_ID, @Curr_Col_Head =


Col_Head
FROM #Col_Heads
WHERE Col_ID > @Col_ID_Curr
ORDER BY Col_ID



column heading
IF (@Col_ID_Old <> @Col_ID_Curr)
Begin
Set @SQL = @SQL + ', '
Set @Summary_SQL = @Summary_SQL + ' + '
End
END
END



DROP TABLE #Col_Heads

Set @SQL = @SQL + char(13) + 'FROM (' + @Base_Data_SQL


+ ') AS Base_Data '
+ char(13) + 'GROUP BY ' + @Row_Headings

If (@Add_Row_Summary='S')
Begin
Set @SQL = 'SELECT Pivot_Data.*, ' + char(13)
+ ' (' + @Summary_SQL + ') AS RowTotal ' + char(13)
+ 'FROM (' + @SQL + ') AS Pivot_Data'
End


Print @SQL
Exec (@SQL)
go


exec proc_Query_Pivot_1


mitabla where
micondicion"
'SELECT id_libro, titulo, nombre
FROM librosCategorias
INNER JOIN categorias ON categorias.idcategoria >librosCategorias.idcategoria
INNER JOIN libros on idLibro = id_libro
',
'id_libro, titulo',
'nombre',
'SELECT nombre FROM categorias',


etc),
'MAX',


en este caso solo
quiero mostrar 'Si'
"'Si'",
'N'


""


escribió en
el mensaje news:1c1e001c4521b$f59abd10


$
Gracias Liliana por tu respuesta pero lo que necesito es
generar una gran matriz que permita mostrar una gran
cuadricula con valores 0 (cero) ya que en algunos casos
la sentencia Select ... no devuelve nada porque no existe
nada. Algo así:

Productos/Depósitos DA DB DC DE
PA 100 0 15 65
PB 240 1 25 68
PB 25 0 3 18

Como ves en este ejemplo la intersección del Depósito DB
y el Producto PB no existe pero debo mostrar '0' al igual
que PB y DB.

Es por ese motivo que armo dos cursores uno recorriendo
todos los depósitos y otro los productos. Si se te ocurre
algo muy agradecido.

Saludos, Claudio.

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



.





.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida