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]

Responder a