Actualizar campo autonumerico

6 envíos / 0 nuevos
Último envío
Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
Actualizar campo autonumerico

Hola a todos:

De Excel... a Access...

No resulta tan dócil como uno esperara...

Problema... si tiene solucion.

Imposible... si no lo tiene.

Tengo una base de datos con un campo clave autonumerico.

Al borrar registros, el campo autonomerico no se "reajusta"...

A "pelo" resulta facil: Entro en la tabla en vista de diseño, cambio el tipo del campo autonumerico a Texto... suprimo el camo, lo vuelvo a crear con el mismo nombre, lo defino como autonumerico... y ya esta. De nuevo tengo el campo autonumerico funcionando al cien por cien.

Pero claro... eso es "troglodita"...

Tiene solucion ccreando alguna funcion en Visual Basic... o así?

Gracias anticipadas.

Jose Luis Casla

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 11 horas 31 mins
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
no es la idea

no es la idea.

El campo autonumérico tiene por finalidad identificar inequívocamente cada registro. Lo más importante es que todos los valores ahí sean distintos unos de otros. No es importante que haya saltos entre medias.

Así que el hecho de que no se reajuste es algo intencionado, porque estos campos suelen utilizarse como clave para identificar y referirse a un registro desde otras tablas, y si cambias la clave, puede que en otro lugar estés creando un problema.

Como curiosidad, los campos digamos autonuméricos en bases de datos muy grandes, no son correlativos, sino que dan más importancia a la asignación de valores únicos.

 

Puedes añadir campos y modificarlos mediante una instrucción SQL con ALTER TABLE 

si lo utilizas como clave principal, imagino que tendrás qeu borrar también la clave para poder eliminar el campo.

por ejemplo:

Para eliminar la clave principal (suponiendo que se llame PrimaryKey que es el valor por defecto):

ALTER TABLE nombredetutabla DROP CONSTRAINT PrimaryKey

 

Para modificar el tipo de datos del campo autonumérico a texto 

ALTER TABLE nombredetutabla ALTER COLUMN nombredetucampo text

 

Para eliminar tu campo

ALTER TABLE nombredetutabla DROP COLUMN nombredetucampo

 

Para añadir un nuevo campo autonumérico:

ALTER TABLE nombredetutabla ADD COLUMN nombredetucampo AUTOINCREMENT

Si además de añadirlo quieres que sea la clave principal en la misma instrucción

ALTER TABLE nombredetutabla ADD COLUMN nombredetucampo AUTOINCREMENT CONSTRAINT PrimaryKey PRIMARY KEY

 

Estas sentencias SQL las puedes tener almacenadas en consultas, o puedes ejecutarlas mediante VBA 

CurrentDb.Execute tuconsulta, dbFailOnError

 

------
Ya sé Excel, pero necesito más.

Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
A vueltas con el campo autonumérico

Muchas gracias, una vez más, Paco Mejía.

Gracias porque me abres la puerta a una solución que aunque parece compleja, sería un recurso (no el último) para mi situacion.

Le estoy dando muchas vueltas a este tema.

Y analizo esta serie de posibles situaciones mal planteadas por mi parte, y por lo tanto mal resueltas.

Utilizo una sola tabla con los datos a manejar.

Utilizo varios Formularios para visualizar, buscar, seleccionar, etc. registros concretos. Y en todos los casos utilizo como "criterio de fondo" que cada registro sea identificado por su NumeroRegistro que es la clave principal y autonumérica.

De ahí, que cuando borro un registro, desparece ese regsitro, y el campo autonumérico de cada registro queda inalterable, para poder identificar ineqívocamente a cada registro. Eso está pensado así.

Inicialmente, el campo NumeroRegistro va parejo, por decirlo de alguna manera, con el número real de registros que tiene la tabla. Pero cuando se eliminan registros, sucede evidentemente, que el numero del campo autonumérico, ya no coincide con el número de regsitros reales... a partir del registro borrado...

Estoy pensando que quizás debiera no apuntar al NumeroRegistro (autonumérico) sino apuntar al número real del registro, independentemente del valor que tenga el NumeroRegistro... Para la utilización del programa, si acierto a hacerlo así, me evitaría la situación actual... Creo que sería lo aconsejable. Qué opinas Paco?

Quiero abrir en un Report, el contenido de un Registro, que lo busco apuntando al NumeroRegistro, de esta manera:

En mi programa VBA tengo estas lineas:

---------------------------------------------------------------

nPuntero = NumeroRegistro

DoCmd.OpenReport "Informe4", acViewReport, , "NumeroRegistro = " & nPuntero

----------------------------------------------------------

Pienso que si cambio la primera de estas lineas algo así, (no se exactamente la sintaxis a utilizar) funcionaria:

nPuntero = Recno()

DoCmd.OpenReport "Informe4", acViewReport, , "Recno() = " & nPuntero

No sé exactamente si la sintaxis para abrir ese Report funcionaria...

Saludos cordiales.

José Luis Casla

Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
Hola de nuevo:No doy con la

Hola de nuevo:

No doy con la solucion.

En concreto, tengo un formulario (Formulario3) en el que me muestra varios registros seleccionados previamente.

Cada registro se muestra con el nombre, primer apellido y segundo apellido.

Al hacer Doble Click sobre uno de los nombres elegidos, quiero que me abra en otro formulario, (Formulario2) los datos completos de ese registro seleccionado.

En VBA lo tengo actualmente asI:

Private Sub Nombre_DblClick(Cancel As Integer)
Dim nPuntero As Integer
On Error Resume Next
nPuntero = NumeroRegistro ' nPuntero lee el NumeroRegistro, (camplo clave principal, autonumerico) que puede ser por ejemplo el 1059.
DoCmd.Close
DoCmd.OpenForm "Formulario2"
DoCmd.GoToRecord acDataForm, "Formulario2", acGoTo, nPuntero 'Abro el Formulario2 y me muestra el Registro nPuntero que corresponde al 1056.
End Sub

Pero si he suprimido alguno de los registros de la unica tabla donde estan todos los registros, el campo Clave Principal autonumerico llamado NumeroRegistro, ya no coincide con el número real del registro en la tabla, de tal manera que puede ocurrir que un registro ocupe el numero de registro 1056 y su NumeroRegistro diga que es el 1058, porque han sido eliminados dos registros...

Asi que a la hora de abrirme el Formulario2, el nPuntero sea el 1058 cuando en realidad yo quisiera abrir el 1056.

He tratado de modificar el Private Sub Nombre_DblClick

para que el nPuntero apunte no al NumeroRegistro ( que en el ejemplo es 1058), sino al numero real del registro que es 1056.

He tratado de hacerlo de esta manera:

nPuntero = [CurrentRecord]

pero en ese caso, el [CurrentRecord] puede ser el numero 1 que corresponderia al numero de registro del Formulario3 que es donde estoy... y lo que quiero es que nPuntero lea el valor del CurrentRecord de la Tabla... no del Formulario3.

Dicho de otro modo:

El registro de la base de datos de Antonio Gómez Parrilla puede ser en la Tabla el registro numero 1056.

Si selecciono todos los Gómez y los llevo al Formulario3, entonces ese mismo Antonio Gómez Parrilla, en ese Formulario3 es el registro 5 en ese Formulario.

Estando en el Formulario3 quiero capturar el numero de registro 1056 (lugar que ocupa en la Tabla) y no el numero de registro 5 que es el lugar que ocupa en ese momento en el Formulario3...

porque quiero luego llevarlo al Formluario2 donde me muestre ese registro con el resto de campos... fecha de nacimiento, Lugar, etc. etc.

Desde mi punto de vista (de principiante...) debiera poder capturar en VBA, de alguna manera el numero de registro que ocupa en la Tabla... estando dentro de cualquier formulario.

Ahí estoy atascado...

José Luis Casla

Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
Reparando Campo Autonumerico

Hola de nuevo,

En vista de que no consigo saber el numero de registro que ocupa un determinado registro en la Tabla, cuando estoy en un Formulario, estoy tratando de aplicar la solucion de anular el campo autonumerico y volverlo a crear.

Siguiendo las instrucciones (MUY VALIOSAS...) de PacoMejia, he preparado el siguiente Macro:

 

Public Sub DoQSL()
    DoCmd.RunSQL "ALTER TABLE Datos DROP CONSTRAINT NumeroRegistro" ' Anula el campo NumeroRegistro, como Clave principal
    DoCmd.RunSQL "ALTER TABLE Datos DROP COLUMN NumeroRegistro" ' Borra el campo NumeroRegistro
    DoCmd.RunSQL "ALTER TABLE Datos ADD COLUMN NumeroRegistro AUTOINCREMENT CONSTRAINT NumeroRegistro PRIMARY KEY" ' Crea de nuevo el campo NumeroRegistro como Autonumerico y lo define como Clave Principal
End Sub

 

 Lo ejecuto y funciona a la prefección. (Gracias Paco...)

El problema que tengo con esto, es que para ejecutarlo, tengo que salirme de todos los Formularios... y mi idea era poner un Boton en algun Formulario, para que me ejecutara ese Macro... Pero no acierto a conseguirlo... desde un Boton.

Inevitablemente tengo que cerrar todo los Formularios...

Se puede ejecutar ese Macro vinculandolo a un Boton y añadiendo en el macro previamente las necesarias instrucciones para que cierre los formularios... (porque lo he intentado... pero siempre me salta un error... posiblemente a causa de la "delicada" sintaxis de todas estas instrucciones...)???

Jose Luis Casla

Jose Luis Casla...
Imagen de Jose Luis Casla Araiz
Offline
última acción: Hace 1 año 1 mes
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntos
alta: 11/05/2012 - 15:15
Puntos: 1785
A golpes con el VBA para Access...

En un macro tengo esta instrucción:

DoCmd.FindRecord nPuntero, ,True, ,True

Cuando la ejecuta el macro me lleva al registro nPuntero, siempre que el valor de nPuntero sea menor de 1000.

La Base de Datos tienes más de 4000 registros...

Si nPunterio es, por ejemplo, 1450, entonces en lugar de llevarme al registro 1450 me lleva invariablemente al registro 1

De la misma manera si nPuntero es 2367, me lleva al registro 1... etc.

Pero si nPuntero es inferior a 1000 entonces me lleva al registro correcto.

Alguna pista?

Gracias.

Jose Luis Casla