BEGINTRANS/COMMITTRANS NO FIREBIRD

ARNALDOCRUZ 08/10/2010 15:15:39
#354715
boa tarde

tenho um rotina que Incluir altera registro em umas 7 tabelas o esquema é +- como abaixo

1 - adiciono ou edito um numero de PDV na Tabela PDV
2 - adiciono ou edito um numero na tabela Ordem
3 - Adiciono registro na tabela Venda
4 - Adiciono registro na tabelas Itens vendido
5 - Adiciono registro na tabela contas a receber
6 - Adiciono registro na tabela Caixa
7 - Delete a tabela temporaria de Venda

se acontecer qualquer coisa errada neste meio quero que seja abortado todo processo.

do jeito que está vem gravando os dados no item 6 acontece um erro os registros ficam gravados nas tabelas anteriores.

Pergunto

Como eu posso usar o BeginsTrans e CommitTrans/RollbackTrans no vbnet com Firebird para o exemplo acima.



TECLA 08/10/2010 19:25:33
#354750
Resposta escolhida
Veja se o trecho de código abaixo te ajuda.

Private Shared Sub Teste() 
[ô]define a conexão
Dim con As SqlConnection = New SqlConnection([Ô]sua string de conexão[Ô])
[ô]define o objeto SqlTransaction
Dim transaction As SqlTransaction
con.Open
[ô]Inicia a Transação
transaction = con.BeginTransaction
Try
[ô]relaciona os comandos e executa-os
call (New SqlCommand([Ô]INSERT INTO Tabela1 [Ô] + [Ô](Texto) VALUES ([ô]teste1[ô]);[Ô], con, transaction)).ExecuteNonQuery
call (New SqlCommand([Ô]INSERT INTO Tabela1 [Ô] + [Ô](Texto) VALUES ([ô]teste2[ô]);[Ô], con, transaction)).ExecuteNonQuery
call (New SqlCommand([Ô]INSERT INTO Tabela2 VALUES [Ô] + [Ô]([ô]A[ô], [ô]B[ô], [ô]C[ô]);[Ô], con, transaction)).ExecuteNonQuery
[ô]efetua o commit e confirma as alterações
transaction.Commit
Catch sqlError As SqlException
[ô]se ocorreu uma exceção desfaz as alterações
transaction.Rollback
End Try
con.Close
End Sub
ARNALDOCRUZ 09/10/2010 22:39:50
#354800
Tecla da forma que vc passou funciona já testei.

tipo executando tabelas seguidas. mas no meu caso é +- como abaixo

tabela Ordem
tabela PDV
tabelaVendas
tabela Caixa
tabela temporaria

tabela itens venda --->>> aqui tem um loop

tabela contas a receber ---->>> tem um loop


quando executa o loop da erro





TECLA 10/10/2010 09:41:52
#354802
poste a rotina no topico.
ARNALDOCRUZ 10/10/2010 10:53:12
#354803
em um modulo

Public fbCmd As FbCommand
Public selcom As New FbCommand
Public sqlTabela As String = [Ô][Ô]
Public Fbconn As FbConnection = New FbConnection

função de conexao

Fbconn = New FbConnection
Strcon = [Ô]User=SYSDBA;Password=masterkey;Database=[Ô] & ConectString & [Ô];DataSource=localhost;Port=3050;Dialect=3;[Ô]
Fbconn.ConnectionString = Strcon
Fbconn.Open()

botão excluir

Dim Reader As FbDataReader
selcom.Connection = Fbconn
selcom.CommandText = [Ô]Select PDV,Codigo,Qtde,Unidade From tblItensVenda Where PDV=[ô][Ô] & Me.txtMeuPDV.Text & [Ô][ô][Ô]
Reader = selcom.ExecuteReader()
If Not Reader.Read Then
Reader.Close()
fbCmd.Dispose()
Fbconn.Close()
Fbconn.Dispose()
FBconexao = False
Me.Cursor = System.Windows.Forms.Cursors.Default
MessageBox.Show([Ô]Venda não localizada[Ô], [Ô]Aviso do sistema[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
Me.txtMeuPDV.Focus()
Exit Sub
End If
Dim transaction As FbTransaction
transaction = Fbconn.BeginTransaction
Try
Do While Reader.Read
Sql = [Ô]UPDATE tblProduto SET Estoque=Estoque + [Ô] & CInt(Reader([Ô]QTDE[Ô])) & [Ô] WHERE Codigo=[ô][Ô] & Reader([Ô]CODIGO[Ô]) & [Ô][ô][Ô]
fbCmd = New FbCommand(Sql, Fbconn)
fbCmd.ExecuteNonQuery()
Loop
Reader.Close()

Sql = [Ô]Delete From tblVenda Where PDV=[ô][Ô] & Me.txtMeuPDV.Text & [Ô][ô][Ô]
fbCmd = New FbCommand(Sql, Fbconn)
fbCmd.ExecuteNonQuery()
Sql = [Ô]Delete From tblParcelaR Where PDV=[ô][Ô] & Me.txtMeuPDV.Text & [Ô][ô][Ô]
fbCmd = New FbCommand(Sql, Fbconn)
fbCmd.ExecuteNonQuery()
Sql = [Ô]Delete From tblItensVenda Where PDV=[ô][Ô] & Me.txtMeuPDV.Text & [Ô][ô][Ô]
fbCmd = New FbCommand(Sql, Fbconn)
fbCmd.ExecuteNonQuery()
transaction.Commit()
Catch
transaction.Rollback()
End Try

Testei tirando o loop e acontece o mesmo erro

Erro -->> Execute requeries the command object to have a transaction object when the connection object assigned to the command
is in pending local transaction.
The Transaction property of the command has not to been initialized.

Execute requerie no comando para poder executar a transação pois existe uma transação pendente nesta conexão.
+- isso a tradução.

só que já desliguei o compuatdor, dei rollback e desde a primeira vez que coloqui o codigo acontece o erro, se eu tirar o begins trans os cmandos são executados normalmente.

TECLA 11/10/2010 19:23:40
#354886
Experimente fazer um Dispose do objeto FbCommand que está no escopo da iteração.
ARNALDOCRUZ 18/10/2010 15:01:57
#355382
não funciona tecla da erro no dispose

fbCmd.Dispose() - Objeto não pode ser instanciado

meu Deus como agente apanha, um negocio tão simples no vb6

Existe uma outra forma de fazer inclusão, alteração exclusão que possa funcionar com BeginTrans ?



Tópico encerrado , respostas não são mais permitidas