Fórum Perdendo registro com o Interbase #37117
25/06/2003
0
Características
Delphi 7 + Bde +ClientDataSet (no BDE coloquei as configuração p/ ele n fazer cache)
O sistema possui cerca de 50.000 registro e a cada 100 uma média de 5 estão sumindo(?)
É o primeiro sistema q está se utilizando o Interbase 6.0. Acho que deve ter alguma configuração no BD na qual não estou utilizando.
Obs - Exite algum comando p/ forçar a gravação como existe no Paradox.
Agradeço!
Delmar
Curtir tópico
+ 0Posts
25/06/2003
Afarias
Não sei bem como funciona com BDE que tem um controle interno de transações.
Outra coisa é tomar cuidado com o uso de ClientDataSets uma vez q, se vc não tiver um código no evento OnReconcileError, quando há um erro não gravação do registro, vc não será avisado.
T+
Gostei + 0
26/06/2003
Delmar
Faço tb o tratamento de erros no evento OnReconcileError.
Toda a rede é estruturada e todas os pc estao ligados a nobreaks.
O Ponto chave e o seguinte, não acontece erros enquando vc está utilizando o sistema, tudo ocorre normalmente.
Mas as perdas de informações ocorrem!!!
Gostei + 0
28/06/2003
Tomcorreia
da um saque no link abaixo e tente mudar a forma como o interbase grava os dados no disco. outra coisa. será que não ja é hora de migrar para o IBX ou DBExpress ?
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=49&mode=thread&order=0&thold=0
Gostei + 0
28/06/2003
Tomcorreia
da um saque no link abaixo e tente mudar a forma como o interbase grava os dados no disco. outra coisa. será que não ja é hora de migrar para o IBX ou DBExpress ?
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=49&mode=thread&order=0&thold=0
Gostei + 0
28/06/2003
Afarias
vamos tentar chegar ao problema:
1) Quando vc diz: ´perdas de informações ocorrem´ vc quer dizer:
a) Existem registros no banco q são selecionados (com SELECT) e num tempo qualquer apenas ´somem´!
ou
b) O usuário está inserindo/atualizando dados (no CDS) q depois verificam não foram realmente inseridos/atualizados!
2) Sempre acontece com a(s) mesma(s) tabela(s) ?? (1 ou várias)??
3) Existe caso de ser chamado o OnReconcileError?? o q é feito nesses casos?? (ReconcileErrorDialog??)
4) Vc utiliza o evento BeforeUpdateRecord (ou outro) do DataSetProvider??
5) Vc atualiza querys com JOINS (utiliza o evento OnGetTableName do Provider) ??
6) Vc controla suas transações manualmente?? ou abre transações ligadas a DataSets utilizados por Providers??
7) Vc utiliza NestedDataSets?? ou Mestre-Detalhe?? -- como procede com as inclusões/atualizações??
8) Qual o valor da propriedade ResolveToDataSet nos Providers??
-- Dica: Utilize um SQLMonitor para verificar se tudo está sendo enviado corretamente para o banco de dados -- e ´comitado´ sempre!
Abraço
Gostei + 0
02/07/2003
Delmar
Gostei + 0
02/07/2003
Afarias
Bom, isso já mostra q o problema não está no IB -- más no ´meio´ do caminho!
>> Um dos PCs da rede já inseriu mais de 1300 registros e não ouve mais perda depois de tirar as opções de cache do BDE (schema cache time e schema cache size).
Duvido q o problema esteja nestas propriedades (apesar de não trabalhar com BDE) -- até onde entendo referense apenas ao Metadata!
>> Mas outro PC, configurado da mesma forma ainda está perdendo.
Verificou se ambos executáveis são da mesma versão?? Verificou outras configurações?? As operações realizadas e ´dados´ são os mesmos em ambas estações?? (nenhuma particularidade?)
>> Até agora, de umas 12 tabelas, constatei perda somente em uma.
Ótimo! agora é só depurar os processos de atualização da mesma!
>> Atualizo query com joins, mas não uso o evento OnGetTableName do provider.
Então utiliza o evento OnBeforeUpdateRecord! --> Depure este código!
>> Abro as transações nos componentes Tdatabase, depois aplico os applyupdates dos CDSs e em seguida o commit do Tdatabase.
Huumm!! Em geral é uma melhor abordagem permitir que o DataSetProvider controle as transações! Basta vc nunca abrí-las (serão iniciadas, commitadas ou descartadas automaticamente)
>> Se acontecer novamente, vou monitorar.
Boa Sorte!
Abraço
Gostei + 0
03/07/2003
Delmar
Então utiliza o evento OnBeforeUpdateRecord! --> Depure este código!
[color=blue:74a38aba1c]Também não uso este evento. Apenas uso as propriedades providerflags. Realmente sempre tive duvida, pois por ter varias JOINS, como saberia o provider sobre qual tabela fazer o insert ou update. Como não uso nada no OnGetTableName sempre tive a impressão que um insert ou update ocorreria sobre a primeira tabela a figurar apos o from do select.[/color:74a38aba1c]
>> Abro as transações nos componentes Tdatabase, depois aplico os applyupdates dos CDSs e em seguida o commit do Tdatabase.
Huumm!! Em geral é uma melhor abordagem permitir que o DataSetProvider controle as transações! Basta vc nunca abrí-las (serão iniciadas, commitadas ou descartadas automaticamente)
[color=blue:74a38aba1c]Bom, aqui não gostaria de mudar, pois gostaria de fazer tudo ou nada quando a transação precisa operar sobre dois ou mais CDSs.
[/color:74a38aba1c]
[color=blue:74a38aba1c]Obrigado pelas preciosas colaborações. Continuam sendo bem-vindas.
Delmar[/color:74a38aba1c]
Gostei + 0
03/07/2003
Afarias
Vc deveria (também) usar o evento OnGetTableName:
TableName := ´NomeTabelaQueSeraAtualizada´;
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)