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
se alguém tiver uma ideia de como ajudar a ficar mais rápido...
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
Curtir tópico
+ 0
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...
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
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 :)
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
Clique aqui para fazer login e interagir na Comunidade :)