Establecer parámetros en una consulta de unión
Tengo una consulta de selección basada en consultas de unión. Estas consultas de unión se diferencian unas de otras en tres campos: día, turno y grupo. La cuestión es que ahora tengo una consulta de unión para cada día/turno/grupo ¿se podrían establecer parámetros en una única consulta de unión para no tener que ir cambiando de consulta cuando quiera ejecutar la consulta de selección para un día, turno y grupo concreto?
1 Respuesta
No acabo de entender del todo tu pregunta, si la explicas un poco más, e incluso si pones las SQLs de tus consultas, quizás te pueda orientar.
Hola Sven, cuánto tiempo, me alegro de contactar de nuevo contigo.
Ok. Verás estas son mis consultas de unión.
Tengo hecha una para cada día. D12-D13-D14-D15 con la siguiente estructura:
SELECT [tabla1].[PAREJA],[tabla1].NOMBRE, FROM [tabla1]
WHERE[tabla1].[D12]="T" OR [tabla1].[D12]="M/T"
UNION SELECT [tabla2].[PAREJA],[tabla2].NOMBRE,FROM [tabla2]
WHERE
[tabla2].[GRUPO]= "A" OR [tabla2].[GRUPO]= "B";
para el día 13 (D13)---- Sólo cambiaría la parte final
WHERE
[tabla2].[GRUPO]= "C" OR [tabla2].[GRUPO]= "B";
para el día 14 (D14) ---- idem
WHERE
[tabla2].[GRUPO]= "C" OR [tabla2].[GRUPO]= "A";
para el día 15 (D15) ---- idem.
WHERE
[tabla2].[GRUPO]= "A" OR [tabla2].[GRUPO]= "B";
y luego estas otras donde cambiaría el turno y el grupo
Día 12:
SELECT [tabla1].[PAREJA],[tabla1].NOMBRE, FROM [tabla1]
WHERE[tabla1].[D12]="M" OR [tabla1].[D12]="M/T"
UNION SELECT [tabla2].[PAREJA],[tabla2].NOMBRE,FROM [tabla2]
WHERE
[tabla2].[GRUPO]= "A" OR [tabla2].[GRUPO]= "B";
y para el día 13, 14 y 15 volvería hacer los cambios sólo en los grupos
Lo que necesito es "simplicidad"
Utilizo estas consultas en una de selección para sacar datos que utilizaré luego para hacer un informe y tal y como lo he planteado cada día debo cambiar la consulta de unión. Que vale, no hay problema, pero podría ejecutar la consulta sin darme cuenta de haber cambiado la consulta de union para el día correspondiente y tener unos datos que no son lo que deberían ser
Por eso había pensado en si se podría seleccionar
- el turno. Que aparece en los campos D12, D13, D14 entre:
"T o M/T" o
"M o M/T"
- el grupo. Que siempre ha de ser:
"A o B" o
"B o C" o
"A o C"
O, a lo mejor hay una manera de que cuando ejecute la consulta de selección pueda seleccionar qué consulta de unión quiero utilizar (ya que las tengo hechas, je, je)
No sé si así queda más claro
Muchas gracias y un saludo
Se me ocurre una posible solución, si la consulta la lanzas desde un formulario en el que selecciones los parámetros.
La idea sería la siguiente:
Creas un formulario con 3 cuadros combinados: cboDia (4 valores "D12", "D13","D14" y "D15"), cboTurno (2 valores "T o M/T" y "M o M/T") y cboGrupo (3 valores "A o B", "B o C" y "A o C") y un botón para ejecutar la consulta cmdConsulta. Los combos defínelos como "lista de valores" y ponle a mano esos valores, en ese orden y con esas expresiones, pues el código los va a coger tal cual y luego trocearlos para separar sus partes y crear los WHERE.
Al código del botón le pones este código:
Private Sub cmdConsulta_Click 'Compruebas que se han seleccionados los tres parámetros If Nz(Me.cboDia, "") = "" Then MsgBox "Tienes que seleccionar un día", vInformation, "ERROR" Me.cboDia.SetFocus: Exit Sub End If If Nz(Me.cboTurno, "") = "" Then MsgBox "Tienes que seleccionar un turno", vInformation, "ERROR" Me.cboTurno.SetFocus: Exit Sub End If If Nz(Me.cboGrupo, "") = "" Then MsgBox "Tienes que seleccionar un grupo", vInformation, "ERROR" Me.cboGrupo.SetFocus: Exit Sub End If 'Creas la SQL y la cargas en la consulta "C1" Dim miSQL As String miSQL = "SELECT [tabla1].[PAREJA],[tabla1].NOMBRE FROM [tabla1] " _ & "WHERE [tabla1].[" & Me.cboDia & "]='" & Left(Me.cboTurno, 1) & "' OR [tabla1].[" & Me.cboDia & "]='" & Right(Me.cboTurno, 3) & "' " _ & "UNION SELECT [tabla2].[PAREJA],[tabla2].NOMBRE FROM [tabla2] " _ & "WHERE [tabla2].[GRUPO]= '" & Left(Me.cboGrupo, 1) & "' OR [tabla2].[GRUPO]= '" & Right(Me.cboGrupo, 1) & "'" CurrentDb.QueryDefs("C1").SQL = miSQL DoCmd.OpenQuery "C1" End Sub
Para terminar, tendrás que crear una consulta cualquiera llamada "C1", que será la que se modifique por código cada vez que pulses el botón y se abrirá con la consulta de unión de los parámetros seleccionados.
El código obviamente no lo puedo probar, pero debería funcionarte.
Ya me dices. Saludos!
PD: es fácil encontrarme en el otro foro, en el que creo también estás registrada... ;-)
Si no te sale, pon aquí el código para que lo mira a ver si veo dónde falla, o mándame una copia de la BD con las tablas (con algún dato inventado) y el formulario
Dim miSQL As String
MiSQL = "SELECT [salas_p].[PAREJA GRUPAL],[ salas_p].EMPLEO, [salas_p].APELLIDOS,[ salas_p].NOMBRE FROM [salas_p]" _
& "WHERE [salas_p].["&Me.cboDia&"]='"&Left(Me.cboTurno,1)&'"OR [salas_p].["&Me.cboDia&"]='"&Right(Me.cboTurno,3)&'"" _
& "UNION SELECT [salas_c].[PAREJA GRUPAL], [salas_c].EMPLEO, [salas_c].APELLIDOS, [salas_c].NOMBRE FROM [salas_c]" _
& "WHERE [salas_c].[GRUPO]='"&Left(Me.cboGrupo,1)&'" OR [salas_c].[GRUPO]='"&Right(Me.cboGrupo,1)&'""
Currentdb.querydefs("C1").SQL = miSQL
Docmd.openquery "C1"
Por lo que veo, te falta un espacio en blanco antes del UNION y de los 2 WHERE.
También tienes mal las comillas simples (siempre van dentro de las comillas dobles)
E imagino que sería cosa de pegar aquí, pero los & tienen que ir separados del resto.
Te pego aquí la SQL corregida en lo que veo:
miSQL = "SELECT [salas_p].[PAREJA GRUPAL],[salas_p].EMPLEO, [salas_p].APELLIDOS,[salas_p].NOMBRE FROM [salas_p]" _ & " WHERE [salas_p].[" & Me.cboDia & "]='" & Left(Me.cboTurno,1) & "' OR [salas_p].[" & Me.cboDia & "]='" & Right(Me.cboTurno,3) & "'" _ & " UNION SELECT [salas_c].[PAREJA GRUPAL], [salas_c].EMPLEO, [salas_c].APELLIDOS, [salas_c].NOMBRE FROM [salas_c]" _ & " WHERE [salas_c].[GRUPO]='" & Left(Me.cboGrupo,1) & "' OR [salas_c].[GRUPO]='" & Right(Me.cboGrupo,1) & "'"
Ya me dirás.
¡Gracias!
Supongo.. Ahora funciona correctamente pero me he dado cuenta de que no es exactamente lo que quiero.. Seguro que podrías solventarlo pero tengo el tiempo encima y, es más, no se si merece la pena tantas molestias por una gente que nunca me va a valorar nada.. Así que se queda como esta.. Como siempre, un placer Sven.. La próxima en tu foro.. Un abrazo
- Compartir respuesta