Problemas sincronización en formulario

Tengo un formulario con campos de dos tablas diferentes (relacionadas), el primer campo del formulario es NIF, tengo una rutina asociada a ese campo que hace de buscador por ese campo, el problema es que al introducir un NIF, en primera instancia, sólo me aparecen los datos de la tabla principal, tengo que "actualizar todo" para que me aparezcan los datos en los campos de la tabla secundaria.

No sé si el problema es de la rutina del buscador o de origen del registro del formulario.

Te detallo la rutina del buscador, por si te da una pista del problema que planteo.

Option Compare Database
Dim i As Integer
Private Sub Form_Current()
Me.Controls("TELÉFONO").Enabled = False
Me.Controls("MÓVIL").Enabled = False
Me.Controls("FAX").Enabled = False
Me.Controls("OBS").Enabled = False
End Sub
Private Sub NIF_AfterUpdate()
Dim BUSCAR As String
Dim CriterioBusqueda As String
Dim rsc As DAO.Recordset
Set rsc = Me.RecordsetClone 'Recorremos la tabla cliente
BUSCAR = Me.NIF.Value
CriterioBusqueda = "[NIF]=" & "'" & BUSCAR & "'"
'Comprobamos si existe el Código Cliente
If DCount("NIF", "attpublico", CriterioBusqueda) > 0 Then
Me.Undo 'limpiamos el campo
'Si lo encontramos un mensaje
If MsgBox("Encontrado " _
& BUSCAR & vbCrLf & _
"Desea modificarlo", vbYesNo + vbInformation _
, "BUSCAR") = vbYes Then
'Nos movemos al registro especificado _
y desbloquemos todos los campos
rsc.FindFirst CriterioBusqueda
Me.Bookmark = rsc.Bookmark
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
Else 'De elegir NO solamente nos movemos
rsc.FindFirst CriterioBusqueda
Me.Bookmark = rsc.Bookmark
End If
Set rsc = Nothing 'Cerramos el Recordset
Else 'De no existir el cliente
If MsgBox("Cliente no Encontrado" & vbCrLf & _
"Desea crear al cliente : " _
& BUSCAR, vbYesNo, "No Encontrado") = vbYes Then
Me.Undo 'limpiamos
DoCmd.GoToRecord , , acNewRec 'Creamos un nuevo registro
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
NIF = BUSCAR 'Asignamos el valor de la variable Buscar _
al campo IdCliente
DoCmd.GoToControl "TELÉFONO" 'Nos movemos al siguiente campo
Else 'De haber elegido NO
Me.Undo 'limpiamos
End If 'Salimos
End If
End Sub 'Nos vamos

T

1 Respuesta

Respuesta
1

Me parece que la pregunta se te quedó a medias, pero si dices que te funciona todo bien después de darle a actualizar, prueba poniendo Me.Refresh antes del End Sub del procedimiento Private Sub NIF_AfterUpdate()

Hola Sveinbjorn,

He probado con me.refresh como me dijiste pero a simple vista no tiene efecto en el formulario. En cambio con me.requery colocado donde comentas, si lo actualiza, pero se va al primer registro de la tabla , no se queda en el registro que se pretende dar de alta.....

Gracias una vez más por tu ayuda.

Saludos

David

Prueba a ponerlo no al final, sin dentro del if donde te haga falta que te muestren los datos de las dos tablas.

Si así no te funciona, puedes probar a hacer esto:

Declaras una variable tipo long, por ejemplo:

Dim miRegistro as long

miRegistro=Me.CurrentRecord

Esto nos da el número de registro activo. Tendrías que colocarlo delspues del rsc. FindFirst cirterioBusqueda

Luego, para moverte a el, después del requery, le pones:

DoCmd. GoToRecord,, acGoTo, miRegistro

A ver si así.

Me da este error: Se ha producido el error 2505 en tiempo de ejecución: una expresión en el argumento 4 tiene un valor que no es valido.

Para la rutina en la que incluí, los cambios que me decías (no estoy seguro de haberlos hecho bien), parece que falla en el final (DoCmd.GoToRecord , , acGoTo, miRegistro)

Private Sub NIF_AfterUpdate()
Dim BUSCAR As String
Dim CriterioBusqueda As String
Dim rsc As DAO.Recordset
Set rsc = Me.RecordsetClone 'Recorremos la tabla cliente
BUSCAR = Me.NIF.Value
CriterioBusqueda = "[NIF]=" & "'" & BUSCAR & "'"
'Comprobamos si existe el Código Cliente
If DCount("NIF", "attpublico", CriterioBusqueda) > 0 Then
Me.Undo 'limpiamos el campo
'Si lo encontramos un mensaje
If MsgBox("Encontrado " _
& BUSCAR & vbCrLf & _
"Desea modificarlo", vbYesNo + vbInformation _
, "BUSCAR") = vbYes Then
'Nos movemos al registro especificado _
y desbloquemos todos los campos
rsc.FindFirst CriterioBusqueda
Me.Bookmark = rsc.Bookmark
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
Else 'De elegir NO solamente nos movemos
rsc.FindFirst CriterioBusqueda
Dim miRegistro As Long
miRegistro = Me.CurrentRecord
Me.Bookmark = rsc.Bookmark
End If
Set rsc = Nothing 'Cerramos el Recordset
Else 'De no existir el cliente
If MsgBox("Cliente no Encontrado" & vbCrLf & _
"Desea crear al cliente : " _
& BUSCAR, vbYesNo, "No Encontrado") = vbYes Then
Me.Undo 'limpiamos
DoCmd.GoToRecord , , acNewRec 'Creamos un nuevo registro
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
NIF = BUSCAR 'Asignamos el valor de la variable Buscar _
al campo IdCliente
DoCmd.GoToControl "TELÉFONO" 'Nos movemos al siguiente campo
Else 'De haber elegido NO
Me.Undo 'limpiamos
End If 'Salimos
Me.REQUERY
DoCmd.GoToRecord , , acGoTo, miRegistro
End If
End Sub 'Nos vamos

Private Sub NIF_AfterUpdate()
Dim BUSCAR As String
Dim CriterioBusqueda As String

Dim miRegistro As Long
Dim rsc As DAO.Recordset
Set rsc = Me.RecordsetClone 'Recorremos la tabla cliente
BUSCAR = Me.NIF.Value
CriterioBusqueda = "[NIF]=" & "'" & BUSCAR & "'"
'Comprobamos si existe el Código Cliente
If DCount("NIF", "attpublico", CriterioBusqueda) > 0 Then
Me.Undo 'limpiamos el campo
'Si lo encontramos un mensaje
If MsgBox("Encontrado " _
& BUSCAR & vbCrLf & _
"Desea modificarlo", vbYesNo + vbInformation _
, "BUSCAR") = vbYes Then
'Nos movemos al registro especificado _
y desbloquemos todos los campos
rsc.FindFirst CriterioBusqueda

miRegistro = Me.CurrentRecord
Me.Bookmark = rsc.Bookmark
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True

Me.REQUERY
DoCmd.GoToRecord , , acGoTo, miRegistro
Else 'De elegir NO solamente nos movemos
rsc.FindFirst CriterioBusqueda
miRegistro = Me.CurrentRecord
Me.Bookmark = rsc.Bookmark
End If
Set rsc = Nothing 'Cerramos el Recordset

Me.REQUERY
DoCmd.GoToRecord , , acGoTo, miRegistro
Else 'De no existir el cliente
If MsgBox("Cliente no Encontrado" & vbCrLf & _
"Desea crear al cliente : " _
& BUSCAR, vbYesNo, "No Encontrado") = vbYes Then
Me.Undo 'limpiamos
DoCmd.GoToRecord , , acNewRec 'Creamos un nuevo registro
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
NIF = BUSCAR 'Asignamos el valor de la variable Buscar _
al campo IdCliente
DoCmd.GoToControl "TELÉFONO" 'Nos movemos al siguiente campo
Else 'De haber elegido NO
Me.Undo 'limpiamos
End If 'Salimos
End If
End Sub 'Nos vamos

Siento decir que no funciona,

Para un nuevo registro, no actualiza (no refresca el formulario, siguen sin aparecer los datos en los combo)

Para un registro que ya existía, (si refresca) pero se va a un registro nuevo.

Si lo que quieres es que se te actualicen los datos que se despliegan en los combos, tienes que utilizar el requery en los combos con Me. NombreDelCombo. Requery

Buenas tardes Sveinbjorg,

He probado a actualizar un solo combo como me indicabas, he probado a poner la instrucción en cada línea de la rutina y nada, no tiene efecto.

Saludos

David

Hola, he estado dándole vueltas al problema, a ver si descubría dónde podía fallar la rutina....

En principio, parece que el problema se plantea cuando se trata de dar de alta un registro nuevo (cuando ya existe, muestra todos los campos), entonces.... al dar de alta un registro si el buscador detecta que no existe, debería dar de alta ese registro , actualizar (para que refresque los datos), ir al registro nuevo recién creado y poder rellenar los campos del formulario de ese registro.

Todo esto desde mi punto de vista, que no sé nada de programación. Sigo haciendo pruebas con los comandos que me has facilitado, a ver si suena la flauta.

En algún sitio vi una idea... la de llamar a la tecla de función f5 desde un módulo, pero no entendí muy bien como hacerlo, supongo que tiene el mismo efecto que el me.requery en la rutina, qué te parece?

Otra rutina de búsqueda?

Disculpa el latazo.

Saludos

Para simular la llamada a la tecla F5, se usa eso:

DoCmd. DoMenuItem acFormBar, acRecordsMenu, 5,, acMenuVer70

Su efecto es más similar a Refresh que a Requery.

Tu planteamiento es correcto. Por lo que comentas, la primera parte del if funciona correctamente. En el caso de que el registro no exista, se debería dar de alta (con DoCmd. GoToRecord,, acNewRec), luego actualizar (Me. Requery) y luego poner en el nuevo registro (que es donde da el problema, ¿no?)

Si el formulario no está ordenado por ningún campo (por ejemplo NIF ascendente), puedes decirle que vaya al último registro (DoCmd. GoToRecord,, acLast), que será el nuevo

Si está ordenado, usa otra rutina de búsqueda de nuevo, como al principio del código:

BUSCAR = Me.NIF.Value
CriterioBusqueda = "[NIF]=" & "'" & BUSCAR & "'"

...

A ver si así lo solucionas...

Si, ahora si, por fin, funciona, usando (DoCmd.GoToRecord , , acLast), después de semanas rompiéndome la cabeza. Muchas gracias.

Sólo me falta afinar el resultado....

Cuando no encuentra un registro (me da a elegir entre crearlo o no crearlo) si elijo NO quiero crearlo, debería ir a un nuevo registro, ahora se va al último.... he probado varias combinaciones pero no me funcionan, puedes chequearlo por favor.

Private Sub NIF_AfterUpdate()
Dim BUSCAR As String
Dim CriterioBusqueda As String
Dim rsc As DAO.Recordset
Set rsc = Me.RecordsetClone 'Recorremos la tabla cliente
BUSCAR = Me.NIF.Value
CriterioBusqueda = "[NIF]=" & "'" & BUSCAR & "'"
'Comprobamos si existe el Código Cliente
If DCount("NIF", "attpublico", CriterioBusqueda) > 0 Then
Me.Undo 'limpiamos el campo
'Si lo encontramos un mensaje
If MsgBox("Encontrado " _
& BUSCAR & vbCrLf & _
"Desea modificarlo", vbYesNo + vbInformation _
, "BUSCAR") = vbYes Then
'Nos movemos al registro especificado _
y desbloquemos todos los campos
rsc.FindFirst CriterioBusqueda
Me.Bookmark = rsc.Bookmark
Me.Controls("Teléfono").Enabled = True
Me.Controls("Móvil").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
DoCmd.GoToControl "TELÉFONO"
Else 'De elegir NO solamente nos movemos
rsc.FindFirst CriterioBusqueda
Me.Bookmark = rsc.Bookmark
End If
Set rsc = Nothing 'Cerramos el Recordset
Else 'De no existir el cliente
If MsgBox("Cliente no Encontrado" & vbCrLf & _
"Desea crear al cliente : " _
& BUSCAR, vbYesNo, "No Encontrado") = vbYes Then
Me.Undo 'limpiamos
DoCmd.GoToRecord , , acNewRec 'Creamos un nuevo registro
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
NIF = BUSCAR 'Asignamos el valor de la variable Buscar _
al campo IdCliente
DoCmd.GoToControl "TELÉFONO" 'Nos movemos al siguiente campo
Else 'De haber elegido NO
Me.Undo 'limpiamos
End If 'Salimos
Me.REQUERY
DoCmd.GoToRecord , , acLast
Me.Controls("TELÉFONO").Enabled = True
Me.Controls("MÓVIL").Enabled = True
Me.Controls("FAX").Enabled = True
Me.Controls("OBS").Enabled = True
DoCmd.GoToControl "TELÉFONO"
End If
End Sub 'Nos vamos

Tal como tienes el código esto es lo que hace:

Si existe el cliente y quieres modificarlo -> Nos movemos al registro especificado y desbloqueamos todos los campos -> Salimos

Si existe el cliente y no quieres modificarlo -> solamente nos movemos -> Salimos

Si no existe el cliente y lo queremos crear -> va a un nuevo registro, le asigna el NIF ... -> sale del if al Requery, se mueve al último y sigue el código.

Si no existe el cliente y NO lo queremos crear -> sale del if al Requery, se mueve al último y sigue el código.

No entendí bien lo de "Cuando no encuentra un registro (me da a elegir entre crearlo o no crearlo) si elijo NO quiero crearlo, debería ir a un nuevo registro, ahora se va al último...", pero el problema está en que si no existe el cliente, siempre acaba el código en el Requery y GoToRecod acLast.

Si le das a que no quieres crear el cliente, lo lógico no es ir a un registro nuevo, creo yo...

Si quieres salir del procedimiento en algún punto, usa Exit Sub.

A ver si esto te sirve de ayuda.

Tal como tienes el código esto es lo que hace:

Si existe el cliente y quieres modificarlo -> Nos movemos al registro especificado y desbloqueamos todos los campos -> Salimos

Si existe el cliente y no quieres modificarlo -> solamente nos movemos -> Salimos

Si no existe el cliente y lo queremos crear -> va a un nuevo registro, le asigna el NIF ... -> sale del if al Requery, se mueve al último y sigue el código.

Si no existe el cliente y NO lo queremos crear -> sale del if al Requery, se mueve al último y sigue el código.

[/p%

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas