Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
>
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?
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.
>
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
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
>
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; 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;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); Tempo:= Time;
ThreadEspera:= TEspera.Create(True);
ThreadEspera.FreeOnTerminate:= True;
ThreadEspera.Resume;
end;
procedure TForm1.Timer1Timer(Sender: TObject);label1.Caption:= TimeToStr(Time - Tempo);
end;
Boa Sorte!!
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 !!!!