Então, mas foi como te falei, operações em lotes, não use o ClientDataSet para inclui, alterar e excluir. Faça através da montagem dinâmica de sqls e use o método executedirect do sqlconnection para isso, sempre dentro de transações monitoradas.
Desta forma ficará ainda mais rápido e sem nenhum problema. Abs BL From: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] On Behalf Of Lucas Eduardo Barao Neves Sent: sexta-feira, 4 de julho de 2008 13:46 To: delphi-br@yahoogrupos.com.br Subject: RE: [delphi-br] Lentidao com ClientDataset Bruno, muito obrigado! O processo ficou absurdamente mais rapido, mas ainda tem um problema: Eu estou mandando o ApplyUpdates a cada 3000 registros e ainda assim, mais pro final do processo ele me retorna o erro "SQLDA error or incorrect version / types of variables", coisa assim. Ja verifiquei e nao e inconsistencia nos dados. Isso acontecia muito quando eu usava close/open toda hora. Alguma sugestao? Obrigado --- Em qua, 2/7/08, Bruno Lichot <[EMAIL PROTECTED]<mailto:bruno.lichot%40codegear.com>> escreveu: De: Bruno Lichot <[EMAIL PROTECTED]<mailto:bruno.lichot%40codegear.com>> Assunto: RE: [delphi-br] Lentidao com ClientDataset Para: "delphi-br@yahoogrupos.com.br<mailto:delphi-br%40yahoogrupos.com.br>" <delphi-br@yahoogrupos.com.br<mailto:delphi-br%40yahoogrupos.com.br>> Data: Quarta-feira, 2 de Julho de 2008, 11:28 Salve Lucas, É o seguinte. Para fazer estes processamentos em lotes o ideal é ler os dados e navegar por eles com clientdatasets mesmo. Só que para navegação não use locate, use setkey com índices dinâmicos em memória no CDS que é estupidamente rápido. No meu primeiro exemplo do meu link de downloads gratuitos (HTTP://cc.codegear. com/author/ 795118) tem uma aplicações sobre recursos do ClientDataSet que implementa em um dos exemplos o setkey. Em tempo, estarei no FireBird Developers Day – FDD – dia 19/07 (WWW.firebirddevelo persday.com. br) fazendo uma palestra sobre estes e outros recursos. Para manipular os dados, ou seja fazer inserts, deletes e updates dos registros, o melhor a se fazer e montar dinamicamente os comandos SQL e executá-los sempre dentro de uma transação monitorada usando o método ExecuteDirect do SQLConnection. No mesmo exemplo que indiquei na aplicação servidora, tem uma função na classe principal chamada incluipedidos que faz algo parecido desta forma que expliquei. Faça o processamento em lote separado por tabelas e para cada um deles abra uma transação monitorada, processe o lote e feche a transação. Desta forma ficará rápido o processamento e não trará problemas para o seu banco. Dicas: Tenha total controle das conexões que você utilizar, bem como das transações monitoradas. Cuidado para não deixar objetos instanciados desnecessariamente, feche sempre os datasets quando não utilizar mais. Verifique o tamanho de buffer em memória do FireBird para que não incorra no erro de ter um banco de 100 mb e um espaço em memória de 12 mb. O seu espaço em memória deve ser relativo ao tamanho do seu banco e limitado ao que você tem de RAM disponível e ao que outros recursos no Server também podem consumir. Ou seja não tenha de mais, mas também não tenha de menos. Abraços, BL From: [EMAIL PROTECTED] os.com.br [mailto:[EMAIL PROTECTED] os.com.br] On Behalf Of Lucas Eduardo Barao Neves Sent: quarta-feira, 2 de julho de 2008 10:33 To: [EMAIL PROTECTED] os.com.br Subject: [delphi-br] Lentidao com ClientDataset Bom dia pessoal, gostaria de uma ajuda de voces, Estou trabalhando em um sistema de importacao de dados via arquivo TXT. Ele= tem mais ou menos a seguinte estrutura: Arquivo: +- 56000 linhas Ele atualizara da seguinte forma: Tabela 1 - 85000 registros Para cada sequencial encontrado / criado, ele atualizara uma tabela 2 =3D 1= 0000 registros Para cada um da tabela 2 ele atualizara ou fara insercoes em uma tabela 3 = =3D 900 registroa A tabela 3 fara a mesma coisa na tabela 4: 56000 registros (todos os regist= ros do TXT) Ja tentei das seguintes formas: Somente com queries, uma para selecao, uma para insercao, uma para alteraca= o; Somente com queries, somente uma para selecao, insercao e alteracao, Somente uma query com ClientDataSet para selecao, insercao e alteracao. Essas tres primeiras tentativas geravam tantos acessos ao banco de dados qu= e chegava uma hora que dava um overflow dentro do banco (o famoso e misteri= oso erro SQLDA); Sendo assim tentei de outra forma: Um ClientDataSet para cada tabela da situacao informada, todos eles com sel= ect * e carregamento na memoria, procura pelo comando Locate. Dessa forma ate funciona sem dar erro no banco, porem ele esta a uma veloci= dade de 1 a 2 registros por segundo!!!!! Das outras formas eu ate conseguia uma marca maior, o problema e o erro que= acontece apos tantas requisicoes com o banco. Estou utilizando Delphi 6, dbExpress e Firebird 2.0. Sei que e uma mistura = assassina, mas e so o que tem aqui na empresa. Alguem tem sugestoes de o que eu posso fazer para melhorar a performance ne= sse sentido? O processo da maneira que esta demora uma noite inteira para t= erminar, sendo que no sistema antigo deles, a mesma rotina feita em Clipper= e DBF levava em torno de 30 minutos. Agradeco antecipadamente! Lucas Neves Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua cara @ymail.com ou @rocketmail. com. http://br.new. mail.yahoo. com/addresses [As partes desta mensagem que não continham texto foram removidas] CONFIDENTIALITY NOTICE: This email message is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message. [As partes desta mensagem que não continham texto foram removidas] Novos endereços, o Yahoo! que você conhece. Crie um email novo com a sua cara @ymail.com ou @rocketmail.com. http://br.new.mail.yahoo.com/addresses [As partes desta mensagem que não continham texto foram removidas] CONFIDENTIALITY NOTICE: This email message is for the sole use of the intended recipient(s) and may contain confidential and privileged information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message. [As partes desta mensagem que não continham texto foram removidas]