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.

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

Renan

Responder

Posts

25/07/2017

Renan

Segue uma tela para ajudar no entendimento.

http://i67.tinypic.com/2i8dmj6.png
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar