Access - Borrar Reg.(tabla1)y Subreg(Tabla2)con ADO

   
Vista:

Borrar Reg.(tabla1)y Subreg(Tabla2)con ADO

Publicado por Gema (26 intervenciones) el 03/03/2011 20:33:02
Hola a tod@s:

Tengo un formulario principal y un subformulario en el que se relacionan de uno a varios registros. Para que me entendáis diré que el formulario principal indica una venta a un cliente, y en el subformulario se detallan las facturas necesarias hasta completar esa venta. Digamos que es una venta principal (formulario) hecha por diferentes entregas o facturas (subformulario)…

Lo que necesito es que si una venta que ya estaba grabada se ha anulado, mediante un botón de comando, se elimine tanto el registro de la tabla principal de ventas como los registros de la otra tabla relacionada.

El formulario principal está compuesto de campos independientes y se usa ADO.

¿Cómo puedo hacerlo?. Muchisimas gracias y saludos: Gema.


A continuación, os paso las principales funciones de grabar y editar que tengo en el formulario para que me entendais mejor:

'El formulario principal está editado con ADO:

Option Compare Database
Private cnn As ADODB.Connection
Private WithEvents Reg As ADODB.Recordset
Dim nChar As Integer
Option Explicit

'Y al cargar el formulario entramos en modo nuevo registro:

Private Sub Form_Load()
Set cnn = Application.CurrentProject.Connection
End Sub

'Si actualizo un combo con un código determinado para una venta determinada, me aparecen todos los datos grabados anteriormente:

Private Sub Combo01_AfterUpdate()
TipoReg.Caption = "Modificar Registro": TipoReg.ForeColor = 6723891
Set Reg = New ADODB.Recordset
Reg.Open "Select * From TVentasCiclos Where IdVentaCiclo ='" & _
Combo01 & "'", cnn, adOpenDynamic, adLockOptimistic
If Not Reg.EOF Then

IdVentaCiclo = Reg!IdVentaCiclo
Combo10 = Reg!IdCliente
Id_Empresa = Reg!Id_Empresa


Cuadro_combinado30 = Reg!Consultor
Importe = Reg!Importe
Ejercicio = Reg!Ejercicio
Else
Combo01.SetFocus
End If
Reg.Close: Set Reg = Nothing
End Sub

'Y grabo el registro principal mediante un botón de comando:

Private Sub Comando38_Click()
On Error Resume Next
Set Reg = New ADODB.Recordset
Reg.Open "SELECT * From TVentasCiclos Where IdVentaCiclo ='" & _
Combo01 & "'", cnn, adOpenDynamic, adLockOptimistic
If Reg.EOF Then Reg.AddNew

Reg!IdCliente = Combo10
Reg!IdVentaCiclo = IdVentaCiclo
Reg!Id_Empresa = Id_Empresa
...
Reg!Consultor = Cuadro_combinado30
Reg!Importe = Importe
Reg!Ejercicio = Ejercicio
Reg.Update
Combo01.Requery 'Actualiza el Combo32 con el nuevo Registro
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Borrar Reg.(tabla1)y Subreg(Tabla2)con ADO

Publicado por Marcelo (161 intervenciones) el 04/03/2011 13:16:29
Hay un par de formas que para mi son menos complejas

La primera es borrar el registro de la tabla principal. Para que se borren en cascada los registros en la tabla relacionada sólo basta con especificar en la relación de ambas (2 clic en la linea de relación) la integridad referencial y seleccionar 2 casilleros de selección: Exigir integridad referencial y permitir eliminar en cascada.

La otra es en VBA hacer ejecutar 2 sentencias SQL, cada una borra los registros especificados en un combobox que contiene el Id que vincula ambas tablas:

'Quita las advertencias, no pregunta si estamos seguros de borrar, sólo lo hace

DoCmd.SetWarnings False

'Ejecuta un sql que elimina el registro de la Tabla: Ventas seleccionado
'como parametro desde el combobox IdVenta del formulario VentasAnaliza

DoCmd.RunSQL "DELETE Ventas.IdVenta " & _
"FROM Ventas " & _
"WHERE (((Ventas.IdVenta)=[Forms]![VentasAnaliza]![IdVenta]));"

'Ejecuta un sql que elimina el registro de la Tabla: VentasDetalle seleccionado
'como parametro desde el combobox IdVenta del formulario VentasAnaliza

DoCmd.RunSQL "DELETE VentasDetalle.IdVenta " & _
"FROM VentasDetalle " & _
"WHERE (((VentasDetalle.IdVenta)=[Forms]![VentasAnaliza]![IdVenta]));"

'Reestablece las advertencias, es muy importante porque sino
'quedariamos sin cuadros de dialogo de advertencias

DoCmd.SetWarnings True

'Limpia el combobox IdVenta, ya que esta venta ya se ha borrado

IdVenta.Value = Null

'Actualiza el combobox IdVenta

DoCmd.Requery "IdVenta"

'Actualiza el subformulario VentasAnalizaDetalle para que el detalle
'que hemos borrado en la tabla se refleje en el sistema de formularios

DoCmd.Requery "VentasAnalizaDetalle"

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

!OK MARELO¡ :Borrar Reg.(tabla1)...

Publicado por Gema (26 intervenciones) el 04/03/2011 21:40:57
Hola Marcelo:

Tal y como tengo la BD, con la primera forma que indicas(Exigir integridad referencial y permitir eliminar en cascada usando la relaciones de tablas) no puedo hacerlo ya que cuando quiero introducir una Venta NUEVA, hasta que no he grabado el registro, la clave de la tabla principal (tabla1) aun no está generada y por lo tanto cuando quiero introducir registros en el subformulario (tabla2), al necesitar integridad referencial, me indica que no es posible ya que necesita un registro relacionado y aún no está creado. No se si me explico bien…

Pero, ¡!!!!!! LA SEGUNDA OPCIÓN ME FUNCIONA PERFECTAMENTE¡¡¡¡¡¡

Vamos, que funciona tan bien que me he cargado borrando y venga a borrar todos los registros de prueba que tenía.

Mil gracias Marcelo, me has ayudado enormemente, así que te mando un afectuoso abrazo: :-)

Gema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar