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