Trabalhar com dados em memória
25/07/2017
0
Estou com uma pequena agenda de compromissos, onde tenho uma duvida sobre trabalhar com dados em memoria, para melhorar a performance.
O funcionamento é bem simples.
Ao clicar num calendário, executo esse código, que varre a tabela AGENDA e conta quantos compromissos tenho por hora, listando os horários num clientdataset e exibido num dbgrid.
Bom, da pra notar que vou consultar o banco 16 vezes a cada clique no calendário. Tudo isso porque preciso ter o numero de compromissos por horário.
Pergunto: Tem como otimizar essa pesquisa?
----------------------------------------------
A segunda questão é listar os compromissos de cada horario ao clicar no horario.
Pra isso tenho um outro DBgrid.
Hoje Faço assim:
Como podem ver, executo novamente uma consulta no banco a cada clique.
Como eu poderia fazer essa consulta usando os dados em memoria já carregados na qrcont?
O funcionamento é bem simples.
Ao clicar num calendário, executo esse código, que varre a tabela AGENDA e conta quantos compromissos tenho por hora, listando os horários num clientdataset e exibido num dbgrid.
procedure TFrmAgenda.CarregaHorarios(f_Data: TDate); var X: Integer; HoraIni: TTime; begin // Abre e fecha o componente de memoria cdsHorarios.Close; cdsHorarios.IsEmpty; cdsHorarios.CreateDataSet; cdsHorarios.Open; // Procedimento de inicio de hora HoraIni := StrToTime('07:15'); // For para ir das 08:00 as 11:45 e 13:30 as 20:15 for X := 1 to 16 do begin HoraIni := IncMinute(HoraIni, 45); //Contando os registros pra colorir o grid horarios with qrCont do begin Close; SQL.Clear; SQL.Add('SELECT DATA, HORA FROM AGENDA'); SQL.Add('WHERE HORA = :H AND DATA = :D'); ParamByName('H').AsTime := HoraIni; ParamByName('D').AsDate := Calendario.Date; Open; FetchAll; end; cdsHorarios.Append; cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni; cdsHorarios.FieldByName('QTDE').AsInteger := qrCont.RecordCount; cdsHorarios.Post; if HoraIni = StrToTime('11:45') then HoraIni := IncMinute(HoraIni, 60); end; cdsHorarios.First; GridHorariosCellClick(GridHorarios.Columns[0]); //Mostra a agenda do 1º registro end;
Bom, da pra notar que vou consultar o banco 16 vezes a cada clique no calendário. Tudo isso porque preciso ter o numero de compromissos por horário.
Pergunto: Tem como otimizar essa pesquisa?
----------------------------------------------
A segunda questão é listar os compromissos de cada horario ao clicar no horario.
Pra isso tenho um outro DBgrid.
Hoje Faço assim:
with frmdm.qrAgenda do begin Close; SQL.Clear; SQL.Add('SELECT * FROM AGENDA'); SQL.Add('WHERE HORA = :H AND DATA = :D'); ParamByName('H').AsTime:= cdsHorariosHORA.AsDateTime; ParamByName('D').AsDate:= Calendario.Date; Open; end;
Como podem ver, executo novamente uma consulta no banco a cada clique.
Como eu poderia fazer essa consulta usando os dados em memoria já carregados na qrcont?
Renan
Curtir tópico
+ 0
Responder
Posts
25/07/2017
Renan
Segue uma tela para ajudar no entendimento.
http://i67.tinypic.com/2i8dmj6.png
http://i67.tinypic.com/2i8dmj6.png
Responder
Clique aqui para fazer login e interagir na Comunidade :)