CDS em Delphi 7 está lento

Delphi

25/10/2004

Pessoal estou com um problema....Estou desenvolvendo um sistema para automacao comercial e já está quase pronto....eu uso banco de dados relacional (firebird/interbase) e quando eu vou atualizar um registro que foi modificado(eu abro e fecho o sds e o cds) e pelo fato do banco de dados estar cheio...isso fica muito lento.....eu queria saber como eu faco essa atualizacao apenas no registro em q foi modificado...


Renatobso

Renatobso

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

25/10/2004

Colega,

O ApplyUpdates do ClientDataSet irá enviar apenas o registro modificado ao Servidor através de seu Delta, e isso é automático, vc não precisa se preocupar com isso...

O seu problema de lentidão pode estar relacionado ao volume de registros retornados e ao Close/Open :
1. Configure a propriedade PacketRecords do CDS para o número de registros que devem ser trazidos por vez do servidor. O default desta propriedade é -1, ou seja, todos os registros. Eu utilizo 32, mas fica a seu critério.
2.Não abra ou feche diretamente o DataSet. Isto também é automático com a abertura e fechamento ou Refresh do ClientDataSet.

Ajuste estes 2 detalhes e observe se houve ganho. Outras providências, no banco de dados, como índices por exemplo, podem ser tomadas, mas em geral, estas duas regras já representam um ganho de performance considerável.

T+


GOSTEI 0
Renatobso

Renatobso

25/10/2004

po cara....valew pela resposta....mas o q acontece eh o seguinte....eu realmente preciso de todos os dados na tela.....o q eu estava pesquisando agora q eu espero q vc possa me ajudar é como atualizar apenas o registro q foi alterado...ao inves de abrir e fechar o banco de dados.....
tem dois eventos q teoricamente serviria para este fim...o refresh record e o update record......mas ambos não mudam nada.......
se vc puder me ajudar.....
eu te cadastrei no meu msn bele?tem algum problema?


GOSTEI 0
Vinicius2k

Vinicius2k

25/10/2004

eu realmente preciso de todos os dados na tela.....o q eu estava pesquisando agora q eu espero q vc possa me ajudar é como atualizar apenas o registro q foi alterado...ao inves de abrir e fechar o banco de dados.....

Com certeza vc não precisa de todos os registros na tela de uma só vez. O que a propriedade PacketRecords faz é trazer o número de registros que vc determinar de cada vez. Tudo automático, a não ser q vc configure para não ser automático...
Se vc tem um grid que exibe 10 registros vc só precisa trazer 10, quando tentar rolar a grid para exibir o registro 11, o CDS irá buscar mais 10, e mais 10, e assim por diante... isso é chamado de fetch por demanda...

tem dois eventos q teoricamente serviria para este fim...o refresh record e o update record......mas ambos não mudam nada...

O único método que envia as atualizações para o Banco de Dados é o ApplyUpdates, e, volto a afirmar, só é enviado o que foi modificado e seu problema não está em aplicar as atualizações mas em fechar e abrir o CDS novamente trazendo todos os registros...

eu te cadastrei no meu msn bele?tem algum problema?

Blz. Nenhum problema. :wink:

T+


GOSTEI 0
Renatobso

Renatobso

25/10/2004

Muito obrigado pela dica.....resolveu o meu problema...só q isso gerou um outro problema.....eu disse q precisava de todos os dados na tela pq eu uso o LOCATE (faço as pesquisas direto no CDS), porém com esta propriedade(PacketRecords) quando eu faço uma localizaçao em algum registro que foge dos q estao na tela ela automaticamente busca todo o banco de dados....logo fica travado alguns segundos pra fazer essa seleção...Pode me ajudar nessa?ficaria muito grato por isso....

desde de já agradeço pela atenção até aqui demonstrada....

Falow.....


GOSTEI 0
Vinicius2k

Vinicius2k

25/10/2004

Colega,

Infelizmente, isto não tem solução... os métodos Locate, RecordCount e Last, vão forçar o fetch de todos os registros para o lado do cliente para que possam trabalhar... e isso é inevitável...

É por isso que a utilização do Locate não é recomendada no modelo Client/Server, aliás nem mesmo a forma que vc está fazendo que, apesar de estar realizando o fetch por demanda (o que é um atenuante), traz um grande volume de registros... eu sei que isso, algumas vezes, é inevitável e é por isso que existe o recurso para realizar o fetch dos registros conforme necessário...

Eu lhe aconselho a trabalhar com ´filtros´ (SQL where) em substiução ao locate porque esta é a forma ideal de implementar buscas no modelo C/S.

T+


GOSTEI 0
Renatobso

Renatobso

25/10/2004

Eu ja uso esse tipo de filtro(SQL), mas muitos clientes sentem a necessidade de ir escrevendo o nome de um cliente e ele ja ir buscando automaticamente no grid...por isso preciso dele tb......mas de qualquer forma vc ja me ajudou bastante...até pq se eu não usar suas dicas nesse atual momento com certeza eu vou precisar delas mais tarde....

valew cara...
falow......


GOSTEI 0
Renatobso

Renatobso

25/10/2004

Outra coisa......será q não tem como fazer o q eu quero em BackGround???Tipo enquanto o cds for se atualizando a tela não travar...ele ir jogando os dados na tela conforme ele for trazendo.....???


GOSTEI 0
POSTAR