Perdendo registro com o Interbase
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!
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
Curtidas 0
Respostas
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+
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
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!!!
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
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
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
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
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
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
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
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
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
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
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]
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
25/06/2003
>> Como não uso nada no OnGetTableName ...
Vc deveria (também) usar o evento OnGetTableName:
TableName := ´NomeTabelaQueSeraAtualizada´;
T+
Vc deveria (também) usar o evento OnGetTableName:
TableName := ´NomeTabelaQueSeraAtualizada´;
T+
GOSTEI 0