Validar al grabar cebeceza y detalle

Mi nombre es marco guttierrez y quisiera que me ayuden
al ingresar los datos de la cabecera y el detalle de un documento
quiero validarlo me explico por ejemplo si intento grabar un documento
(Cabecera y detalle) ... Y tengo un error en el detalle
va a grabar la cabecera pero el detalle (y viceversa) no ... Hay alguna
manera de si manda un error en la cabecera o en el detalle no grabe
nada. Muchas gracias
----------------------------------------------------------------------------------------------------------------------
Try
Dim cmd As New OleDb.OleDbCommand
cmd.Connection = Con
Dim sql As String
sql
= "insert into NOTADECREDITO values ('" & TXTidnotadecredito.Text
& "' , '" & DateTimePicker1.Value.Date & "' , '" &
TXTidfactura.Text & "' , '" & TXTtotalsubtotalDEV.Text & "',
'" & TXTtotaligvDEV.Text & "', '" & TXTtotalDEV.Text &
"','" & TXTtotalgalonajeDEV.Text & "','" &
TXTnumeronc.Text.Trim & "')"
cmd.CommandType = CommandType.Text
cmd.CommandText = sql
Con.Open()
cmd.ExecuteNonQuery()
Con.Close()
Catch ex As Exception
MsgBox("ERROR AL TRATAR DE GRABAR CABECERA")
MsgBox(ex.Message) : Con.Close()
End Try
-----------------
Try
For i = 0 To DGVNC.Rows.Count - 1
Dim cmd2 As New OleDb.OleDbCommand
cmd2.Connection = Con
Dim sql2 As String
sql2
= "insert into DETNOTACREDITO values ( '" & TXTidnotadecredito.Text
& "' , '" & DGVNC.Rows(i).Cells(0).Value & "' ,'" &
DGVNC.Rows(i).Cells(3).Value & "' ,'" &
DGVNC.Rows(i).Cells(4).Value & "' ,'" &
DGVNC.Rows(i).Cells(5).Value & "' ,'" &
DGVNC.Rows(i).Cells(6).Value & "' ,'" &
DGVNC.Rows(i).Cells(7).Value & "' )"
cmd2.CommandType = CommandType.Text
cmd2.CommandText = sql2
Con.Open()
cmd2.ExecuteNonQuery()
Con.Close()
Next
Catch ex As Exception
MsgBox("ERROR AL TRATAR DE GRABAR DETALLE")
MsgBox(ex.Message) : Con.Close()
End Try
---------
'aquí actualizo los campos de la tabla factura que también afecta si hay error en la nota de crédito
Try
Dim est As String = String.Empty
If TXTestado.Text = "CANCELADO" Then est = "C"
If TXTestado.Text = "PENDIENTE" Then est = "P"
Dim cmd3 As New OleDb.OleDbCommand
cmd3.Connection = Con
Dim sql3 As String
sql3
= "Update FACTURAS Set nc = '" & TXTnc.Text.Trim & "'
,pendiente= '" & TXTpendiente.Text & "',estado = '" & est
& "' WHERE idfactura = '" & TXTidfactura.Text & "'"
cmd3.CommandType = CommandType.Text
cmd3.CommandText = sql3
Con.Open()
cmd3.ExecuteNonQuery()
Con.Close()
Catch ex As Exception
MsgBox("ERROR AL aCTUALIZAR FACTURA")
MsgBox(ex.Message) : Con.Close()
End Try
MsgBox("Se Grabo Correctamente", 64, "CONFIRMACIÓN")
TXTnumero.Clear()
TXTnumeronc.Clear()
TXTnumeronc.Focus()
Call limpiar()
End If
----------------------------------------------------------------------------------------------------------------------

Respuesta
1

Tray endtray definen una transacción, si tu quieres que la actualización de las distintas tablas pertenezcan a una sola transacción debes usar un solo tray y no uno para cada grabación de tabla, esto hará que cualquier error de grabación, deshaga la transacción y cancele todas las grabaciones realizadas.

Cualquier duda estoy a tus ordenes, solo que voy ha estar fuera 10 días y no voy a contestar muy rapido.

Bye

gracias por responder pero ya hice lo que me dices pero no funciona por ejemplo como tu dices agrego datos a dos tablas (notas de crédito y detalle de notas de crédito ) y actualizo una tercera tabla (clientes) si por ejemplo

*******try

' grabo nota de crédito

código.....

Con.Open()
cmd.ExecuteNonQuery()
Con.Close()

'grabo detalle nota de crédito

código ....

Con.Open()
cmd2.ExecuteNonQuery() 'si el error es aquí es verdad que el try contiene el error
Con.Close() 'pero ya grabo la tabla nota de crédito me puedes explicar

'actualizo la factura 'como solucionarlo

Con.Open()
cmd3.ExecuteNonQuery()
Con.Close()

*********Catch ex As Exception

MsgBox("mensaje de error")
MsgBox(ex.Message) : Con.Close()


**********End Try

gracias

Creo que no me explique bien, Lo quiero decir es que debes usar transacciones, a continuación te muestro una pagina de la ayuda de visual basic y el código que contiene para que te des cuenta de que debes hacer.

http://msdn.microsoft.com/es-es/library/cc464026(v=VS.71).aspx

Dim myTransaction As SqlClient.SqlTransaction

dcNorthwind.Open()

myTransaction = dcNorthwind.BeginTransaction()

daCustomers.UpdateCommand.Transaction = myTransaction daOrders.UpdateCommand.Transaction = myTransaction
Try

daCustomers.Update(DsNorthwind1)

daOrders.Update(DsNorthwind1)

myTransaction.Commit()

Catch dbcex As DBConcurrencyException

MessageBox.Show("Update Failed, Concurrency Exception")

myTransaction.Rollback()

Catch ex As Exception

MessageBox.Show("Update Failed")

myTransaction.Rollback()

Finally

dcNorthwind.Close()

End Try

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas