Mensaje dentro de Foro VB.NET

Responder 
#1 - 15/04/2008 15:57:47 Reporta abuso | Link Permanente
Pelad0
Fecha de registro: 15/04/2008
0 post en este tema
1 post en foro vb.net
1 post en todos los foros
Formulario Maestro-Detalles

Responder Citar
Hola, colegas, los molesto por un problema que ya me está consumiendo las pocas neuronas que aún conservo. Tengo dos tablas en Access relacionadas, una para almacenar las órdenes y otra para los detalles de las mismas. La estructura de las mismas es:


 

 

Tabla Ordenes

------------------

ID_Orden           Autoumérico                     Clave primaria

Fecha               Fecha/Hora

 

 

Tabla Detalles

-----------------

ID_Orden           Numérico                           Clave primaria

ID_Item               Numérico                           Calve primaria

Concepto            Texto

Importe               Numérico

 

 

Las tablas se relacionan por el campo ID_Orden. La relación está establecida en el Access, exigiendo integridad referencial, y actualizando y eliminando en cascada. A la vez, creé un Dataset en mi proyecto con estas dos tablas, donde también establezco la misma relación. Tengo un formulario en mi proyecto donde utilizo un TextBox para mostrar el campo ID_Orden, un DateTimePicker para el campo Fecha, y un DataGridView para los detalles. Siguiendo algunos ejemplos que pude ir encontrando, en el evento Enter del DataGridView hago un EndEdit del BindingSource de las ordenes, y al momento de grabar los datos, hago algo así:

 

Me.Validate()

Me.OrdersBindingSource.EndEdit()

Me.DetailsBindingSource.EndEdit()

 

Dim orderUpdates() As DataRow = Me.TestDataSet.Orders.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)

Dim detailUpdates() As DataRow = Me.TestDataSet.Details.Select("", "", DataViewRowState.Added Or DataViewRowState.ModifiedCurrent)

 

Me.OrdersTableAdapter.Update(orderUpdates)

Me.DetailsTableAdapter.Update(detailUpdates)

 

Dim orderDeletes() As DataRow = Me.TestDataSet.Orders.Select("", "", DataViewRowState.Deleted)

Dim detailDeletes() As DataRow = Me.TestDataSet.Details.Select("", "", DataViewRowState.Deleted)

 

Me.DetailsTableAdapter.Update(detailDeletes)

Me.OrdersTableAdapter.Update(orderDeletes)

 

 

El inconveniente es que al ejecutar la instrucción “Me.DetailsTableAdapter.Update(detailUpdates)” obtengo un error que indica “No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla Ordenes”. Según entiendo, el error se produce porque el Access asigna en la instrucción anterior (“Me.OrdersTableAdapter.Update(orderUpdates)”) un identificador para el campo ID_Orden, pero el mismo no se traslada al campo relacionado de la grilla, por lo que se pierde la integridad referencial. El problema es que no sé cómo solucionarlo, ya probé varias combinaciones (no establecer la relación en el Access, cambiarla para que no exija integridad referencial, indicar en el Dataset que comience el incrementador del campo ID_Orden en -1 y que el paso sea -1 (también lo leí en algunos ejemplos), pero nada funcionó. Traté de encontrar algún ejemplo que hiciera lo mismo, pero no lo conseguí. ¿Alguno tendrá algún ejemplo que me permita descubrir dónde estoy fallando?

 

 

Saludos, y muchas gracias a todos,

 

 

Andrés

Volver arriba