Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Access y Visual Basic

Estas en el tema de Access y Visual Basic en el foro de Visual Basic clásico en Foros del Web. Hola a todos: Estoy desarrollando un programa con Visual Basic y Access, de hecho lo que estoy empezando a hacer es a aprender VB. Mi ...
  #1 (permalink)  
Antiguo 14/12/2002, 19:02
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Access y Visual Basic

Hola a todos:

Estoy desarrollando un programa con Visual Basic y Access, de hecho lo que estoy empezando a hacer es a aprender VB. Mi duda es la siguiente:

Tengo un textbox llamado TextDNI y una etiqueta Define(2), y quiero que al introducir el DNI en el textbox busque en la tabla Usuarios y en el campo DNI la entrada que coincida. Si hay una entrada con ese DNI muestra en la etiqueta los valores de los campos nombre, apellidos y telefono y si no abre un nuevo formulario para registrar a ese usuario nuevo.

De momento he hecho este código que muestro más abajo y sólo me busca en la primera entrada de la tabla. Supongo que para que recorra todo el campo habrá que hacer un bucle o algo así.

La conexión con la base de datos ya la he realizado al abrir el formulario, así como definir las variables públicas y todo eso.

Código:
Private Sub TextDNI_KeyPress(KeyAscii As Integer)
    If (KeyAscii = 13) Then 
    ButConfirm.SetFocus
    identifica = TextDNI.Text
    With db
        Set rstUsuarios = .OpenRecordset("Usuarios")
        With rstUsuarios
            If (identifica = !DNI) Then
            Define(2).Caption = !nombre + " " + !apellidos + ". Tel: " + !telefono
            Else
                 UsuarioNuevo.Show 1
            End If
        End With
    End With
    End If
End Sub
Gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 14/12/2002, 22:02
Avatar de lmg7  
Fecha de Ingreso: agosto-2002
Mensajes: 93
Antigüedad: 21 años, 8 meses
Puntos: 0
Hola

Prueba de definir una consulta (objeto QueryDef), de forma de que con un texto SQL adecuado abras un recordset conteniendo solo las coincidencias buscadas.

El texto SQL sería en tu caso "SELECT * FROM Usuarios WHERE DNI = " & Str(identifica) & " ORDER BY DNI;"

Contame si te sirvió.

Saludos.

(PD: "ORDER BY DNI" no es necesario, solo si quieres ordenar los registros)
  #3 (permalink)  
Antiguo 15/12/2002, 06:18
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Gracias lmg7 por tu ayuda pero, como ya dije estoy empezando con esto del VB y la verdad, no sé por dónde coger lo que me has sugerido.

De hecho entendía que SQL era otro tipo de base de datos distinta de Access por lo que no me he preocupado de buscar información sobre el tema. Si no es así, donde debería poner el texto SQL y la consulta QueryDef. He probado ha insertarlo así

Código:
...        
With rstUsuarios
        SELECT * FROM Usuarios WHERE DNI = " & Str(identifica);
            If (identifica = !DNI) Then
...
y directamente da error, marcando el asterisco. Pensé que sería simplemente introducir un bucle que recorriera el campo DNI y que cuando cuando coincidiera devolviera el número de entrada en la tabla para luego tomar los valores de los otros campos de esa misma entrada.

Gracias de nuevo.
  #4 (permalink)  
Antiguo 15/12/2002, 08:01
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Bien, buscando y buscando he encontrado lo que estaba buscando, es esto:
Código:
Private Sub TextDNI_KeyPress(KeyAscii As Integer)
    If (KeyAscii = 13) Then
    identifica = TextDNI.Text
        Set rstUsuarios = db.OpenRecordset("Usuarios")
        rstUsuarios.MoveFirst
        Do While Not rstUsuarios.EOF
            If rstUsuarios!DNI <> identifica Then
                rstUsuarios.MoveNext
                UsuarioNuevo.Show 1 
            Else
                Define(2).Caption = rstUsuarios!nombre + " " + rstUsuarios!apellidos + ". Tel: " + rstUsuarios!telefono
                ButConfirm.SetFocus
        Exit Do
        End If
        Loop
    End If
End Sub
Me funciona bien excepto que no sé si lo que está en rojo es el sitio adecuado, es decir, mi intención es que si no encuentra ninguna entrada que coincida con el valor buscado abra un nuevo form.

Gracias de nuevo.
  #5 (permalink)  
Antiguo 15/12/2002, 10:41
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
No, ni mucho menos es el sitio correcto. Al fin y al cabo con ejecutar esa sentencia una sola vez bastaría. Ahora bien, te comento varias cosas:
1- Una de las cosas más ineficientes que se puede hacer en VB es recorrerte un recordset con un while, es tremendamente ineficaz (en tiempo). En tu caso simplemente quieres buscar un registro en concreto, así que tienes otras alternativas disponibles: mírate métodos como find.
2- Esto es sólo un consejo: estás programando con una tecnología de acceso a datos que Microsoft ya ha "parado" de desarrollar. Trata de dejar DAO y pasarte a ADO (te será mucho más beneficioso en el futuro si luego empiezas con el .net).

Simplemente eso.
Saludos.
  #6 (permalink)  
Antiguo 15/12/2002, 11:04
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
Ah, se me olvidaba escribirte como poner lo del show, así de sencillo. Y es que ahora que te iba a escribir el código usando find, veo que es más sencillo todavía ¿por qué abrir un recordset con todos los campos de todos los registros de la tabla usuarios si sólo quieres buscar uno en concreto? Mejor un select con un where ¿no?

Set rstUsuarios=db.openRecordSet("select DNI from Usuarios where DNI='" & txtDNI & "'")
if not rstUsuarios.eof then
' el registro existe y hace lo que sea
else
UsuarioNuevo.Show 1
end if

y bla bla bla


Saludos.
  #7 (permalink)  
Antiguo 15/12/2002, 11:41
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Parece que tiene bastante mejor pinta. Lo probaré. Gracias.
  #8 (permalink)  
Antiguo 15/12/2002, 11:49
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Lo siento pero como has podido apreciar soy un principiante en toda regla. ¿Y ahora qué pasa?
Código:
Private Sub TextDNI_KeyPress(KeyAscii As Integer)
    If (KeyAscii = 13) Then
    identifica = TextDNI.Text
    Set rstUsuarios = db.OpenRecordset("select DNI from Usuarios where DNI='" & identifica & "'")
        If Not rstUsuarios.EOF Then
            Define(2).Caption = rstUsuarios!nombre + " " + rstUsuarios!apellidos + ". Tel: " + rstUsuarios!telefono 
            ButConfirm.SetFocus
        Else
            UsuarioNuevo.Show 1
        End If
    End If
End Sub
  #9 (permalink)  
Antiguo 15/12/2002, 13:03
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
Ah, perdona, no me había dado cuenta que luego muestras esos campos, así que el select está mal evidentemente, debería ser:
set rstUsuarios=db.openrecordset("select nombre, apellidos, telefono from usuarios where dni ='" & txt DNI & "'")
La variable identifica no te sirve para nada. Además, veo que no la declaras en el evento (ni el recordset), o sea, que o son globales o no has usado el Option Explicit. Si es lo primero, bueno... no sé como lo estarás programando y si luego las usas en otros sitios, pero si es debido a lo segundo (no has declarado Option Explicit), hazlo, no hacerlo puede llevarte a grandísimas catástrofes.
  #10 (permalink)  
Antiguo 15/12/2002, 15:22
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Ahora sí, va todo de maravilla, muchísimas gracias.
Por cierto, identifica sí la había definido previamente como pública y Option Explicit.

Gracias por tu ayuda otra vez.
  #11 (permalink)  
Antiguo 18/12/2002, 17:44
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
¿Recuerdas esto?

Código:
Set rstPrestamos = db.OpenRecordset("select * from Prestamos where art1='" & articulo1 & "'")
Pues bien, ¿y si quiero que además de en el campo art1 busque lo mismo en art2?

He probado con:

- Set rstPrestamos = db.OpenRecordset("select * from Prestamos where art1 & art2='" & articulo1 & "'")

- Set rstPrestamos = db.OpenRecordset("select * from Prestamos where art1='" & articulo1 & "' & art2='" & articulo1 & "'")

- Y varias combinaciones más.

No sé si iré bien encaminado. Gracias.
  #12 (permalink)  
Antiguo 18/12/2002, 18:36
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Bueno, finalmente he resuelto esa pregunta, y no sé si lo habré hecho de una manera muy correcta pero al menos funciona.

Código:
Private Sub TextArt1_KeyPress(KeyAscii As Integer)
    If (KeyAscii = 13) Then
        articulo1 = TextArt1.Text
        Set rstPrestamos = db.OpenRecordset("select * from Prestamos where art1='" & articulo1 & "'")
        If Not rstPrestamos.EOF Then
            MsgBox "Artículo ya prestado", vbExclamation, "¡Atención!"
            TextArt1.Text = ""
        Else
            Set rstPrestamos = db.OpenRecordset("select * from Prestamos where art2='" & articulo1 & "'")
            If Not rstPrestamos.EOF Then
                MsgBox "Artículo ya prestado", vbExclamation, "¡Atención!"
                TextArt1.Text = ""
            Else
                Set rstArticulos = db.OpenRecordset("select descripcion from Articulos where codigo ='" & articulo1 & "'")
                If Not rstArticulos.EOF Then
                    Define(0).Caption = rstArticulos!descripcion
                    TextArt2.SetFocus
                Else
                    MsgBox "Artículo no registrado", vbExclamation, "¡Atención!"
                    TextArt1.Text = ""
                End If
            End If
        End If
    End If
End Sub
Gracias por tu ayuda, de momento dejaré así el código ya que funciona y ahora mismo tampoco tengo mucho tiempo para aprender otros métodos.
Hasta luego.
  #13 (permalink)  
Antiguo 19/12/2002, 02:44
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
Hola,

Una pregunta, ¿cual es la clave foránea de Préstamos que está relacionada con la tabla artículos? Las tres consultas que has puesto se pueden hacer en una sin ningún problema, eso sí, te aconsejo que antes de seguir programando en VB atacando una BBDD te bajes un tutorial de SQL y le eches un buen vistazo. Te será muy útil.

Saludos.
  #14 (permalink)  
Antiguo 19/12/2002, 14:43
Avatar de pdjazr  
Fecha de Ingreso: noviembre-2002
Ubicación: Lima - Limon
Mensajes: 207
Antigüedad: 21 años, 5 meses
Puntos: 0
En mi pagina puedes encontrar multiples ejemplos al respecto....

saludos
__________________
http://paracraneo.comlu.com
  #15 (permalink)  
Antiguo 19/12/2002, 16:09
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
¿y cómo accedo a esta página? es obligatorio registrarse (pregunto). Si es así lo hago sin mayores problemas.
Gracias por el ofrecimiento.
  #16 (permalink)  
Antiguo 19/12/2002, 17:17
Avatar de pdjazr  
Fecha de Ingreso: noviembre-2002
Ubicación: Lima - Limon
Mensajes: 207
Antigüedad: 21 años, 5 meses
Puntos: 0
Si amigo...es como tu dices.....saludos
__________________
http://paracraneo.comlu.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:59.