Dúvida a respeito de transação dbexpress (msg erro)
Não tenho muita experiência com transações, estou usando clientdataset + provider + sqldataset + firebird e ocorre o seguinte erro:
0 botão gravar
1 inicio uma transação
2 gravo os dados em uma tabela X (post)
3 applyupdates na tabela X
4 executo uma sp que retorna um erro devido a uma informação errada na tela de cadastro
5 executo um rollback
6 corrijo a informação que estava errada na tela
7 botão gravar
8 gravo os dados em uma tabela X (post)
9 applyupdates na tabela X --->>> ERRO! registro não encontrado (record not found or changed ....)
Analizando o log do SQLMonitor vejo que a primeira vez que tenta gravar na tabela X o comando é um INSERT mas na segunda vez o comando é um UPDATE, como não tinha sido gravado nada (por causa do erro na SP que gerou um rollback) o UPDATE falha
Após o rollback o provider não teria que tentar inserir novamente o registro? O que estou fazendo de errado?
0 botão gravar
1 inicio uma transação
2 gravo os dados em uma tabela X (post)
3 applyupdates na tabela X
4 executo uma sp que retorna um erro devido a uma informação errada na tela de cadastro
5 executo um rollback
6 corrijo a informação que estava errada na tela
7 botão gravar
8 gravo os dados em uma tabela X (post)
9 applyupdates na tabela X --->>> ERRO! registro não encontrado (record not found or changed ....)
Analizando o log do SQLMonitor vejo que a primeira vez que tenta gravar na tabela X o comando é um INSERT mas na segunda vez o comando é um UPDATE, como não tinha sido gravado nada (por causa do erro na SP que gerou um rollback) o UPDATE falha
Após o rollback o provider não teria que tentar inserir novamente o registro? O que estou fazendo de errado?
Rodrigo Buschmann
Curtidas 0
Respostas
Rodrigo Buschmann
21/12/2006
Mais uma informação:
Primeiro SQL gerado:
insert into ´LANC_PDV´
(´ID_LANC_PDV´, ´COD_LANC_PDV´, ´TIPO_CARTAO´, ´NR_INICIAL´, ´NR_FINAL´, ´VALOR´)
values
(?, ?, ?, ?, ?, ?)
Segundo SQL gerado:
update ´LANC_PDV´ set
´NR_INICIAL´ = ?,
´NR_FINAL´ = ?,
´VALOR´ = ?
where
´ID_LANC_PDV´ = ?
Aí que dá erro no update pois devido ao erro na SP foi dado um rollback
Primeiro SQL gerado:
insert into ´LANC_PDV´
(´ID_LANC_PDV´, ´COD_LANC_PDV´, ´TIPO_CARTAO´, ´NR_INICIAL´, ´NR_FINAL´, ´VALOR´)
values
(?, ?, ?, ?, ?, ?)
Segundo SQL gerado:
update ´LANC_PDV´ set
´NR_INICIAL´ = ?,
´NR_FINAL´ = ?,
´VALOR´ = ?
where
´ID_LANC_PDV´ = ?
Aí que dá erro no update pois devido ao erro na SP foi dado um rollback
GOSTEI 0
Macario
21/12/2006
Olá.
O que exatamente é executada para correção no [b:b54e02bd4d]item 6[/b:b54e02bd4d]?
[]´s
O que exatamente é executada para correção no [b:b54e02bd4d]item 6[/b:b54e02bd4d]?
[]´s
GOSTEI 0
Rodrigo Buschmann
21/12/2006
Vou tentar explicar:
Existe um relacionamento mestre/detalhe +- como uma nota fiscal (cabeçalho e ítens)
No detalhe, que é uma grid, o usuário digita um nr inicial e final, que são números de cartão telefônicos que estão sendo vendidos.
Como é inviável digitar número por número, motivo pelo qual se coloca o inicial e final, uma SP vai no banco de dados e grava numa tabela de cartões cadastrados que eles foram vendidos
Ocorre que o usuário pode digitar um número de cartão inexistente ou já vendido, isso gera uma exception no BD avisando da situação e um rollback para cancelar também a gravação daquelas tabelas mestre/detalhe que citei lá em cima
O ìTEM 6 se resume então ao usuário voltar na grid, corrigir o numero do cartão e pressionar ´gravar novamente´. Com isso todo o processo é refeito, post na mestre/detalhe e na tentativa do applyupdate dá o erro pois, como falei, é gerado um UPDATE em vez do INSERT
Existe um relacionamento mestre/detalhe +- como uma nota fiscal (cabeçalho e ítens)
No detalhe, que é uma grid, o usuário digita um nr inicial e final, que são números de cartão telefônicos que estão sendo vendidos.
Como é inviável digitar número por número, motivo pelo qual se coloca o inicial e final, uma SP vai no banco de dados e grava numa tabela de cartões cadastrados que eles foram vendidos
Ocorre que o usuário pode digitar um número de cartão inexistente ou já vendido, isso gera uma exception no BD avisando da situação e um rollback para cancelar também a gravação daquelas tabelas mestre/detalhe que citei lá em cima
O ìTEM 6 se resume então ao usuário voltar na grid, corrigir o numero do cartão e pressionar ´gravar novamente´. Com isso todo o processo é refeito, post na mestre/detalhe e na tentativa do applyupdate dá o erro pois, como falei, é gerado um UPDATE em vez do INSERT
GOSTEI 0
Macario
21/12/2006
Olá.
Temos que descobrir pq No segundo ApplyUpdates o State da tabela esta como Edit e não Insert.
vou tentar simular o caso.
[]´s
Temos que descobrir pq No segundo ApplyUpdates o State da tabela esta como Edit e não Insert.
vou tentar simular o caso.
[]´s
GOSTEI 0
Rodrigo Buschmann
21/12/2006
Se quizer ver o código:
http://www.digibyte.inf.br/codigo.txt
http://www.digibyte.inf.br/codigo.txt
GOSTEI 0
Rodrigo Buschmann
21/12/2006
Fiz um projetinho bem simples, só com uma grid e os botões de insert, post, apply, commit e rollback e dá pra ver claramente que o cds, quando vou fazer alguma modificação após o rollback, entra em modo de edição e isso gera o erro conforme relatado
Bem, se fosse pra mim gerar os sql´s poderia contornar isso mas vou ter que mudar tudo e deve existir algum detalhe pra arrumar isso, não é possível ...
Bem, se fosse pra mim gerar os sql´s poderia contornar isso mas vou ter que mudar tudo e deve existir algum detalhe pra arrumar isso, não é possível ...
GOSTEI 0