Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con Cursor SQL

Estas en el tema de Problema con Cursor SQL en el foro de SQL Server en Foros del Web. Estimados, tratare de ser lo mas claro posible para ver si alguien me ayuda a encotnrar el error o tiene una sugerencia: Tengo una tabla ...
  #1 (permalink)  
Antiguo 16/01/2012, 17:43
Avatar de heap811019  
Fecha de Ingreso: enero-2011
Ubicación: Mexico DF
Mensajes: 40
Antigüedad: 13 años, 3 meses
Puntos: 1
Información Problema con Cursor SQL

Estimados, tratare de ser lo mas claro posible para ver si alguien me ayuda a encotnrar el error o tiene una sugerencia:

Tengo una tabla de "nomina por año" ej: nomina2009, nomina2010 ..etc

Cada una de tiene los siguientes campos:
ID
NOMBRE_EMPLEADO
SUELDO
DESCUENTO_ENERO
DESCUENTO_FEBRERO
DESCUENTO_MARZO
DESCUENTO_ABRIL
DESCUENTO_MAYO
DESCUENTO_JUNIO
DESCUENTO_JULIO
DESCUENTO_AGOSTO
DESCUENTO_SEPTIEMBRE
DESCUENTO_OCTUBRE
DESCUENTO_NOVIEMBRE
DESCUENTO_DICIEMBRE

El requerimiento es que en una tabla similar llamada RESUMEN2009 pueda poner un resumen de los descuentos aplicados en el año (ya que cuando piden un prestamo, se les descuenta via nomina mensualmente), esta tabla tendria los campos

ID
MES_DESDE1
MES_HASTA1
DESCUENTO1
MES_DESDE2
MES_HASTA2
DESCUENTO2
MES_DESDE3
MES_HASTA3
DESCUENTO3

Les muestro un ejemplo:
Un empleado en 2009 pidio un prestamo de 1640 pesos a pagar en un año entonces sus descuentos se ven asi:

Dscto_Ene: 149.00
Dscto_Feb: 149.00
Dscto_Mar: 149.00
Dscto_Abr: 149.00
Dscto_May: 149.00
Dscto_Jun: 149.00
Dscto_Jul: 149.00
Dscto_Ago: 149.00
Dscto_Sep: 149.00
Dscto_Oct: 149.00
Dscto_Nov: 150.00
Dscto_Dic: 0.00

El resultado que busco seria algo similara esto:
MES_DESDE1: Enero
MES_HASTA1: Octubre
DESCUENTO1: 149.00
MES_DESDE2: Noviembre
MES_HASTA2: Noviembre
DESCUENTO2: 150.00
MES_DESDE3: Diciembre
MES_HASTA3: Diciembre
DESCUENTO3: 0.00

La idea con la q inicie la consulta fue un CURSOR, que tome el primer renglon y de ahi vaya comparando el valor de enero contra febrero y si son iguales va con marzo y asi suscesivamente. Como se podran imaginar.....lo hice con puros IF y el codigo se hace mas que largo, un aprox de 1000 lineas, ya lo arme y todo, pero al querer ejecutarlo me manda muchos errores, todos dicen los mismo:

Msg 102, Level 15, State 1, Line 48
Incorrect syntax near '{'.
Msg 102, Level 15, State 1, Line 63
Incorrect syntax near '}'.

Les adjunto parte del codigo que hice, ya que no me permite ponerlo completo:
Código:
DECLARE @CLAVE NVARCHAR (30)
DECLARE @I INT

DECLARE @JUN04 NVARCHAR (10)
DECLARE @JUL04 NVARCHAR (10)
DECLARE @AGO04 NVARCHAR (10)
DECLARE @SEP04 NVARCHAR (10)
DECLARE @OCT04 NVARCHAR (10)
DECLARE @NOV04 NVARCHAR (10)
DECLARE @DIC04 NVARCHAR (10)

SET @I = 1
DECLARE RES CURSOR FOR
SELECT clave_de_cobro, JUN04, JUL04, AGO04,	SEP04, OCT04, NOV04, DIC04 FROM T1991

OPEN RES
 
FETCH NEXT FROM RES
INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04

WHILE @@FETCH_STATUS = 0
	BEGIN 
		IF @JUN04 = @JUL04 --1
			{IF @JUN04 = @AGO04--2
				{IF @JUN04 = @SEP04--3
					{IF @JUN04 = @OCT04--4
						{IF @JUN04 = @NOV04--5
							{IF @JUN04 = @DIC04--6
								{UPDATE T1991
								 SET DSD1 = 'JUN04',
									 HST1 = 'DIC04',
									 DSCT1 = @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04}
							 ELSE
								{UPDATE T1991
								 SET DSD1 = 'JUN04',
									 HST1 = 'NOV04',
									 DSCT1 = @NOV04,
									 DSD2 = 'DIC04',
									 HST2 = 'DIC04',
									 DSCT2 = @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}--CIERRA IF 6
							}
						 ELSE
							{UPDATE T1991
							 SET DSD1= 'JUN04',
							     HST1= 'OCT04',
							     DSCT1= @OCT04
							 WHERE clave_de_cobro = CEILING(@CLAVE)
							 IF @NOV04 = @DIC04
								{UPDATE T1991
								 SET DSD2= 'NOV04',
								     HST2= 'DIC04',
									 DSCT2= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								}
							 ELSE 
								{UPDATE T1991
								 SET DSD2= 'NOV04',
								     HST2= 'NOV04',
									 DSCT2= @NOV04,
								     DSD3= 'DIC04',
								     HST3= 'DIC04',
									 DSCT3= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								}
							 PRINT @I
							 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
							 SET @I = @I+1
							 FETCH NEXT FROM RES
							 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
							}--CIERRA IF 5
						}
					 ELSE
						{UPDATE T1991
						 SET DSD1= 'JUN04',
						     HST1= 'SEP04',
						     DSCT1= @SEP04
						 WHERE clave_de_cobro = CEILING(@CLAVE)
						 IF @OCT04 = @NOV04
							{IF @OCT04 = DIC04
								{UPDATE T1991
								 SET DSD2= 'OCT04',
									 HST2= 'DIC04',
									 DSCT2= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							 ELSE
								{UPDATE T1991
								 SET DSD2= 'OCT04',
									 HST2= 'NOV04',
									 DSCT2= @NOV04
									 DSD3= 'DIC04',
									 HST3= 'DIC04',
									 DSCT3= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							}
						}--CIERRA IF 4
					}
				 ELSE 
					{UPDATE T1991
					 SET DSD1= 'JUN04',
					     HST1= 'AGO04',
					     DSCT1= @AGO04
					 WHERE clave_de_cobro = CEILING(@CLAVE)
					 IF @SEP04 = @OCT04
						{IF @SEP04 = @NOV04
							{IF @SEP04 = @DIC04
								{UPDATE T1991
								 SET DSD2= 'SEP04',
									 HST2= 'DIC04',
									 DSCT2= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							 ELSE 
								{UPDATE T1991
								 SET DSD2= 'SEP04',
									 HST2= 'NOV04',
									 DSCT2= @NOV04,
									 DSD3= 'DIC04',
									 HST3= 'DIC04',
									 DSCT3= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							}
						 ELSE 
							{UPDATE T1991
							 SET DSD2= 'SEP04',
								 HST2= 'OCT04',
								 DSCT2= @OCT04
							 WHERE clave_de_cobro = CEILING(@CLAVE)
							 IF @NOV04 = @DIC04
								{UPDATE T1991
								 SET DSD3= 'NOV04',
									 HST3= 'DIC04',
									 DSCT3= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							 ELSE 
								{UPDATE T1991
								 SET DSD3= 'NOV04',
									 HST3= 'NOV04',
									 DSCT3= @NOV04,
									 DSD4= 'DIC04',
									 HST4= 'DIC04',
									 DSCT4= @DIC04
								 WHERE clave_de_cobro = CEILING(@CLAVE)
								 PRINT @I
								 PRINT 'SE ACTUALIZO LA CLAVE ' + @CLAVE
								 SET @I = @I+1
								 FETCH NEXT FROM RES
								 INTO @CLAVE, @JUN04, @JUL04, @AGO04, @SEP04, @OCT04, @NOV04, @DIC04
								}
							}
						}
					}--CIERRA IF 3
				}
				
END

CLOSE RES
DEALLOCATE RES

Espero me puedan ayudar a encontrar el error o si me sugieren otro metodo mas facil y mas sencillo, se los agradecere muchisimo!

Un saludo colegas
  #2 (permalink)  
Antiguo 16/01/2012, 19:32
Avatar de drako_darpan  
Fecha de Ingreso: octubre-2008
Ubicación: Sinaloa
Mensajes: 617
Antigüedad: 15 años, 6 meses
Puntos: 58
Respuesta: Problema con Cursor SQL

Hola que tal, bueno si lo estas haciendo SQL las "{ } " no van, es asi:

Código SQL:
Ver original
  1. IF @cMes = "Enero"
  2. BEGIN
  3.       SELECT 'Enero'
  4. END
  5. ELSE IF @cMes = "Febrero"
  6. BEGIN
  7.       SELECT 'Febrero'
  8. END
  9. .
  10. .
  11. .
  12. etc

Con respecto al cursor, la verdad yo no lo recomiendo por la lentitud que puede tener, revisa si no te sale mejor con el CASE WHEN en forma de SWITCH.

En google encontraras ejemplos

Etiquetas: cursor, select, sql, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:52.