Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Consulta Desde->Hasta (https://www.clubdelphi.com/foros/showthread.php?t=58743)

Luis M. 30-07-2008 16:31:29

Consulta Desde->Hasta
 
Saludos.

Pongo esta imagen para que os hagáis una idea de lo que quiero hacer.



Al pulsar el botón "Buscar" lanzo la siguiente consulta:

Código Delphi [-]
procedure TFiltroEntradaPelotas.BTBuscarClick(Sender: TObject);
var
  cPath: string;
  anyo,mes,dia: Word;
  cFecha1,cFecha2: string;
begin
  DecodeDate(DesdeFecha.Date,anyo,mes,dia);
  cFecha1 := IntToStr(anyo)+'-'+IntToStr(mes)+'-'+IntToStr(dia);
  DecodeDate(hastaFecha.Date,anyo,mes,dia);
  cFecha2 := IntToStr(anyo)+'-'+IntToStr(mes)+'-'+IntToStr(dia);

  QEntradaPelotas.Close;
  QEntradaPelotas.SQL.Text := 'Select * From ENTRADAPELOTAS Where (NUMERO >= '+ QuotedStr(DesdeEntrada.Text)+
                              ') and (NUMERO <= '+ QuotedStr(HastaEntrada.Text)+') and ('+
                              'FECHAENTRADA >= '+QuotedStr(cFecha1)+') and (FECHAENTRADA <= '+
                              QuotedStr(cFecha2)+') and ( MARCA >= '+QuotedStr(DesdeMarca.Text)+
                              ') and (MARCA <= '+QuotedStr(HastaMarca.Text)+') ORDER BY NUMERO';

  QEntradaPelotas.Open;

  cPath := ExtractFilePath(Application.ExeName);
  frxReport1.LoadFromFile(cPath + 'REPORTS\' + 'ListadoEntradasPelotasPorNumero.fr3');
  frxReport1.ShowReport;
end;

La consulta funciona bien, siempre y cuando rellene todos los "Edits".
Lo que quiero conseguir, es qué si se deja por ejemplo en blanco los Edits
Desde Nº de entrada y Hasta Nº de entrada, o cualquier otro. En la
consulta, me salga todos los datos de los Edits que no he rellenado.
La base de datos es Firebird 2.0.4
Si Tenéis cualquier idea o sugerencia al respecto, os lo agradecería.

Un saludo.

Neftali [Germán.Estévez] 30-07-2008 16:39:58

¿Y no puedes comprobar antes de ejecutar la consulta si los han rellenado o no?

En la consulta utiliza una variable _Desde, por ejemplo y haces la comprobación:

Código Delphi [-]
if (DesdeEntrada.Text = '') then begin
  _Desde := '00000';
end
else begin
  _Desde := DesdeEntrada.Text;
end;

// Luego en la consulta donde tienes DesdeEntrada.Text lo cambias por _Desde

No se si me expliqué bien; Igual para el campo Hasta.

enecumene 30-07-2008 16:42:03

Hola, si he entendido bien, ¿por qué no usas consultas anidadas if...Then?


Saludos.

Edito: Neftalí ya contestó :D

juanelo 30-07-2008 16:44:36

No se si el lo mismo que dice Enecumene, pero ¿porque no lo evaluas en tu aplicacion, para armar la sentencia correcta?
Saludos

Luis M. 30-07-2008 17:10:40

Gracias por responder.
Este es un "Filtro sencillo", pero tengo que desarrollar algunos con
muchos edits como estos.
Si son todos "Desde->Hasta", más o menos los puedo resolver como
dice Neftali, pero el problema me surge cuando por por ejemplo
hay uno o varios edits que solo comparan un resultado.
Por ejemplo:

Si no relleno el número de factura, la consulta no devuelve nada.
Este es sencillo y se puede resolver bien, pero tengo que hacer algunos
filtros que pueden tener varios edits como estos, y aquí es donde me
encuentro que no se como resolverlo sin tener que prepara muchos If Then

Muchas gracias por vuestra ayuda.

Un saludo.

RolphyReyes 30-07-2008 18:15:33

Saludos.

Una idea podría ser, pones tu sentencia SELECT dentro del Editor de SQL en tu componente Query así:
Código SQL [-]
Select * From ENTRADAPELOTAS 
Where NUMERO >= COALESCE(:DNUMERO, NUMERO) 
and   NUMERO <= COALESCE(:HNUMERO, NUMERO)
and   FECHAENTRADA >= COALESCE(:DFECHA, FECHAENTRADA)
and   FECHAENTRADA <= COALESCE(:HFECHA, FECHAENTRADA)
and   MARCA >= COALESCE(:DMARCA, MARCA)
and   MARCA <= COALESCE(:HMARCA, MARCA)
ORDER BY NUMERO

Ahí tienes todos tus parámetros, luego en Delphi:
Código Delphi [-]
With QEntradaPelotas, Params do
begin
  Close;
  ParamByName('DNUMERO').Value := Null;
  ParamByName('HNUMERO').Value := Null;
  .
  .
  .
end;

Luego a medida que tienes valores se lo pasas y los que no se
queda nulos y el COALESCE se encarga de dejarlo en blanco.

A recomendación trata de no tener ningún componente desendiente
de TDataSet en la presentación (formularios) trata de ponerlos
en un DataModule.

Luis M. 30-07-2008 19:40:34

Hola RolphyReyes.
Gracias por responder.
Probaré tú código a ver que tal me va.

Cita:

Empezado por RolphyReyes (Mensaje 304472)
A recomendación trata de no tener ningún componente desendiente
de TDataSet en la presentación (formularios) trata de ponerlos
en un DataModule.

Gracias por la recomendación.
Siempre suelo ponerlo en un DataModule, esto ha sido una pequeña excepción.:D

Nuevamente gracias por tu aporte.
Un saludo.


La franja horaria es GMT +2. Ahora son las 20:52:38.

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