Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcos Barbosa

Consulta com DBGRID

Recommended Posts

Pessoal, tenho uma consulta onde utilizo o DBGRID, nesta consulta tenho algumas opções de filtro, tipo período de data, digitar as primeiras letras do nome....

Para conexão uso o componente TSQLConection da paleta DBExpress, o DataSource, DataSetProvider e o ClienteDataSet da paleta Data Access.

O problema é que quando utilizo qualquer uma das opções do filtro o resultado está demorando para aparece, segue o código:

 

begin //

  unidade := frm_ExcluirEmailDuplicado.DBC_unidade.Text;

  DM.QRY_email.Close;
  DM.QRY_email.SQL.Clear;
  DM.QRY_email.SQL.add('SELECT * FROM email WHERE unidade ='+QuotedStr(unidade)+'ORDER BY unidade');
  DM.QRY_email.Open;

  email := DM.QRY_emailEMAIL.AsString;
  uf := DM.QRY_emailUF.AsString;

  DM.ClientDataSet_telemedicina.Active:=False;
  DM.qry_telemedicina.Close;
  DM.qry_telemedicina.SQL.Clear;
  DM.qry_telemedicina.SQL.Add('SELECT  t.* FROM TELEMEDICINA t');
  DM.qry_telemedicina.SQL.Add('WHERE EXISTS(SELECT COUNT(*), x.assunto FROM TELEMEDICINA x');
  DM.qry_telemedicina.SQL.Add('where x.assunto = t.assunto');
  DM.qry_telemedicina.SQL.Add('AND data BETWEEN :_dta_ini and :_dta_fim');


  if assunto.Text <> '' Then
     begin // 0,1
         DM.qry_telemedicina.SQL.Add('AND assunto LIKE '''+'' + assunto.Text +'%''');
     end;  // 0,1

  if uf = '' then
    begin // 2
       if Email <> '' Then
           Begin // 0,2
               DM.QRY_telemedicina.SQL.Add('AND para =:_Email');
               DM.qry_telemedicina.SQL.Add('GROUP BY x.assunto');
               DM.qry_telemedicina.SQL.Add('HAVING COUNT(*) > 1 )');
               DM.qry_telemedicina.SQL.Add('ORDER BY ASSUNTO, DATA, HORA');

               DM.QRY_telemedicina.Params.ParamByName('_Email').Asstring := Email;
           End  // 0,2
       else
           Begin // 0,3
               DM.qry_telemedicina.SQL.Add('GROUP BY x.assunto');
               DM.qry_telemedicina.SQL.Add('HAVING COUNT(*) > 1 )');
               DM.qry_telemedicina.SQL.Add('ORDER BY ASSUNTO, DATA, HORA');
           End;  // 0,3

    end // 2
  else
    begin // 3
       DM.QRY_telemedicina.SQL.Add('AND UF =:_Uf');

       DM.qry_telemedicina.SQL.Add('GROUP BY x.assunto');
       DM.qry_telemedicina.SQL.Add('HAVING COUNT(*) > 1 )');
       DM.qry_telemedicina.SQL.Add('ORDER BY ASSUNTO, DATA, HORA');

       DM.QRY_telemedicina.Params.ParamByName('_Uf').Asstring := 'S';
    end; // 3

    DM.qry_telemedicina.Params.ParamByName('_dta_ini').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_ini.Date);
    DM.qry_telemedicina.Params.ParamByName('_dta_fim').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_fim.Date);

    DM.qry_telemedicina.Open;
    DM.ClientDataSet_telemedicina.Active:=True;

end;

 

Já vi q a demora acontece por causa das duas últimas linhas:

    DM.qry_telemedicina.Open;
    DM.ClientDataSet_telemedicina.Active:=True;

 

Como posso resulver esse problema ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcos,

 

Você pode otimizar essa rotina de algumas maneiras:

1. Carregue apenas os campos que você precisa da consulta, ou seja, substitua o asterisco pelos campos que de fato você precisa.

2. No seu TSQLDataSet marque a propriedade NoMetada como True;

3. No seu DataSetProvider marque a propriedade poRetainServerOrder como True;

 

Outra coisa, na seguinte passagem:

 

  DM.qry_telemedicina.SQL.Add('WHERE EXISTS(SELECT COUNT(*), x.assunto FROM TELEMEDICINA x');
  DM.qry_telemedicina.SQL.Add('where x.assunto = t.assunto');

 

você faz a concatenação de duas cláusulas where, isso está correto?

 

Na consulta "EXISTS(SELECT COUNT(*), x.assunto FROM TELEMEDICINA x'" não seria a mesma coisa do que dizer "x.assunto is not null" ?

Se essas substituição for válida, então sua consulta se tornará ainda mais eficiente.

 

Verifique...

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

A tabela tem 5 campos e todos eles são necessários por isso coloquei i *.

Não achei no TSQLDataSet a propriedade NoMetada, achei ela no TSQLQUERY e já está como true.

Mudei o poRetainServerOrde do componenete DataSetProvider para true, mas continua com a mesma lentidão.

 

Com relação ao select, a função toda serve para listar todos os registros de uma mesma tabela com o campo assunto iguais.

 

 

Marcos,

 

Você pode otimizar essa rotina de algumas maneiras:

1. Carregue apenas os campos que você precisa da consulta, ou seja, substitua o asterisco pelos campos que de fato você precisa.

2. No seu TSQLDataSet marque a propriedade NoMetada como True;

3. No seu DataSetProvider marque a propriedade poRetainServerOrder como True;

 

Outra coisa, na seguinte passagem:

 

  DM.qry_telemedicina.SQL.Add('WHERE EXISTS(SELECT COUNT(*), x.assunto FROM TELEMEDICINA x');
  DM.qry_telemedicina.SQL.Add('where x.assunto = t.assunto');

 

você faz a concatenação de duas cláusulas where, isso está correto?

 

Na consulta "EXISTS(SELECT COUNT(*), x.assunto FROM TELEMEDICINA x'" não seria a mesma coisa do que dizer "x.assunto is not null" ?

Se essas substituição for válida, então sua consulta se tornará ainda mais eficiente.

 

Verifique...

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.