Localizar registros por data no delphi
Preciso de ajuda para localizar eventos por data no delphi, tenho um MaskEdit onde o usuario deve digitar a data do evento procurado, e esta data devera ser localizada em uma tabela de eventos(tb_eventos) em formato paradox, e mostrada em um DBGrid. Usei o comando Locate(<tabela>.Locate) porem a data é incompativel com string,
já tentei o strtodate e vice-versa, mas não consegui fazer a busca funcionar.
Grato pela atenção!
Jean. :roll:
já tentei o strtodate e vice-versa, mas não consegui fazer a busca funcionar.
Grato pela atenção!
Jean. :roll:
Jeancarlos
Curtidas 0
Respostas
Mmtoor
24/08/2003
Esqueça a table e use query.
Var
Data: String;
begin
Data := Edit1.text;
query1.Close;
query1.SQL.Clear;
query1.SQL.Text := ´SELECT * FROM nome_da_tabela WHERE data =:pData´;
query1.ParamByName(´pData´).AsDateTime := StrToDate(Data);
query1.Prepare;
query1.Open;
dbgrid1.SetFocus;
ShowMessage(´Total de registros encontrados na pesquisa: ´ + IntToStr(query1.RecordCount));
Sem mais;
mmtoor2003
mmtoor2003@yahoo.com.br
Var
Data: String;
begin
Data := Edit1.text;
query1.Close;
query1.SQL.Clear;
query1.SQL.Text := ´SELECT * FROM nome_da_tabela WHERE data =:pData´;
query1.ParamByName(´pData´).AsDateTime := StrToDate(Data);
query1.Prepare;
query1.Open;
dbgrid1.SetFocus;
ShowMessage(´Total de registros encontrados na pesquisa: ´ + IntToStr(query1.RecordCount));
Sem mais;
mmtoor2003
mmtoor2003@yahoo.com.br
GOSTEI 0
Jeancarlos
24/08/2003
Ok mmtoor, Obrigado pela dica valeu!
Mas ainda nao consegui mostrar os registros por data no DBGrid. pois o DBGrid deveria mostrar o nome dos campos da tabela e seus registros e quando digitada uma data no EditMask, clicando no botao ok deveria ser selecionado o registro que contivesse a respectiva data. Quando substitui a Table por um Query o DBGrid deixou de exibir os campos da tabela. Da o seguinte erro :EDBE Engine error with message invalid field name Data´ mas o nome do campo está correto, na tabela é ´Agn_data´ o codigo ficou assim:
procedure TFrm_AgendaVirtual.bbtnOKClick(Sender: TObject);
Var
Data: String;
begin
Data := meBuscaData.text;
DM_Data.qr_Agenda.Close;
DM_Data.qr_Agenda.SQL.Clear;
DM_Data.qr_Agenda.SQL.Text := ´SELECT * FROM Agenda.db WHERE data =:Agn_data´;
DM_Data.qr_Agenda.ParamByName(´Agn_data´).AsDateTime := StrToDate(Data);
DM_Data.qr_Agenda.Prepare;
DM_Data.qr_Agenda.Open;
dbgAgendaVirtual.SetFocus; {(Obs:DBGrid recebe texto?)(antes eu usava um Table.locate e um bookmark para selecionar os registros no DBGrid)}
ShowMessage(´Total de registros encontrados na pesquisa: ´ + IntToStr(DM_Data.qr_Agenda.RecordCount));
end;
Não entendi poque do texto showMessage, pois minha intenção era de somente apontar e selecionar um registro da tabela mostrado no dbgrid
que fosse selecionado pelo campo data.
Agradeço mais uma vez pela sua atenção mmtoor, fiquei muito agradecido pela ajuda.
Mas ainda nao consegui mostrar os registros por data no DBGrid. pois o DBGrid deveria mostrar o nome dos campos da tabela e seus registros e quando digitada uma data no EditMask, clicando no botao ok deveria ser selecionado o registro que contivesse a respectiva data. Quando substitui a Table por um Query o DBGrid deixou de exibir os campos da tabela. Da o seguinte erro :EDBE Engine error with message invalid field name Data´ mas o nome do campo está correto, na tabela é ´Agn_data´ o codigo ficou assim:
procedure TFrm_AgendaVirtual.bbtnOKClick(Sender: TObject);
Var
Data: String;
begin
Data := meBuscaData.text;
DM_Data.qr_Agenda.Close;
DM_Data.qr_Agenda.SQL.Clear;
DM_Data.qr_Agenda.SQL.Text := ´SELECT * FROM Agenda.db WHERE data =:Agn_data´;
DM_Data.qr_Agenda.ParamByName(´Agn_data´).AsDateTime := StrToDate(Data);
DM_Data.qr_Agenda.Prepare;
DM_Data.qr_Agenda.Open;
dbgAgendaVirtual.SetFocus; {(Obs:DBGrid recebe texto?)(antes eu usava um Table.locate e um bookmark para selecionar os registros no DBGrid)}
ShowMessage(´Total de registros encontrados na pesquisa: ´ + IntToStr(DM_Data.qr_Agenda.RecordCount));
end;
Não entendi poque do texto showMessage, pois minha intenção era de somente apontar e selecionar um registro da tabela mostrado no dbgrid
que fosse selecionado pelo campo data.
Agradeço mais uma vez pela sua atenção mmtoor, fiquei muito agradecido pela ajuda.
GOSTEI 0
Bacalhau
24/08/2003
Queres ir para um registo específico ou mostrar os registos que contém a data pretendida?
A solução sem query para um registo é criares um indice secundário da tabela tb_eventos, do campo Data (por exemplo TB_DATA).
Após escolheres a data escre o seguinte código:
tb_eventos.indexname := ´TB_DATA´;
tb_eventos.setkey;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.gotokey; // ou gotonearest
Para mostrar os eventos na data o código é o seguinte:
tb_eventos.cancelrange; // para retirar filtragens anteriores
tb_eventos.indexname := ´TB_DATA´;
tb_eventos.setrangestart;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.setrangeend;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.applyrange;
O grid vai mostrar só os eventos daquela data.
abraço
bacalhau
A solução sem query para um registo é criares um indice secundário da tabela tb_eventos, do campo Data (por exemplo TB_DATA).
Após escolheres a data escre o seguinte código:
tb_eventos.indexname := ´TB_DATA´;
tb_eventos.setkey;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.gotokey; // ou gotonearest
Para mostrar os eventos na data o código é o seguinte:
tb_eventos.cancelrange; // para retirar filtragens anteriores
tb_eventos.indexname := ´TB_DATA´;
tb_eventos.setrangestart;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.setrangeend;
tb_eventos.fieldbyname(´Data´).asdatetime := <data que pretendo>;
tb_eventos.applyrange;
O grid vai mostrar só os eventos daquela data.
abraço
bacalhau
GOSTEI 0