update en un campo con procedimiento almacenado

20/05/2004 - 11:26 por Jomaweb | Informe spam
Hola

Tengo una tabla con datos de clientes. Y estoy haciendo un procedimiento que
cuando alguien elimina un cliente en una provincia automáticamente se
renumeran unos números identificadores que yo les doy (no sus identity).

Por ejemplo, si tengo
1->juan;
2->pedro;
3->paco;
4->manuel
y en mi aplicacion alguien elimina a Pedro (numero 2) el SP automáticamente
hace un UPDATE y asigna el numero 2 a paco y el 3 a manuel.

Pero hasta ahora no he descubierto cómo coger un SELECT y realizar un
MOVENEXT para ir actualizando el campo. Esto es lo que tengo, pero no
funciona porque no tengo manera de pasar al siguiente registro. ¿dónde me he
perdido?

DECLARE @ITERADOR INTEGER
DECLARE @ID_CLIENTE INTEGER
SET @ITERADOR=0
SELECT * FROM clientes WHERE provincia=@PROV

IF (@@ROWCOUNT<>0)
BEGIN

WHILE (@ROW<=@ITERADOR)
BEGIN
SELECT @ID_CLIENTE=ID_CLIENTE FROM CLIENTES
UPDATE CLIENTES SET CODIGO=@ITERADOR WHERE ID_CLIENTE=@ID_CLIENTE
SET @ITERADOR=@ITERADOR + 1
continue
END
set @mensaje= 'SE RENUMERARON LOS CLIENTES'

select @mensaje as mensaje

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
20/05/2004 - 12:52 | Informe spam
No, no. Tanto la propuesta de Rubén como la mía eliminan ese bucle,
olvídate de él.

Por otro lado, el libro de Fernando es excelente. Sin duda alguna te lo
recomiendo. Luego, cuando tengas un poco más de experiencia, otro libro
imprescindible es el de Kalen Delaney: "A fondo SQL Server 2000"


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jomaweb" escribió en el mensaje
news:
Si, es una idea excelente, pero me pierdo a la hora de hacer el MOVENEXT


en
el bucle WHILE.

Hay algo que no pillo y no sé que és. De todos modos, ¿me recomendáis el
libro de F. Guerrero "SQL Server 2000 programacion con ejemplos" para
ponerme un poco las pilas con esto?


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
>
> Lo que haces no es muy eficiente. Si lo que necesitas es numerar


esos
> códigos para que sean consecutivos, en vez de hacer eso yo los numeraría
en
> la sentencia de recogida de datos. Hay varias técnicas para numerar los
> registros de forma consecutiva, pero la más usada es crear una variable
> tabla dentro del procedimiento de devolución de datos con la estructura
que
> necesites más un campo con la propiedad Identity activada. Por ejemplo:
>
> DECLARE @clientesTABLE (id integer identity(1,1) PRIMARY KEY,
> nombre varchar(50))
>
> Y a continuación insertas los datos ordenados por el identificador que
> tenían antes:
>
> INSERT @clientes(nombre)
> SELECT nombre FROM clientes ORDER BY id_cliente
>
> Por último devuelves los datos y ya tendrías la estructura que


necesitas:
>
> SELECT * FROM @clientes
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> Por favor, responder únicamente al foro
> Se agradece la inclusión de sentencias DDL
>
>
> "Jomaweb" escribió en el mensaje
> news:
> > Hola
> >
> > Tengo una tabla con datos de clientes. Y estoy haciendo un


procedimiento
> que
> > cuando alguien elimina un cliente en una provincia automáticamente se
> > renumeran unos números identificadores que yo les doy (no sus
identity).
> >
> > Por ejemplo, si tengo
> > 1->juan;
> > 2->pedro;
> > 3->paco;
> > 4->manuel
> > y en mi aplicacion alguien elimina a Pedro (numero 2) el SP
> automáticamente
> > hace un UPDATE y asigna el numero 2 a paco y el 3 a manuel.
> >
> > Pero hasta ahora no he descubierto cómo coger un SELECT y realizar un
> > MOVENEXT para ir actualizando el campo. Esto es lo que tengo, pero no
> > funciona porque no tengo manera de pasar al siguiente registro. ¿dónde
me
> he
> > perdido?
> >
> > DECLARE @ITERADOR INTEGER
> > DECLARE @ID_CLIENTE INTEGER
> > SET @ITERADOR=0
> > SELECT * FROM clientes WHERE provincia=@PROV
> >
> > IF (@@ROWCOUNT<>0)
> > BEGIN
> >
> > WHILE (@ROW<=@ITERADOR)
> > BEGIN
> > SELECT @ID_CLIENTE=ID_CLIENTE FROM CLIENTES
> > UPDATE CLIENTES SET CODIGO=@ITERADOR WHERE
ID_CLIENTE=@ID_CLIENTE
> > SET @ITERADOR=@ITERADOR + 1
> > continue
> > END
> > set @mensaje= 'SE RENUMERARON LOS CLIENTES'
> >
> > select @mensaje as mensaje
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Rubén Vigón
20/05/2004 - 13:00 | Informe spam
¡¡Nada de bucles!! :-)

Ésa consulta actualiza el campo "Numero" de todos los registros de tu tabla

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://www.mvp-access.com/rubenvigon
Respuesta Responder a este mensaje
#8 Jomaweb
20/05/2004 - 13:45 | Informe spam
Repito, la propuesta de Rubén me pone EL MISMO NUMERO EN TODOS LOS
REGISTROS.
Yo necesito que sean consecutivos.


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:%

No, no. Tanto la propuesta de Rubén como la mía eliminan ese bucle,
olvídate de él.

Por otro lado, el libro de Fernando es excelente. Sin duda alguna te


lo
recomiendo. Luego, cuando tengas un poco más de experiencia, otro libro
imprescindible es el de Kalen Delaney: "A fondo SQL Server 2000"


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jomaweb" escribió en el mensaje
news:
> Si, es una idea excelente, pero me pierdo a la hora de hacer el MOVENEXT
en
> el bucle WHILE.
>
> Hay algo que no pillo y no sé que és. De todos modos, ¿me recomendáis


el
> libro de F. Guerrero "SQL Server 2000 programacion con ejemplos" para
> ponerme un poco las pilas con esto?
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
> news:
> >
> > Lo que haces no es muy eficiente. Si lo que necesitas es numerar
esos
> > códigos para que sean consecutivos, en vez de hacer eso yo los


numeraría
> en
> > la sentencia de recogida de datos. Hay varias técnicas para numerar


los
> > registros de forma consecutiva, pero la más usada es crear una


variable
> > tabla dentro del procedimiento de devolución de datos con la


estructura
> que
> > necesites más un campo con la propiedad Identity activada. Por


ejemplo:
> >
> > DECLARE @clientesTABLE (id integer identity(1,1) PRIMARY KEY,
> > nombre varchar(50))
> >
> > Y a continuación insertas los datos ordenados por el identificador que
> > tenían antes:
> >
> > INSERT @clientes(nombre)
> > SELECT nombre FROM clientes ORDER BY id_cliente
> >
> > Por último devuelves los datos y ya tendrías la estructura que
necesitas:
> >
> > SELECT * FROM @clientes
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > Por favor, responder únicamente al foro
> > Se agradece la inclusión de sentencias DDL
> >
> >
> > "Jomaweb" escribió en el mensaje
> > news:
> > > Hola
> > >
> > > Tengo una tabla con datos de clientes. Y estoy haciendo un
procedimiento
> > que
> > > cuando alguien elimina un cliente en una provincia automáticamente


se
> > > renumeran unos números identificadores que yo les doy (no sus
> identity).
> > >
> > > Por ejemplo, si tengo
> > > 1->juan;
> > > 2->pedro;
> > > 3->paco;
> > > 4->manuel
> > > y en mi aplicacion alguien elimina a Pedro (numero 2) el SP
> > automáticamente
> > > hace un UPDATE y asigna el numero 2 a paco y el 3 a manuel.
> > >
> > > Pero hasta ahora no he descubierto cómo coger un SELECT y realizar


un
> > > MOVENEXT para ir actualizando el campo. Esto es lo que tengo, pero


no
> > > funciona porque no tengo manera de pasar al siguiente registro.


¿dónde
> me
> > he
> > > perdido?
> > >
> > > DECLARE @ITERADOR INTEGER
> > > DECLARE @ID_CLIENTE INTEGER
> > > SET @ITERADOR=0
> > > SELECT * FROM clientes WHERE provincia=@PROV
> > >
> > > IF (@@ROWCOUNT<>0)
> > > BEGIN
> > >
> > > WHILE (@ROW<=@ITERADOR)
> > > BEGIN
> > > SELECT @ID_CLIENTE=ID_CLIENTE FROM CLIENTES
> > > UPDATE CLIENTES SET CODIGO=@ITERADOR WHERE
> ID_CLIENTE=@ID_CLIENTE
> > > SET @ITERADOR=@ITERADOR + 1
> > > continue
> > > END
> > > set @mensaje= 'SE RENUMERARON LOS CLIENTES'
> > >
> > > select @mensaje as mensaje
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#9 Liliana Sorrentino
20/05/2004 - 14:07 | Informe spam
Hola,
No sé si este ejemplo te sirva, renumera todo desde 1 (fue Miguel Egea quien
publicó algo parecido a esto hace un tiempo).
Saludos... Liliana.

DROP TABLE #test
go
CREATE TABLE #test
(orden smallint,
nombre char(10))

INSERT #test SELECT 1, 'Juan'
INSERT #test SELECT 2, 'Pepe'
INSERT #test SELECT 3, 'Luis'
INSERT #test SELECT 4, 'José'

DELETE FROM #test WHERE orden = 2

SELECT * FROM #test

DECLARE @orden smallint SET @orden = 0
UPDATE T
SET @orden= @orden + 1, orden=@orden
FROM #test T

SELECT * FROM #test
go

"Jomaweb" escribió en el mensaje
news:eUxzo$
Repito, la propuesta de Rubén me pone EL MISMO NUMERO EN TODOS LOS
REGISTROS.
Yo necesito que sean consecutivos.


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:%
>
> No, no. Tanto la propuesta de Rubén como la mía eliminan ese bucle,
> olvídate de él.
>
> Por otro lado, el libro de Fernando es excelente. Sin duda alguna te
lo
> recomiendo. Luego, cuando tengas un poco más de experiencia, otro libro
> imprescindible es el de Kalen Delaney: "A fondo SQL Server 2000"
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> Por favor, responder únicamente al foro
> Se agradece la inclusión de sentencias DDL
>
>
> "Jomaweb" escribió en el mensaje
> news:
> > Si, es una idea excelente, pero me pierdo a la hora de hacer el


MOVENEXT
> en
> > el bucle WHILE.
> >
> > Hay algo que no pillo y no sé que és. De todos modos, ¿me recomendáis
el
> > libro de F. Guerrero "SQL Server 2000 programacion con ejemplos" para
> > ponerme un poco las pilas con esto?
> >
> >
> > "Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
> > news:
> > >
> > > Lo que haces no es muy eficiente. Si lo que necesitas es numerar
> esos
> > > códigos para que sean consecutivos, en vez de hacer eso yo los
numeraría
> > en
> > > la sentencia de recogida de datos. Hay varias técnicas para numerar
los
> > > registros de forma consecutiva, pero la más usada es crear una
variable
> > > tabla dentro del procedimiento de devolución de datos con la
estructura
> > que
> > > necesites más un campo con la propiedad Identity activada. Por
ejemplo:
> > >
> > > DECLARE @clientesTABLE (id integer identity(1,1) PRIMARY KEY,
> > > nombre varchar(50))
> > >
> > > Y a continuación insertas los datos ordenados por el identificador


que
> > > tenían antes:
> > >
> > > INSERT @clientes(nombre)
> > > SELECT nombre FROM clientes ORDER BY id_cliente
> > >
> > > Por último devuelves los datos y ya tendrías la estructura que
> necesitas:
> > >
> > > SELECT * FROM @clientes
> > >
> > > Un saludo
> > >
> > > -
> > > "Sólo sé que no sé nada. " (Sócrates)
> > >
> > > Por favor, responder únicamente al foro
> > > Se agradece la inclusión de sentencias DDL
> > >
> > >
> > > "Jomaweb" escribió en el mensaje
> > > news:
> > > > Hola
> > > >
> > > > Tengo una tabla con datos de clientes. Y estoy haciendo un
> procedimiento
> > > que
> > > > cuando alguien elimina un cliente en una provincia automáticamente
se
> > > > renumeran unos números identificadores que yo les doy (no sus
> > identity).
> > > >
> > > > Por ejemplo, si tengo
> > > > 1->juan;
> > > > 2->pedro;
> > > > 3->paco;
> > > > 4->manuel
> > > > y en mi aplicacion alguien elimina a Pedro (numero 2) el SP
> > > automáticamente
> > > > hace un UPDATE y asigna el numero 2 a paco y el 3 a manuel.
> > > >
> > > > Pero hasta ahora no he descubierto cómo coger un SELECT y realizar
un
> > > > MOVENEXT para ir actualizando el campo. Esto es lo que tengo, pero
no
> > > > funciona porque no tengo manera de pasar al siguiente registro.
¿dónde
> > me
> > > he
> > > > perdido?
> > > >
> > > > DECLARE @ITERADOR INTEGER
> > > > DECLARE @ID_CLIENTE INTEGER
> > > > SET @ITERADOR=0
> > > > SELECT * FROM clientes WHERE provincia=@PROV
> > > >
> > > > IF (@@ROWCOUNT<>0)
> > > > BEGIN
> > > >
> > > > WHILE (@ROW<=@ITERADOR)
> > > > BEGIN
> > > > SELECT @ID_CLIENTE=ID_CLIENTE FROM CLIENTES
> > > > UPDATE CLIENTES SET CODIGO=@ITERADOR WHERE
> > ID_CLIENTE=@ID_CLIENTE
> > > > SET @ITERADOR=@ITERADOR + 1
> > > > continue
> > > > END
> > > > set @mensaje= 'SE RENUMERARON LOS CLIENTES'
> > > >
> > > > select @mensaje as mensaje
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#10 ulises
20/05/2004 - 15:50 | Informe spam
Hola Liliana,

El problema que le veo es que vuelve a renumerar todo, lo
cual puede ocasionar que le puede cambiar la secuencia a
los registros anteriores al registro eliminado, he
modificado la sentencia para incorporarla como un triger,
usando tu datos :

DROP TABLE tempo
go
CREATE TABLE tempo
(orden smallint,
nombre char(10))
go
INSERT tempo SELECT 1, 'Juan'
INSERT tempo SELECT 2, 'Pepe'
INSERT tempo SELECT 3, 'Luis'
INSERT tempo SELECT 4, 'José'
INSERT tempo SELECT 5, 'Marco'
INSERT tempo SELECT 6, 'Ulises'

CREATE TRIGGER eliminaregistro ON tempo FOR DELETE
AS
DECLARE @cantidad int
UPDATE tempo SET @cantidad = ( SELECT COUNT(*) FROM
deleted where orden < tempo.orden ),
orden = orden - @cantidad
go

si eliminamos registros :

select * from tempo
delete from tempo where orden in (2)
select * from tempo
delete from tempo where orden in (1,4)
select * from tempo

tenemos los siguientes resultados :

orden nombre
-
1 Juan
2 Pepe
3 Luis
4 José
5 Marco
6 Ulises

orden nombre
-
1 Juan
2 Luis
3 José
4 Marco
5 Ulises

orden nombre
-
1 Luis
2 José
3 Ulises

Saludos,
Ulises


Hola,
No sé si este ejemplo te sirva, renumera todo desde 1


(fue Miguel Egea quien
publicó algo parecido a esto hace un tiempo).
Saludos... Liliana.

DROP TABLE #test
go
CREATE TABLE #test
(orden smallint,
nombre char(10))

INSERT #test SELECT 1, 'Juan'
INSERT #test SELECT 2, 'Pepe'
INSERT #test SELECT 3, 'Luis'
INSERT #test SELECT 4, 'José'

DELETE FROM #test WHERE orden = 2

SELECT * FROM #test

DECLARE @orden smallint SET @orden = 0
UPDATE T
SET @orden= @orden + 1, orden=@orden
FROM #test T

SELECT * FROM #test
go

"Jomaweb" escribió en el


mensaje
news:eUxzo$
Repito, la propuesta de Rubén me pone EL MISMO NUMERO




EN TODOS LOS
REGISTROS.
Yo necesito que sean consecutivos.


"Carlos Sacristan" <csacristan ARROBA mvps.org>




escribió en el mensaje
news:%
>
> No, no. Tanto la propuesta de Rubén como la mía




eliminan ese bucle,
> olvídate de él.
>
> Por otro lado, el libro de Fernando es excelente.




Sin duda alguna te
lo
> recomiendo. Luego, cuando tengas un poco más de




experiencia, otro libro
> imprescindible es el de Kalen Delaney: "A fondo SQL




Server 2000"
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> Por favor, responder únicamente al foro
> Se agradece la inclusión de sentencias DDL
>
>
> "Jomaweb" escribió en el




mensaje
> news:
> > Si, es una idea excelente, pero me pierdo a la hora




de hacer el
MOVENEXT
> en
> > el bucle WHILE.
> >
> > Hay algo que no pillo y no sé que és. De todos




modos, ¿me recomendáis
el
> > libro de F. Guerrero "SQL Server 2000 programacion




con ejemplos" para
> > ponerme un poco las pilas con esto?
> >
> >
> > "Carlos Sacristan" <csacristan ARROBA mvps.org>




escribió en el mensaje
> > news:
> > >
> > > Lo que haces no es muy eficiente. Si lo que




necesitas es numerar
> esos
> > > códigos para que sean consecutivos, en vez de




hacer eso yo los
numeraría
> > en
> > > la sentencia de recogida de datos. Hay varias




técnicas para numerar
los
> > > registros de forma consecutiva, pero la más usada




es crear una
variable
> > > tabla dentro del procedimiento de devolución de




datos con la
estructura
> > que
> > > necesites más un campo con la propiedad Identity




activada. Por
ejemplo:
> > >
> > > DECLARE @clientesTABLE (id integer identity




(1,1) PRIMARY KEY,
> > > nombre varchar(50))
> > >
> > > Y a continuación insertas los datos ordenados por




el identificador
que
> > > tenían antes:
> > >
> > > INSERT @clientes(nombre)
> > > SELECT nombre FROM clientes ORDER BY




id_cliente
> > >
> > > Por último devuelves los datos y ya tendrías la




estructura que
> necesitas:
> > >
> > > SELECT * FROM @clientes
> > >
> > > Un saludo
> > >
> > > -
> > > "Sólo sé que no sé nada. " (Sócrates)
> > >
> > > Por favor, responder únicamente al foro
> > > Se agradece la inclusión de sentencias DDL
> > >
> > >
> > > "Jomaweb" escribió




en el mensaje
> > > news:
> > > > Hola
> > > >
> > > > Tengo una tabla con datos de clientes. Y estoy




haciendo un
> procedimiento
> > > que
> > > > cuando alguien elimina un cliente en una




provincia automáticamente
se
> > > > renumeran unos números identificadores que yo




les doy (no sus
> > identity).
> > > >
> > > > Por ejemplo, si tengo
> > > > 1->juan;
> > > > 2->pedro;
> > > > 3->paco;
> > > > 4->manuel
> > > > y en mi aplicacion alguien elimina a Pedro




(numero 2) el SP
> > > automáticamente
> > > > hace un UPDATE y asigna el numero 2 a paco y el




3 a manuel.
> > > >
> > > > Pero hasta ahora no he descubierto cómo coger




un SELECT y realizar
un
> > > > MOVENEXT para ir actualizando el campo. Esto es




lo que tengo, pero
no
> > > > funciona porque no tengo manera de pasar al




siguiente registro.
¿dónde
> > me
> > > he
> > > > perdido?
> > > >
> > > > DECLARE @ITERADOR INTEGER
> > > > DECLARE @ID_CLIENTE INTEGER
> > > > SET @ITERADOR=0
> > > > SELECT * FROM clientes WHERE provincia=@PROV
> > > >
> > > > IF (@@ROWCOUNT<>0)
> > > > BEGIN
> > > >
> > > > WHILE (@ROW<=@ITERADOR)
> > > > BEGIN
> > > > SELECT @ID_CLIENTE=ID_CLIENTE FROM




CLIENTES
> > > > UPDATE CLIENTES SET CODIGO=@ITERADOR




WHERE
> > ID_CLIENTE=@ID_CLIENTE
> > > > SET @ITERADOR=@ITERADOR + 1
> > > > continue
> > > > END
> > > > set @mensaje= 'SE RENUMERARON LOS




CLIENTES'
> > > >
> > > > select @mensaje as mensaje
> > > >
> > > >
> > >
> > >
> >
> >
>
>






.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida