BEGINTRANS/COMMITTRANS NO FIREBIRD
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.
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.
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
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
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
poste a rotina no topico.
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.
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.
Experimente fazer um Dispose do objeto FbCommand que está no escopo da iteração.
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 ?
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