Trabalhar com dados em memória
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
Curtidas 0
Respostas
Renan
25/07/2017
Segue uma tela para ajudar no entendimento.
http://i67.tinypic.com/2i8dmj6.png
http://i67.tinypic.com/2i8dmj6.png
GOSTEI 0