SQL - Sql procedimiento Error

 
Vista:
Imágen de perfil de Joshua

Sql procedimiento Error

Publicado por Joshua (4 intervenciones) el 25/01/2007 21:05:15
Hola, estoy tratando de crear un procedimiento que me tome los datos de una tabla y los coloque en otra, las dos tablas son detalles de una factura pero una de ellas no tiene el campo item, asi que me toca guiarme por el numero de documento. El problema esta con el procedimiento, lo llevo asi:

CREATE PROCEDURE factura_detalle_data
AS
BEGIN
SET NOCOUNT ON;
DECLARE @tipo_documento VARCHAR
DECLARE @documento NUMERIC
DECLARE @item NUMERIC
DECLARE @especialista VARCHAR
DECLARE @detalle VARCHAR
DECLARE @actividad NUMERIC
DECLARE @cantidad NUMERIC
DECLARE @descuento NUMERIC
DECLARE @valor NUMERIC
DECLARE @doc_anterior NUMERIC
DECLARE @cont_item NUMERIC
DECLARE facturas CURSOR FOR SELECT Nro_Factura, Cod_Actividad, Ced_Especialista, Cantidad, Porc_Descuento, Subtotal FROM Detalle_Factura ORDER BY Nro_Factura ASC

SET @doc_anterior = 0
SET @cont_item = 1

OPEN facturas

WHILE(1=1)
BEGIN
FETCH NEXT FROM facturas INTO @documento, @actividad, @especialista, @cantidad, @descuento, @valor
IF (@@FETCH_STATUS = -1)
BREAK
IF @doc_anterior = @documento
BEGIN
INSERT INTO FTC_FACTURA_DETALLE (TIPO_DOCUMENTO, DOCUMENTO, ITEM, ESPECIALISTA, DETALLE, ACTIVIDAD, CANTIDAD, DESCUENTO, VALOR) VALUES ('FD', @documento, @cont_item, @especialista, ' ', @actividad, @cantidad, @descuento, @valor)
SET @cont_item = @cont_item + 1 *(Aqui el primer error)
END

IF @doc_anterior <> @documento
BEGIN
@cont_item = 1
INSERT INTO FTC_FACTURA_DETALLE (TIPO_DOCUMENTO, DOCUMENTO, ITEM, ESPECIALISTA, DETALLE, ACTIVIDAD, CANTIDAD, DESCUENTO, VALOR) VALUES ('FD', @documento, @cont_item, @especialista, ' ', @actividad, @cantidad, @descuento, @valor)
END
SET @doc_anterior = @documento *(Aqui el segundo)
END
CLOSE facturas
DEALLOCATE facturas
END

y los errores que me arrojan son
Msg 102, Level 15, State 1, Procedure factura_detalle_data, Line 58
Incorrect syntax near '@cont_item'.
Msg 102, Level 15, State 1, Procedure factura_detalle_data, Line 65
Incorrect syntax near 'END'.

en las lineas en donde tengo el asteristo para que se ubiquen.
Gracias de antemano por la posible ayuda
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
sin imagen de perfil

RE:Sql procedimiento Error

Publicado por Liliana (426 intervenciones) el 26/01/2007 13:08:51
Hola,

Primero, la solución del error:
Falta un SELECT en @cont_item = 1
Con esto, no te da error tu consulta, pero no es la forma óptima de resolver tu situación, sino, simplemente, de evitar el error.

Segundo, la sugerencia:
Te mando un código que numera filas dentro de un grupo, que es tu caso, para que veas una manera de tratar estos casos eliminando los CURSORES, que no son buenos para un motor de base de datos, que está optimizado para trabajar con conjuntos de datos y no fila a fila.
Espero que te sirva y puedas adaptarlo a tus necesidades, porque indiscutiblemente el comportamiento será mucho mejor.
Saludos,
Liliana.

create table #test(
col1 varchar(5),
col2 varchar(5)
)
insert into #test values('A','AA')
insert into #test values('A','BB')
insert into #test values('A','CC')
insert into #test values('B','AA')
insert into #test values('B','BB')
insert into #test values('X','XX')

SELECT S.col1, S.col2, (SELECT COUNT(*)
FROM #test
WHERE col1 = S.col1 AND col2 <= S.col2) AS counter
FROM #test AS S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joshua

RE:Sql procedimiento Error

Publicado por Joshua (4 intervenciones) el 26/01/2007 15:16:50
Hola, gracias por responder, pero el problema es que estoy haciendo una migracion de datos desde unas tablas sin normalizar a otras nuevas normalizadas y relacionadas, como en las tablas viejas tengo mas de 10.000 registros no puedo ponerme a hacer un insert por cada registro, para eso utilizo el cursor, pero aun nose porque me marca ese error si a mi parecer la sintaxis esta bien.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Sql procedimiento Error

Publicado por Liliana (426 intervenciones) el 26/01/2007 15:59:24
Joshua,
Justamente para no hacer un insert por cada fila, es que te sugiero que elimines los cursores, que sí trabajan de esa manera.
Fijate el código que te mandé a modo de ejemplo, si lo copiás y pegás en el QA, vas a ver cómo trabaja.
En tu caso solo deberías ejecutar algo así:

INSERT TablaNueva
SELECT S.col1, S.col2, (SELECT COUNT(*)
FROM TablaVieja
WHERE col1 = S.col1 AND col2 <= S.col2) AS counter
FROM TablaVieja) AS S

Saludos,
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joshua

RE:Sql procedimiento Error

Publicado por Joshua (4 intervenciones) el 26/01/2007 16:25:08
Gracias Liliana, ya entendi lo que me querias decir, hacer el insert basado en una consulta sobre la vieja tabla, lo unico raro que veo es como hacer para poner el item en el detalle de la factura, me explico, yo pienso que podria hacer esto mirando el codigo de la factura, si hay dos iguales, entonces la primera tendria que ser item 1 y la otra item 2, esa comparacion y el consecutivo item lo trataba de hacer con el procedimiento pero no me funcionó, ahora con tu idea me aproximo un poco pero la columna counter de tu codigo me da la sumatoria de las facturas con codigo repetido, mas no un consecutivo.
Gracias de nuevo...
Joshua
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Sql procedimiento Error

Publicado por Liliana (426 intervenciones) el 26/01/2007 16:43:06
Un ejemplo es mejor que mil palabras:

CREATE TABLE #Detalle_Factura
(
Nro_Factura int,
Cod_Actividad int
)

INSERT INTO #Detalle_Factura VALUES (1, 11)
INSERT INTO #Detalle_Factura VALUES (1, 12)
INSERT INTO #Detalle_Factura VALUES (1, 13)
INSERT INTO #Detalle_Factura VALUES (2, 21)
INSERT INTO #Detalle_Factura VALUES (2, 22)
INSERT INTO #Detalle_Factura VALUES (3, 31)
INSERT INTO #Detalle_Factura VALUES (3, 32)
SELECT * FROM #Detalle_Factura
CREATE TABLE #FTC_FACTURA_DETALLE
(
Nro_Factura int,
Cod_Actividad int,
Item int
)

INSERT #FTC_FACTURA_DETALLE
SELECT S.Nro_Factura, S.Cod_Actividad,
(SELECT COUNT(*)
FROM #Detalle_Factura
WHERE Nro_Factura = S.Nro_Factura AND Cod_Actividad <= S.Cod_Actividad) AS counter
FROM #Detalle_Factura AS S

SELECT * FROM #FTC_FACTURA_DETALLE

El Resultado es:

Nro_Factura Cod_Actividad Item
----------- ------------- -----------
1 11 1
1 12 2
1 13 3
2 21 1
2 22 2
3 31 1
3 32 2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joshua

RE:Sql procedimiento Error

Publicado por Joshua (4 intervenciones) el 26/01/2007 17:01:17
Perfecto... Mil Gracias
Joshua
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar