三层主从表的问题(200分) (200分)

  • 主题发起人 主题发起人 glpttlb
  • 开始时间 开始时间
G

glpttlb

Unregistered / Unconfirmed
GUEST, unregistred user!
在中间层已设置好主从表关系,tdatasetprovider options的pocascadeletes=true
pocascadeupdates=true,
客户端主从查询正常,但从表新增记录,主从连接关键字为空(2层结构自动填入数值),
删除主表记录,从表也未删除。
d7+ado+com+ sqlserver2000,dbexpress也一样。
试了delphi/kylix数据库开发(eric harmon)的例子,也一样,目前只好先用代码实现。
附简单3层实例者,给300分(能不需代码能级联跟新关键字和删除记录)
 
longbin@gliet.edu.cn
 
我也遇到過, 必須在SQL SERVER里設置兩個表的主從關系(RelationShip),關且作Cascade Delete的設定.
 
to smokingroom
在SQL SERVER里設置兩個表的主從關系(RelationShip),只是数据库级的。
我在客户端现象依旧,从数据的关键字内容有时会和主不一致,更新出错。
 
只设为主从表还不行,好像要在应数据库中主从表要有外鍵约束,有空时给你一个例子吧
 
我在数据库中主从表有外鍵约束(并有级联更新、删除),客户端显示依旧,
当然外鍵约束约束没问题,但客户端删除主记录前,从记录的关键字被用户修改为其他值,
其从deltal已记录(单机环境下,同一用户),更新会出错。
 
另一问题:
如主从表的连接关键字在客户端先不生成,在中间层产生,有谁做过?
如:进销存的销售单.可另给高分
 
先删除丛表,再删除主表
 
新增记录如果需要主从表关键字同步的话,不写代码是不可能的
如果关键字是客户端生成的,那很简单,你自己把从表的关联字段填上就可以了
如果是服务端生成的,就必须在DatasetProvider.BeforeUpdateReord
事件写一些代码
procedure TAutoIncMDForm.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
if (UpdateKind = ukInsert) and (SourceDS = qryDetail) and //qryDetail是从表的名称
(DeltaDS.FieldByName('MasterID').Value = Unassigned)
then
then
begin
if DeltaDS.BOF then
begin
//通过qryIdentity生成主表主键
qryIdentity.Close;
qryIdentity.Open;
end;
DeltaDS.FieldByName('MasterID').NewValue := qryIdentity.Fields[0].Value;
end;
end;
记住把DatasetProvider.Options的poPropogateChanges变True
这样客户端从表就可以显示关联字段
 
to shiningplus
我想通过qryIdentity生成主表主键取过来,而不是更新从表的每条记录都
从新生成。因为一个客户存盘过程中可能有其他用户刚好存盘完毕,通过qryIdentity生成
的键值就可能不一样
 
if DeltaDS.BOF then
已经保证了主表每条记录保证生成一次
还有我写错了,qryIdentity是得到当前从表的主表的主键
原本我的qryIdentity通过 select @@identity 得到当前的新增的自增字段
不知道你的主表主键是怎样生成的
 

我的QQ:20319145
如果还有问题,QQ联系我
 
to shiningplus:
以下是不明白的语句:
if DeltaDS.BOF then
//为什么此条语句保证了主表每条记录保证生成一次
begin
//通过qryIdentity生成主表主键
qryIdentity.Close;
qryIdentity.Open;
end;
DeltaDS.FieldByName('MasterID').NewValue := qryIdentity.Fields[0].Value;
//此语句可能其他用户也在执行,qryIdentity.Fields[0].Value每次可能不同。
能发个简单示例吗,非常感谢!
longbin@gliet.edu.cn
 
to shiningplus:
从表记录有无办法取得主表的值,在中间层,不是指从表中没一条记录
都要
//通过qryIdentity生成主表主键
qryIdentity.Close;
qryIdentity.Open;
因为我可能想取主表中记录的值!!!
 
关键是你主表的主键是什么时候生成的,客户端?服务段?触发器?
什么时候生成的,提交前?提交后?
 
也要保证插入数据时是先插入到主表,然后再插入到从表。[:D]
 
主表的主键在中间层通过规则生成,如何将其在中间层传给子表(主表的主键及其它内容)
 
procedure TundDataAppServer.dspTempAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData := '主键值'
不过这样主表一次只能保存一条记录
end;
 
中间层的TDataSetProvider定义
procedure TundDataAppServer.dspTempAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData := '主键值'
不过这样主表一次只能保存一条记录
end;

客户端的clientdataset定义
procedure TundDataAppServer.cdsTempAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
cdsTemp.FieldByName('主键').value := OwnerData;
end;
 
to yangdear
主表的主键在中间层通过规则生成(而不是从客户端传过来),
如何将其在中间层传给子表(主表的主键及其它内容)
 
后退
顶部