Procedimientos y funciones

Estoy intentando hacer una función que me busque en una base de datos. La función la declare así.
Function buscar_alumno(tabla As Recordset, entrada As String, opcion As Integer) As Recordset
' declaracion de variables
Dim datos As Database
Dim eleccion As String
'asignacion en la base de datos
Set datos = OpenDatabase(App.Path & "\bbaa.mdb")
 If opcion = 1 Then
          eleccion = "select * from alumnos where codigo like "
          eleccion = eleccion + "'"
          eleccion = eleccion + entrada
          eleccion = eleccion + "'"
    End If
    If opcion = 2 Then
         eleccion = "select * from alumnos where dni like "
         eleccion = eleccion + "'"
         eleccion = eleccion + entrada
         eleccion = eleccion + "'"
    End If
     If opcion = 3 Then
         eleccion = "select * from alumnos where nombre like "
         eleccion = eleccion + "'"
         eleccion = eleccion + entrada
         eleccion = eleccion + "'"
    End If
    Set tabla = datos.OpenRecordset(eleccion)
End Function
Y luego la llamo aso
Set tabla = buscar_alumno(tabla, entrada, opcion)
Pero no funciona, ¿Qué hice mal?
1

1 Respuesta

165.850 pts. Más de 35 años en la informática y más de 20 trabajando...
Prueba con este código:
Function buscar_alumno(tabla As Recordset, entrada As String, opcion As Integer) As Recordset
    ' declaracion de variables
    Dim datos As Database
    Dim tabla As Recordset
    Dim eleccion As String
    buscar_alumno = "" ' Valor por defecto para caso de no encontrarlo
    ' asignacion en la base de datos
    Set datos = OpenDatabase(App.Path & "\bbaa.mdb")
    Select Case opcion
        Case 1: eleccion = "select * from alumnos where codigo like " '*" & entrada & "*'"
        Case 2: eleccion = "select * from alumnos where dni like " '*" & entrada & "*'"
        Case 3: eleccion = "select * from alumnos where nombre like " '*" & entrada & "*'"
        Case Else:
            MsgBox "No se reconoce la opcion"
            Exit Function
    End Select
    Set tabla = datos.OpenRecordset(eleccion)
    If Not tabla.EOF Then
        ' Devolvemos el primer nombre que encontremos (aunque podría haber más)
        tabla.moveFirst
        buscar_alumno = tabla!nombre
    End If
    tabla.Close
End Function
El problema que veo es que si pones que el nombre sea como '*pepe*' pueden salirte 20 personas, pero la función sólo te puede devolver un valor que te he puesto que sea el primer 'pepe' que encuentre.
También te podría devolver una parrafada con el nombre de todos los alumnos.
Hola, ante todo gracias por responder tan rapido
probé el código y me da los siguientes problemas
buscar_alumnos="" ' esto me dice que es un uso no valido de la propiedad
buscar_alumnos=tabla!nombre me dice lo mismo
Otra cosa yo quiero pasar a tabla todos los valores, dni, nombre, teléfono, etc y tabla! ¿Nombre no pasaría solo ese campo en el supuesto de que funcionara?
Perdona, pero la función está definida como un "recordset" y debería ser un "string" (una cadena de caracteres que contendrá el nombre del alumno).
Si lo que quieres es que devuelva el recordset, dímelo y lo cambiamos, pero tengo la impresión que estás buscando un nombre más que un conjunto de registros.
Por bien esta línea:
Function buscar_alumno(tabla As Recordset, entrada As String, opcion As Integer) As String
Exacto, lo que quiero que me devuelva es un recordset (nombre del alumno, dni, etc, que va todo en la tabla alumnos)
Entonces deja la definición de la función así:
Function buscar_alumno(entrada As String, opcion As Integer) As Recordset
    ' declaracion de variables
    Dim datos As Database
    Dim eleccion As String
    buscar_alumno = "" ' Valor por defecto para caso de no encontrarlo
    ' asignacion en la base de datos
    Set datos = OpenDatabase(App.Path & "\bbaa.mdb")
    Select Case opcion
        Case 1: eleccion = "select * from alumnos where codigo like " '*" & entrada & "*'"
        Case 2: eleccion = "select * from alumnos where dni like " '*" & entrada & "*'"
        Case 3: eleccion = "select * from alumnos where nombre like " '*" & entrada & "*'"
        Case Else:
            MsgBox "No se reconoce la opcion"
            Exit Function
    End Select
    Set buscar_alumno= datos.OpenRecordset(eleccion)
End Function
Aunque sería mejor que la base de datos 'datos' estuviera definida fuera de la función y se la pasases como parámetro, en cuyo caso el código sería:
Function buscar_alumno(datos As Database, entrada As String, opcion As Integer) As Recordset
    ' declaracion de variables
    Dim eleccion As String
    buscar_alumno = "" ' Valor por defecto para caso de no encontrarlo
    Select Case opcion
        Case 1: eleccion = "select * from alumnos where codigo like " '*" & entrada & "*'"
        Case 2: eleccion = "select * from alumnos where dni like " '*" & entrada & "*'"
        Case 3: eleccion = "select * from alumnos where nombre like " '*" & entrada & "*'"
        Case Else:
            MsgBox "No se reconoce la opcion"
            Exit Function
    End Select
    Set buscar_alumno= datos.OpenRecordset(eleccion)
End Function
Y siempre teniendo en cuenta que antes de llamar a la función tienes que abrir la base de datos:
    ' Asignación en la base de datos
    Set datos = OpenDatabase(App.Path & "\bbaa.mdb")

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas