Ir para conteúdo
Fórum Script Brasil
  • 0

(RESOLVIDO) Parar um TClientDataSet em execução?


Mario Henrique

Pergunta

Pessoal, bom dia!

Uso Delphi 7 + dbexpress!

Cenário:

-estou abrindo um tclientdataset com muitos dados, muitos mesmo!

-o mesmo é lento, e o usuário tem que aguardar um pouco o processamento dele!

-enquanto o tclientdataset está em execução, eu mostro num tlabel o contador do tclientdataset em andamento, assim o usuário vê que o sistema está em execução!

-não preciso trazer menos dados e nem melhorar a performance!

-o cenário esta do jeito que preciso!

O que preciso é:

-mostrar um botão onde, enquanto o tclientdataset está em execução, o usuário possa clicá-lo e o tclientdataset PARE COM OS DADOS CARREGADOS ATÉ ALI e o usuário possa ver os dados carregados até onde ele quis parar e voltar a trabalhar no sistema!

Só isto!

Parece simples mas to quebrando a cabeça... rsrs!

Agradeço a atenção de todos e se precisarem estou a disposição!

Editado por Mario Henrique
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Jhonas, agradeço a atenção!

Eu sei que deixa lento, mas não tive outra idéia!

Segue abaixo a atualização do label:

procedure TForm1.CDSAfterScroll(DataSet: TDataSet);

begin

while CDS.GetNextPacket > 0 do

begin

label1.Text := IntToStr( CDS.RecordCount );

Update;

Application.ProcessMessages;

end;

end;

Então, é como falei: neste cenário não estou preocupado com a lentidão... eu quero PARAR (stop) este evento, caso eu aperte um button e os dados que foram carregados fiquem no CDS!

Não sei se fui claro, mas vai ai mais uma explicação rapida:

-tenho 100.000 registros a serem carregados num tclientdataset!

-o evento acima fica atualizando um tlabel enquanto o tclientdataset vai recebendo dados!

-eu quero saber se tem como eu parar este evento acima (pode ser através de um tbutton) e os dados já carregados no tclientdataset permaneçam nele pro usuário ver até onde carregou!

Abraço!

Link para o comentário
Compartilhar em outros sites

  • 0

tenho 100.000 registros a serem carregados num tclientdataset!

eu tenho uma tabela com 160.000 e consigo carregar todos os 160.000 no dbgrid em apenas 2 segundos usando indices na tabela ( usando o TTable )

while CDS.GetNextPacket > 0 do
begin
   label1.Text := IntToStr( CDS.RecordCount );
   Update;
   Application.ProcessMessages;
end;
o uso da clausula Update sozinha fara a atualização de todos os seus registros, a cada vez que o contador do while for ativado ... o ideal é usar um filtro atraves da clausula Where exemplo UPDATE ATABLE SET anruf_bis=<Time> WHERE ID=<ID Value> outra coisa que não é necessaria, é atualizar os todos registros o tempo todo .... mas somente quando houver alguma alteração nos registros exemplo
procedure TForm1.Button1Click(Sender: TObject);
begin
   ClientDataSet1.Insert;
   ClientDataSet1.FieldByName('anruf_von').AsDateTime := time;
   ClientDataSet1.Post;   
   ClientDataSet1.ApplyUpdates(0); // aplica o applyUpdates no button2.
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   ClientDataSet1.edit;
   ClientDataSet1.FieldByName('anruf_bis').AsDateTime := time;
   ClientDataSet1.Post;
   showmessage(intToStr(ClientDataSet1.ChangeCount)); // retorna 1
   if ClientDataSet1.ChangeCount > 0 then
      ClientDataSet1.applyUpdates(0);
end;
caso não queira tentar outra abordagem no seu codigo declare uma variavel publica cancelar : Boolean; no seu codigo faça a mudança
while CDS.GetNextPacket > 0 do
begin
   label1.Text := IntToStr( CDS.RecordCount );
   Update;
   Application.ProcessMessages;
   if Cancelar then
      begin
         //MessageDlg('Processo foi Interrompido! ', mtInformation, [mbOK], 0);
         Break; { Sai do loop }
         exit;
      end;
end;
em um botão coloque
procedure TForm1.Button3Click(Sender: TObject);
begin
   cancelar := true;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela atenção, Jhonas!

Valeu por todas as dicas!

Mas no meu cenário, eu precisava mesmo do "BREAK" que você mencionou... dai resolveu!

Eu uso "where", "packetrecords", "first 10", etc... vários eventos para melhorar a performance... mas agradeço mesmo pelas suas dicas!

Sou programador delphi + php + firebird + postgresql há tempo... portanto estou a disposição para ajudar caso o forum precise e q eu saiba também!

Abraço e t+!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...