Perdendo registro com o Interbase

Firebird

25/06/2003

Tenho um Aplicativo instalado em rede (4 maquinas + 1 servidor)... Win98+WinXp
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

Delmar

Curtidas 0

Respostas

Afarias

Afarias

25/06/2003

para gravar no Interbase: COMMIT (na transação)

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
Delmar

Delmar

25/06/2003

Afarias quanto ao uso de Commit ja as utilizo nas transações.
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
Tomcorreia

Tomcorreia

25/06/2003

amigo,
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
Tomcorreia

Tomcorreia

25/06/2003

amigo,
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
Afarias

Afarias

25/06/2003

Oi Delmar, seu caso é estranho...

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
Delmar

Delmar

25/06/2003

Oi Delmar, seu caso é estranho... 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! Exato. Insere nos CDS e depois verifica que não foram gravados. 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). Mas outro PC, configurado da mesma forma ainda está perdendo. 2) Sempre acontece com a(s) mesma(s) tabela(s) ?? (1 ou várias)?? Até agora, de umas 12 tabelas, constatei perda somente em uma. 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) ?? Atualizo query com joins, mas não uso o evento OnGetTableName do provider. 6) Vc controla suas transações manualmente?? ou abre transações ligadas a DataSets utilizados por Providers?? Abro as transações nos componentes Tdatabase, depois aplico os applyupdates dos CDSs e em seguida o commit do Tdatabase. 7) Vc utiliza NestedDataSets?? ou Mestre-Detalhe?? -- como procede com as inclusões/atualizações?? 8) Qual o valor da propriedade ResolveToDataSet nos Providers?? False. -- Dica: Utilize um SQLMonitor para verificar se tudo está sendo enviado corretamente para o banco de dados -- e ´comitado´ sempre! Se acontecer novamente, vou monitorar. Abraço



GOSTEI 0
Afarias

Afarias

25/06/2003

>> Exato. Insere nos CDS e depois verifica que não foram gravados.

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
Delmar

Delmar

25/06/2003

Atualizo query com joins, mas não uso o evento OnGetTableName do provider.

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
Afarias

Afarias

25/06/2003

>> Como não uso nada no OnGetTableName ...

Vc deveria (também) usar o evento OnGetTableName:

TableName := ´NomeTabelaQueSeraAtualizada´;


T+


GOSTEI 0
POSTAR