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

#1 Rubén Vigón
20/05/2004 - 11:42 | Informe spam
UPDATE Tabla T SET Numero = (SELECT COUNT(*) FROM Tabla WHERE Numero <= T.Numero)

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://www.mvp-access.com/rubenvigon
Respuesta Responder a este mensaje
#2 Jomaweb
20/05/2004 - 11:50 | Informe spam
No comprendo realmente lo que haces con este update. ¿se supone que le
asignas el número de los inmediatamente inferiores al eliminado?¿y cómo paso
de un registro a otro en el WHILE?

"Rubén Vigón" escribió

UPDATE Tabla T SET Numero = (SELECT COUNT(*) FROM Tabla WHERE Numero <T.Numero)

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
http://www.mvp-access.com/rubenvigon
Respuesta Responder a este mensaje
#3 Carlos Sacristan
20/05/2004 - 11:54 | Informe spam
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
#4 Jomaweb
20/05/2004 - 12:33 | Informe spam
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
#5 Jomaweb
20/05/2004 - 12:52 | Informe spam
Con esto lo que hago es que TODOS los clientes cogen el mismo número, y no
números correlativos.

"Rubén Vigón" escribió

UPDATE Tabla T SET Numero = (SELECT COUNT(*) FROM Tabla WHERE Numero <T.Numero)
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida