GARANTIR DESCONTO

Fórum Lentidão no comando Locate delphi 7 + Firebird 2.1 #560023

08/08/2016

0

Boa Tarde!
estou tendo problemas com uma rotina do sistema aqui que na hora que pesco para pesquisar ele executa essa rotina que é a rotina de apagar uns registros que não consigo por na SQL pois fica muito lento.
Tenho duas Tabelas Processos e Andamentos. na Tabela andamentos tem a chave Estrangeira (FK) que Numero_Processo para ligar com a tabela processos
no momento de separa os dados que eu não quero eu indexo a tabela de Andamentos para ordenar pela FK e feito isso eu dou o locate para procura o registro para eu fazer a varredura o locate fica muito lento não sei o que pode ser, Já tentei criar outro index já tentei ver se tem alguma haver com o tamanho do bancovou por aqui o trecho do código
      DMGeral.qryPesquisaProcessos.Open;
      if ((dteAtualizadosIni.Text   <> '  /  /    ') and (dteAtualizadosFim.Text   <> '  /  /    ')) or
         ((dteDataIniFaturavel.Text <> '  /  /    ') and (dteDataFimFaturavel.Text <> '  /  /    ')) then
      begin
        DMGeral.tbAndamentosProcessuais.IndexFieldNames := 'NUMERO_PROCESSO';
        DMGeral.qryPesquisaProcessos.First;
        while not DMGeral.qryPesquisaProcessos.Eof do
        begin
          DMGeral.tbAndamentosProcessuais.Locate('NUMERO_PROCESSO',DMGeral.qryPesquisaProcessosNUMERO_PROCESSO_ORI.AsString,[]); // Muito lento
          while (DMGeral.qryPesquisaProcessosNUMERO_PROCESSO_ORI.AsString =
                 DMGeral.tbAndamentosProcessuaisNUMERO_PROCESSO.AsString) do
          begin
            if ((dteAtualizadosIni.Text   <> '  /  /    ') and (dteAtualizadosFim.Text   <> '  /  /    ')) and
               ((DMGeral.tbAndamentosProcessuaisDATA.AsDateTime >= dteAtualizadosIni.Date) and
                (DMGeral.tbAndamentosProcessuaisDATA.AsDateTime <= dteAtualizadosFim.Date)) then
            begin
              lApaga := False;
              Break;
            end else
            begin
              DMGeral.tbAndamentosProcessuais.Next; // As vezes fica lento dependendo do index 
              lApaga := True;
            end;
          end;
          // Apaga da Query o que não está dentro do filtro de pesquisa
          if lApaga = True then
            DMGeral.qryPesquisaProcessos.Delete
          else
            DMGeral.qryPesquisaProcessos.Next;
        end;
        DMGeral.tbAndamentosProcessuais.IndexFieldNames := 'CODIGO_ANDAMENTO';
      end;


se alguém tiver uma ideia de como ajudar a ficar mais rápido...
Eduardo Silva

Eduardo Silva

Responder

Post mais votado

10/08/2016

Eduardo, bom dia.
Kra eu tive olhando a parte do font q vc compartilho, mas fiquei com dúvidas pq....
primeiro vc utilizo um while dentro de outro while obtido a partir de um locate.

O que quero dizer é o seguinte. Caso a sua tabela ''tbAndamentosProcessuais'' tenha 100 registros e o seu locate achou um registro equivalente aos parametros informados,
o seu data set vai ficar com o ponteiro na posição encontrada, mas o seu segundo while vai percorrer da posição que está até a posição do registro 100. E o que é complicado
é que isso vai fazer para cada registro da sua tabela ''qryPesquisaProcessos''. Acredito que seja esse o problema da lentidão.

Eu faria o seguinte... Para cada registros ''qryPesquisaProcessos'' eu faria uma pesquisa filtrada, ou seja, utilizando o filtered vc pesquisa um BLOCO de registros da tabela ''tbAndamentosProcessuais'' e caso o recordCount seja igual a ''0'' vc deletaria o registro uma vez que não houve correspondencia.

Em fim, o que quero ressaltar para ti é que o ''LOCATE'' ele coloca o cursor do dataSet em questão em uma posição, e qdo vc dá o .next será a partir desta posição até o final. E nesse sentido vc ainda está correndo um sério risco de entrar em um loop infinito.

Outra coisa que eu exploraria mais é que o LOCATE retorna true ou false. Isso pode ajudar tb.

Não sei se fui claro... qualquer coisa avisa ae.

Abc...

Marco Antônio

Marco Antônio
Responder

Gostei + 1

Mais Posts

09/08/2016

Jones Granatyr

Eu tentaria substituir o locale por uma função que execute uma query na base de dados e retorna o número do processo. Mais ou menos assim:

function getNumeroProcesso(ANumeroProcesso: String)
begin
// Criar uma query em tempo de execução, fazer a consulta SQL e retornar o resultado
end;

Talvez esteja lento porque você está usando o DMGeral para o loop e também para o locale. Uma outra alternativa é utilizar componentes separados, mas só testando para saber :)
Responder

Gostei + 0

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

Aceitar