Ir para conteúdo

POWERED BY:

Arquivado

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

Rodrigo Ricardo

Tempo estimado para execução de uma sql

Recommended Posts

Olá amigos, tenho um relatório qual executa apenas uma sql cujo a base que acesso é muito grande e a sql também tem muitos joins, a mesma costuma demorar alguns minutos para processar e meus clientes acham q o relatório travou, existe alguma funçao que me retorne o tempo de processamento estimado antes mesmo de executar essa sql? ou mostrar um contador onde mostre o tempo já decorrido de processamento? assim informando ao usuário que sistema está em processamento e nao está travado.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega posso estar enganado mas, acho que no seu caso cabe um thread assim você consegue executar a sql e ao mesmo tempo colocar um contador na tela !!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega posso estar enganado mas, acho que no seu caso cabe um thread assim você consegue executar a sql e ao mesmo tempo colocar um contador na tela !!!!

 

você teria um exemplo de como criar um thread?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega dominar a técnica das threads não é fácil, inclusive até eu estou aprendendo e montando pequenas rotinas como aprendizado. Você tem que entender o que são e depois começar a copiar alguns exemplos e modifica-los aos poucos e posteriormente montar suas próprias.

 

Na net você acha vários exemplos e dicas sobre o assunto.

 

 

Leva um tempinho, se você estiver com pressa, acho melhor procurar outra solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega dominar a técnica das threads não é fácil, inclusive até eu estou aprendendo e montando pequenas rotinas como aprendizado. Você tem que entender o que são e depois começar a copiar alguns exemplos e modifica-los aos poucos e posteriormente montar suas próprias.

 

Na net você acha vários exemplos e dicas sobre o assunto.

 

 

Leva um tempinho, se você estiver com pressa, acho melhor procurar outra solução.

 

Cara seu relatorio esta ligado ah um data source nao esta???

 

Bem o que acontecde eh o seguinte, sempre ke voce abre a exibicao do relatorio, ele percorre todas as filds do CloientDataset que esta liado ao datasource, bom tem um jeito de parar isso porem se vocepossui um grid na tela fika meio estranho mais funciona muito bem.

 

Bom trabalho com um grid diferente mais acho que este metodo deve funcionar para voce, no BeforePrint do relatorio, ou seja antes de exibir a tela coloque

 

DBGrid1.DataSource:= nil;

Isso fara que o grid fique sem DataSource agilizando o trabalho dai no After print do relatorio ou ate mesmo no Close dele coloque.

 

DBGrid1.DataSource:= SeuDataSource;

E o grid exibira novamente os campos, espero que ajude pois como nao trabalho com grids normais possa nao funcionar mais posta ai que tento ajduar kaso de erro aguaro resposta e abraço;

By ZAM

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala ae!!!

 

Cara... Não sei se entendi realmente qual seria a melhor solução para você, mas vai umas idéias que TALVEZ POSSAM ser alguma ajuda para seu problema:

 

 

Esse lance de prever o quanto tempo terá uma consulta em SQL não sei se é possível.

O que eu recomendo é o seguinte:

 

1 - Se a consulta tem mtos Joins, muitos registros e tudo mais, NÃO TEM JEITO... O usuário terá q esperar o tempo de processamento para não ter informações incompletas. O que eu recomendo é você fazer um belo estudo de SQL Tunning, otimização de BD e talz, afim de melhorar e agilizar SE POSSÍVEL o processo.

2 - Para que o usuário não pense que o sistema travou, meta um Ctrl+Alt+Del e corra o risco de ferrar com todo o processo, que tal colocar algum meio de ele ver q alguma coisa tá funcionando ainda? Sugiro você colocar um formzinho que aparece por cima de tudo, com uma barra carregando, até mesmo algum label informando qualquer coisa. Essa qualquer coisa pode ser ficar passando as rotinas q estão sendo executadas tipo: Acessando BD, fazendo busca, organizando índice, fazendo o usuário esperar mais um pouco....... Ou simplesmente um: Registros lidos: 1,2,3,4,5,6,7...... Tipo o que acontece qd você dá um scan do antivirus, que fica correndo um monte de porcarias q num ajudam em nada, simplesmente para dizer ao usuário: ESTOU VIVO!

* Pode ser que para realizar o SQL QUERY e a atualização desse formzinho, você precise de uma thread rodando em paralelo. Cabe aqui o estudo que nosso amigo "wllf" sugeriu sobre threads...

 

 

Acho q por enquanto é isso que posso ajudar.

Caso tenha dúvidas, sugestões, idéias, soluções... Posta ae que a gente debate!

 

 

Abraço a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe alguma funçao que me retorne o tempo de processamento estimado antes mesmo de executar essa sql? ou mostrar um contador onde mostre o tempo já decorrido de processamento?

 

Um pequeno exemplo de como usar Threads..

 

var
  Form1: TForm1;
  Tempo:TDateTime;
type
 TEspera = class(TThread)
 protected
   procedure Execute; Override;
 end;

implementation

{$R *.dfm}

procedure TEspera.Execute;
var
Contador:Integer;
begin
Priority := TpLower;
Form1.ProgressBar1.Max:= 100000;
Form1.Timer1.Enabled:= True;

Contador:= 0;
while Contador <> 100000 do
begin
Inc(Contador,1);
Form1.ProgressBar1.Position:= Contador;
Sleep(1);
end;

Form1.Timer1.Enabled:= False;
ShowMessage('Concluído!');
Form1.ProgressBar1.Position:= 0;
inherited;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 ThreadEspera: TEspera;
begin
 Tempo:= Time;

 ThreadEspera:= TEspera.Create(True);
 ThreadEspera.FreeOnTerminate:= True;
 ThreadEspera.Resume;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:= TimeToStr(Time - Tempo);
end;

Boa Sorte!!

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.