我正在 Delphi XE3 + SqlServer 上与 ClientDataSets 创建一个简单的主从关系。我已经通过客户端应用程序的 DatasetField 和服务器应用程序的 Detail TUniQuery 中的属性 MasterSource 配置了 Master-Detail。我正在使用一个 DataSetProvider 和一个 DataSource。
服务器应用程序
**Master table**
object qyREMISION_COMPRA: TUniQuery
Connection = DMBase.BD
SQL.Strings = (SELECT R.ID_REMISION_COMPRA, R.FECHA, R.FACTURA
FROM REMISION_COMPRA R
WHERE R.ID_REMISION_COMPRA =:ID_REMISION_COMPRA)
object qyREMISION_COMPRAID_REMISION_COMPRA: TIntegerField
AutoGenerateValue = arAutoInc
FieldName = ID_REMISION_COMPRA
end
**Detail table**
object qyREMISION_COMPRA_PRODUCTO: TUniQuery
Connection = DMBase.BD
SQL.Strings = (SELECT RP.ID_REMISION_COMPRA_PRODUCTO, RP.ID_REMISION_COMPRA, RP.ID_PRODUCTO
FROM REMISION_COMPRA_PRODUCTO RP
WHERE RP.ID_REMISION_COMPRA=:ID_REMISION_COMPRA
ORDER BY RP.ID_REMISION_COMPRA_PRODUCTO)
SQLUpdate.Strings = (UPDATE REMISION_COMPRA_PRODUCTO
SET ID_REMISION_COMPRA = :ID_REMISION_COMPRA, ID_PRODUCTO = :ID_PRODUCTO
WHERE ID_REMISION_COMPRA_PRODUCTO = :Old_ID_REMISION_COMPRA_PRODUCTO)
MasterSource = datasetREMISION_COMPRA
MasterFields = ID_REMISION_COMPRA
DetailFields = ID_REMISION_COMPRA
**DataSetProvider**
object dspREMISION_COMPRA: TDataSetProvider
DataSet = qyREMISION_COMPRA
Options = [poCascadeDeletes, poCascadeUpdates, poPropogateChanges, poUseQuoteChar] end
客户端应用程序
**Master ClientDataSet**
object cdsREMISION_COMPRA: TClientDataSet
ProviderName = 'dspREMISION_COMPRA'
RemoteServer = dmProvs.dspCompra
object cdsREMISION_COMPRAqyREMISION_COMPRA_PRODUCTO: TDataSetField
FieldName = 'qyREMISION_COMPRA_PRODUCTO'
end
**Detail ClientDataSet**
object cdsREMISION_COMPRA_PRODUCTO: TClientDataSet
DataSetField = cdsREMISION_COMPRAqyREMISION_COMPRA_PRODUCTO
为了保存对数据库的更改,我只为主客户端数据集做cdsREMISION_COMPRA.ApplyUpdates(0)
当我进行插入时效果很好,但是当我进行更新时,数据库中的触发器出现问题,因为应用程序首先执行详细信息,然后执行主表的更新。这个是正常的?我做错了什么?