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
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.
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
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
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
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