porque actualiza dos veces

03/03/2004 - 13:45 por edu | Informe spam
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON Pedidos.npedido Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND (Pedidos_Control.Anulado = 0)
AND (Pedidos.CodHilo IS NOT NULL) AND (Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel FROM Pedidos INNER
JOIN Pedidos_Control ON Pedidos.npedido =Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE npedidocontrol=@npedido
END

CLOSE marcada_cursor

Preguntas similare

Leer las respuestas

#6 Maximiliano D. A.
03/03/2004 - 21:34 | Informe spam
No es necesario para eso usar un Cursor, me imagino que estas usando If
update para detectar el campo, si pasarias el codigo completo y las
estructuras te podemos ayudar mejor.

Bye


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"eduardo" escribió en el mensaje
news:
la razon por la que uso cursores es porque tengo un disparador asociado a


la
tabla que uso, y la primera sentencia del disparador es que cuando se
actualice un dato de un campo, ese dato se inserta en una variable.
he tenido problemas con el update maximo, asi que lo he echo con un
disparador, nose si habeis tenido vosotros ese mismo problema.
gracias por vuestro interes

"ulises" escribió en el mensaje
news:619701c40133$d01c1e00$
Tienes razón!, no me había fijado que el FETCH se
encuentra al inicio y no antes del bucle y al final de la
iteración lo que es lo lógico para que no haya problemas
de duplicidad :(.

Saludos,
Ulises

>Hola:
> A parte de recomedarte que revises bien la respuesta
de ULISES. la razon
>por la que actualiza 2 veces es que hay un error de
logica en el cursor, el
>cliclo debe escribirse:
>> >FETCH NEXT FROM marcada_cursor
>INTO @npedido
>WHILE @@FETCH_STATUS = 0
> BEGIN
> SET @Excel=(SELECT Pedidos_Control.Excel
> FROM Pedidos
> INNER JOIN Pedidos_Control
> ON Pedidos.npedido=Pedidos_Control.npedidoControl
> WHERE npedido=@npedido)
> IF @Excel=0
> UPDATE pedidos_control
> SET marcada=1
> WHERE npedidocontrol=@npedido
> FETCH NEXT FROM marcada_cursor
> INTO @npedido
>END
>> >Si no la ultima vez cuando no se puede leer el registro
igual corres el
>proceso.
> Saludos,
>
>
>Javier Loria
>Costa Rica
>Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>que pueda ser copiado y pegado al Query Analizer.
>La version de SQL y Service Pack tambien ayuda.
>
>edu escribio:
>> el cursor devuelve solo un registro
>> porque el siguiente procedimiento pasa dos veces por el
cursor?
>>
>> DECLARE @npedido AS INT
>> DECLARE @Excel AS BIT
>>
>> DECLARE marcada_cursor CURSOR FOR
>> SELECT Pedidos.npedido
>> FROM Pedidos INNER JOIN Pedidos_Control ON
Pedidos.npedido > >> Pedidos_Control.npedidoControl
>> WHERE (Pedidos_Control.Expedido = 0) AND
>> (Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS
NOT NULL) AND
>> (Pedidos_Control.Marcada = 0)
>>
>> OPEN marcada_cursor
>>
>> WHILE @@FETCH_STATUS = 0
>> BEGIN
>> FETCH NEXT FROM marcada_cursor
>> INTO @npedido
>> SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
>> INNER JOIN Pedidos_Control ON Pedidos.npedido
>> =Pedidos_Control.npedidoControl WHERE npedido=@npedido)
>> IF @Excel=0
>> UPDATE pedidos_control SET marcada=1 WHERE
npedidocontrol=@npedido
>> END
>>
>> CLOSE marcada_cursor
>
>
>.
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 21/02/2004
Respuesta Responder a este mensaje
#7 Javier Loria
03/03/2004 - 21:44 | Informe spam
Hola Eduardo:
Disculpa pero no entendi el problema que tienes cuando dices que has
tenido problemas con el update maximo?
Tal vez si puedes copiar algo del codigo del trigger.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
eduardo escribio:
la razon por la que uso cursores es porque tengo un disparador
asociado a la tabla que uso, y la primera sentencia del disparador es
que cuando se actualice un dato de un campo, ese dato se inserta en
una variable.
he tenido problemas con el update maximo, asi que lo he echo con un
disparador, nose si habeis tenido vosotros ese mismo problema.
gracias por vuestro interes

"ulises" escribió en el mensaje
news:619701c40133$d01c1e00$
Tienes razón!, no me había fijado que el FETCH se
encuentra al inicio y no antes del bucle y al final de la
iteración lo que es lo lógico para que no haya problemas
de duplicidad :(.

Saludos,
Ulises

Hola:
A parte de recomedarte que revises bien la respuesta


de ULISES. la razon
por la que actualiza 2 veces es que hay un error de


logica en el cursor, el
cliclo debe escribirse:
>> FETCH NEXT FROM marcada_cursor
INTO @npedido
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
INNER JOIN Pedidos_Control
ON Pedidos.npedido=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control
SET marcada=1
WHERE npedidocontrol=@npedido
FETCH NEXT FROM marcada_cursor
INTO @npedido
END
>> Si no la ultima vez cuando no se puede leer el registro


igual corres el
proceso.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

edu escribio:
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el




cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON




Pedidos.npedido >>> Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND
(Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS




NOT NULL) AND
(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel




FROM Pedidos
INNER JOIN Pedidos_Control ON Pedidos.npedido
=Pedidos_Control.npedidoControl WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE




npedidocontrol=@npedido
END

CLOSE marcada_cursor




.
Respuesta Responder a este mensaje
#8 edu
04/03/2004 - 09:18 | Informe spam
CREATE TRIGGER Inserta_Marcada ON [dbo].[Pedidos_Control]
FOR UPDATE
AS

DECLARE @Marcada AS BIT
DECLARE @TipoModelo AS INT

SET @Marcada=(SELECT marcada from inserted)
...
...
este es el disparadador, el campo marcada es boolean, si hago un
"update pedidos_control set marcada=true" de todos los pedidos, esta
asignacion me sale un error
alguien sabe porque es?
"Javier Loria" escribió en el mensaje
news:
Hola Eduardo:
Disculpa pero no entendi el problema que tienes cuando dices que has
tenido problemas con el update maximo?
Tal vez si puedes copiar algo del codigo del trigger.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
eduardo escribio:
> la razon por la que uso cursores es porque tengo un disparador
> asociado a la tabla que uso, y la primera sentencia del disparador es
> que cuando se actualice un dato de un campo, ese dato se inserta en
> una variable.
> he tenido problemas con el update maximo, asi que lo he echo con un
> disparador, nose si habeis tenido vosotros ese mismo problema.
> gracias por vuestro interes
>
> "ulises" escribió en el mensaje
> news:619701c40133$d01c1e00$
> Tienes razón!, no me había fijado que el FETCH se
> encuentra al inicio y no antes del bucle y al final de la
> iteración lo que es lo lógico para que no haya problemas
> de duplicidad :(.
>
> Saludos,
> Ulises
>
>> Hola:
>> A parte de recomedarte que revises bien la respuesta
> de ULISES. la razon
>> por la que actualiza 2 veces es que hay un error de
> logica en el cursor, el
>> cliclo debe escribirse:
>> > >> FETCH NEXT FROM marcada_cursor
>> INTO @npedido
>> WHILE @@FETCH_STATUS = 0
>> BEGIN
>> SET @Excel=(SELECT Pedidos_Control.Excel
>> FROM Pedidos
>> INNER JOIN Pedidos_Control
>> ON Pedidos.npedido=Pedidos_Control.npedidoControl
>> WHERE npedido=@npedido)
>> IF @Excel=0
>> UPDATE pedidos_control
>> SET marcada=1
>> WHERE npedidocontrol=@npedido
>> FETCH NEXT FROM marcada_cursor
>> INTO @npedido
>> END
>> > >> Si no la ultima vez cuando no se puede leer el registro
> igual corres el
>> proceso.
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>>
>> edu escribio:
>>> el cursor devuelve solo un registro
>>> porque el siguiente procedimiento pasa dos veces por el
> cursor?
>>>
>>> DECLARE @npedido AS INT
>>> DECLARE @Excel AS BIT
>>>
>>> DECLARE marcada_cursor CURSOR FOR
>>> SELECT Pedidos.npedido
>>> FROM Pedidos INNER JOIN Pedidos_Control ON
> Pedidos.npedido > >>> Pedidos_Control.npedidoControl
>>> WHERE (Pedidos_Control.Expedido = 0) AND
>>> (Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS
> NOT NULL) AND
>>> (Pedidos_Control.Marcada = 0)
>>>
>>> OPEN marcada_cursor
>>>
>>> WHILE @@FETCH_STATUS = 0
>>> BEGIN
>>> FETCH NEXT FROM marcada_cursor
>>> INTO @npedido
>>> SET @Excel=(SELECT Pedidos_Control.Excel
> FROM Pedidos
>>> INNER JOIN Pedidos_Control ON Pedidos.npedido
>>> =Pedidos_Control.npedidoControl WHERE npedido=@npedido)
>>> IF @Excel=0
>>> UPDATE pedidos_control SET marcada=1 WHERE
> npedidocontrol=@npedido
>>> END
>>>
>>> CLOSE marcada_cursor
>>
>>
>> .


Respuesta Responder a este mensaje
#9 Maximiliano D. A.
04/03/2004 - 13:15 | Informe spam
Hola!! es que True esta mal!! debes usar 1 o 0 en los Bol de SQL y no Tue
False!!!

Bye


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"edu" escribió en el mensaje
news:c26obr$1jo$
CREATE TRIGGER Inserta_Marcada ON [dbo].[Pedidos_Control]
FOR UPDATE
AS

DECLARE @Marcada AS BIT
DECLARE @TipoModelo AS INT

SET @Marcada=(SELECT marcada from inserted)
...
...
este es el disparadador, el campo marcada es boolean, si hago un
"update pedidos_control set marcada=true" de todos los pedidos, esta
asignacion me sale un error
alguien sabe porque es?
"Javier Loria" escribió en el mensaje
news:
> Hola Eduardo:
> Disculpa pero no entendi el problema que tienes cuando dices que has
> tenido problemas con el update maximo?
> Tal vez si puedes copiar algo del codigo del trigger.
> Saludos,
>
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda.
> eduardo escribio:
> > la razon por la que uso cursores es porque tengo un disparador
> > asociado a la tabla que uso, y la primera sentencia del disparador es
> > que cuando se actualice un dato de un campo, ese dato se inserta en
> > una variable.
> > he tenido problemas con el update maximo, asi que lo he echo con un
> > disparador, nose si habeis tenido vosotros ese mismo problema.
> > gracias por vuestro interes
> >
> > "ulises" escribió en el mensaje
> > news:619701c40133$d01c1e00$
> > Tienes razón!, no me había fijado que el FETCH se
> > encuentra al inicio y no antes del bucle y al final de la
> > iteración lo que es lo lógico para que no haya problemas
> > de duplicidad :(.
> >
> > Saludos,
> > Ulises
> >
> >> Hola:
> >> A parte de recomedarte que revises bien la respuesta
> > de ULISES. la razon
> >> por la que actualiza 2 veces es que hay un error de
> > logica en el cursor, el
> >> cliclo debe escribirse:
> >> > > >> FETCH NEXT FROM marcada_cursor
> >> INTO @npedido
> >> WHILE @@FETCH_STATUS = 0
> >> BEGIN
> >> SET @Excel=(SELECT Pedidos_Control.Excel
> >> FROM Pedidos
> >> INNER JOIN Pedidos_Control
> >> ON Pedidos.npedido=Pedidos_Control.npedidoControl
> >> WHERE npedido=@npedido)
> >> IF @Excel=0
> >> UPDATE pedidos_control
> >> SET marcada=1
> >> WHERE npedidocontrol=@npedido
> >> FETCH NEXT FROM marcada_cursor
> >> INTO @npedido
> >> END
> >> > > >> Si no la ultima vez cuando no se puede leer el registro
> > igual corres el
> >> proceso.
> >> Saludos,
> >>
> >>
> >> Javier Loria
> >> Costa Rica
> >> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> >> que pueda ser copiado y pegado al Query Analizer.
> >> La version de SQL y Service Pack tambien ayuda.
> >>
> >> edu escribio:
> >>> el cursor devuelve solo un registro
> >>> porque el siguiente procedimiento pasa dos veces por el
> > cursor?
> >>>
> >>> DECLARE @npedido AS INT
> >>> DECLARE @Excel AS BIT
> >>>
> >>> DECLARE marcada_cursor CURSOR FOR
> >>> SELECT Pedidos.npedido
> >>> FROM Pedidos INNER JOIN Pedidos_Control ON
> > Pedidos.npedido > > >>> Pedidos_Control.npedidoControl
> >>> WHERE (Pedidos_Control.Expedido = 0) AND
> >>> (Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS
> > NOT NULL) AND
> >>> (Pedidos_Control.Marcada = 0)
> >>>
> >>> OPEN marcada_cursor
> >>>
> >>> WHILE @@FETCH_STATUS = 0
> >>> BEGIN
> >>> FETCH NEXT FROM marcada_cursor
> >>> INTO @npedido
> >>> SET @Excel=(SELECT Pedidos_Control.Excel
> > FROM Pedidos
> >>> INNER JOIN Pedidos_Control ON Pedidos.npedido
> >>> =Pedidos_Control.npedidoControl WHERE npedido=@npedido)
> >>> IF @Excel=0
> >>> UPDATE pedidos_control SET marcada=1 WHERE
> > npedidocontrol=@npedido
> >>> END
> >>>
> >>> CLOSE marcada_cursor
> >>
> >>
> >> .
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 22/02/2004
Respuesta Responder a este mensaje
#10 Javier Loria
04/03/2004 - 15:11 | Informe spam
Hola Eduardo:
La mala noticia es que la operacion que realizas, SET @Marcada=..., no
tiene sentido :(
INSERTED es una Tabla (Virtual pero es una Tabla) y por ende es un
conjunto de datos, esto significa que puede tener 0, 1 o multiples filas.
@Marcada es una variable que solo puede tener un valor. Esa asignacion puede
resultar en NULL, en un valor valido o en un Valor cualquiera de las filas
de Inserted.
La buena noticia es que lo que esta debajo del SET normalmente se puede
arreglar para que no requiera @Marcada sino que se maneje directamente la
columna de INSERTED con todos los valores.
Por ultimo los campos bit pueden tener 3 estados: 1,0 o NULL.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
edu escribio:
CREATE TRIGGER Inserta_Marcada ON [dbo].[Pedidos_Control]
FOR UPDATE
AS

DECLARE @Marcada AS BIT
DECLARE @TipoModelo AS INT

SET @Marcada=(SELECT marcada from inserted)
...
...
este es el disparadador, el campo marcada es boolean, si hago un
"update pedidos_control set marcada=true" de todos los pedidos, esta
asignacion me sale un error
alguien sabe porque es?
"Javier Loria" escribió en el mensaje
news:
Hola Eduardo:
Disculpa pero no entendi el problema que tienes cuando dices que
has tenido problemas con el update maximo?
Tal vez si puedes copiar algo del codigo del trigger.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
eduardo escribio:
la razon por la que uso cursores es porque tengo un disparador
asociado a la tabla que uso, y la primera sentencia del disparador
es que cuando se actualice un dato de un campo, ese dato se inserta
en una variable.
he tenido problemas con el update maximo, asi que lo he echo con un
disparador, nose si habeis tenido vosotros ese mismo problema.
gracias por vuestro interes

"ulises" escribió en el mensaje
news:619701c40133$d01c1e00$
Tienes razón!, no me había fijado que el FETCH se
encuentra al inicio y no antes del bucle y al final de la
iteración lo que es lo lógico para que no haya problemas
de duplicidad :(.

Saludos,
Ulises

Hola:
A parte de recomedarte que revises bien la respuesta


de ULISES. la razon
por la que actualiza 2 veces es que hay un error de


logica en el cursor, el
cliclo debe escribirse:
>>>> FETCH NEXT FROM marcada_cursor
INTO @npedido
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
INNER JOIN Pedidos_Control
ON Pedidos.npedido=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control
SET marcada=1
WHERE npedidocontrol=@npedido
FETCH NEXT FROM marcada_cursor
INTO @npedido
END
>>>> Si no la ultima vez cuando no se puede leer el registro


igual corres el
proceso.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

edu escribio:
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el




cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON




Pedidos.npedido >>>>> Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND
(Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS




NOT NULL) AND
(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel




FROM Pedidos
INNER JOIN Pedidos_Control ON Pedidos.npedido
=Pedidos_Control.npedidoControl WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE
npedidocontrol=@npedido END

CLOSE marcada_cursor




.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida