Fórum Dúvida a respeito de transação dbexpress (msg erro) #335033

21/12/2006

0

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?


Rodrigo Buschmann

Rodrigo Buschmann

Responder

Posts

21/12/2006

Rodrigo Buschmann

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


Responder

Gostei + 0

21/12/2006

Macario

Olá.

O que exatamente é executada para correção no [b:b54e02bd4d]item 6[/b:b54e02bd4d]?


[]´s


Responder

Gostei + 0

21/12/2006

Rodrigo Buschmann

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



[img:00541ef2b0]http://www.digibyte.inf.br/imagem.gif[/img:00541ef2b0]


Responder

Gostei + 0

21/12/2006

Macario

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


Responder

Gostei + 0

21/12/2006

Rodrigo Buschmann

Se quizer ver o código:

http://www.digibyte.inf.br/codigo.txt


Responder

Gostei + 0

21/12/2006

Rodrigo Buschmann

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 ...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar