Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ordenar consulta SQL por campo agregados (https://www.clubdelphi.com/foros/showthread.php?t=84823)

Jose Manuel 10-12-2013 18:32:40

Ordenar consulta SQL por campo agregados
 
Hola, estoy utilizando D2007, ADO y access, en la siguiente consulta SQL quiero:

1º Ordenarla por el campo agregado COSTE1

Si pongo la siguiente instrucción:
Código SQL [-]
fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_coste1');
Da error “No se han especificado valores para alguno de los parámetros requeridos”
He probado con
Código SQL [-]
fdm.ADOQuery_centros.sql.add('order by 10');
pero no hace nada


2º Añadirle una instrucción para que muestre solo los registros si el campo agregado NUEVA_PLAZA es distinto de NULL, al ser un campo agregado no sé si se puede hacer.

Código SQL [-]
fdm.ADOQuery_centros.active:=false;
fdm.ADOQuery_centros.sql.clear;
fdm.ADOQuery_centros.sql.add(
Select   gss1_Entidades_gestoras.c_nif                     AS CIF,      
         gss1_Entidades_gestoras.c_denominacion_corta      AS Entidad,  
         gss2_Centros_concertados.f_titular                AS f_titular,
         gss2_Centros_concertados.n_id_centro_concertado   AS Nº,      
         gss2_Centros_concertados.c_sector                 AS Sector,   
         gss2_Centros_concertados.c_denominacion_corta     AS Centro,
         gss2_Centros_concertados.c_municipio              AS Municipio,
         gss2_Centros_concertados.c_provincia              AS Provincia,

      (Select 
        SUM(gss3_conciertos.n_plazas) AS Nuevas_plazas 
        FROM  gss3_conciertos  
        WHERE gss3_conciertos.n_id_centro = gss2_Centros_concertados.n_id_centro_concertado
          and gss3_conciertos.f_firma_concierto > :f_ultima) AS nueva_plaza, 

      (Select '+#13+
        SUM(gss5_preciosxplaza.n_coste_periodo1 * gss4_Plazas_actuales.n_plazas) AS Coste1 
        FROM  gss4_plazas_actuales INNER JOIN gss5_preciosxplaza ON 
        gss5_preciosxplaza.n_codigo_tarifa = gss4_plazas_actuales.n_codigo_tarifa 
        WHERE  gss4_Plazas_actuales.n_id_centro = gss2_Centros_concertados.n_id_centro_concertado) AS coste1 

FROM gss2_Centros_concertados  INNER JOIN    gss1_entidades_gestoras ON 
     gss2_centros_concertados.n_id_entidad = gss1_entidades_gestoras.n_id_entidad );

fdm.ADOQuery_centros.active:=true;

ecfisa 10-12-2013 18:56:36

Cita:

Empezado por Jose Manuel (Mensaje 470620)
...
Si pongo la siguiente instrucción:
Código SQL [-]
fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_coste1');
Da error “No se han especificado valores para alguno de los parámetros requeridos”
...

Hola Jose Manuel.

Hay varias cosas que me llaman la atención en tu código, pero desconozco si será omisión en el copiado...

Primera duda: ¿ Seguro que el nombre del campo está declarado en la tabla como "gss2_Centros_concertados.c_coste1" ?

Saludos :)

Jose Manuel 10-12-2013 19:35:19

No, en la tabla no hay ningún campo llamado gss2_Centros_concertados.c_coste1, ni en ninguna tabla, ya que se trata de un campo agregado, ese es mi problema. El campo COSTE1 se forma en la consulta. He probado a ordenarlo por el nº de columna (10), pero no funciona cuando el campo es agregado.

Solo consigo ordena la consulta por cualquier de los campos definidos en las tablas.

Código SQL [-]
         gss1_Entidades_gestoras.c_nif                     AS CIF,      
         gss1_Entidades_gestoras.c_denominacion_corta      AS Entidad,  
         gss2_Centros_concertados.f_titular                AS f_titular,
         gss2_Centros_concertados.n_id_centro_concertado   AS Nº,      
         gss2_Centros_concertados.c_sector                 AS Sector,   
         gss2_Centros_concertados.c_denominacion_corta     AS Centro,
         gss2_Centros_concertados.c_municipio              AS Municipio,
         gss2_Centros_concertados.c_provincia              AS Provincia,

Gracias por responderme.
Un saludo.

ecfisa 10-12-2013 20:00:19

Cita:

Empezado por Jose Manuel (Mensaje 470625)

...
El campo COSTE1 se forma en la consulta
.

Hola Jose Manuel.

Al ver tu código me parece que estas confundiendo los nombres de los campos persistentes del componente, con los declarados en la creación de la tabla o los obtenidos en la consulta SQL.

Por dar un ejemplo, podes armar tu consulta de este modo:
Código Delphi [-]
  ADOQuery.SQL.Text := 'SELECT SUM(CAMPO1) AS TOTAL FROM TU_TABLA';
Y luego obtener el valor deseado de este modo:
Código Delphi [-]
     ShowMessage(ADOQuery.FieldByName('TOTAL').AsString);


Pero no podes enviar en la cadena de la consulta el nombre del campo persistente como en el siguiente ejemplo:
Código Delphi [-]
  ADOQuery.SQL.Text := 'SELECT SUM(DataModule1.DataSet1Campo1) AS TOTAL FROM TU_TABLA';
Esto último es erróneo, la base de datos no esta enterada de que o quién es "DataModule1.DataSet1Campo1".

Saludos :)

Jose Manuel 11-12-2013 17:39:59

Gracias de nuevo por contestarme. Yo tengo las siguientes opciones para ordenar la tabla, y todas me funcionan excepto la numero 7

si pongo
Código Delphi [-]
fdm.ADOQuery_centros.sql.add('order by 10');
no da error, pero no hace nada.
si pongo
Código Delphi [-]
fdm.ADOQuery_centros.sql.add('order by gss4_plazas_actuales.coste1');
error:"No se han especificado valores para algunos de los parámetros requeridos."

No sé, si es posible ordenar por un campo calculado de un SubSelect.

Código SQL [-]
case indice of
  1: fdm.ADOQuery_centros.sql.add('order by gss1_Entidades_gestoras.c_nif');
  2: fdm.ADOQuery_centros.sql.add('order by gss1_Entidades_gestoras.c_denominacion_corta, gss2_Centros_concertados.c_provincia');
  3: fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_denominacion_corta');
  4: fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_municipio, gss2_centros_concertados.c_denominacion_corta');
  5: fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_provincia, gss2_Centros_concertados.c_municipio ');
  6: fdm.ADOQuery_centros.sql.add('order by gss2_Centros_concertados.c_provincia, gss2_Centros_concertados.c_municipio ');
  7: fdm.ADOQuery_centros.sql.add('order by gss4_plazas_actuales.coste1');
end;

ecfisa 11-12-2013 18:18:00

Hola Jose Manuel.

¡ Ahora entiendo el orígen de los nombres largos !, por ejemplo gss1_Entidades_gestoras es el nombre de una tabla ¿ correcto ? Me confundió verlos fuera del ' ' en el mensaje #1 (como si no fueran parte de la cadena SQL).

En tu código SQL tenes declarado el parámetro ":f_ultima" y por el tipo de error que mencionas ,entonces pregunto: ¿ Estas asignándole valor a este antes de ejecutar la consulta ?

Ejemplo:
Código Delphi [-]
  ...
  fdm.ADOQuery_centros.Parameters.ParamByName('f_ultima').Value := ( un valor )
  fdm.ADOQuery_centros.Open;

Saludos :)

Jose Manuel 15-12-2013 15:04:01

Duda en ORDER BY campos agregados
 
Hola, si te fijas en el primer post, decia que todo me funcionaba correctamente en mi consulta. La duda que tenia era saber si se podia ordenar el resultado por un campo agregado, es decir construido en el momento de realizar la consulta, teniendo en cuenta que estoy utilizando D2007, ADO y ACCES.

Un saludo y gracias por todo.

fjcg02 15-12-2013 22:42:32

Buenas noches,
quería comentar un par de cosas.

1.- Si no te funciona así, tal y como lo tienes, prueba a sustituir el order by campo por la propia select que lo construye.

algo así

SELECT bla,bla,bla, select sum(campo) from tabla As Campo1
FROM TABLA2
ORDER BY select sum(campo) from tabla

2.- Supongo que puedes sustituir esos campos calculados por unos inner join de las tablas
gss3_conciertos , gss4_plazas_actuales y gss5_preciosxplaza
Si es posible ( no lo sé, tendría que tener más información y tiempo ) no tendrías ningún problema para hacer lo que estás planteando.

No sé, es cuestión de hacer pruebas.

De todas maneras, tendrías que probar en el propio acces a ver si tragan las consultas. Si traga el access, traga ADO, ya que realmente es el "motor de bbdd" el que te pondría trabas.
También me ha ocurrido que ciertas consultas que en otros motores he podido hacer, en access he tenido que hacer subconsultas, ya que el parser no las soporta. Tampoco es tan problemático.

Prueba y nos cuentas.

Saludos y suerte


La franja horaria es GMT +2. Ahora son las 20:44:13.

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