Doble generador de expresión en una consulta access

Nuevamente hago preguntas. ¿Quisiera saber si en una consulta de access se puede hacer mas de un generador de expresión a diferentes formularios?

Trate de generar una para dos formularios diferentes pero que usen la misma consulta; [Formularios]![Registro_Pacientes]![CC_EspecieOb] O [Formularios]![Registro_Pacientes2]![CC_Especie], pero no resulta

No se si es factible y de serlo que debo hacer...

1 respuesta

Respuesta
1

No dices por qué no te funciona (aunque me lo imagino), pero yo te digo que funcionar, funciona, ya le pongas referencias a uno, dos o 50 formularios al mismo tiempo. Ahora bien, si no quieres que te pregunte por alguno de los valores, los dos formularios (o los que sean) tienen que estar abiertos.

Una demostración práctica a lo rápido:

Si tengo esta tabla:

y con ella hago una consulta como ésta:

Fíjate que en criterios le tengo puesto referencias a dos cuadros combinados de dos formularios distintos (FBuscar1 y FBuscar2).

Caso 1: Abro los dos formularios y selecciono valores en los dos combinados:

Al abrir la consulta:

funciona perfectamente.

Caso 2: abro los dos formularios pero solo selecciono algo en uno de los dos combinados:

al abrir la consulta:

también funciona.

Caso 3: solo abro uno de los dos formularios

al abrir la consulta:

Pide el valor del control del formulario que está cerrado. Si cancelo, la consulta no abre, y si le doy a aceptar (sin poner un valor):

Sigue funcionando.

Obviamente si le pongo cualquier valor en la ventana del parámetro, me traerá los registros que tengas ese valor o el que está en el formulario abierto.

Caso 4 (éste sin imágenes): si abres la consulta con los dos formularios cerrados, te saldrán dos ventanas pidiéndote los valores

¿Solucionaste el problema?

Perdona Sveinbjorn El Rojo, no estuve en línea ayer por eso la demora. Efectivamente es como dices, pero la idea era evitar que pregunte por el campo del formulario que tengo cerrado ya que uno es para registrar datos y el otro para modificarlo. Trato de hacerlo por vba usando la consulta SQL con un "if" para que así verifique que formulario este activo y realice la búsqueda. No lo eh logrado, no soy experto en SQL. Pensé en esto...

Private Sub Comando110_Click()
SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie
From Tabla_Raza
If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes]![CC_EspecieOb]));
ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes2]![CC_Especie]));
End If
End Sub

Pero obviamente no me resulta por que no es lo correcto. Seguiré buscando, o no se si podrás orientarme en esto. GRACIAS...

Genere este otro comando;

Private Sub Comando110_Click()
    If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
DoCmd.RunSQL "SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie, From Tabla_Raza", WHERE(((Tabla_Raza.Especie) = [Formularios]![Registro_Pacientes]![CC_EspecieOb]))
    ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
DoCmd.RunSQL "SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie, From Tabla_Raza", WHERE(((Tabla_Raza.Especie) = [Formularios]![Registro_Pacientes2]![CC_Especie]))
   End If
End Sub

Pero envía este error

La sintaxis correcta para tu primer código sería:

Private Sub Comando110_Click()
Dim miSQL as String
miSQL="SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie
From Tabla_Raza "
If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
miSQL=miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes]![CC_EspecieOb]));
ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
miSQL=miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes2]![CC_Especie]));
End If
'Aqui te faltaría lo que hacer con la SQL
End Sub

La sintaxis correcta para el segundo:

Private Sub Comando110_Click()
    If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
DoCmd.RunSQL "SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie From Tabla_Raza WHERE(((Tabla_Raza.Especie) = [Formularios]![Registro_Pacientes]![CC_EspecieOb]))"
    ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
DoCmd.RunSQL "SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie From Tabla_Raza WHERE(((Tabla_Raza.Especie) = [Formularios]![Registro_Pacientes2]![CC_Especie]))"
   End If
End Sub

Dicho esto, tampoco te funcionará porque RunSQL solo sirve para consultas de acción y no para consultas de selección.

Lo que puedes hacer es modificar la SQL de tu consulta "Consulta_Razas" y luego abrirla, por ejemplo, usando el primer código:

Private Sub Comando110_Click()
Dim miSQL as String
miSQL="SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie
From Tabla_Raza "
If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
miSQL=miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes]![CC_EspecieOb]));
ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
miSQL=miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes2]![CC_Especie]));
End If
CurrentDb.QueryDefs("Consulta_Razas").SQL = miSQL
DoCmd.OpenQuery "Consulta_Razas"
End Sub

¡Muchas Gracias! Sveinbjorn El Rojo, eres un genio indiscutible, probé toda las sintaxis indicadas y la que me funciono perfecto fue la primera, aquí la dejo para quien pueda servirle;

Private Sub Comando110_Click()
Dim miSQL As String
miSQL = "SELECT Tabla_Raza.ID_Raza, Tabla_Raza.Raza, Tabla_Raza.Foto, Tabla_Raza.Especie From Tabla_Raza "
    If CurrentProject.AllForms("Registro_Pacientes").IsLoaded Then
miSQL = miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes]![CC_EspecieOb]));"
    ElseIf CurrentProject.AllForms("Registro_Pacientes2").IsLoaded Then
miSQL = miSQL & "WHERE (((Tabla_Raza.Especie)=[Formularios]![Registro_Pacientes2]![CC_Especie]));"
End If
'Aqui te faltaría lo que hacer con la SQL. Y ESTO PUSE:
    CurrentDb.QueryDefs("Consulta_Razas").SQL = miSQL
    DoCmd.OpenForm "Registro_EspeciesRazas", acNormal
End Sub

Agradecido de sus conocimientos y ayuda...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas