Dudas con OpenForm en Access

Tengo un problemilla al abrir un formulario pasándole un argumento. Lo que quiero es que se me habrá dicho formulario exactamente por el registro que le estoy pasando.
Hasta ahora se me abre el formulario que quiero pero por el primer registro no por el deseado.
Adjunto código:
Dim rst As Recordset
Dim Tabla As TableDef
Dim fld As Field
Dim textoBusq As String
Dim contador As Integer
Debug.Print "Coincidencias encontrada con el texto: " & textoBusq
contador = 0
textoBusq = InputBox("Introduce valor a buscar")
For Each Tabla In CurrentDb.TableDefs
If Left(Tabla.Name, 4) <> "MSys" Then
Set rst = CurrentDb.OpenRecordset("SELECT * FROM [" & Tabla.Name & "];")
rst.MoveFirst
Do Until rst.EOF
For Each fld In rst.Fields
If InStr(1, fld.Value, textoBusq, vbTextCompare) Then
Debug.Print " En tabla: " & Tabla.Name
Debug.Print " Campo:" & fld.Name
Debug.Print " Posicion:" & rst.AbsolutePosition + 1
Debug.Print " Cadena entera: " & rst(fld.Name)
contador = contador + 1
DoCmd.OpenForm Tabla.Name, acNormal , , fld.Name & "='" & textoBusq & "'"
End If
Next
rst.MoveNext
Loop
End If
Next
If contador = 0 Then
Debug.Print "No se encontraron coincidencias"
Else
Debug.Print "Total coincidencias: " & contador
End If
End Sub

1 Respuesta

Respuesta
1
He retocado un poco tu código para construir una única clausula WHERE para cada tabla.
    Dim rst As Recordset
    Dim Tabla As TableDef
    Dim fld As Field
    Dim textoBusq As String
    Dim contador As Integer
    Dim listaFld As String
    Dim auxWhere As String
    Debug.Print "Coincidencias encontrada con el texto: " & textoBusq
    contador = 0
    textoBusq = InputBox("Introduce valor a buscar")
    For Each Tabla In CurrentDb.TableDefs
        If Left(Tabla.Name, 4) <> "MSys" Then
            Set rst = CurrentDb.OpenRecordset("SELECT * FROM [" & Tabla.Name & "];")
            rst.MoveFirst
            listaFld = Chr$(0)
            auxWhere = ""
            Do Until rst.EOF
                For Each fld In rst.Fields
                    If InStr(1, fld.Value, textoBusq, vbTextCompare) Then
                        If InStr(listaFld, Chr$(0) & fld.Name & Chr$(0)) = 0 Then
                            ' No está el campo en la Where. Lo añadimos
                            listaFld = listaFld & fld.Name & Chr$(0)
                            If auxWhere <> "" Then auxWhere = auxWhere & " or "
                            auxWhere = auxWhere & "[" & fld.Name & "] like '*" & textoBusq & "*'"
                            Debug.Print " En tabla: " & Tabla.Name
                            Debug.Print " Campo:" & fld.Name
                            Debug.Print " Posicion:" & rst.AbsolutePosition + 1
                            Debug.Print " Cadena entera: " & rst(fld.Name)
                            contador = contador + 1
                        End If
                    End If
                Next
                rst.MoveNext
            Loop
            rst.Close
            If auxWhere <> "" Then DoCmd.OpenForm Tabla.Name, , , auxWhere
        End If
    Next
    If contador = 0 Then
        Debug.Print "No se encontraron coincidencias"
      Else
        Debug.Print "Total coincidencias: " & contador
    End If
Buenos días, me funciona todo perfecto exceptuando una cosa. Hay una búsqueda que hago que me da un error y sólo esa búsqueda es la que da error y por m´ñas que intento encontrar dicho error no soy capaz.
El error es: El nombre del formulario 'TMPCLP495551' esta mal escrito o hace referencia a un foprmulario que no existe.
Cuando depuro el erro me lo da en la línea: DoCmd.OpenForm Tabla.Name,,, auxWhere y si paso el cursor sobre ella me da unos datos de campos que no existen en mis tablas y es muy raro, incluso elimine todo lo que creía referente al error (tablas y formulario) y me sigue saliendo.
Gracias y saludos
Ese nombre se corresponde con una tabla temporal de tu base de datos.
Para realizar ciertas tareas, Access crea este tipo de objetos que algunas veces no elimina bien y aparecen en la colección Tabledefs.
Al igual que has quitado las tablas del sistema, también puedes hacer que no se ejecute el proceso para estas poniendo:
    If Left(Tabla.Name, 4) <> "MSys" and Left(Tabla.Name, 3) <> "TMP" Then

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas