Delphi 6 x DBExpress x Firebird 1.5
Prezados Senhores,
Estou com um problema de um tamanho de um bonde. Tenho uma aplicação de controle de cobrança e a mesma como não poderia deixar de menos, tem uma rotina para gerar o movimento de cobrança de um determinado mês/ano.
O meu problema é: Após os cálculos de cobrança, todos os dados aparecem na tela e quando mando enviar para o servidor, com um bom [color=red:0b14b16ad1]cdsCobranca.ApplyUpdates(0); SQLConection.Commit(Transacao);[/color:0b14b16ad1]
onde:
[color=red:0b14b16ad1]...
var Transacao: TTransactionDesc;
...
with Transacao do begin
TransactionID := 1;
IsolationLevel := xilREADCOMMITTED;
end;
...[/color:0b14b16ad1]
Os dados não são efetivamente gravados em minha tabela COBRANCA. Enquanto que antes do período atual o sistema rodada corretamente.
Será que tem alguma alma que pode me socorrer???
PS: O ProviderFlags do meu TSQLDataSet estão corretos.
:arrow: [color=red:0b14b16ad1]Título alterado pelo Moderador oTTo. Removido: ´Me socorram!!!´[/color:0b14b16ad1]
Estou com um problema de um tamanho de um bonde. Tenho uma aplicação de controle de cobrança e a mesma como não poderia deixar de menos, tem uma rotina para gerar o movimento de cobrança de um determinado mês/ano.
O meu problema é: Após os cálculos de cobrança, todos os dados aparecem na tela e quando mando enviar para o servidor, com um bom [color=red:0b14b16ad1]cdsCobranca.ApplyUpdates(0); SQLConection.Commit(Transacao);[/color:0b14b16ad1]
onde:
[color=red:0b14b16ad1]...
var Transacao: TTransactionDesc;
...
with Transacao do begin
TransactionID := 1;
IsolationLevel := xilREADCOMMITTED;
end;
...[/color:0b14b16ad1]
Os dados não são efetivamente gravados em minha tabela COBRANCA. Enquanto que antes do período atual o sistema rodada corretamente.
Será que tem alguma alma que pode me socorrer???
PS: O ProviderFlags do meu TSQLDataSet estão corretos.
:arrow: [color=red:0b14b16ad1]Título alterado pelo Moderador oTTo. Removido: ´Me socorram!!!´[/color:0b14b16ad1]
Tinorj
Curtidas 0
Respostas
Vinicius2k
20/07/2004
Colega,
Apenas vc poderá entender o que estah acontecendo, mas para isso precisa ver o que está acontecendo...
1 - Não se controla transações no dbExpress quando se faz uso de ClientDataSets... a própria Midas irá abrir a transação, realizar as operações e ´commitar´ a transação... esta transação q vc estah abrindo e commitando não é a mesma envolvida no ApplyUpdates no CDS.
2 - O método ApplyUpdates não gera exceção em caso de problemas... ele retorna o número de erros ocorridos durante a tentativa de aplicar no banco, então o primeiro passo é testar se ocorreu algum erro com :
3 - Para saber qual, ou quais, erro(s) ocorreram no processo vc precisa trabalhar no evento OnReconcileError do CDS, por exemplo:
Fazendo isso vc irá descobrir exatamente que erro está ocorrendo, se houver algum, e de posse da mensagem de retorno do banco poderá ajustar sua rotina para solucionar o problema.
Pessoalmente eu não uso métodos do CDS para situações de grande processamento como estas... Na sua posição eu controlaria explicitamente a transação, abrindo-a (como vc está fazendo), executaria diretamente as instruções SQL no servidor e ´commitaria´ se não houvessem exceções ou daria um Rollback em caso de problemas...
Quando vc tem duas operações, por exemplo a geração de uma N.F e seus títulos à receber, vc aplica os updates da N.F e tudo bem, não ocorrem erros, mas durante a aplicação dos títulos houve um erro... vc ficará com uma N.F sem títulos pois são CDS diferentes com transações diferentes... essa é minha opinião...
Espero ter ajudado...
T+
Apenas vc poderá entender o que estah acontecendo, mas para isso precisa ver o que está acontecendo...
1 - Não se controla transações no dbExpress quando se faz uso de ClientDataSets... a própria Midas irá abrir a transação, realizar as operações e ´commitar´ a transação... esta transação q vc estah abrindo e commitando não é a mesma envolvida no ApplyUpdates no CDS.
2 - O método ApplyUpdates não gera exceção em caso de problemas... ele retorna o número de erros ocorridos durante a tentativa de aplicar no banco, então o primeiro passo é testar se ocorreu algum erro com :
if CDS.ApplyUpdates(0) = 0 then //não houve erro else // houve erro chame CDS.CancelUpdates, por exemplo
3 - Para saber qual, ou quais, erro(s) ocorreram no processo vc precisa trabalhar no evento OnReconcileError do CDS, por exemplo:
Action:= raCancel; ShowMessage(E.Message);
Fazendo isso vc irá descobrir exatamente que erro está ocorrendo, se houver algum, e de posse da mensagem de retorno do banco poderá ajustar sua rotina para solucionar o problema.
Pessoalmente eu não uso métodos do CDS para situações de grande processamento como estas... Na sua posição eu controlaria explicitamente a transação, abrindo-a (como vc está fazendo), executaria diretamente as instruções SQL no servidor e ´commitaria´ se não houvessem exceções ou daria um Rollback em caso de problemas...
Quando vc tem duas operações, por exemplo a geração de uma N.F e seus títulos à receber, vc aplica os updates da N.F e tudo bem, não ocorrem erros, mas durante a aplicação dos títulos houve um erro... vc ficará com uma N.F sem títulos pois são CDS diferentes com transações diferentes... essa é minha opinião...
Espero ter ajudado...
T+
GOSTEI 0
Tinorj
20/07/2004
Nobre Vinícius,
Com relação a criar a rotina diretamente via instruções SQL está transquilo, porém antes de eu realmente efetivar e executar das instruções, meu usuário precisa visualizar os dados e possa fazer modificações que ele ache necessário antes de enviar para o servidor.
O jeito é fazer na mão mesmo... Só que o mais engraçado é que nos dois meses anteriores funcionou perfeitamente, só agora no 3º mês começou a acontecer isso.
Mas mesmo assim valeu pela explicação sobre o funcionamento do MIDAS, pois estou usando essa tecnologia a pouco tempo... Antes eu era viciado em BDE, ninguém é perfeito...
[]´s :wink:
PS: POXA oTTo, por que vc tirou o ´Me socorram!!!´ do meu tópico? Era caso de urgência... Tá 3Kg, mas na próxima vez que isso acontecer, eu conto tudo pra minha mãe... 8)
Com relação a criar a rotina diretamente via instruções SQL está transquilo, porém antes de eu realmente efetivar e executar das instruções, meu usuário precisa visualizar os dados e possa fazer modificações que ele ache necessário antes de enviar para o servidor.
O jeito é fazer na mão mesmo... Só que o mais engraçado é que nos dois meses anteriores funcionou perfeitamente, só agora no 3º mês começou a acontecer isso.
Mas mesmo assim valeu pela explicação sobre o funcionamento do MIDAS, pois estou usando essa tecnologia a pouco tempo... Antes eu era viciado em BDE, ninguém é perfeito...
[]´s :wink:
PS: POXA oTTo, por que vc tirou o ´Me socorram!!!´ do meu tópico? Era caso de urgência... Tá 3Kg, mas na próxima vez que isso acontecer, eu conto tudo pra minha mãe... 8)
GOSTEI 0
Vinicius2k
20/07/2004
O jeito é fazer na mão mesmo... Só que o mais engraçado é que nos dois meses anteriores funcionou perfeitamente, só agora no 3º mês começou a acontecer isso.
Bem, não posso precisar o que estah ocorrendo, mas se utilizar o trabalho no OnReconcileError vc mesmo saberá pois estará vendo a mensagem de retorno do banco... eu me arriscaria a dizer que é uma violação de chave primária ou estrangeira, mas é só uma suposição...
T+
GOSTEI 0
Tinorj
20/07/2004
Com certeza não há violação de chave primária... Mas numa outra oportunidade vou experimentar sua idéia...
Valeu Brow!!!
Valeu Brow!!!
GOSTEI 0