ACCESS Cargar datos de un registro existente al introducir uno nuevo

Tengo una base de datos en la que introduzco datos en una tabla a través de un formulario. Necesitaría que si un registro ya existe en la tabla, al introducir uno nuevo a través de dicho formulario, después de actualizar un campo, llamémoslo por ejemplo DOCUMENTO, el formulario me cargase automáticamente dicho registro ya existente.

1 respuesta

Respuesta
2

José Manuel: De entre varias formas, puedes usar el Método FindFirst.

En éste enlace, lo tienes explicado de una forma breve y con un ejemplo.

https://msdn.microsoft.com/es-es/library/office/ff194787.aspx 

Mis saludos >> Jacinto

He adaptado el código del ejemplo a mi formulario pero no consigo que haga nada.

Sub FindDOC_N()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("AUTORES")
rst.FindFirst "[DOC_N] LIKE '*parts*'"
If rst.NoMatch Then
MsgBox "Record not found."
Gotto Cleanup
Else
Do While Not rst.NoMatch
MsgBox "Customer name: " & rst!CustName
rst.FindNext "[DOC_N] LIKE '*parts*'"
Loop
rst.FindNext "[DOC_N] LIKE '*parts*'"
End If
Cleanup:
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub

José Manuel: Si no malentiedo tu necesidad, lo que quieres es que te muestre 1 Registro, con lo cual puedes simplificar mucho el Código. Aprovecha el RecordsetClone del Formulario.

Además observo que usas un critério muy genérico para encontrarlo. Tu debes saber la Razón.

Prueba lo siguiente y luego lo aplicas a tus necesidades. Lo he puesto al perder el Foco

Private Sub DOC_N_LostFocus()
Dim Rst As Object
Set Rst = Me.RecordsetClone
Rst.FindFirst "[DOC_N] LIKE '*parts*'"
If Not Rst.NoMatch Then  
    Me.Bookmark = Rst.Bookmark 'Sincronización
Else
    MsgBox "No se ha encontrado ningún registro con éste Texto"
End If
End Sub

Ya me contarás. Saludos >> Jacinto

Con ese código lo que me sale cuando relleno el campo DOC_N es el mensaje "No se ha encontrado ningún registro...", aunque lo rellene con un número que ya existe en la tabla. 

Lo que necesito es que si relleno dicho campo un número que ya existe en otro registro de la tabla, me carge dicho registro para evitar duplicados de registros, y si no coincide entonces que me permita continuar rellenando campos

José Manuel: Con ese código que te envío estoy suponiendo que:

La tabla que sirve como Origen de datos del Formulario, es donde quieres buscar el dato.

En la tabla citada hay un campo que se llama DOC_N

En ese campo hay datos tales como >> 50partsPor, PartsPepe, Parts587...

Si no fuera así me comentas y vemos donde está el fallo. Mis saludos >> Jacinto

Perdona si no me he explicado bien, la tabla efectivamente sirve de origen de datos del formulario. En ella está el campo DOC_N en la que se introducen datos alfanuméricos tales como los de un DNI, pasaporte o cualquier documento, que en principio va a ser único.

Lo que hace falta es que si se rellena dicho campo con nº de documento que ya se haya introducido previamente en otro registro, me cargue dicho registro evitando así un registro duplicado. Por otro lado el registro que ese está rellenando en ese momento debe quedar también cancelado en ese caso. 

Si el documento que se introduce es la primera vez que se introduce, entonces no debe a parecer nada para así poder continuar rellando campos en el registro.

Bueno José Manual, esperemos que a la tercera acertemos.

Copia y pega éste código y recuerda activar [Procedimiento de evento] en Propiedades del Formulario >> Pestaña Eventos >> Antes de Actualizar

Private Sub DOC_N_BeforeUpdate(Cancel As Integer)
Dim Rst As Object 
‘Dim Rst As DAO.Recordset ‘También puedes declararlo así
‘Ahora con ésta línea creas el Clon del Recordset
Set Rst = Me.RecordsetClone 
‘Con ésta línea buscas en el Recordset, si hay algún DOC_N, que sea igual. Trim es por si acaso hay espacios
Rst.FindFirst "[DOC_N] = '" & Trim(Me.DOC_N) & "'" 
‘Sondeamos con el Negado de la condición IF. Si se cumple es que el DOC_N existe
If Not Rst.NoMatch Then  
    MsgBox "El documento: " & Me.DOC_N.Text & " ya existe." & vbCrLF & vbCrLF & "Pulsa el botón ""Aceptar"".", vbOKOnly, "DOCUMENTO EXISTENTE"               
    ‘Para que no cuente como nuevo registro.               
    Me.Undo 
    Me.Bookmark = Rst.Bookmark 
End If
End Sub

Mis saludos >> Jacinto

¡Gracias! Funciona a la perfección.

Buenas Jacinto, con el código que me has facilitado, si quisiera que el registro al que me redirigiese el recorset, en lugar de depender de un único campo, dependiese de tres, ¿sería posible?

Sería algo así:

Rst.FindFirst "[DOC_N] & [FECHA] & [TIPO] = '" & Trim(Me.DOC_N) & "'" & '" & Trim(Me.FECHA) & "'" & '" & Trim(Me.TIPO) & "'" 

El objetivo es que me remita a un registro en el que coincidan los datos que ingreso en tres campos ([DOC_N], [FECHA] y [TIPO])

José Manuel:

Para una mejor comprensión y captura de Fallo en caso de que se produzca, te sugiero que declares unas Variables de Criterios y después de establecerlos, los juntas con “ AND “

Dim CriterioUno As String,CriterioDos As String, CriterioTres As String, Criterios As String
CriterioUno =  "[DOC_N] = '" & Trim(Me.DOC_N) & "'"
CriterioDos = "[FECHA] = #" & Format(Me.FECHA, "mm/dd/yyyy") & "#"
CriterioTres =  "[TIPO] = '" & Trim(Me.TIPO) & "'"
Criterios = CriterioUno & “ AND “ & CriterioDos & “ AND “ & CriterioTres
‘Y ahora en el FindFirst
Rst. FindFirst Criterios

Mis saludos >> Jacinto

Private Sub Form_AfterUpdate()
Dim CriterioUno As String, CriterioDos As String, CriterioTres As String, Criterios As String
CriterioUno = "[ATESTADO] = '" & Trim(Me.ATESTADO) & "'"
CriterioDos = "[FECHA] = #" & Format(Me.FECHA, "mm/dd/yyyy") & "#"
CriterioTres = "[UNIDAD] = '" & Trim(Me.UNIDAD) & "'"
Criterios = CriterioUno & “ And “ & CriterioDos & “ And “ & CriterioTres
Rst.FindFirst Criterios
If Not Rst.NoMatch Then
    MsgBox "ATESTADO YA REGISTRADO" & vbCrLf & vbCrLf & "Pulsa el botón ""Aceptar"".", vbOKOnly, "REGISTRO EXISTENTE"
    Me.Undo
    Me.Bookmark = Rst.Bookmark
End If
End Sub

He colocado el código el Form:AfterUpdate y me sale el siguiente error:

"Se ha producido el error '13' en tomepo de ejecución.

No coinciden los tipos"

Puede deberse a que coloco el código en el lugar equivocado? También he probado a introducirlo "Antes de actualizar" el último de los criterios y se repite el mismo error.

José Manuel: Estaba contestando y se ha cerrado el Navegador. Ignoro si has recibido la respuesta.

Te comentaba que ese error se debe a que uno de los datos que filtramos no es Texto.

Tu debes saber si es el ... Uno, ... Dos o ... Tres: A mi modo de verlo ha de ser el ... Uno o el ... Tres

Modifica la línea afectada de éste modo:

CriterioElQueSea = "[CampoElQueCorresponda] = " & Me.ElNombreDelControl

Mis saludos >> Jacinto

Lo he modificado en los dos criterios (1 y 3) y me sigue dando el mismo problema.

De todas formas los dos criterios corresponden con campos tipo "texto", aunque en el primero a pesar de ser tipo texto, sólo se introducen números. El otro criterio corresponde a un campo en el que se selecciona un texto de un listado desplegable.

José Manuel: Desde luego que ese error, es justo lo que pone "Tipo"

Entonces, se me ocurre que en el Combo tengas más de una Columna y justo la primera sea un identificador numérico. Puedes depurar el código paso a paso y ver donde te salta el error.

Si puedes aislar los Objetos que intervienen en ese proceso, poniendo algunos datos inventados y quieres enviarme la BD a [email protected], miro de ver de dónde viene el fallo. Saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas