Imprimir página | Cerrar ventana

Unir consultas

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=83872
Fecha de impresión: 18/Noviembre/2018 a las 21:40


Tema: Unir consultas
Publicado por: rokoko
Asunto: Unir consultas
Fecha de publicación: 30/Julio/2018 a las 16:35
Buenas.
LLevo un tiempo intentando unir dos consultas en una sola, necesito que sea asi para utilizar una rutina de Mihura para no tener ni tablas ni consultas en access. He esperado a volver de vacaciones a ver si me venia la inspiracion, pero no...Confused

Las dos consultas son estas

1º llamada   Consulta2Cab

SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria, tbFicha.Parque, Sum(tbDetallesFicha.[9Horas]) AS SumaDe9Horas, Count(tbFichaTrabajador.Observaciones) AS CuentaDeObservaciones
FROM (tbFicha INNER JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles) INNER JOIN tbDetallesFicha ON tbFichaTrabajador.Id = tbDetallesFicha.Id_tbFichaTrabajador
GROUP BY tbFicha.Fecha, tbFichaTrabajador.Categoria, tbFicha.Parque
HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaTrabajador.Categoria) Like "Cab*"));



2º llamada  Consulta2MinCab

SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, tbFichaMinimos.Min9Horas
FROM tbFicha INNER JOIN tbFichaMinimos ON tbFicha.id = tbFichaMinimos.IdFicha
WHERE (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaMinimos.Categoria) Like "Cab*"));




Ahora lo tengo asi, pero no puedo utilizar la rutina de Mihura para darle acceso a las tablas, utilizo las dos consultas anteriores, pero como veis en la sql no estan las tablas.

SELECT Consulta2MinCab.Parque, Consulta2MinCab.Min9Horas, Nz([SumaDe9Horas],0) AS 9h, IIf([9h]-[Min9Horas]=0,"OK",[9h]-[Min9Horas]) AS Res9, Consulta2Cab.CuentaDeObservaciones
FROM Consulta2Cab RIGHT JOIN Consulta2MinCab ON (Consulta2Cab.Parque = Consulta2MinCab.Parque) AND (Consulta2Cab.Fecha = Consulta2MinCab.Fecha)
ORDER BY Consulta2MinCab.Parque;



o tambien asi, utilizando la consulta Consulta2Cab, pero no tengo acceso a los nombres de las tablas para esta consulta

SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0,"OK",Nz([SumaDe9Horas],0)-[Min9Horas]) AS Res, tbFichaMinimos.Min9Horas, Nz([SumaDe9Horas],0) AS 9
FROM (tbFichaMinimos LEFT JOIN tbFicha ON tbFichaMinimos.IdFicha = tbFicha.id) LEFT JOIN Consulta2Cab ON (tbFicha.Parque = Consulta2Cab.Parque) AND (tbFicha.Fecha = Consulta2Cab.Fecha)
GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, tbFichaMinimos.Min9Horas, Nz([SumaDe9Horas],0)
HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaMinimos.Categoria) Like "Cab*"));


A ver si se os ocurre algo para unirlas u otra solucion..... recordar que para que pueda utilizar la rutina de Mihura en la consulta final en la sql tienen que estar las tablas....


Saludos







Respuestas:
Publicado por: Mihura
Fecha de publicación: 30/Julio/2018 a las 16:59
Esquemáticamente:

SQL1 = "SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria ..... "
SQL2 = "SELECT tbFicha.Fecha, tbFichaMinimos.Categoria ...."

SQL = "SELECT .... " & _
          "FROM (" & SQL1 & ") AS T1" & _
          "LEFT JOIN (" & SQL2 & ") AS T2 ON T1.xxx = T2.xxx" & _
          "WHERE ...."

Una vez que te funcione ya aplicas el RT_RutaTabla a las tablas de la SQL1 y SQL2.

Por cierto, en vez de HAVING en las dos primeras consultas usa WHERE, es más rápido.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 30/Julio/2018 a las 18:04
uhmmmm!!!  Ire probando.. lo de las 2 sql lo veo claro, pero el junntarlas no tanto. pero podrias ser algo asi??  donde esta en nombre de la consulta poner SQL1  o SQL2..

SELECT Consulta2MinCab.Parque, Consulta2MinCab.Min9Horas, Nz([SumaDe9Horas],0) AS 9h, IIf([9h]-[Min9Horas]=0,"OK",[9h]-[Min9Horas]) AS Res9, Consulta2Cab.CuentaDeObservaciones
FROM Consulta2Cab RIGHT JOIN Consulta2MinCab ON (Consulta2Cab.Parque = Consulta2MinCab.Parque) AND (Consulta2Cab.Fecha = Consulta2MinCab.Fecha)
ORDER BY Consulta2MinCab.Parque;


Publicado por: Mihura
Fecha de publicación: 30/Julio/2018 a las 18:44
No, tanto SQL1 como SQL2 son un string ..  entiendo que lo estás haciendo en un entorno VBA, NO en el diseñador de consultas.



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 31/Julio/2018 a las 00:34
Las consultas las obtengo desde la vista SQL, y las que son muy largas y no caben en una sola linea las hago con un complemento creo que de Chea. De hay van al entorno vba.
En tu ejemplo, el T1, T2 son tablas no?? No me acaba de quedar claro la estructurabde la consulta resultante.......


Publicado por: Mihura
Fecha de publicación: 31/Julio/2018 a las 08:43
Es una consulta con subconsultas incluidas:

SELECT Campo1, Campo2
FROM (SELECT Campo1 FROM Mitabla1) AS T1
LEFT JOIN (SELECT Campo2 FROM Mitabla2) AS T2 ON T1.Id = T2.Id
WHERE ...


Al separarlo (lo que te pongo en el primer post) lo que hago es dejarmelo más claro a la hora de modificarla y simplificar el proceso de montaje y pruebas, ya que así puedes probar cada una por separado.



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 02/Agosto/2018 a las 17:21
Me esta costando bastante entender lo de las subconsultas

De momento voy asi, he armado las consultas necesarias, pero no veo como incluir stSQL1 que es la consulta Consulta2Cab en stSQL que es la que va en el recorsource.
Una ves funcione la Consulta2Cab en entorno vba  le pondre la rutina de Mihura.

Dim stSQL1 As String
Dim stSQL As String


'Esta es  Consulta2Cab 
stSQL1 = ""

stSQL1 = stSQL1 & " SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria, "
stSQL1 = stSQL1 & "    tbFicha.Parque, Sum(tbDetallesFicha.[9Horas]) "
stSQL1 = stSQL1 & "    AS SumaDe9Horas, Count(tbFichaTrabajador.Observaciones) "
stSQL1 = stSQL1 & "    AS CuentaDeObservaciones"
stSQL1 = stSQL1 & " FROM (tbFicha"
stSQL1 = stSQL1 & " INNER JOIN tbFichaTrabajador"
stSQL1 = stSQL1 & " ON tbFicha.id = tbFichaTrabajador.IdDetalles)"
stSQL1 = stSQL1 & " INNER JOIN tbDetallesFicha"
stSQL1 = stSQL1 & " ON tbFichaTrabajador.Id = tbDetallesFicha.Id_tbFichaTrabajador"
stSQL1 = stSQL1 & " GROUP BY tbFicha.Fecha, tbFichaTrabajador.Categoria, "
stSQL1 = stSQL1 & "    tbFicha.Parque"
stSQL1 = stSQL1 & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL1 = stSQL1 & "    AND ((tbFichaTrabajador.Categoria) "
stSQL1 = stSQL1 & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "




stSQL = ""

stSQL = stSQL & " SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz([SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM (" & RT_RutaTabla("tbFichaMinimos") & ""
stSQL = stSQL & " LEFT JOIN " & RT_RutaTabla("tbFicha") & ""
stSQL = stSQL & " ON tbFichaMinimos.IdFicha = tbFicha.id)"
stSQL = stSQL & " LEFT JOIN Consulta2Cab"
stSQL = stSQL & " ON (tbFicha.Parque = Consulta2Cab.Parque) "
stSQL = stSQL & "    AND (tbFicha.Fecha = Consulta2Cab.Fecha)"
stSQL = stSQL & " GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((tbFichaMinimos.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "

Me.RecordSource = stSQL





Publicado por: Mihura
Fecha de publicación: 02/Agosto/2018 a las 17:57
stSQL = stSQL & " SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz([SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM (" & RT_RutaTabla("tbFichaMinimos") & ""
stSQL = stSQL & " LEFT JOIN " & RT_RutaTabla("tbFicha") & ""
stSQL = stSQL & " ON tbFichaMinimos.IdFicha = tbFicha.id)"
stSQL = stSQL & " LEFT JOIN (" & stSQL1 & ") AS T1"
stSQL = stSQL & " ON (tbFicha.Parque = T1.Parque) "
stSQL = stSQL & "    AND (tbFicha.Fecha = T1.Fecha)"
stSQL = stSQL & " GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((tbFichaMinimos.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 02/Agosto/2018 a las 18:34
Ahora si veo mas clara la estructura.
Pero me da error 3131, error en la clausula From

stSQL con Consulta2Cab funciona correctamente.......

Y la stSQL1 tambien, le he puesto un formulario con recordsource para probar  y correcto


Publicado por: Mihura
Fecha de publicación: 02/Agosto/2018 a las 19:46
Tendrás que mirar la calificación de los campos, porque repites las tablas en las dos consultas ... p.ej: T1.SumaHoras 




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 02/Agosto/2018 a las 20:07
Publicado originalmente por Mihura Mihura escribió:

Tendrás que mirar la calificación de los campos, porque repites las tablas en las dos consultas ... p.ej: T1.SumaHoras 

Stern SmileStern Smile  Si, cada consulta lleva sus tablas. Me a sido imposible hacer una unica consulta con el generador de consultas, de hay que tenga que hacerlo apoyandome en una consulta extra.

No puede haber tablas o campos repetidos en SQL???

Entiendo que lo que estoy haciendo, es lo mismo que con una consulta normal pero en sql-vba. Se obtienen los datos de stSQL1 y luego con estos se obtiene los de stSQL

Ahora que parecia que empezaba a ver la luz jajaja



Publicado por: Mihura
Fecha de publicación: 02/Agosto/2018 a las 20:12
Si tienes un campo fecha en más de una tabla tienes que calificarlo:

Tabla1.Fecha       Tabla2.Fecha


Si llamas a una tabla más de una vez en una consulta se usan los alias para diferenciarlas:

SELECT ... FROM Tabla AS T1
SELECT ... FROM Tabla AS T2

y sus campos:   T1.Fecha    T2.Fecha




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 02/Agosto/2018 a las 20:32
El unico campo con el mismo nombre es Categoria, que esta en la tabla  tbFichaMinimos y tbFichaTrabajador, ya lo mirare mas relajadamente

SumaDe9Horas es el resultado de totales de Consulta2Cab.....uffffffWackoWacko


Publicado por: pitxiku
Fecha de publicación: 05/Agosto/2018 a las 17:36
No se trata sólo de si hay 2 campos en tablas distintas que se llamen igual:

- Si la misma tabla la usas en las 2 consultas (o en subconsultas), tienes que usar alias para que Access sepa a cuál te estás refiriendo.

- Si está la misma tabla, habrá campos que aparezcan en varias consultas y subconsultas: tienes que usar/calificar la tabla o alias para que Access muestre/devuelva bien el dato.


Publicado por: rokoko
Fecha de publicación: 06/Agosto/2018 a las 10:58
Buenas!!  no se ni cuantas pruebas he hecho ya.....esta es la ultima. A ver si veis el fallo, o es que no me estoy enterando de nadaConfused

Dim stSQL1 As String
Dim stSQL As String


'Esta es  Consulta2Cab, que va dentro de la stSQL
stSQL1 = ""

stSQL1 = stSQL1 & " SELECT T2.Fecha, T3.Categoria, "
stSQL1 = stSQL1 & "    T2.Parque, Sum(T4.[9Horas]) "
stSQL1 = stSQL1 & "    AS SumaDe9Horas, Count(T3.Observaciones) "
stSQL1 = stSQL1 & "    AS CuentaDeObservaciones"
stSQL1 = stSQL1 & " FROM (tbFicha AS T2"
stSQL1 = stSQL1 & " INNER JOIN tbFichaTrabajador AS T3"
stSQL1 = stSQL1 & " ON T2.id = T3.IdDetalles)"
stSQL1 = stSQL1 & " INNER JOIN tbDetallesFicha AS T4"
stSQL1 = stSQL1 & " ON T3.Id = T4.Id_tbFichaTrabajador"
stSQL1 = stSQL1 & " GROUP BY T2.Fecha, T3.Categoria, "
stSQL1 = stSQL1 & "    T2.Parque"
stSQL1 = stSQL1 & " HAVING (((T2.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL1 = stSQL1 & "    AND ((T3.Categoria) "
stSQL1 = stSQL1 & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "




stSQL = ""


stSQL = stSQL & " SELECT T6.Fecha, T5.Categoria, "
stSQL = stSQL & "    T6.Parque, IIf(Nz(T1.[SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz(T1.[SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, T5.Min9Horas, "
stSQL = stSQL & "    Nz([T1.SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM tbFichaMinimos AS T5"
stSQL = stSQL & " LEFT JOIN tbFicha AS T6"
stSQL = stSQL & " ON T5.IdFicha = T6.id)"
stSQL = stSQL & " LEFT JOIN (" & stSQL1 & ") AS T1"
stSQL = stSQL & " ON (T6.Parque = T1.Parque) "
stSQL = stSQL & "    AND (T6.Fecha = T1.Fecha)"
stSQL = stSQL & " GROUP BY T6.Fecha, T5.Categoria, "
stSQL = stSQL & "    T6.Parque, T5.Min9Horas, "
stSQL = stSQL & "    Nz([T1.SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((T5.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((T5.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "

Me.RecordSource = stSQL



Publicado por: pitxiku
Fecha de publicación: 06/Agosto/2018 a las 18:08
Aparte que en la segunda línea de stSQL no indicas la tabla de origen de [Min9Horas], no veo nada raro. Supongo que te sigue dando el error en la cláusula From.

Puedes hacer una cosa: si las consultas, cuando las creaste en el diseñador funcionaban bien, puedes seguir trabajando ahí y ajustándolas. Si en el diseñador de consultas pulsas sobre el cuadro de una tabla, verás que en la hoja de propiedades aparece la propiedad Alias: ahí puedes establecer el alias para cada tabla. Y puedes usar la vista SQL para agregar la segunda consulta en la cláusula FROM, pasar luego a la vista Diseño y ver qué errores encuentra Access.


Publicado por: rokoko
Fecha de publicación: 06/Agosto/2018 a las 22:36
Publicado originalmente por pitxiku pitxiku escribió:

Aparte.......

Ya he calificado esos campos(Min9Horas) y sigue el error...ya lo mirare mas despacio....




De momento con la ayuda de Mihura voy asi y parece que funciona, ahora es ir poniendo el resto de campos y montando el resto de consultas, que son unas cuantas.  Ya ire contando.....

Me esta resultando bastante dificil entenderlas......


Dim SQL, SQL1 As String, SQL2 As String, SQL3 As String

    SQL1 = "SELECT DISTINCT Id, Parque" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]"
       
    SQL2 = "SELECT Parque, Categoria, Min9Horas, Min10Horas" & _
        " FROM (" & SQL1 & ") AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*'"

    SQL3 = "SELECT Parque, Sum([9Horas]) AS S9,Sum([10Horas]) AS S10, Nz(Count([Observaciones]),0) AS OBS" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE Categoria Like 'Cab*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _
    " GROUP BY Parque"

'Dos formas de poner la consulta
' - sin trocear las dos primeras

    SQL = "SELECT TT1.Parque, IIf(S9-Min9Horas=0, 'Ok', Nz(S9)-Nz(Min9Horas)) AS R9, IIf(S10-Min10Horas=0, 'Ok', Nz(S10)-Nz(Min10Horas)) AS R10, TT2.OBS" & _
        " FROM (SELECT Parque, Categoria, Min9Horas, Min10Horas" & _
        " FROM (SELECT DISTINCT Id, Parque" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*') AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " ORDER BY TT1.Parque"

' - Y esta troceada
    SQL = "SELECT TT1.Parque, IIf(S9-Min9Horas=0, 'Ok', Nz(S9)-Nz(Min9Horas)) AS R9, IIf(S10-Min10Horas=0, 'Ok', Nz(S10)-Nz(Min10Horas)) AS R10, TT2.OBS" & _
        " FROM (" & SQL2 & ") AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " ORDER BY TT1.Parque"
   
    Me.RecordSource = SQL


Publicado por: rokoko
Fecha de publicación: 08/Agosto/2018 a las 09:43
Buenas!! Voy poco a poco, pero me he encontrado ahora con otro problemilla que no soy capaz de resolver, la consulta en si es casi la misma, solo que suma y resta dos criterios  Bom*  y Cab*
Las modificaciones que hago son estas, respecto a la que estan en el post de arriba, le añado el filtro Bom*  y sumo los campos Min9Horas y Min10Horas

SQL3 = "SELECT Parque, Sum([9Horas]) AS S9,Sum([10Horas]) AS S10, Nz(Count([Observaciones]),0) AS OBS" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE Categoria Like 'Cab*'  OR Categoria Like 'Bom*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _
    " GROUP BY Parque"


SQL = "SELECT TT1.Parque, IIf(S9-Sum(Min9Horas)=0, 'Ok', Nz(S9)-Nz(Sum(Min9Horas))) AS R9, IIf(S10-Sum(Min10Horas)=0, 'Ok', Nz(S10)-Nz(Sum(Min10Horas))) AS R10, TT2.OBS" & _
        " FROM (SELECT Parque, Categoria, Min9Horas, Min10Horas" & _
        " FROM (SELECT DISTINCT Id, Parque" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*')  OR Categoria Like 'Bom*' AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " ORDER BY TT1.Parque"



El error que me suelta es se a producido el error 3122  su consulta no incluye la expresion especifica 'Parque'  como parte de una funcion de agregado

No consigo ver en que fallo.....

Saludos


Publicado por: pitxiku
Fecha de publicación: 08/Agosto/2018 a las 17:57
Para SQL, la segunda, en el WHERE de la categoría, tienes que cerrar el paréntesis después del Bom y antes del Alias:

" WHERE Categoria Like 'Cab*'  OR Categoria Like 'Bom*') AS TT1" & _

Otras cosas:

- Ten cuidado con las fechas y los formatos americano <-> español. Suelen dar dolores de cabeza.
- Haces 2 veces la suma de los campos: una para decir si está bien, y otra para ver el resultado. ¿No puede ser sólo una suma?


Publicado por: rokoko
Fecha de publicación: 08/Agosto/2018 a las 20:01
El parentesis lo tenia bien, se me a ido el dedo al hacer un corta y pega, cuando utilizo una sola categoria unicamente en el  WHERE Categoria Like 'Cab*')  AS TT1  por ejemplo,  no hago la suma del campo Min9Horas y funciona correctamente, pero cuando utilizo las dos categorias si que tengo que sumar Min9Horas, hay me salta el error...    no se si te valdra de pista.....



Lo de poner 2 veces la resta es por el IIF, si la resta da 0 pones OK si no pones lo que de las resta.....te refieres a eso?  o a la  sql3??  hay suma horas diferentes.....


SQL3 = "SELECT Parque, HoraFirmas, FirmasOk, Sum([9Horas]) AS S9,Sum([10Horas]) AS S10, Nz(Count([Observaciones]),0) AS OBS" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE Categoria Like 'Cab*' OR Categoria Like 'Bom*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _
    " GROUP BY Parque, HoraFirmas, FirmasOK"



    SQL = "SELECT TT1.Parque, TT2.HoraFirmas, TT2.FirmasOK, IIf(S9-Sum(Min9Horas)=0, 'Ok', Nz(S9)-Nz(Sum(Min9Horas))) AS R9, IIf(S10-Sum(Min10Horas)=0, 'Ok', Nz(S10)-Nz(Sum(Min10Horas))) AS R10, TT2.OBS" & _
        " FROM (SELECT Parque, Categoria, Min9Horas, Min10Horas" & _
        " FROM (SELECT DISTINCT Id, Parque,HoraFirmas, FirmasOK" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*' OR Categoria Like 'Bom*') AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " ORDER BY TT1.Parque"


Publicado por: rokoko
Fecha de publicación: 08/Agosto/2018 a las 20:30
Creo que el fallo puede ser que falte el GROUP BY  en la SQL

Lo pongo asi y ahora el error es otro, aunque pruebo en poner los IIf(S9-Sum(Min9Horas)=0....... de varias formas en GROUP BY  no lo consigo
Error 3122 Su consulta no incluye la expresion especificada IIf(S9-Sum(Min9Horas)=0............como parte de una funcion de agregado

SQL = "SELECT TT1.Parque, TT2.HoraFirmas, TT2.FirmasOK, TT2.OBS, IIf(S9-Sum(Min9Horas)=0, 'Ok', Nz(S9)-Nz(Sum(Min9Horas))) AS R9, IIf(S10-Sum(Min10Horas)=0, 'Ok', Nz(S10)-Nz(Sum(Min10Horas))) AS R10" & _
        " FROM (SELECT Parque, Categoria, Min9Horas, Min10Horas" & _
        " FROM (SELECT DISTINCT Id, Parque,HoraFirmas, FirmasOK" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*' OR Categoria Like 'Bom*') AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " GROUP BY TT1.Parque, TT2.HoraFirmas, TT2.FirmasOK, TT2.OBS" & _
        " ORDER BY TT1.Parque"


Publicado por: pitxiku
Fecha de publicación: 09/Agosto/2018 a las 17:26
Me refiero a que no necesitas hacer la suma 2 veces: 1 para que el Iif sepa cuál de los 2 argumentos tomar, y otra para el resultado que hay que poner en el argumento.

Por otro lado, el propio Access ya ye está diciendo que lo que no sea una suma, conteo, etc., en una consulta de totales, debe ir a la agrupación.

Prueba a colocar las sumas en una serie de campos:

Sum(Min9Horas) AS Suma9Horas, Sum(Min10Horas) AS Suma10Horas

Y luego usa esas sumas en otros campos:

Iif(Nz(S9)-Nz(Suma0Horas)=0, 'OK', Nz(S9)-Nz(Suma9Horas)) AS R9, …

Si así tampoco te deja, tendrás que hacer otro nivel de consultas: una para la consulta de totales, y otra encima para los Iif.


Publicado por: rokoko
Fecha de publicación: 10/Agosto/2018 a las 17:44
Que pelea estoy teniendo con esta consulta, en principio es la ultima que me queda, las demas ya me han ido saliendo, pero esta no hay forma....

SQL3 = "SELECT Parque, HoraFirmas, FirmasOk, Nz(Count([Observaciones]),0) AS OBS, Sum([9Horas]) AS S9" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE Categoria Like 'Cab*' OR Categoria Like 'Bom*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _
    " GROUP BY Parque, HoraFirmas, FirmasOK"

'Dos formas de poner la consulta
' - sin trocear las dos primeras
    SQL = "SELECT TT1.Parque, TT2.HoraFirmas, TT2.FirmasOK, TT2.OBS, Sum(Min9Horas) AS Suma9Horas,IIf(Nz(S9)-Nz(Suma9Horas)=0, 'OK', Nz(S9)-Nz(Suma9Horas)) AS R9" & _
        " FROM (SELECT Parque, Categoria, Min9Horas" & _
        " FROM (SELECT DISTINCT Id, Parque,HoraFirmas, FirmasOK" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*' OR Categoria Like 'Bom*') AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " GROUP BY TT1.Parque, TT2.HoraFirmas, TT2.FirmasOK, TT2.OBS" & _
        " ORDER BY TT1.Parque" 



El error sigue el mismo....me tiene despistado del todo. En verde la ultima modificacion.
https://www.dropbox.com/s/92htqhocnrv0rtc/Error%20access.JPG?dl=0







Esta consulta de abajo funciona perfectamente, solo lleva 1 categoria (Cab*) como filtro y Min9Horas no va sumada, yo tengo que poner las dos categorias como filtro en where y sumar Min9Horas

La 1º letra azul hay que sumarla y la 2º letra azul  y la roja va con este otro filtro Categoria Like 'Cab*'
Le voy poniendo las agrupaciones hasta que me salta el error en el cual me atasco..

SQL3 = "SELECT Parque, Nz(Count([Observaciones]),0) AS OBS, Sum([9Horas]) AS S9”& _

    " FROM (tbFicha" & _

    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _

    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _

    " WHERE Categoria Like 'Cab*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _

    " GROUP BY Parque"

 


    SQL = "SELECT TT1.Parque, TT2.OBS, IIf(S9-Min9Horas=0, 'Ok', Nz(S9)-Nz(Min9Horas)) AS R9 " & _

        " FROM (SELECT Parque, Categoria, Min9Horas" & _

        " FROM (SELECT DISTINCT Id, Parque" & _

        " FROM tbFicha" & _

        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _

        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _

        " WHERE Categoria Like 'Cab*') AS TT1" & _

        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _

        " ORDER BY TT1.Parque"



Saludos


Publicado por: Mihura
Fecha de publicación: 10/Agosto/2018 a las 18:55
Deberías coger solo los datps necesarios en la consulta y las operaciones con los mismos hacerlas en el formulario.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: rokoko
Fecha de publicación: 10/Agosto/2018 a las 20:20
Ya habia pensado eso Mihura, pero son mucho campos y no me convencia..

Pero...no me lo creo ni yo...parece que esta funcionaTongueTongueTongueTongue

Hare mas pruebas, pero parece que pinta bien, no veas que ilusion me ha hecho.


   'H  Horas trabajadas(tbDetallesFicha)  sumadas
   'M  Horas de minimos (tbFichaMinimos)  sumadas
   'R  Resultado de restar H-M
   

    
    'Suma de las horas trabajadas en 2 categorias

    SQL3 = "SELECT Parque, Nz(Count([Observaciones]),0) AS OBS, Nz(Sum([9Horas]),0) AS H9" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE Categoria Like 'Cab*' Or Categoria Like 'Bom*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]" & _
    " GROUP BY Parque"


          'Suma de los minimos de 2 categorias
    SQL = "SELECT TT1.Parque, TT2.OBS, Sum([Min9Horas]) AS M9, H9, IIf(H9-M9=0,'OK',H9-M9) As R9" & _
        " FROM (SELECT Parque, Categoria, Min9Horas" & _
        " FROM (SELECT DISTINCT Id, Parque" & _
        " FROM tbFicha" & _
        " WHERE Fecha = [Formularios]![frmGestionOficial]![txtFecha]) AS T1" & _
        " LEFT JOIN tbFichaMinimos ON T1.id = tbFichaMinimos.IdFicha" & _
        " WHERE Categoria Like 'Cab*' Or Categoria Like 'Bom*') AS TT1" & _
        " LEFT JOIN (" & SQL3 & ") AS TT2 ON TT1.Parque = TT2.Parque" & _
        " GROUP BY TT1.Parque,TT2.OBS, H9" & _
        " ORDER BY TT1.Parque"


Publicado por: rokoko
Fecha de publicación: 11/Agosto/2018 a las 13:47
A la SQL3 le he tenido que poner el filtro WHERE como lo veis en negrita, si no no me filtraba los dias en las dos categorias......Le hare una prueba a fondo a ver que tal.....

SQL3 = "SELECT Parque, Nz(Count([Observaciones]),0) AS OBS, Nz(Sum([9Horas]),0) AS H9" & _
    " FROM (tbFicha" & _
    " LEFT JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles)" & _
    " LEFT JOIN tbDetallesFicha ON tbFichaTrabajador.id = tbDetallesFicha.Id_tbFichaTrabajador" & _
    " WHERE (Categoria Like 'Cab*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha]) OR (Categoria Like 'Bom*' AND Fecha = [Formularios]![frmGestionOficial]![txtFecha])" & _
    " GROUP BY Parque"


        


Publicado por: rokoko
Fecha de publicación: 22/Agosto/2018 a las 18:47
Buenas!!

Ya me van saliendo las consultas en sql con subconsultas, por mi parte se puede cerrar.

Muchas gracias a todos

Saludos



Imprimir página | Cerrar ventana