Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido)Filtro banco de dados por hora


João Paulo Taraciuk

Pergunta

Olá, estou trabalhando no projeto de uma agenda, onde o usuário cadastra os eventos, então 10 minutos antes do horário programado deverá aparecer uma uma mensagem avisando , tipo assim

Cadastro um evento para as 16:00 horas, então 15:50 eu recebo uma mensagem sobre o evento que vai ocorrer daqui à 10 minutos, aí fica a pergunta:

Trabalho com o banco MySql3.23, Delphi 7, estou a principio filtrando a minha pesquisa por data dessa maneira

DM_agenda.ZQry_consulta.Active:=False;

DM_agenda.ZQry_consulta.SQL.Clear;

DM_agenda.ZQry_consulta.SQL.Add('select * from eventos where data =:date order by horario asc');

DM_agenda.ZQry_consulta.ParamByName('date').AsDate:=Date;

DM_agenda.ZQry_consulta.Active:= True;

while not (DM_agenda.ZQry_consulta.Eof)do begin

ListBox1.Items.Add(DM_agenda.ZQry_consulta.Fields[2].AsString);

DM_agenda.ZQry_consulta.Next;

Estou jogando os horários do dia para um listbox, só para conferir, por aí pode-se perceber que o campo 2 da tabela é onde estão os horários dos eventos(Field horario), o campo data é o campo 3 da tabela, aí eu jogo para um edit

Edit2.Text:=DM_agenda.ZQry_consulta.Fields[2].AsString

e o edit3 está recebendo a hora atual, então eu faço o cálculo onde o edit1 irá receber a diferença entre estes dois horários

Edit1.Text:=TimeToStr(StrToTime(Edit2.Text) - StrToTime(Edit3.Text));

No edit4 eu coloco 00:10:00

if(StrToTime(Edit1.Text)<StrToTime(Edit4.Text))Then{Se o resultado da conta: hora do evento menos hora atual for menor que 10 minutos mostrará a mensagem}

ShowMessage('Existe um evento agendado para as 'DM_agenda.ZQry_consulta.Fields[2].AsString+' horas');

Até aí está saindo, o que não estou conseguindo fazer é o filtro do banco da dados, gostaria de saber uma maneira de filtrar os horários da seguinte maneira, que ele jogasse para o Edit2 o horário mais próximo da hora atual, tipo se agora são três horas, mas tem eventos para as 15:05 e 15:08, ele jogasse o valor menor, outra coisa que tem que fazer é ignorar nesta consulta os eventos que já passaram da hora, por que no ListBox que coloquei aparecem todos os eventos,

qualquer ajuda eu agradeço, fazem menos de dois meses que comecei a programar, então se tiver algum erro na minha procedure, agradeceria se um colega desse um toque.

Valeu!!!

Editado por João Paulo Taraciuk
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

gostaria de saber uma maneira de filtrar os horários da seguinte maneira, que ele jogasse para o Edit2 o horário mais próximo da hora atual, tipo se agora são três horas, mas tem eventos para as 15:05 e 15:08, ele jogasse o valor menor

mas voce já esta fazendo isto

DM_agenda.ZQry_consulta.SQL.Add('select * from eventos where data =:date order by horario asc');
esta selecionando os registro por data e ordenando os horarios
outra coisa que tem que fazer é ignorar nesta consulta os eventos que já passaram da hora
use uma variavel que pegue o tempo atual para comparar com o campo horario da sua tabela var hora : TTime; hora := now; // atribui a variavel hora a hora atual e ela é passada como parametro para a SQL como faz com a data
DM_agenda.ZQry_consulta.SQL.Add('select * from eventos where data =:date and horario > :hora order by horario asc');

OBS: uma idéia para controlar os eventos da tabela, seria uma varredura no arquivo atraves de um componente timer, onde voce poderia especificar de quanto em quanto tempo esta varredura seria feita, para verificar se existissem eventos a serem realizados

abraço

Editado por Jhonas
Link para o comentário
Compartilhar em outros sites

  • 0

João, apenas uma sugestão.

Quando você não adiciona os campos ao dataset, fica mais legível e seguro você utilizar FieldByName(<nome>) do que Fiels[<indice>].

Legível porque só de olhar você sabe de quem está "falando" e seguro porque caso a ordem de algum campo vier a ser modificada no banco, ou algum novo campo incluído/excluído no meio, você pode ter problemas.

Assim, no caso de:

Edit2.Text := DM_agenda.ZQry_consulta.Fields[2].AsString;

seria preferível:

Edit2.Text:=DM_agenda.ZQry_consulta.FieldByName('Horario')AsString;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo, muito obrigado, o meu código ficou dessa maneira

function Tfrm_principal.lendobanco: Boolean;
var
hora, calculo:TTime;
begin
hora:= Now;
calculo:=hora + StrToTime(Edit4.Text);{aqui, o edit4 está recebendo 00:05:00, aí seguindo o exemplo do Jhonas , ele filtra a partir do evento que ocorrerá daqui a 5 minutos}
DM_agenda.ZQry_consulta.Active:=False;
DM_agenda.ZQry_consulta.SQL.Clear;
DM_agenda.ZQry_consulta.SQL.Add('select * from cad_eventos where data =:date and horario > :hora order by horario desc');
DM_agenda.ZQry_consulta.ParamByName('date').AsDate:=Date;
DM_agenda.ZQry_consulta.ParamByName('hora').AsTime:=calculo;
DM_agenda.ZQry_consulta.Active:= True;
            while not (DM_agenda.ZQry_consulta.Eof)do begin
            ListBox1.Items.Add(DM_agenda.ZQry_consulta.Fieldbyname('horario').AsString);
            DM_agenda.ZQry_consulta.Next;
            Edit2.Text:=DM_agenda.ZQry_consulta.Fieldbyname('horario').AsString;
então o resultado dessa pesquisa, é somente os eventos que ainda irão acontecer, ficando possível mostrar o lembrete, agora, o grid principal da agenda mostra todos os eventos do dia,
select * from cad_eventos

teria como mostrar todos os dados do dia, mas a linha de foco no grid ficar setado no evento que aparece na pesquisa acima, no caso, o mesmo evento que vai para o Edit2 , que seria o próximo evento ?

Desde já agradeço, sem a ajuda dos colegas do fórum eu estaria perdido

Valeu

Link para o comentário
Compartilhar em outros sites

  • 0
teria como mostrar todos os dados do dia, mas a linha de foco no grid ficar setado no evento que aparece na pesquisa acima, no caso, o mesmo evento que vai para o Edit2 , que seria o próximo evento ?

'select * from cad_eventos where data =:date and horario > :hora order by horario desc'

mas a select esta trazendo todos os registros da data escolhida e horario maior que o horario atual, neste caso o foco estara no primeiro registro que é o proximo evento ..... ao fazer nova pesquisa, o que era registro atual não sera mostrado, mas sim, o proximo como registro atual ..... por isso que dei a ideia para fazer a pesquisa dentro de um timer, onde voce pode controlar a data, o tempo e os eventos

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...