BEGINTRANS E COMMITTRANS

WHELLNET 13/10/2009 21:45:05
#325220
Fala pessoal. Gostaria da ajuda de vocês sobre essa questão.
- Utilizo Firebird 2.1
- Conecto no Splash e Desconecto do UnLoad.

Desenvolvi um novo projeto, e nele comecei a utilizar o BeginTrans e CommitTrans nas transações durante as gravações no banco de dados.
Porém estou com um problema um tanto quando estranho. Algumas das transações não estão sendo gravadas no banco.

Abaixo o esquema da rotina de gravação.
Private Sub cmd_confirmar()
On Error GoTo TrataErros
[ô]Faço a validação dos campos afim de evitar algum campo essencial não preenchido ou preenchido errado
Conexao.BeginTrans
[ô]Gravo tbl_vendas (Tabela principal)
[ô]Gravo tbl_vendasprodutos (itens produtos da venda)
[ô]Gravo tbl_receber (financeiro)
TrataErros:
Select Case Err.Number
Case 0
Conexao.CommitTrans
If MsgBox([Ô]Deseja imprimir o pedido agora?[Ô], vbQuestion + vbYesNo) = vbYes Then
frm_spool.Id = 21
frm_spool.Parametro = IdNovo & [Ô]|1|1[Ô]
frm_spool.Show 1
End If
Unload Me

Case Else
Conexao.RollbackTrans
[ô]mostra uma tela com o erro e arquivo um log da operação
GravaErro Err.Number, Err.Description, Sql, [Ô]frm_cadpvendas.cmd_confirma_Click[Ô]
Err.Clear
End Select


Pois bem, funciona quase perfeitamente.
Acontece que tem horas que o sistema não grava no banco. O curioso é que o cliente consegue imprimir o pedido numa boa. Lembrando que esse pedido é um relatório com informações provenientes do banco.

E notei que realmente foi reservado os id[ô]s da tabela, pois os mesmos ficam ausentes.
Estou fazendo algo errado? Tem algum outro comando pra gravar?
Ahh detalhe, esse erro é intermitente. 90% funciona normal. Uma ocasião ou outra o sistema me apronta uma destas :-(.
Uma vez até passei vergonha, falei que o cliente talvez não tivesse salvo, ai o cliente me mostrou o pedido impresso :-P

Mais alguma considerações:
- Não há exclusão do pedido (não pq no sistema não há essa opção)
- Não acredito que tenha algum excluindo.

Não sei o que fazer, alguem tem alguma dica?
Grato
TECLA 13/10/2009 23:10:59
#325232
Citação:

[ô]Gravo tbl_vendas (Tabela principal)
[ô]Gravo tbl_vendasprodutos (itens produtos da venda)
[ô]Gravo tbl_receber (financeiro)



Você utiliza STORED PROCEDURE no processo de gravação?
Experimenta executar a rotina de inclusão usando uma SP, retornando um valor após a INSERÇÃO.

Exemplo:
...
SELECT [ô]COD_RET[ô]=1, [ô]MENS_RET[ô]=[ô]CADASTRO EFETUADO[ô]
...


Se as SPs retornarem 1, COMMIT... Caso contrário... ROLLBACK.

é uma possibilidade.
WHELLNET 13/10/2009 23:54:55
#325236
Na verdade não utilizo SP pra essa função. é que a rotina é um pouco grande então resumi
Em anexo a rotina completa.

Notei que no Ibexpert, no final dos processos (Sql Editor por exemplo) ele carrega o comando
Commit Work.
Vou colocar isso pra testar no cliente.
GREGO 14/10/2009 09:43:34
#325252
controle as transações pelo banco, é melhor

crie uma procedure que faça o que vc precisa

nela vc pode gerar erros para depois vc tratar no seu código

e o commit fica dentro do proprio banco
Tópico encerrado , respostas não são mais permitidas