Access cambia el número de registro al guardarlo y refrescar la base
En mi base de datos al dar de alta un nuevo registro en un formulario se posiciona en el número 622, cumplimento los campos y al guardarlo y hacer un requery o pulsar F5, el registro con los datos recién introducidos tiene ahora el número 24 si lo busco. Por ello me resulta imposible crear una sentencia de código para tras hacer un requery que se muestre el último registro creado, pues si lo hago, me muestra el 622 pero contiene los datos que antes tenía el 621 y no lo entiendo. Cada vez que creo un registro se posiciona a partir del 24 desplazando un número a todos los demás hasta el último que había. ¿Por qué pasa esto?
1 respuesta
El Requery equivale a Cerrar y abrir el Formulario, por eso se te posiciona en el primer Registro que si es lo que me imagino, procede de un autonumérico al que se han borrado las primeras Filas
Así se te posiciona en el Número 24 porque ese es el "Primer Registro".
Explica por favor un poco más tu proceso y el Objetivo que quieres conseguir e intento ayudarte, o igual te responde otra persona, pero será con más elementos de juicio.
Jose:
¿Se me ha pasado comentarte >> Para qué necesitas el Requery?
Si lo que pretendes es que cuando abras el formulariode nuevo, te muestre el último Registro que grabaste bastaría con poner al abrirlo.
Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord , , acLast
End Sub
Gracias por tu respuesta Jacinto, pero esto ya lo he probado y el último registro que obtengo no se corresponde con el que acabo de introducir, intentaré clarificar un poco más lo que me pasa y que me está llegando a desesperar. Mi base de datos tiene ahora 622 registros que van del 1 al 622, puedo pasarlos todos de uno en uno y van correlativos, si pulso ir a primer registo me posiciono en 1 y si pulso ir al último paso al 622, hasta aquí lo normal. Lo que quiero lograr es que al crear uno nuevo, sin tener que cerrar la base, haciendo un requery, me grabe el registro creado y se posicione en el que acabo de crear y es aquí cuando viene un problema con el que no contaba, pues el último registro que creo, no es el último registro de la base después de crearlo, pues cambia de número y no lo puedo entender. Si tengo 622 registros y pulso nuevo registro, la numeración indica 623 para el que estoy cumplimentando, en teoría, al acabar de crearlo y hacer un requery, el último registro de mi base sería este 623 con los datos nuevos no? es lo normal o eso creía yo, pero el 623 tiene los datos del 622 y mis datos nuevos, si los busco, a pesar de que cuando estaba cumplimentando el formulario su número indicaba 623, tras el requery, se intercalan y posicionan con el número 24, y si creo otro más ocupa el 25 aumentando un número todos los registros que hay por delante hasta el 623, 624, etc.. esto no me entra en la cabeza, y por ello, el comando (DoCmd.GoToRecord , , acLast) a pesar de que me lleva efectivamente al último registro de la base, no me vale, pues este último registro no se corresponde con el que he creado y que ahora ocupa otra posición. ¿tiene esto alguna lógica? por más vueltas que le doy, no lo puedo entender, espero que pueda tener alguna explicación y me puedas ayudar.
Lo que necesito hacer es tras modificar o crear un registro nuevo, hacer un requery y que se me muestre el registro modificado o el nuevo y sólo lo logro con el que modifico y que ya estaba creado, si el registro es nuevo me ocurre el problema comentado, y esta operación es fundamental para lo que estoy construyendo.
Utilizo por ejemplo:
Dim marcador As Variant
marcador = Me.Bookmark
Me.Requery
Me.Bookmark = marcador
y obtengo la base refrescada posicionándose en el registro modificado, pero cuando es nuevo cambia la numeración y no me devuelve el recien creado. Espero haberlo explicado bien y que me puedas ayudar.
Un saludo.
Después de pelearme con esto todo el día estoy casi al borde de tirar la toalla, pero se me ocurre una idea.. si en lugar de usar bookmark para que me devuelva el registro activo usase una sentencia que me buscase el registro recién creado para posicionarse sobre él, daría igual que sea el 24, 0 el 621, con localizarlo me valdría, sólo que no sé cual sería la sentencia de código para localizarlo, tendría que ser algo que en base a los datos introducidos en dos campos del formulario fuese capaz de localizar el registro tras hacer requery, así que rellenaría el registro nuevo y el código que necesito, debería coger los datos de los campos DNI, OBRA y FechaEntrada, grabarlo, hacer requery y localizar el registro correspondiente poniéndolo en pantalla, así daría igual la numeración ya que entiendo que lo localizaría y para mí sería válido. A ver si esto es posible.
El lado menos bueno de tirar la toalla es que casi seguro tienes que recogerla después.
Por tanto lo mejor es no tirarla.
Bien:
Supongo que tienes alguna razón poderosa para querer saber el Registro Activo.
Yo miro alguna metodología y te haré una propuesta a ver si te funciona o si alguien al leer ésto te contesta.
En cualquier caso y casi seguro será un recordatorio para ti, ten en cuenta que:
Cuando modificas un Registro, si lo que quieres es recalcular algunos campos está el Me. Recalc, si lo que quieres es capturar algún dato que haya modificado alguien esta el Me. Refresh y en ninguno de los casos dejas de "Visualizar" el mismo registro.
Al dar de Alta un nuevo registro, si no lo tengo mal entendido, no tiene Bookmark hasta que se ha guardado, sea porque cierras el formulario, porque vas al registro anterior, porque añades uno nuevo... etc.
De otro lado si lo que deseas es "Capturar" el valor de algunos campos, puedes declarar variables en el Ámbito que las necesites y guardas esos valores.
Ejemplo: A nivel de Modulo de Formulario, fuera de los procedimientos o funciones, después del Option Compare... y Option Explicit.
Dim ElDNI As String
En elvento AfterUpdate del Campo DNI, capturas su valor con :
ElDNI = Me.DNI.Value
Y así puedes usar la variable cuando quieras.
Ya me comentarás
Mi problema Jacinto, es que aunque mi voluntad es muy grande, mi conocimiento del tema es muy pequeño y estoy construyendo mi base de datos con muchísima paciencia en base a realizar mil pruebas con los ejemplos de lo que entiendo que necesito y que voy localizando como puedo.
En los casi dos años que llevo construyendo esta base, he utilizado Me.Recalc y Me.Refresh como me indicas y están haciendo su función en algunas partes de la misma, pero ahora es Requery lo que posiciona el registro donde tiene que quedar y lo que me falta es poner un código para que automáticamente lo localice y quede en pantalla inmediatamente después de ese Requery, teniendo en cuenta que no queda el último cuando es nuevo como he indicado antes.
Suena muy bien lo de capturar el valor de los campos y usar la variable para localizar el registro; entiendo que tiene que funcionar. Necesitaría poner código a un botón para capturar en el formulario el valor de dos campos DNI y FECHAENTR, hacer requery y utilizar las variables para localizar el registro, no sé si estoy poniendo una barbaridad, ya he comentado que mis conocimientos de esto son muy escasos. ¿esto se puede hacer con un boton?, o sea, poner un procedimiento al botón así:
Dim ElDNI As String
Dim ElFECHAENTR As String
ElDNI = Me.DNI.Value
ElFECHAENTR = ME.FECHAENTR.Value
Me.Requery
Y ahora algo que use las variables para localizar el registro y que quede en pantalla.
-------------
(Deben ser dos las variables "DNI Y FECHAENTR" ya que en mi base el DNI puede repetirse pues una misma persona puede aparecer varias veces aunque con distintas fechas de entrada, por eso sólo puede existir un registro que cumpla la condición).
Perdón de nuevo si esto que indico es una barbaridad para alguien que entienda del tema, pero como no sé hacerlo, al menos transmito mi necesidad por si puedes ayudarme.
Un saludo.
De acuerdo José:
Tal como te comenté te haré una propuesta, y aquí quiero decir que te prepararé un Ejemplo.
Para que sea lo mas ilustrativo posible y se aproxime lo máximo a la realidad dime por favor:
Los Nombres de:
Tabla, Campos que estás utilizando y el tipo, (Autonumérico si lo hay), Numérico etc.
Y si además me pones una imagen del Formulario que utilizas para alimentar a la Tabla, estupendo.
Así cuando lo recibas, será casi inmediato, que lo puedas anexar a tu BD.
Otra alternativa es que me mandes la parte de la Base de Datos, que quede implicada en él tema que nos ocupa aunque sea con unas cuantas entradas inventadas.
Si eliges ésta opción mi email es: [email protected]
Estupendo Jacinto. Indico datos:
Nombre de Tabla ............. RESTODATOS que tiene todos estos campos.
El formulario es grande así que te envío imágenes y explicaciones más detalladas por email para que puedas entender mejor lo que me pasa. Luego si se soluciona el problema, lo pondré aquí para que cualquier persona que se encuentre en una situación parecida lo pueda solucionar también.
Un saludo.
Jacinto, debo agradecerte tu ayuda, pero la solución de este tema iba por otro camino mucho más simple y que acabo de descubrir tecleando directamente sobre la tabla que alimenta el formulario, cada vez que introducía un registro nuevo, en lugar de quedar al final, se ordenaba por el campo DNI ocupando la posición que le tocase en función del número introducido, por ello la forma más sencilla de solucionar que el último registro introducido sea el que ocupe la última posición en la base ha sido generar un campo nuevo en la tabla que he denominado REG de Autonumeración, luego llamando a la tabla desde del formulario (pestaña Diseño) en "Agregar Campos Existentes-Modificar Origen del Registro", he modificado el origen del registro añadiendo el nuevo campo e indicando en orden "Ascendente" con lo que cada nuevo registro quedará el último
Ahora tas hacer requery, para volver al registro recién introducido y que éste quede en pantalla, sólo hay que colocar este código:
Dim miRegistro As Long
miRegistro = Me.CurrentRecord
Me.Requery
DoCmd.GoToRecord , , acGoTo, miRegistro
DoCmd.GoToRecord , "Nombre del Formulario", acGoTo, CurrentRecord
Espero que esto sirva a alguna persona que como yo tenga este problema.
- Compartir respuesta