Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ordenar tclientdataset (https://www.clubdelphi.com/foros/showthread.php?t=90424)

mblascog 05-06-2016 10:55:06

Ordenar tclientdataset
 
Buenas,
En otro post gnzsoloyo me ayudó a crear una sentencia sql, para mi, compleja. Como funciona no pienso ni tocar una coma, pero resulta que el resultado de esta consulta la visualizo en un dbgrid, donde se permite ordenar pulsado en el título de la columna.
Al mismo tiempo tengo otra query que cuelga del primero, asignando mastersource, ...
No he encontrado la manera de ordenar dichas sentencias por lo que me he decidido a crear unas tablas virtuales con el resultado y a partir de aquí he pensado que lo tendría todo resuelto, pero no.

He usado, primero JvMemoryData de las Jedi, pero no hay la propiedad MasterSource y sí SortedOnFields.
Como necesito las dos he probado TClientDataSet, este te permite MasterSource, pero no veo la manera de ordenar los campos.

Alguna ayudita! Gracias

Ñuño Martínez 05-06-2016 11:45:51

El orden inicial de los campos es el indicado en la consulta. Cambiando el orden en el que aparecen en la consulta SQL cambiará el orden en la tabla. No se me ocurre otra solución.

mblascog 05-06-2016 11:54:37

Gracias Ñuño

mblascog 05-06-2016 12:21:26

Se me ha pasado el tiempo para poder editar el anterior post, por lo que he tenido que crear uno nuevo

Si así no se puede, tendré que volver al inicio e intentar crear en tiempo de ejecución las sentencias sql.

La sentencia sql es la siguiente:

Código SQL [-]
SELECT  idclient,  client,  concepte, historic,  directori,  idtasca,  idestat,  datavenciment,  estat,  color
FROM 
    (SELECT c.id idclient, c.client, t.concepte, t.historic, c.directori, t.id idtasca, e.id idestat, s.datavenciment, e.estat, e.color
    FROM clients c 
            INNER JOIN tasques t ON t.idclient = c.id
            INNER JOIN subtasques s ON s.idtasca = t.id
            INNER JOIN estat e ON s.idestat = e.id
    ORDER BY c.client ASC, s.datavenciment DESC) t1
GROUP BY client, idtasca

Y devuelve estos registros:


De estos registros, solo muestro en un dbgrid Client, Concepte y Estat. Y éstos son los únicos campos por los que en un momento dado tendré que ordenar
- por client, ya está, ya que esta misma ordena por client
- por concepte, la ha modificado así, y también funciona:

Código SQL [-]
SELECT  idclient,  client,  concepte, historic,  directori,  idtasca,  idestat,  datavenciment,  estat,  color
FROM 
    (SELECT c.id idclient, c.client, t.concepte, t.historic, c.directori, t.id idtasca, e.id idestat, s.datavenciment, e.estat, e.color
    FROM tasques t 
            INNER JOIN subtasques s ON t.id = s.idtasca
            INNER JOIN clients c ON t.idclient = c.id
            INNER JOIN estat e ON s.idestat = e.id
    ORDER BY t.concepte ASC, s.datavenciment DESC) t1
GROUP BY concepte

- en cambio, por estat, no.
Código SQL [-]
SELECT  idclient,  client,  concepte, historic,  directori,  idtasca,  idestat,  datavenciment,  estat,  color
FROM 
    (SELECT c.id idclient, c.client, t.concepte, t.historic, c.directori, t.id idtasca, e.id idestat, s.datavenciment, e.estat, e.color
    FROM estat e 
            INNER JOIN subtasques s ON s.idestat = e.id
            INNER JOIN tasques t ON t.id = s.idtasca
            INNER JOIN clients c ON t.idclient = c.id
    ORDER BY e.estat ASC, s.datavenciment DESC) t1
GROUP BY estat

- el registro con Client2 sale duplicado y no aparece uno cuyo cliente es Didac (habría de haber 2 con Didac)



Gracias por vuestra ayuda

mblascog 05-06-2016 13:59:25

Yo misma me contesto:

Código SQL [-]
SELECT idclient, client, concepte, historic, directori, idtasca, idestat, datavenciment, estat, color
FROM
  (SELECT c.id idclient, c.client, t.concepte, t.historic, c.directori, t.id idtasca, e.id idestat, s.datavenciment, e.estat, e.color
  FROM subtasques s, clients c, tasques t, estat e      
  WHERE s.idtasca = t.id AND s.idestat = e.id AND t.idclient = c.id
  ORDER BY idtasca,s.datavenciment DESC) t1
GROUP BY idtasca
ORDER BY estat

Y sólo tengo que cambiar el ORDER BY por el campo que tengo que ordenar.

Seguro que es muy fácil para los que entendeis, pero yo que no domino, mis horas me ha costado (no hay mal que por bien no venga .... a la próxima tardaré menos)
Gracias.

ecfisa 06-06-2016 15:21:21

Hola mblascog.

Me alegro que lo solucionaras ^\||/, pero creo que también te podrían resultar interesantes estos enlaces:
Saludos :)


La franja horaria es GMT +2. Ahora son las 18:26:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi