Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Filtrar por fecha dinamicamente sql y delphi7 (https://www.clubdelphi.com/foros/showthread.php?t=66991)

jandres 23-03-2010 15:59:40

Filtrar por fecha dinamicamente sql y delphi7
 
Saludos tengo un sistema de personal donde me gustaria filtrar por fecha una base de datos utilizo sql y delphi 7 me gustaria poder hacer un filtro dinamico que pueda seleccionar en un datetimepicker la fecha y que me filtre la tabla por esa feha pero es que no se como hacer lo en codigo solo tengo la idea

si pueden ayudar me

Gracias una vez mas.

maeyanes 23-03-2010 16:25:56

Hola...

Podrías hacer algo como esto:

Código Delphi [-]
procedure TMyForm.DateSearch(ADate: TDate; AQuery: TQuery);
begin
  AQuery.Close;
  AQuery.SQL.Text := 'select * from Tabla where Fecha = :Fecha';
  AQuery.ParamByName('Fecha').AsDate := ADate;
  AQuery.Open
end;

Este método recibe dos parámetros, la fecha que quieres usar para filtrar tu tabla y un objeto TQuery que es sobre el que quieres hacer el filtro...

Para llamarlo desde una forma que tenga un TDateTimePicke, un TDBGrid, un TQuery, un TDataSource y un TButton haces esto:

Código Delphi [-]
procedure TmyForm.Button1Click(Sender: TObject);
begin
  DateSearch(DateTimePicker1.Date, Query1)
end;


Saludos...

afunez2007 23-03-2010 16:36:23

Das muy pocos datos, no dices si estas trabajando con alguna tabla en un grid o con una quer??

Te puedo dar un par de consejos:

Lo puedes hacer con un boton despues de seleccionar la fecha o en el evento OnCloseUp del datetime picker y podria ser algo asi como:

Si lo haces con un query:
Código Delphi [-]
Query1.Active:=False;
Query1.SQL.Text:'SELECT *FROM TUTABLA WHERE 
FECHA='+QuotedStr(DateToStr(DateTimePicker1.Date));
Query1.Active:=True;

Si lo haces con un TTable:
Código Delphi [-]
Table1.Active:=False;
Table1.Filtered:=False;
Table1.Filter:='FECHA='+QuotedStr(DateToStr(DateTimePicker1.Date));
Table1.Filtered:=True;
Table1.Active:=True;

Espero te sirvan estas ideas

Saludos

userdelphi 04-12-2010 22:53:43

quiero filtrar una fecha en un dateTimePicker1
 
hola,he leido muchos foros aca adentro y no logro encontrar mi error, necesito ayuda, primero, uso BD access el campo "fecha" es de fecha/hora, utilizo AdoQuery en delphi, un dateTimePicker, un dbgrid y para indicar el filtro seria eligiendo desde el dateTimePicker y luego presionar un button.

intente cambiar formato, ya q en mi BD se almacena dd/mm/aaaa y en el dbgrid se ve mm/dd/aaaa, eso me funciono, ya que el valor lo hacia copiar en un edit, tamb intente crear una variable vfecha y darle el valor del dateTimePicker convirtiendolo, pero se me rompe en la condicion q le doy para el sql.
he leido de hacer parametros, eso nunca lo vi en clases, me explicarian como se asigna y si se debe declarar en la seccion VAR???

aca les mando una parte del codigo.... no se asusten ya que lo que he encontrado lo ponia ahi, y comentaba y descomentaba.

si alguien me ayuda a ordenar eso se lo agradezco,
de ser asi, aun denme el fragmento de codigo y si debo declarar algo en la seccion var o donde , gracias

esto es: (hoy un desorden jaja)

procedure TFormListadoVentas.ButtonfiltrofechaClick(Sender: TObject);
var
vFecha:String;
begin
//ShortDateFormat:= 'd/m/yyyy';
vFecha:=FormatDateTime('dd/mm/yyyy',dateTimePicker1.DateTime);//Componente Month Calendar
//el formato lo puedes cambiar a dd/mm/yyyy o mm/dd/yyyy
editfiltrofecha.Text := vfecha;

formlistadoVentas.ADOQueryFiltro.Active := false;
// Utilizamos quotedString para ponerle comillas simple a la cadena (en el caso que sea de tipo string ;) )
FormListadoVentas.AdoQueryFiltro.SQL.Text := 'SELECT * FROM tVentas WHERE Fecha ='+quotedstr(xfecha);
ParamByName('xFecha').AsDate := DateTimePicker1.Date;


formlistadoVentas.ADOQueryFiltro.Active := true;

FormListadoVentas.dbgridVentas.DataSource := datasourceFiltro;
FormListadoVentas.DBNavigator1.DataSource := datasourceFiltro;
end;


se los agradezco, como veran saque mucho de aca, y aun los comentarios de quien posteo estan , help me, please

gracias ,

Vales08 24-11-2011 14:00:28

Cita:

Empezado por maeyanes (Mensaje 357942)
Hola...

Podrías hacer algo como esto:

Código Delphi [-]
procedure TMyForm.DateSearch(ADate: TDate; AQuery: TQuery);
begin
  AQuery.Close;
  AQuery.SQL.Text := 'select * from Tabla where Fecha = :Fecha';
  AQuery.ParamByName('Fecha').AsDate := ADate;
  AQuery.Open
end;

Este método recibe dos parámetros, la fecha que quieres usar para filtrar tu tabla y un objeto TQuery que es sobre el que quieres hacer el filtro...

Para llamarlo desde una forma que tenga un TDateTimePicke, un TDBGrid, un TQuery, un TDataSource y un TButton haces esto:

Código Delphi [-]
procedure TmyForm.Button1Click(Sender: TObject);
begin
  DateSearch(DateTimePicker1.Date, Query1)
end;


Saludos...



Muy buen dia a todos, estuve buscando sobre como filtrar un dbgrid con la fecha seleccionada de un datetimepicker y encontre este hilo..
Lo que me gustaria saber es donde pones este código:

Código Delphi [-]
procedure TMyForm.DateSearch(ADate: TDate; AQuery: TQuery);
begin
  AQuery.Close;
  AQuery.SQL.Text := 'select * from Tabla where Fecha = :Fecha';
  AQuery.ParamByName('Fecha').AsDate := ADate;
  AQuery.Open
end;

Desde ya muchas gracias..
Saludos!!

ecfisa 24-11-2011 18:03:26

Cita:

Empezado por Vales08 (Mensaje 419330)
Lo que me gustaria saber es donde pones este código

Hola.

Bueno depende del efecto que busques, por ejemplo:

Si deseas que se vaya filtrando a medida que se producen cambios en el TDateTimePicker:
Código Delphi [-]
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin
  DateSearch(Query, DateTimePicker1.Date);
end;

Si deseas que lo haga al salir del TDateTimePicker:
Código Delphi [-]
procedure TForm1.DateTimePicker1Exit(Sender: TObject);
begin
  DateSearch(Query, DateTimePicker1.Date);
end;

O si deseas que el filtrado se decida manualmente:
Código Delphi [-]
procedure TForm1.btnFiltrarClick(Sender: TObject);
begin
  DateSearch(Query, DateTimePicker1.Date);
end;
También podría ser filtrado en el evento OnCloseUp del TDateTimePicker, ...

Saludos.

maeyanes 24-11-2011 18:55:48

Hola...

ecfisa, yo creo que más bien se refiere a donde coloca el código del método y no desde donde hace la llamada al método...

En dado caso, sería algo así:

Código Delphi [-]
// Declaración del tipo TMyForm:
type
  TMyForm = class(TForm)
    // Componentes agregados al formulario y eventos del mismo...
  private
    // Como solo se va a usar en este formulario lo declaramos en la sección private
    procedure DateSearch(ADate: TDate; AQuery: TQuery);
  end;

implementation

procedure TMyForm.DateSearch(ADate: TDate; AQuery: TQuery);
begin
  AQuery.Close;
  AQuery.SQL.Text := 'select * from Tabla where Fecha = :Fecha';
  AQuery.ParamByName('Fecha').AsDate := ADate;
  AQuery.Open
end;

end.


Saludos...

ecfisa 24-11-2011 19:55:46

Cita:

Empezado por maeyanes (Mensaje 419347)
yo creo que más bien se refiere a donde coloca el código del método y no desde donde hace la llamada al método...

No había pensado en eso, pero es muy posible... ;)

Saludos.

Vales08 24-11-2011 21:04:29

Muchas gracias por sus respuestas... En realidad tiene razon maeyanes pero igual no estaba de mas la explicacin de ecfisa...
Yo quería saber donde iba el código del método, porque no soy muy ducha en esto y nunca había utilizado un método..
Pero ya me sacaron la duda..

Muchas gracias..

Vales08 25-11-2011 15:15:38

Buen dia..
Eh estado aplicando los códigos como me han dicho

Código Delphi [-]
  private
    { Private declarations }
    procedure DateSearch(ADate: TDate; AQuery: TIBQuery);
  public
    { Public declarations }
  end;


Código Delphi [-]
procedure TAgenda_de_turnos.DateSearch(ADate: TDate; AQuery: TIBQuery);
begin
  DM.Q_agen_tur.Close;
  DM.Q_agen_tur.SQL.Add('select * from AGENDAS_TURNOS where FECHA = :fecha');
  DM.Q_agen_tur.ParamByName('fecha').AsDate := Date;
  DM.Q_agen_tur.Open;
end;


Código Delphi [-]
procedure TAgenda_de_turnos.Buscar_fechaClick(Sender: TObject);
begin
  DateSearch(fecha_turno.Date, DM.Q_agen_tur)
end;


Pero me salta el siguiente error, cuando presiono el boton (donde llamo al metodo DateSearch)
Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EIBInterBaseError with message 'Dynamic SQL Error
SQL error code = -104
Token unknown - line 2, char 1
select'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Necesito saber porque salta ese error, que estoy haciendo mal... Muchas gracias

oscarac 25-11-2011 15:33:49

estas seguro (a) que el parametro (el valor) se llama Date?
no deberia ser ADate??

Vales08 25-11-2011 15:38:26

Me fije bien y en esta codigo, solamente me toma Date..

Código Delphi [-]
procedure TAgenda_de_turnos.Buscar_fechaClick(Sender: TObject);
begin
  DateSearch(fecha_turno.Date, DM.Q_agen_tur);
end;

Pero a este codigo si cambie Date por ADate.. Yo le habia puesto Date, porque a ADate no me lo tomaba..

Código Delphi [-]
procedure TAgenda_de_turnos.DateSearch(ADate: TDate; AQuery: TIBQuery);
begin
  DM.Q_agen_tur.Close;
  DM.Q_agen_tur.SQL.Add('select * from AGENDAS_TURNOS where FECHA = :fecha');
  DM.Q_agen_tur.ParamByName('fecha').AsDate := ADate;  //aqui modifique
  DM.Q_agen_tur.Open;
end;


Pero el error me sigue saltando de igual manera y en el mismo lugar..

oscarac 25-11-2011 15:46:50

antes de esta linea
Código Delphi [-]
DM.Q_agen_tur.SQL.Add('select * from AGENDAS_TURNOS where FECHA = :fecha');

agregale por siacaso
Código Delphi [-]
 
DM.Q_agen_tur.SQL.clear;

maeyanes 25-11-2011 15:57:26

Hola...

El error te está indicando que el token select es desconocido, esto te sucede por que estás usando el método Add cada vez que usas el método, entonces lo que te hace es agregar una línea más. Esto es:

Código:

1era vez que usas el método DateSearch:
DM.Q_agen_tur.SQL.Strings[0] := 'select * from AGENDAS_TURNOS where FECHA = :fecha'

2da vez que usas el método DateSearch:
DM.Q_agen_tur.SQL.Strings[0] := 'select * from AGENDAS_TURNOS where FECHA = :fecha'
DM.Q_agen_tur.SQL.Strings[1] := 'select * from AGENDAS_TURNOS where FECHA = :fecha'

Esto genera una consulta SQL de este tipo:

Código SQL [-]
select * from AGENDAS_TURNOS where FECHA = :fecha
select * from AGENDAS_TURNOS where FECHA = :fecha

Si te fijas, el código origina que yo puse usa la propiedad Text:

Código Delphi [-]
AQuery.SQL.Text := 'select * from Tabla where Fecha = :Fecha';

Otro detalle que noto es que haces uso del componente Q_agen_tur directamente en el código del método, lo cual no debería ser ya que para eso está el parámetro AQuery.



Saludos...

Vales08 25-11-2011 15:58:12

Claro me falto esa linea de codigo, ahora no me salta mas el error..
El problema ahora es que no me busca, me muestra la grilla vacia...

Tiene algo que ver la forma en que yo cargue las fechas..???
Porque yo a las fechas no las cargaba con el datetimepicker, directamente las cargada desde un dbedit, conectado al campo FECHA de la tabla AGENDA_TURNOS..
El campo FECHA, tiene la propiedad EditMask a la cual yo le puse Date, para que tome el formato '__/__/__'.

No se la verdad porque no me busca..

Vales08 25-11-2011 16:02:07

Ahh ok, entonces interprete mal el codigo, ahora veo si lo soluciono....
Yo utilice el Add tambien porque en las consultas siempre utilice esa forma, pero voy a hacer como vos me decis maeyanes asi corroboro que este alli el problema..

Muchas gracias por sus respuestas..


La franja horaria es GMT +2. Ahora son las 05:00:05.

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