Ir al contenido


Foto

filtrando por fechas

delphi

  • Por favor identifícate para responder
31 respuestas en este tema

#21 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 27 junio 2018 - 01:16

Cuando haces uniones necesitas alias. Por lo que veo, y entiendo, tu pretendes algo como:


sql
  1. SELECT Sub.Desde, Sub.hasta, Sub.Empresa
  2. FROM(
  3. SELECT fechadesde1 AS desde, fechahasta1 AS Hasta, Empresa1 AS Empresa
  4. FROM tabla1
  5. WHERE fechahasta1 BETWEEN :fecha1 AND :fecha2
  6. UNION ALL
  7. SELECT fechadesde2 AS desde, fechahasta2 AS Hasta, Empresa2 AS Empresa
  8. FROM tabla2
  9. WHERE fechahasta2 BETWEEN :fecha1 AND :fecha2
  10. UNION ALL
  11. SELECT fechadesde3 AS desde, fechahasta3 AS Hasta, Empresa3 AS Empresa
  12. FROM tabla3
  13. WHERE fechahasta3 BETWEEN :fecha1 AND :fecha2
  14. ) AS Sub
  15. ORDER BY hasta

Observa como si bien cada subconjunto que se va a unir tiene diferentes campos, todos comparten el mismo alias. Esto es fundamental cuando uno va a hacer unión. ¡Los campos deben conservar el mismo nombre!

Además, no es lo mismo hacer un order by fechahasta3 dentro de la unión. ¿No será que quieres ordenar el conjunto ya con el union? Si es así:

1) Armas tu conjunto de datos con las uniones

2) Luego ordenas

 

Y para esto se recomiendo hacerlo por subconsulta, observa como la subconsulta trae el conjunto y ordeno en la consulta maestra refenciando por el campo alias.

 

Admito que no he probado la consulta SQL propiamente en mi motor, pero debería de andar.

 

Saludos,


  • 0

#22 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 27 junio 2018 - 04:31

El error está en que se juntan las cadenas entre union all y select quedando pegadas:


delphi
  1. Query.SQL.Add('select * from tabla1'+
  2. 'union all'+
  3. 'select * from tabla2');
  4.  
  5. //Esto resulta en select * from tabla1union allselect * from tabla2
  6. //lo ideal sería agregar un espacio en cada línea así
  7.  
  8. Query.SQL.Add('select * from tabla1 '+ //¿ves el espacio al final?
  9. 'union all '+ //¿ves el espacio al final?
  10. 'select * from tabla2');

Saludos


  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 junio 2018 - 04:33

El error está en que se juntan las cadenas entre union all y select quedando pegadas:


delphi
  1. Query.SQL.Add('select * from tabla1'+
  2. 'union all'+
  3. 'select * from tabla2');
  4.  
  5. //Esto resulta en select * from tabla1union allselect * from tabla2
  6. //lo ideal sería agregar un espacio en cada línea así
  7.  
  8. Query.SQL.Add('select * from tabla1 '+ //¿ves el espacio al final?
  9. 'union all '+ //¿ves el espacio al final?
  10. 'select * from tabla2');

Saludos

 

Cierto. Hay un error en la formación de la cadena.

Aunque tampoco invalida mi punto: si se va a hacer uniones, hay que tener presente el nombre de los campos, y sobre todo de los tipos.

Ni que decir, que es casi un pecado mortal invocar uniones cuando se pretende hacer select *.

Hay que asegurarse de que los campos sean del mismo tipo, en el mismo orden de aparición.

 

Por ello es que yo he propuesto una consulta basada en el uso de alias y limitar a los campos que realmente se necesiten. Y además, si se pretende hacer un ordenamiento del conjunto de datos, este debe hacerse "fuera" de la unión. Lo cual ya sugiere el uso de consultas unidadas.

 

Saludos,


  • 0

#24 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 02 julio 2018 - 01:00

El error está en que se juntan las cadenas entre union all y select quedando pegadas:


delphi
  1. Query.SQL.Add('select * from tabla1'+
  2. 'union all'+
  3. 'select * from tabla2');
  4.  
  5. //Esto resulta en select * from tabla1union allselect * from tabla2
  6. //lo ideal sería agregar un espacio en cada línea así
  7.  
  8. Query.SQL.Add('select * from tabla1 '+ //¿ves el espacio al final?
  9. 'union all '+ //¿ves el espacio al final?
  10. 'select * from tabla2');

Saludos

lo probe de esa forma ahora me dice que el parametro fecha no funicona


  • 0

#25 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 02 julio 2018 - 01:12

Cuando haces uniones necesitas alias. Por lo que veo, y entiendo, tu pretendes algo como:


sql
  1. SELECT Sub.Desde, Sub.hasta, Sub.Empresa
  2. FROM(
  3. SELECT fechadesde1 AS desde, fechahasta1 AS Hasta, Empresa1 AS Empresa
  4. FROM tabla1
  5. WHERE fechahasta1 BETWEEN :fecha1 AND :fecha2
  6. UNION ALL
  7. SELECT fechadesde2 AS desde, fechahasta2 AS Hasta, Empresa2 AS Empresa
  8. FROM tabla2
  9. WHERE fechahasta2 BETWEEN :fecha1 AND :fecha2
  10. UNION ALL
  11. SELECT fechadesde3 AS desde, fechahasta3 AS Hasta, Empresa3 AS Empresa
  12. FROM tabla3
  13. WHERE fechahasta3 BETWEEN :fecha1 AND :fecha2
  14. ) AS Sub
  15. ORDER BY hasta

Observa como si bien cada subconjunto que se va a unir tiene diferentes campos, todos comparten el mismo alias. Esto es fundamental cuando uno va a hacer unión. ¡Los campos deben conservar el mismo nombre!

Además, no es lo mismo hacer un order by fechahasta3 dentro de la unión. ¿No será que quieres ordenar el conjunto ya con el union? Si es así:

1) Armas tu conjunto de datos con las uniones

2) Luego ordenas

 

Y para esto se recomiendo hacerlo por subconsulta, observa como la subconsulta trae el conjunto y ordeno en la consulta maestra refenciando por el campo alias.

 

Admito que no he probado la consulta SQL propiamente en mi motor, pero debería de andar.

 

Saludos,

cuando uno las tablas con el '' union all'' en la grilla me aparece los registros de las diferentes tablas 


  • 0

#26 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 julio 2018 - 01:42

A ver, postea el código nuevamente tal como lo tienes ahora mismo, y la consulta que quieres filtrar.


  • 0

#27 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 02 julio 2018 - 02:52

A ver, postea el código nuevamente tal como lo tienes ahora mismo, y la consulta que quieres filtrar.


delphi
  1. query.close;
  2.  
  3. query.sql.clear;
  4. query.sql.add ('select * from emprsa1 where coberturafechahasta1>= : fecha1 and coberturafechahasta1 <= fecha2 '+ 'union all '+
  5. ' select * from empresa2 where coberturafechahasta2 >= : fecha1 and coberturafechahasta2 <= fecha2 '+ 'union all '+
  6. select * from empres3 where coberturafechahasta3 >= : fecha1 and coberturafechahasta3 <= fecha2 ');
  7. query.params.ParamByName('fecha1').Value := FormatDateTime('yyyy/mm/dd',Datetimepicker1.Date);
  8. query.Params.ParamByName('fecha2').Value := FormatDateTime('yyyy/mm/dd',Datetimepicker2.Date);
  9. query.open;


Editado por enecumene, 02 julio 2018 - 05:09 .
Colocación etiquetas

  • 0

#28 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 julio 2018 - 04:10

El ojo de Halcón, sin necesidad de probarlo, me dice que te faltan los dos puntos para el parámetro fecha2.

Saludos
  • 0

#29 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 02 julio 2018 - 04:36

El ojo de Halcón, sin necesidad de probarlo, me dice que te faltan los dos puntos para el parámetro fecha2.

Saludos

si jajaj, lo vi y los agregue para ver si ese era el problema pero sigue dando el mismo error


  • 0

#30 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 109 mensajes

Escrito 02 julio 2018 - 05:05

En fecha1 sobra un espacio entre : y fecha1

 

 

coberturafechahasta1>= : fecha1

 en las 3 veces que utilizas fecha1.


  • 0

#31 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 julio 2018 - 05:12

Eso es porque la cadena se corta en el segundo union all, falta una comilla simple al inicio del select despúes del segundo union all, aparte de lo comentado por Delphius y Gaston.


  • 0

#32 the walrus

the walrus

    Advanced Member

  • Miembros
  • PipPipPip
  • 60 mensajes

Escrito 02 julio 2018 - 05:39

ya lo pude solucionar muchas gracias a todos por la ayuda 


  • 0





Etiquetado también con una o más de estas palabras: delphi

IP.Board spam blocked by CleanTalk.