SQL Server - Cursor

   
Vista:

Cursor

Publicado por Hector Perez (5 intervenciones) el 03/11/2008 19:55:14
Hola amigoa, veran, me encuentro con un pequeño dilema, necesito hacer un barrido a una tabla temporal que lleno en base a las claves de un select que se hara posteriormente, esto para establecer algunos atributos desde un reporte de Reporting Services, el procediemiento funciona correctamente, el problema es con el ultimo registro, aparentemente el cursor nunca llega a el, ya que la comparacion la realiza con el registro anterior, podrian ayudarme a revisar cual es mi error?.

La idea es que las claves del campo 'Clave' repetidas unicamente la 1ra coincidencia aparezca con uno, y las sucesivas con 0 hasta que se encuentre una clave distinta.

DECLARE @tabla VARCHAR(50),
@pintNum INT,
@pintAnio INT

SET @pintAnio = 2007
SET @pintNum = 11

SET @tabla = '#Tmp' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR,GETDATE(),121),'-',''),':',''),' ',''),'.','')

EXEC('
DECLARE @linea1 INT,
@linea2 INT,
@numRegistro INT,
@destinatario1 VARCHAR(10),
@destinatario2 VARCHAR(10),
@encabezado BIT

SET @numRegistro = 0

SELECT reqDet.req_linea,
reqDet.id_destinatario,
null AS oculta_Encabezado
INTO '+@tabla+'
FROM dbo.SC_requisicion_ctrl reqCtrl
INNER join dbo.SC_requisicion_det reqDet
ON reqDet.req_ano = reqCtrl.req_ano
AND reqDet.req_no = reqCtrl.req_no
INNER JOIN dbo.SC_requisicion_guia guia
ON guia.req_ano = reqDet.req_ano
AND guia.req_no = reqDet.req_no
AND guia.req_linea = reqDet.req_linea
WHERE reqCtrl.req_no = '+@pintNum+'
AND reqCtrl.req_ano = '+@pintAnio+'
ORDER BY reqDet.req_linea

DECLARE cur_destinatario CURSOR FOR

SELECT req_linea,
id_destinatario
FROM '+@tabla+'

OPEN cur_destinatario
FETCH NEXT FROM cur_destinatario INTO @linea1, @destinatario1
SET @encabezado = 0
SET @numRegistro = @numRegistro + 1
WHILE @@FETCH_STATUS = 0
BEGIN

IF @destinatario1 <> @destinatario2
SET @encabezado = 1
IF @numRegistro = 1
SET @encabezado = 1

UPDATE '+@tabla+'
SET oculta_Encabezado = @encabezado
WHERE req_linea = @linea1
AND id_destinatario = @destinatario1

FETCH NEXT FROM cur_destinatario INTO @linea2, @destinatario2

SET @encabezado = 0
IF @destinatario1 <> @destinatario2
SET @encabezado = 1

UPDATE '+@tabla+'
SET oculta_Encabezado = @encabezado
WHERE req_linea = @linea2
AND id_destinatario = @destinatario2
END

SET @encabezado = 0
IF @destinatario1 <> @destinatario2
SET @encabezado = 1
SELECT @linea1,@destinatario1 , @linea2,@destinatario2
UPDATE '+@tabla+'
SET oculta_Encabezado = @encabezado
WHERE req_linea = @linea2
AND id_destinatario = @destinatario2

CLOSE cur_destinatario
DEALLOCATE cur_destinatario

SELECT * FROM '+@tabla+'

DROP TABLE '+@tabla+' ')


Resultado obtenido:
linea Clave Estatus
1 70004325 1
2 70004325 0
3 70004325 0
4 70004325 0
5 70004325 0
6 70004325 0
7 70004325 0
8 70004325 0
11 70004485 1
12 70004485 1


Resultado deseado
linea Clave Estatus
1 70004325 1
2 70004325 0
3 70004325 0
4 70004325 0
5 70004325 0
6 70004325 0
7 70004325 0
8 70004325 0
11 70004485 1
12 70004485 0
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder