CJ: 如何在由主细表关系的前端使用PacketRecords?(50分)

C

coder

Unregistered / Unconfirmed
GUEST, unregistred user!
In Delphi5/demos/corba/DataModule示例
1.如果在数据模块上建立Master-detail,客户端将
CustomerCDS.packetrecors 设为 4 (or others which > 0 )
Application.run 出错
2.不在数据模块上,而在客户端建立Master-detail,同样报错.
如何在由主细表关系的前端使用PacketRecords?
积分不多,只能省着用了 :)
 
你的数据库关系是在哪里建立的?服务器?客户?
最近写了篇如何用ACTIVEX和MIDAS写程序的文章,讲到了MASTER-DETAIL
不过PACKETS-RECORD没试过。我看看。
 
试了,什么错都没有,实在奇怪。
如要程序代码或文章(WORD 2000)来信索取
 
cj:给我一份!
peterwangzy@263.net
 
cj:
我用的是delphi5,因为在delphi5中数据模块是无状态的,因此状态信息在客户
端维护.以下是我的测试程序,对delphi5的corba示例做了一点修改:
1.Master-detail关系在服务器端维护.
2.在客户端的FormCreate事件中加上:
DemoConnect.open;
with CustomerCDSdo
begin
PacketRecords:=0;
// get meta data
open ;
PacketRecords:=2;
// get first 2 records, it is OK.
GetNextPacket;
end;
OrdersCDS.open;
3.在客户端的BtnNextPacketClick事件中加上:
CustomerCDS.GetNextPacket;
4.在客户端的BeforeGetRecords事件中发送用于定位服务器cursor的信息,在本程序
中为custno的值.
procedure CustomerCDS.BeforeGetRecords事件中加上:
var
CurRecord: TBookMark;
begin
with sender as TClientDataSetdo
begin
if Active then
begin
CurRecord := GetBookMark;
try
last;
ownerData := fieldValues['CustNo'];
GotoBookMark(CurRecord);
finally
FreeBookMark(CurRecord);
end;
end;
end;
end;

5.在服务器端接受客户端的状态信息用于定位.
procedure TDemoCORBA.CustomerTableBeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
If sender is TDataSetProvider then
with sender as TDataSetProviderdo
DataSet.Locate('CustNo', OwnerData, []);
end;

cj: 在调试中发现当客户端正确发送custno的值'1321'后,服务器端的程序未能正确
接收,OwnerData显示为unasigned.因此服务端会重新发送2条已发送的记录,客户端
将报'键冲突'错.
cj: my email: delphicoder@21cn.com
tel : 0731-4410035
希望能和你尽快取得联系.
 
Hello :
您这个“CORBA”可难倒我了。我只对CORBA的文档感兴趣(E文用祠比较丰富)。
我做MIDAS只用DCOM和SOCKET,不用CORBA。我觉得CORBA唯一的优点,就是类不用在客户端注册。但如需要远程激活,还要用DOA什么的。至于夸平台的无缝连接我总觉得不可信。而且,夸平台的也不是有DCOM FOR L/U NUX了吗?:)
D5我没有装(装了后瞎改时间,又UNINSTALL了)
言归正传:
我觉得你的主要-明细实现有问题,既然是SERVER做了关联,客户搞两个CLIENTDATASET做什么?
我的做法,以CUSTOMER-ORDER为例:
1、服务器端做好关系(用个DATASOURCE);
2、在客户端放个CLIENTDATASET为CDSCUSTOMER,连接服务器的PROVIDER(主要表);
3、用字段编辑器加入所有字段,注意,最后有个TBLORDER;
3、两个DBGRID,两个DATASOURCE,第一个连CUSTOMER,一个不连
4、在第一个(连CUSTOMER的)DBGRID的ONCHANGE事件:
procedure TForm1.DSCustomerDataChange(Sender: TObject;
Field: TField);
begin
DSOrder.DataSet := CDSCustomerTblOrder.NestedDataSet;
end;
连接服务器代码:
procedure TForm1.BtnConnectClick(Sender: TObject);
var
s:string;
begin
s := InputBox('输入','输入服务器的IP地址','');
if s <> '' then
begin
SocketConnection1.Address := s;
CDSCustomer.Open;
CDSCustomer.PacketRecords := 5;
CDSCustomer.GetNextPacket;
end;
end;
这样没什么问题。
这样,你把代码一段段调试,比如,去定位代码等,找出问题所在。
 
接受答案了.
 
我今天刚碰到这个问题,症结在于:如果用Corba方式,在ClientDataSet的BeforeApplyUpdate事件的Handle中设置的OwnerData传不到AppServer端,实为一BUG,而AppServer端的OwnerData在ClientDataSet的AfterApplyUpdate事件的Handle中却可以接收到.不知谁知道解决的办法.
 
顶部