Pasar el resultado de una consulta a una variable en vba acess

He tratado de buscar información sobre el tema indicado, sin embargo no logro hacer funcionar como quisiera. Quiero que cuando el usuario digite el código de un libro, el sistema antes de que haga cualquier cosa verifique si este CodLib aún esta prestado u si ya está disponible (devuelto). Si el código digitado se encuentra disponible, que continúe la rutina (lo demás funciona muy bien).

Lo que he hecho hasta el momento es esto:

Private Sub TexCodLib_AfterUpdate()
Dim DisponL As Boolean
Dim rst As Recordset
Dim Client As String
Dim miVariable
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
miVariable = rst("Carnet").Value
DisponL = Nz(DLookup("Disponible", "02LIBROS", "[CodLib]='" & Me.CodLib & "'"), "")
Client = "SELECT [06CLIENTES].Carnet, [06CLIENTES]![Nombres] & "" "" & [06CLIENTES]![Apellidos] AS CLIENTE FROM (06CLIENTES INNER JOIN (02LIBROS RIGHT JOIN 11VALES_PRÉSTAMO ON [02LIBROS].CodLib = [11VALES_PRÉSTAMO].CodLib) ON [06CLIENTES].Carnet = [11VALES_PRÉSTAMO].Carnet) LEFT JOIN 12DEVOLUCIONES ON [11VALES_PRÉSTAMO].ValeNo = [12DEVOLUCIONES].ValeNo GROUP BY [11VALES_PRÉSTAMO].ValeNo, [11VALES_PRÉSTAMO].CodLib, [02LIBROS].Libro, [06CLIENTES].Carnet, [06CLIENTES]![Nombres] & "" "" & [06CLIENTES]![Apellidos], [12DEVOLUCIONES].DescargoNo HAVING ((([11VALES_PRÉSTAMO].ValeNo)=IIf(IsNull([12DEVOLUCIONES]![DescargoNo]),[11VALES_PRÉSTAMO]![ValeNo],(0))) AND (([11VALES_PRÉSTAMO].CodLib)=[Formularios]![EJECUTAR PRÉSTAMO]![TexCodLib]));"
If DisponL = False Then
MsgBox "Los registros muestran que éste libro lo tiene prestado: '" & Client & "'", vbCritical, "ERROR, LIBRO NO DISPONIBLE"
Else
TxtCodLib = Nz(DLookup("Libro", "02LIBROS", "[CodLib]='" & Me.CodLib & "'"), "")
Me.TxtLibro = TxtCodLib
TexCodEq.Enabled = False
TxtEquipo.Enabled = False
End If
End Sub

Con el DisponL quiero evaluar si el libro está disponible, es decir si en la tabla 02LIBROS.Disponible=False/True. Si es False entonces ¿Quién tiene el libro?, para ello ejecuto la consulta Client para que me diga el carnet y el nombre completo del individuo, para luego pasárselo al MsgBox.

1 Respuesta

Respuesta
2

En el código tienes varios errores:

1º/ Intentas abrir un recordset sobre una sql que no defines en ningún lado (la variable miSql)

2º/ ¿Para que´defines la variable miVariable si luego no la usas?

Dicho esto, tu código podría quedar así:

Private Sub TexCodLib_AfterUpdate()
Dim DisponL As Boolean
Dim rst As Recordset
Dim Client As String
Dim miSQL As String
DisponL = Nz(DLookup("Disponible", "02LIBROS", "[CodLib]='" & Me.CodLib & "'"), "")
If DisponL = False Then
miSQL= "SELECT [06CLIENTES].Carnet, [06CLIENTES]![Nombres] & "" "" & [06CLIENTES]![Apellidos] AS CLIENTE FROM (06CLIENTES INNER JOIN (02LIBROS RIGHT JOIN 11VALES_PRÉSTAMO ON [02LIBROS].CodLib = [11VALES_PRÉSTAMO].CodLib) ON [06CLIENTES].Carnet = [11VALES_PRÉSTAMO].Carnet) LEFT JOIN 12DEVOLUCIONES ON [11VALES_PRÉSTAMO].ValeNo = [12DEVOLUCIONES].ValeNo GROUP BY [11VALES_PRÉSTAMO].ValeNo, [11VALES_PRÉSTAMO].CodLib, [02LIBROS].Libro, [06CLIENTES].Carnet, [06CLIENTES]![Nombres] & "" "" & [06CLIENTES]![Apellidos], [12DEVOLUCIONES].DescargoNo HAVING ((([11VALES_PRÉSTAMO].ValeNo)=IIf(IsNull([12DEVOLUCIONES]![DescargoNo]),[11VALES_PRÉSTAMO]![ValeNo],(0))) AND (([11VALES_PRÉSTAMO].CodLib)=[Formularios]![EJECUTAR PRÉSTAMO]![TexCodLib]));"
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
Client=rst("Cliente")
rst.Close
set rst=nothing
MsgBox "Los registros muestran que éste libro lo tiene prestado: '" & Client & "'", vbCritical, "ERROR, LIBRO NO DISPONIBLE"
Else
TxtCodLib = Nz(DLookup("Libro", "02LIBROS", "[CodLib]='" & Me.CodLib & "'"), "")
Me.TxtLibro = TxtCodLib
TexCodEq.Enabled = False
TxtEquipo.Enabled = False
End If
End Sub

¡Gracias! Por brindarme siempre amablemente tu ayuda.

Fíjate que en la prueba de lo que me has transcrito me sale un mensaje de "error 3061 en tiempo de ejecución. Pocos parámetros. Se esperaba 1" y remarca con amarillo 

Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)

Disculpa la molestia, me puedes decir que he hecho mal? Por favor..

el error está en que al construir así la SQL, no entiende el parámetro que le estás pasando (la parte del having). Al escribir las SQL en VBA, tienes que hacer referencia a los valores que tomas del formulario, con Me, y no con [Formularios]!NombreFormulario]![NombreCampo], o al menos no dentro de la propia SQl.

Solución, cambia la última parte de la variable miSQL por esta otra:

HAVING ((([11VALES_PRÉSTAMO].ValeNo)=IIf(IsNull([12DEVOLUCIONES]![DescargoNo]),[11VALES_PRÉSTAMO]![ValeNo],(0))) AND (([11VALES_PRÉSTAMO].CodLib)=" & Me.TexCodLib

¡Gracias!, y disculpa ya me dio mucha pena tanto con lo mismo. Exactamente como lo tienes me tira un error dice falta operador en la expresión de consulta, he intentado corregir con el asunto del apostrofe: ='" & Me.TexCodLib & "'"));" pero con esto me dice que se espera fin de la instrucción.

La sintaxis correcta es esta:

='" & Me.TexCodLib & "'));"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas