¿Como traigo datos de mi tabla al form actual? Access 2003

Tengo un TXTDNI que si ingreso un DNI existente en mi BD me tira el mensaje de 'Existente', pero me gustaría que al darle 'Aceptar' a ese MsgBox me traiga automáticamente los datos coincidentes con ese DNI

3 respuestas

Respuesta
2

Tienes que usar la función DBúsq() (o DLookUp(), en inglés), que tiene esta sintaxis:

DBúsq("NombreCampo","NombreTabla","Condición")

En tu caso, habrás de añadirle al código que tengas tantas líneas como campos quieras traer, después del mensaje.

Por ejemplo, para traer el nombre y los apellidos:

Me.Nombre=DLookup("Nombre","TDatos","DNI='" & Me.DNI & "'")

Me.Apellidos=DLookup("Apellidos","TDatos","DNI='" & Me.DNI & "'")

He cometido un pequeño error, tu campo en el formulario se llama TXTDNI, por lo que la parte de la condición sería así:

"DNI='" & Me.TXTDNI & "'"

Gracias! Me funciono prefecto para lo que quería, pero ahora me surge otro problema... El código me quedo así:

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

Private Sub TXTDNI_LostFocus()
If ((TXTDNI.Text = "" & TXTDNI.Text = TXTDNI.Text)) Then
MsgBox "El alumno ya existe", vbInformation, "Ya fue alumno"
End If
Me.TXTAPELLIDONOMBRE = DLookup("APELLIDONOMBRE", "DATOS", "DNI='" & Me.TXTDNI & "'")
DoCmd.Close acForm, "Busca Alumno"
SendKeys "{ENTER}", True
End Sub

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

Mi problema es que ahora cada vez que agrego un alumno NUEVO me salta el MsgBox...

Si me podes ayudar te lo agradecería

Realmente no entiendo lo que pretendes hacer con el primer If, no le encuentro el sentido... pero mira si este ejemplo te ayuda a terminar tu código: http://www.siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/162-este-valor-ya-existe

El primer IF es para que al cargar un DNI me busque si ya no esta dentro de mi base de datos para no cargar dos veces al mismo alumno

¿Y te funciona bien el primer IF? Porque realmente no está buscando si ya tienes registrado el DNI (no haces ninguna referencia a la tabla donde guardas los datos...)

Funciona pero por más que cargue un alumno ya registrado o uno nuevo, me salta siempre el MsgBox

Entonces no te funciona...

El If, lo que hace es comprobar si el cuadro de texto está en blanco y si lo que escribes en él es igual que lo que escribes en él.

Es mejor que adaptes el ejemplo que te sugería antes para cpmprobar si el valor ya existe, o al menos, una forma abreviada usando DLookup (diga lo que diga el otro compañero):

Private Sub TXTDNI_LostFocus()
Dim elDNI as Variant
elDNI=DLookUp("NombreCampoDNI","NombreTabla","NombreCampoDNI='" & Me.TXTDNI & "'")
If Not IsNull(elDNI) Then
MsgBox "El alumno ya existe", vbInformation, "Ya fue alumno"
Else
Me.TXTAPELLIDONOMBRE = DLookup("APELLIDONOMBRE", "DATOS", "DNI='" & Me.TXTDNI & "'")
DoCmd.Close acForm, "Busca Alumno"
SendKeys "{ENTER}", True
End If
End Sub

donde tendrás que cambiar los nombres dentro de la función DLookUp() para adaptarlos a los tuyos

Respuesta
2

La respuesta que te dan Sveinbjor El Rojo es una opción, otra alternativa es utilizar una consulta SQL que es más practica y estándar, por ejemplo:

1. Crea un el evento "Después de actualizar" del campo TXTDNI puedes agregar el siguiente código: tbl1= nombre de su tabla. Campo1, campo2, campo3 son campos de su tabla y lo debe reemplazar en le código que te anexo

Dim strSql AS String

Dim db AS Databases

Dim rs AS RecordSet

SET db=CurrentDb

IF NOT ISNULL(me.TXTDNI) or me.TXTDNI<>"" THEN

   strSql="SELECT tbl1.campo1,tbl1.campo2,tbl1.campo2 FROM tbl1" & vbcrlf

   strSql=strSql  & " WHERE DNI=" & "'" TXTDNI & "'" & ";"

 SET rs=db.OpenRercordSet(strSql)

 Msgbox "Datos del DNI: " & Me.TXTDNI  & vbcrlf & _

 rs.campo1 & " " & rs.campo2 & " " rs.campo3

ELSE

     Me.TXDNI.SetFocus

ENDIF

rs.close

db.close

set db=nothing

set rs=nothing

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

Esta es una opción, en lo posible trata de no usar DLookUp().

Porque no aconsejas usar el DLookUp()?

Por que cuando tu debas migrar a SQL u otro tu base de Access no te servirá, además las consultas Sql pueden manejar criterios más complejos que la función DLookUp(). Por otro lado, cuando tengas una base de datos con miles de registros los formularios en que utilices DLookUp() se demoran más en cargar, igualmente en combo de lista que la utilicen. Consulta en más en la Web.

Respuesta
1

Aunque haya pasado tiempo, quizá te sirva

If DCount("cif", "Peticiones", "[cif]=forms!peticiones!cif") >= 1 Then
Dim d, e, f
d = DLookup("nombresociedad", "consulta1", "[cif]=[forms]![peticiones]![cif]")
e = DLookup("domiciliosocial", "consulta1", "[cif]=[forms]![peticiones]![cif]")
f = DLookup("localidadsocial", "consulta1", "[cif]=[forms]![peticiones]![cif]")
Dim Respuesta As Integer
Respuesta = MsgBox("Ese CIF ya existe, corresponde a " & UCase(d) & Chr$(10) + "con domicilio en " & UCase(e) & Chr$(10) + "en " & UCase(f) & " ¿ Quiere modificar los datos ?", vbYesNo, "El que avisa no es traidor")
    If Respuesta = vbYes Then
     DoCmd.CancelEvent
    End If
End If

Así, cuando escribas un dni duplicado, te aparecerá un mensaje diciéndote quien tiene ese dni, domicilio, localidad. Tienes que adaptar los nombres a tus campos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas