Como quitar los cursores

09/10/2003 - 23:23 por J.Carlos Herrero | Informe spam
Hola:
Tengo un procedimiento almacenado que
usa 2 cursores.
¿ Se podria hacer lo mismo, pero sin
usar los cursores. ?
Estas son las estructuras de las 3 tablas
implicadas en el procedimiento almacenado:

CREATE TABLE [RECIBO] (
[RECIBO] [smallint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
[NUM_EMISION] [int] NULL ,
[F_EMISION] [datetime] NULL ,
CONSTRAINT [PK_RECIBO] PRIMARY KEY NONCLUSTERED
(
[RECIBO]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [LOGSITREC] (
[RECIBO] [smallint] NOT NULL ,
[NUM_SITUACION] [smallint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
CONSTRAINT [PK_LOGSITREC] PRIMARY KEY NONCLUSTERED
(
[RECIBO],
[NUM_SITUACION]
) ON [PRIMARY] ,
CONSTRAINT [FK_LOGSITREC_RECIBO] FOREIGN KEY
(
[RECIBO]
) REFERENCES [RECIBO] (
[RECIBO]
)
) ON [PRIMARY]
GO

CREATE TABLE [DEDUCCION] (
[RECIBO] [smallint] NOT NULL ,
[NUM_DEDUCCION] [tinyint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
[NUM_EMISION] [smallint] NULL ,
[F_EMISION] [datetime] NULL ,
CONSTRAINT [PK_DEDUCCION] PRIMARY KEY NONCLUSTERED
(
[RECIBO],
[NUM_DEDUCCION]
) ON [PRIMARY] ,
CONSTRAINT [FK_DEDUCCION_RECIBO] FOREIGN KEY
(
[RECIBO]
) REFERENCES [RECIBO] (
[RECIBO]
)
) ON [PRIMARY]
GO

Estos son los datos de prueba:

INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (1, 1, N'20030909', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (2, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (3, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (4, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (5, 1, N'20030913', NULL, NULL)

INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (1, 1, 1, N'20030909')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (2, 1, 1, N'20030910')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (3, 1, 1, N'20030911')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (4, 1, 1, N'20030912')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (5, 1, 1, N'20030913')

INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (1, 1, 1, N'20030909', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (2, 1, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (2, 2, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 1, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 2, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 3, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 1, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 2, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 3, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 4, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 1, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 2, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 3, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 4, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 5, 1, N'20030913', NULL, NULL)

El procedimiento almacenado es:

CREATE PROCEDURE Cierre
( @sit_origen smallint,
@sit_destino smallint,
@f_emision char(10)
)
AS

DECLARE
@recibo smallint,
@nemision int,
@num_situacion smallint,
@num_deduccion tinyint,
@f_sistema char(10),
@retorno bit

BEGIN TRAN
SELECT @nemision=0
SELECT @f_sistema=convert(char(10),getdate(),3)
print @f_sistema

DECLARE Datos CURSOR FOR
SELECT RECIBO FROM dbo.RECIBO where SITUACION=@sit_origen


OPEN Datos
FETCH NEXT FROM Datos INTO @recibo



WHILE @@FETCH_STATUS=0

BEGIN
print 'Número de emisión: ' + str(@nemision)
SELECT @nemision=@nemision + 1
UPDATE dbo.RECIBO set SITUACION=@sit_destino,
F_SITUACION=@f_sistema,
NUM_EMISION=@nemision,
F_EMISION=@f_emision
where RECIBO=@recibo

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

print 'Actualizamos el recibo'
SELECT @num_situacion=MAX(NUM_SITUACION) FROM dbo.LOGSITREC
where RECIBO=@recibo

begin
IF (@num_situacion IS NOT NULL)
SET @num_situacion= @num_situacion + 1
ELSE
SET @num_situacion=1
end

print 'num_situacion: ' + str(@num_situacion)

INSERT INTO dbo.LOGSITREC values (@recibo,
@num_situacion, @sit_destino, @f_sistema)

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

print 'Insertamos en logsitrec'
BEGIN
DECLARE Cursor_Ded CURSOR FOR
SELECT NUM_DEDUCCION FROM DEDUCCION where RECIBO=@recibo
print 'Abrimos el cursor'
OPEN Cursor_Ded
FETCH NEXT FROM Cursor_Ded into @num_deduccion
print 'bucle para recorrer todos los registros'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @nemision=@nemision + 1

print 'número de emisión en el bucle de deducciones: ' + str(@nemision)

UPDATE dbo.DEDUCCION set SITUACION=@sit_destino,
F_SITUACION=@f_sistema,
NUM_EMISION=@nemision,
F_EMISION=@f_emision
where RECIBO=@recibo
and NUM_DEDUCCION=@num_deduccion

print 'Actualizamos las deducciones del recibo'
print 'Número de emisión: ' + str(@nemision)

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

FETCH NEXT FROM Cursor_Ded INTO @num_deduccion

END
CLOSE Cursor_Ded
DEALLOCATE Cursor_Ded
print 'Cierra el cursor de Deducciones'
END

FETCH NEXT FROM Datos
INTO @recibo

END



CLOSE Datos
DEALLOCATE Datos
print 'Cierra el cursor de Recibos'

COMMIT
RETURN @@ERROR

La ejecución desde el QA es en el dia 09/10/2003:
exec Cierre 1,2,'15/10/2003'

Los resultados son:

RECIBO SITUACION F_SITUACION NUM_EMISION F_EMISION
1 2 2003-10-09 00:00:00.000 1 2003-10-15
00:00:00.000
2 2 2003-10-09 00:00:00.000 3 2003-10-15
00:00:00.000
3 2 2003-10-09 00:00:00.000 6 2003-10-15
00:00:00.000
4 2 2003-10-09 00:00:00.000 10 2003-10-15
00:00:00.000
5 2 2003-10-09 00:00:00.000 15 2003-10-15
00:00:00.000

RECIBO NUM_SITUACION SITUACION F_SITUACION
-
1 1 1 2003-09-09 00:00:00.000
2 1 1 2003-09-10 00:00:00.000
3 1 1 2003-09-11 00:00:00.000
4 1 1 2003-09-12 00:00:00.000
5 1 1 2003-09-13 00:00:00.000
1 2 2 2003-10-09 00:00:00.000
2 2 2 2003-10-09 00:00:00.000
3 2 2 2003-10-09 00:00:00.000
4 2 2 2003-10-09 00:00:00.000
5 2 2 2003-10-09 00:00:00.000

RECIBO NUM_DEDUCCION SITUACION F_SITUACION NUM_EMISION
F_EMISION
-
1 1 2 2003-10-09 00:00:00.000 2
2003-10-15 00:00:00.000
2 1 2 2003-10-09 00:00:00.000 4
2003-10-15 00:00:00.000
2 2 2 2003-10-09 00:00:00.000 5
2003-10-15 00:00:00.000
3 1 2 2003-10-09 00:00:00.000 7
2003-10-15 00:00:00.000
3 2 2 2003-10-09 00:00:00.000 8
2003-10-15 00:00:00.000
3 3 2 2003-10-09 00:00:00.000 9
2003-10-15 00:00:00.000
4 1 2 2003-10-09 00:00:00.000 11
2003-10-15 00:00:00.000
4 2 2 2003-10-09 00:00:00.000 12
2003-10-15 00:00:00.000
4 3 2 2003-10-09 00:00:00.000 13
2003-10-15 00:00:00.000
4 4 2 2003-10-09 00:00:00.000 14
2003-10-15 00:00:00.000
5 1 2 2003-10-09 00:00:00.000 16
2003-10-15 00:00:00.000
5 2 2 2003-10-09 00:00:00.000 17
2003-10-15 00:00:00.000
5 3 2 2003-10-09 00:00:00.000 18
2003-10-15 00:00:00.000
5 4 2 2003-10-09 00:00:00.000 19
2003-10-15 00:00:00.000
5 5 2 2003-10-09 00:00:00.000 20
2003-10-15 00:00:00.000

Perdonad por lo extenso de la consulta.
Un saludo
Carlos





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.522 / Virus Database: 320 - Release Date: 29/09/2003
 

Leer las respuestas

#1 Liliana Sorrentino
10/10/2003 - 15:36 | Informe spam
Hola Carlos,
Gracias por la inclusión de todos los datos necesarios para poder darte una
mano.
Espero que te sirva esta solución, probada con la información que nos das
para la prueba, los resultados son los mismos que mostrás.
Saludos... Liliana.

CREATE PROCEDURE Cierre
( @sit_origen smallint,
@sit_destino smallint,
@f_emision char(10)
)

AS

DECLARE
@recibo smallint,
@nemision int,
@num_situacion smallint,
@num_deduccion tinyint,
@f_sistema char(10),
@retorno bit

BEGIN TRAN

SELECT
@nemision=0,
@f_sistema=convert(char(10),getdate(),3)

UPDATE DEDUCCION
SET SITUACION = @sit_destino,
F_SITUACION = @f_sistema,
@nemision = CASE WHEN rec.recibo = @recibo THEN @nemision + 1 ELSE
@nemision + 2 END,
@recibo = rec.recibo,
NUM_EMISION = @nemision,
F_EMISION = @f_emision
FROM DEDUCCION DED
INNER JOIN RECIBO REC ON ded.RECIBO = rec.recibo
WHERE rec.SITUACION = @sit_origen


INSERT INTO LOGSITREC
SELECT sit.recibo,
CASE WHEN MAX(sit.num_situacion) IS NULL THEN 1 ELSE MAX(sit.num_situacion)
+ 1 END,
@sit_destino, @f_sistema
FROM RECIBO rec
INNER JOIN LOGSITREC sit ON rec.recibo = sit.recibo
WHERE rec.SITUACION = @sit_origen
GROUP BY sit.recibo

UPDATE RECIBO
SET SITUACION = @sit_destino,
F_SITUACION = @f_sistema,
NUM_EMISION = (SELECT MIN(NUM_EMISION) - 1 FROM DEDUCCION WHERE recibo rec.recibo GROUP BY recibo),
F_EMISION = @f_emision
FROM RECIBO rec
WHERE SITUACION = @sit_origen

COMMIT
RETURN @@ERROR

"J.Carlos Herrero" escribió en el mensaje
news:
Hola:
Tengo un procedimiento almacenado que
usa 2 cursores.
¿ Se podria hacer lo mismo, pero sin
usar los cursores. ?
Estas son las estructuras de las 3 tablas
implicadas en el procedimiento almacenado:

CREATE TABLE [RECIBO] (
[RECIBO] [smallint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
[NUM_EMISION] [int] NULL ,
[F_EMISION] [datetime] NULL ,
CONSTRAINT [PK_RECIBO] PRIMARY KEY NONCLUSTERED
(
[RECIBO]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [LOGSITREC] (
[RECIBO] [smallint] NOT NULL ,
[NUM_SITUACION] [smallint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
CONSTRAINT [PK_LOGSITREC] PRIMARY KEY NONCLUSTERED
(
[RECIBO],
[NUM_SITUACION]
) ON [PRIMARY] ,
CONSTRAINT [FK_LOGSITREC_RECIBO] FOREIGN KEY
(
[RECIBO]
) REFERENCES [RECIBO] (
[RECIBO]
)
) ON [PRIMARY]
GO

CREATE TABLE [DEDUCCION] (
[RECIBO] [smallint] NOT NULL ,
[NUM_DEDUCCION] [tinyint] NOT NULL ,
[SITUACION] [smallint] NOT NULL ,
[F_SITUACION] [datetime] NOT NULL ,
[NUM_EMISION] [smallint] NULL ,
[F_EMISION] [datetime] NULL ,
CONSTRAINT [PK_DEDUCCION] PRIMARY KEY NONCLUSTERED
(
[RECIBO],
[NUM_DEDUCCION]
) ON [PRIMARY] ,
CONSTRAINT [FK_DEDUCCION_RECIBO] FOREIGN KEY
(
[RECIBO]
) REFERENCES [RECIBO] (
[RECIBO]
)
) ON [PRIMARY]
GO

Estos son los datos de prueba:

INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (1, 1, N'20030909', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (2, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (3, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (4, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[RECIBO] ([RECIBO], [SITUACION], [F_SITUACION],
[NUM_EMISION], [F_EMISION])
VALUES (5, 1, N'20030913', NULL, NULL)

INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (1, 1, 1, N'20030909')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (2, 1, 1, N'20030910')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (3, 1, 1, N'20030911')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (4, 1, 1, N'20030912')
INSERT INTO [dbo].[LOGSITREC] ([RECIBO], [NUM_SITUACION], [SITUACION],
[F_SITUACION])
VALUES (5, 1, 1, N'20030913')

INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (1, 1, 1, N'20030909', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (2, 1, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (2, 2, 1, N'20030910', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 1, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 2, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (3, 3, 1, N'20030911', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 1, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 2, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 3, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (4, 4, 1, N'20030912', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 1, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 2, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 3, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 4, 1, N'20030913', NULL, NULL)
INSERT INTO [dbo].[DEDUCCION] ([RECIBO], [NUM_DEDUCCION], [SITUACION],
[F_SITUACION], [NUM_EMISION], [F_EMISION])
VALUES (5, 5, 1, N'20030913', NULL, NULL)

El procedimiento almacenado es:

CREATE PROCEDURE Cierre
( @sit_origen smallint,
@sit_destino smallint,
@f_emision char(10)
)
AS

DECLARE
@recibo smallint,
@nemision int,
@num_situacion smallint,
@num_deduccion tinyint,
@f_sistema char(10),
@retorno bit

BEGIN TRAN
SELECT @nemision=0
SELECT @f_sistema=convert(char(10),getdate(),3)
print @f_sistema

DECLARE Datos CURSOR FOR
SELECT RECIBO FROM dbo.RECIBO where SITUACION=@sit_origen


OPEN Datos
FETCH NEXT FROM Datos INTO @recibo



WHILE @@FETCH_STATUS=0

BEGIN
print 'Número de emisión: ' + str(@nemision)
SELECT @nemision=@nemision + 1
UPDATE dbo.RECIBO set SITUACION=@sit_destino,
F_SITUACION=@f_sistema,
NUM_EMISION=@nemision,
F_EMISION=@f_emision
where RECIBO=@recibo

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

print 'Actualizamos el recibo'
SELECT @num_situacion=MAX(NUM_SITUACION) FROM dbo.LOGSITREC
where RECIBO=@recibo

begin
IF (@num_situacion IS NOT NULL)
SET @num_situacion= @num_situacion + 1
ELSE
SET @num_situacion=1
end

print 'num_situacion: ' + str(@num_situacion)

INSERT INTO dbo.LOGSITREC values (@recibo,
@num_situacion, @sit_destino, @f_sistema)

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

print 'Insertamos en logsitrec'
BEGIN
DECLARE Cursor_Ded CURSOR FOR
SELECT NUM_DEDUCCION FROM DEDUCCION where RECIBO=@recibo
print 'Abrimos el cursor'
OPEN Cursor_Ded
FETCH NEXT FROM Cursor_Ded into @num_deduccion
print 'bucle para recorrer todos los registros'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @nemision=@nemision + 1

print 'número de emisión en el bucle de deducciones: ' +


str(@nemision)

UPDATE dbo.DEDUCCION set SITUACION=@sit_destino,
F_SITUACION=@f_sistema,
NUM_EMISION=@nemision,
F_EMISION=@f_emision
where RECIBO=@recibo
and NUM_DEDUCCION=@num_deduccion

print 'Actualizamos las deducciones del recibo'
print 'Número de emisión: ' + str(@nemision)

if @@ERROR <> 0
begin
ROLLBACK
RETURN @@ERROR
end

FETCH NEXT FROM Cursor_Ded INTO @num_deduccion

END
CLOSE Cursor_Ded
DEALLOCATE Cursor_Ded
print 'Cierra el cursor de Deducciones'
END

FETCH NEXT FROM Datos
INTO @recibo

END



CLOSE Datos
DEALLOCATE Datos
print 'Cierra el cursor de Recibos'

COMMIT
RETURN @@ERROR

La ejecución desde el QA es en el dia 09/10/2003:
exec Cierre 1,2,'15/10/2003'

Los resultados son:

RECIBO SITUACION F_SITUACION NUM_EMISION F_EMISION
1 2 2003-10-09 00:00:00.000 1 2003-10-15
00:00:00.000
2 2 2003-10-09 00:00:00.000 3 2003-10-15
00:00:00.000
3 2 2003-10-09 00:00:00.000 6 2003-10-15
00:00:00.000
4 2 2003-10-09 00:00:00.000 10 2003-10-15
00:00:00.000
5 2 2003-10-09 00:00:00.000 15 2003-10-15
00:00:00.000

RECIBO NUM_SITUACION SITUACION F_SITUACION
-
1 1 1 2003-09-09 00:00:00.000
2 1 1 2003-09-10 00:00:00.000
3 1 1 2003-09-11 00:00:00.000
4 1 1 2003-09-12 00:00:00.000
5 1 1 2003-09-13 00:00:00.000
1 2 2 2003-10-09 00:00:00.000
2 2 2 2003-10-09 00:00:00.000
3 2 2 2003-10-09 00:00:00.000
4 2 2 2003-10-09 00:00:00.000
5 2 2 2003-10-09 00:00:00.000

RECIBO NUM_DEDUCCION SITUACION F_SITUACION NUM_EMISION
F_EMISION
-
1 1 2 2003-10-09 00:00:00.000 2
2003-10-15 00:00:00.000
2 1 2 2003-10-09 00:00:00.000 4
2003-10-15 00:00:00.000
2 2 2 2003-10-09 00:00:00.000 5
2003-10-15 00:00:00.000
3 1 2 2003-10-09 00:00:00.000 7
2003-10-15 00:00:00.000
3 2 2 2003-10-09 00:00:00.000 8
2003-10-15 00:00:00.000
3 3 2 2003-10-09 00:00:00.000 9
2003-10-15 00:00:00.000
4 1 2 2003-10-09 00:00:00.000 11
2003-10-15 00:00:00.000
4 2 2 2003-10-09 00:00:00.000 12
2003-10-15 00:00:00.000
4 3 2 2003-10-09 00:00:00.000 13
2003-10-15 00:00:00.000
4 4 2 2003-10-09 00:00:00.000 14
2003-10-15 00:00:00.000
5 1 2 2003-10-09 00:00:00.000 16
2003-10-15 00:00:00.000
5 2 2 2003-10-09 00:00:00.000 17
2003-10-15 00:00:00.000
5 3 2 2003-10-09 00:00:00.000 18
2003-10-15 00:00:00.000
5 4 2 2003-10-09 00:00:00.000 19
2003-10-15 00:00:00.000
5 5 2 2003-10-09 00:00:00.000 20
2003-10-15 00:00:00.000

Perdonad por lo extenso de la consulta.
Un saludo
Carlos





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.522 / Virus Database: 320 - Release Date: 29/09/2003


Preguntas similares