关于MIDAS实现Master/Detail应用有两个难解 的问题请教(200分)

  • 主题发起人 主题发起人 沐枫
  • 开始时间 开始时间

沐枫

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 一个Master表,带一个以上的Detail表,
使用TADODataset/TADOTable,并通过DataSource建立主关键字关连。
同时在每个表中设置每个字段的ProviderFlags属性(中InKey,InWhere,InUpdate),
然后通过TDataSetProvider传递给客户。
客户程序使用SocketConntion连拉,数据表采用TClientDataSet获取Provider传回来的数据,
建立相应的TClientDataSet通过DataSetField,采用NestedTable形式与主TClientDataSet关联。
--> 问题:
TDatasetProvider设置为:ResolveToDataSet=True, UpdateMode=WhereKeyOnly,此时,
主表和子表均可以增加和删除数据,主表可以修改数据,
但子表不能修改数据,如修改,则提交后将出现"Record Changed by Anthoer"错误。
TDataSetProvider设置为:ResolveToDataSet=False,UpdateMode=WhereKeyOnly,此时:
主表和子表均可以删除和修改数据,主表可以增加数据,
但子表不能增加数据,如增加,则提交后将出现"主关键字段不能为NULL"错 误。
请问,为何会有这么大的分别?如果要解决问题,是否只能使用ResolveToDataSet=False,
并且在客户或服务端自行设置和主表关联的关键字段的值,使用不为NULL?
这样一来,Delphi的Master/Detail结构的发处就体现不出来,而且代码量也挺大的
(要保证Master/Detail关键字一致不太容易。)
----->请关注。
2 此系统采用MTS,Delphi已安装UpdataePacked#1, ADO UP#1 ADO UP#2
MTS Module 在没安装 Updatapack之前,只能采用"不支持事务"模式,
安装上述UpdataPack以后,可采用"支持事务"模式,
但"需要事务"和"需要新事务"均不能用,一用,提交事务将出现"不能启动事务(类似)"的错误信息。
数据集采用TADODataSet/TADOTable,然道MIDAS应用在MTS中还仍要自行管理事务吗?
(曾有人提示按李维修改的Provider.pas文件做,但无效。原因是TADODataset处理事务已经有识别是否在MTS中了)
运行和开发环境:Delphi5+ADO2.5+SQL7.0+Windows2000Server
升级包:SQL7Update#2, Delphi5 Update#1 ADOExpress UP#1,Up#2
我把所有分数都拿出来了,以后还可以加,请大家帮忙。
 
如果用ADO那么ResolveToDataSet=true,但是你在子表中不能有字段允许空。
否则你要使用SQLUPDATE
 
尽信书不如无书,不要把李维的书当做圣经,祇能够参考用的,撰写的方式你想的太多了,不是你想的那样子。只要在AP端做一部分; 在Client端做一部分即可。例如:在AP端的OnBefore或是在资料转变的各项事件中做你想做的事,如果想不出好的法子,就写封”妹儿”给我,我会寄个我写的小程序。
 
我现在采用的是第二种
TDataSetProvider设置为:ResolveToDataSet=False,
主键自己设置,我也感到麻烦,但我看了Delphi中的Sample也是采用这种方法,

不知大家还有什么更好的方法
 
在服务器端,建立主从表关系时不要有masterfile进行关联,用带参数的sql进行主子表的关联,同时
将对应的privoder的resolveToDataSet 属性设为true 就可能解决。
 
我也采用这种方式,能新增、修改,但不能删除。请问你是如何设置能删除的?
我删除的时候,系统提醒我子表有数据,不能删除。
 
我在用BCB5做多层结构系统时,我在Server端加入了一个取得服务器IP地址的方法:GetServerIP它的参数是vIP:Variant *,IN方式,并在服务端实现了这个方法,
加入的代码如下:
*vIP="192.168.0.01";最后我注册成功。
可是在我开发客户端程序时,我用TSocketConnection
当取得它的服务时我是这样做的:
Variant* vip;
SocketConnection1->AppServer.GetServerIP(vip);
Edit1->Tex=vip;
可 是我在运行程序时出错,没有编译通过。
它说getserverIP不是variant的成员
getserverIP is not a memober of variant
请问?
我该如何去调用这个方法呢?
请各位大侠多多指教?
小生的QQ:65466700(24小时在线恭候)
MAIL: alongsun@sina.com
 
我也碰到类似问题,我用的是D6,如果在中间层进行主细表关联(ADO),在Client端用单个CDS
取出,在DBGrid中显示,在那个复合字段中有按钮出现,但不起作用,我试了各种设置,均
无效,最后我是这样处理的,在中间层不进行主细表关联(用两个DATASET两个PROVIDE)在
客户端用两个CDS连接中间层的相应的PROVIDE,然后两个CDS进行主细关连,在中间层的
IAPPSERVER INTERFACE中加一方法,中有两个OLEVARIANT参数(var型),该方法主要是供
客户端更新主细表时调用,客户端在更新主细表时,调用该方法,传入主细表的CDS的Delta
中间层得到两个DELTA后,启动一个事务,如事务成功则返回参数无值,如事务ROLLBAK,则
返回参数中有Delta包,客户端得到返回参数后再作相应处理即可.该办法是复杂了一点,但
尽在掌握之中,比不着边际的试来试去要好些,供你参考。
 
也为这个问题烦恼。关注
 
此問題確實挺煩人的,關注各大俠的看法。
 
這個問題真正煩人,我不僅碰到如樓上那位仁兄所說的問題,而且我在修改子表中的數据時也
有問題,具體如下:修改並保存之后,關閉窗口,數據還是修改之前的數据,必須要關閉程序重
新啟動才會更新.並且以上的問題都有如下的怪現象:程序在我的機上調試運行都沒有問題,
在其他的機器上就出現以上所說的兩個問題了
 
提醒一点:
ProviderFlags属性(中InKey,InWhere,InUpdate)只有在TDataSetProvider的BeforeUpdateRecord
事件中设置了才有效。
 
我的解决方法:
在客户端的主clientdataset的afterscoll事件中写open子表的sql,这样新增和修改主子表都
没有问题,但是到删除的时候用clientdataset.delete 后clientdataset.applyupdates(0);
后有问题,老师出现无法定位记录的错误,怎么办?我的解决方法是:在应用服务端写一个函数不
就解决了,deletetable,大致是用sql去删除记录:)
 
到底怎样,请总结一下
 
TO:ZDR
"我也碰到类似问题,我用的是D6,如果在中间层进行主细表关联(ADO),在Client端用单个CDS
取出,在DBGrid中显示,在那个复合字段中有按钮出现,但不起作用,我试了各种设置,均
无效,最后我是这样处理的,在中间层不进行主细表关联(用两个DATASET两个PROVIDE)在
客户端用两个CDS连接中间层的相应的PROVIDE,然后两个CDS进行主细关连,在中间层的
IAPPSERVER INTERFACE中加一方法,中有两个OLEVARIANT参数(var型),该方法主要是供
客户端更新主细表时调用,客户端在更新主细表时,调用该方法,传入主细表的CDS的Delta
中间层得到两个DELTA后,启动一个事务,如事务成功则返回参数无值,如事务ROLLBAK,则
返回参数中有Delta包,客户端得到返回参数后再作相应处理即可.该办法是复杂了一点,但
尽在掌握之中,比不着边际的试来试去要好些,供你参考。"
能祥细点吗?
 
看一下
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2137718
 
后退
顶部