三层主从表数据存盘的问题(300分)

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

glpttlb

Unregistered / Unconfirmed
GUEST, unregistred user!
本人正在做一个三层进销存,如:进货单主表与从表通过‘单号’关联,‘单号’在主表
存盘时通过算法产生,如何将‘单号’传给子表。(注:主从表在同一事务中更新)
由于要增减库存,希望能在TDataSetProvider的事件中使用。
最好附上简单例子,一经验证立即给分。
如能发来有价值的源码,本人也可将com+进销存的部分源码交换。
 
不明白!
 
给你个建议,不知道符不符合你的要求,用三层的主从表关系。
中间层建立主从表关系,客户端也建立主从表关系。
你搜索一下以前的老帖子,有一大堆,若你再通不过再说了~!
 
to 阿西喊佛
新单的'单号'还未生成,要在中间层主表存盘时生成。
以前的主从表关系其关键字在客户端已输入了。
 
呵呵,有点晕了,你是想在服务器中生成‘单号’,然后传到客户端??
另,我的那个邮箱你是怎么得到的 :)
 
to 阿西喊佛
你的那个邮箱是你上回回答了我的问题,留下的。
我是想在将主表和从表的数据同时传到服务器中,
生成‘单号’,一起更新,再增减库存,
希望能在TDataSetProvider的事件中使用,因为其可解析detal。
 
本人用协调对象操作。因为使用detal更新效率较高,
能告诉我如何使用adoquery解析detal也可,(不用TDataSetProvider)
 
当客户端数据传过来后,服务器主表通过算法对数据进行计算得出‘单号’,然后在传给服务器字表的‘单号’字段,你的意思是不是这样的?
想了想,若是要达到这样的情况,那么可以在服务器端动态创建主从表。
每次从客户端传过来的数据首先插入到主表和从表中,然后再对这两个adoquery进行主从关联。这样也可以保持服务器同步。
在datasetprovider里面进行什么什么解析detail还没干过(呵呵)能否讲讲 :)。
 
to 阿西喊佛
每次从客户端传过来的数据首先插入到主表和从表中,那不是等于存盘了吗?
不知你是否做过网络版的类似进销存系统。
一张单据的单号是数据提交后产生的,当然主从表是一起提交,并在同一时务中。
在事务中还要增减库存。我不太明白你的意思,能否发个简单例子,分不够可加!
 
我们qq上聊吧,这样聊太慢了,呵呵。
11662195(Delphi)。
 
不好意思,我没有qq
 
呵呵,刚才又仔细看了遍,开始就搞错你的意思了,呵呵。
看这样可否通:
先在客户端通过主从表生成‘单号’记录,然后传到服务器,然后断开主从表,然后设置
从表的data等于服务器datasetprovider的data属性,这样子表就接收了来自服务器的所有data,然后在把主从关系建立,最后存盘……
 
我先说一下我的做法:
通过协调对象取得两个数据包,分别设置主从表的data,
更新时将主、从表的detal调用协调对象的更新方法:如update(vdata1,vadata2)。
如为修改单据,因为已有‘单号’,很简单,update(vdata1,vadata2)即可搞定,即
方法中有如下语句:
aps.AS_ApplyUpdates(providername,Vdatas1,IMaxError,IErrorCount,OnwerData);
aps.AS_ApplyUpdates(providername,Vdatas2,IMaxError,IErrorCount,OnwerData);即可。
新增数据时
aps.AS_ApplyUpdates(providername,Vdatas2,IMaxError,IErrorCount,OnwerData);
vdatas1、vdatas2中还无单号,vdatas1的单号可在Tprovider的事件中产生,而无法
传递到vdata2中。
我觉得你的方法并不可行:因为多用户环境中其他用户也有可能参数相同单号。一次
存盘经过几次传递效率很低。
如果不是我希望用detal的高效率,我有更好的方法,也已经实现。
既在中间曾直接通过Tadoquery。
 
呵呵,本来是完全可以通过query搞定的,但是由于你要求的必须保持同步,而且是通过主从表来保持同步,而且主从表中的从表字段又是从服务器传递过来的,然后再通过客户端提交数据进行保存,那么所经过的步骤就算再简化也是:提交->返回->再提交保存这个的环节。
若是真的想用到detail,那么为什么不试试3层的主从关系呢。
也就是说,主从表里的从表又是另外一个主从表里的主表。
假设a,b,c三个clientdataset,a与b形成主从关系,a是b的主表,b与c形成主从关系,b是c的主表。
这两个主从表都对应与服务器端的不同的dataprovider,这样也就自然形成了数据循环了。
你觉得这个逻辑能否符合你的要求么~?
 
提交->返回->再提交,不知->返回->是指返回客户端还是服务器端。
你的方法我没用过,能否发个例子。(即使不满足要求也给一半分)
我希望主从数据一起在一个事务中提交。
 
longbin@gliet.edu.cn
 
呵呵,差不多,因为时间问题,做了个3层3个主从表的模型,你看看吧。
呵呵,若觉得对你这个方向有用的话,说一声,偶可以改进改进 :)
 
你的问题我有两个方法可能可以实现:
方法一:1。打开TDatasetProvider的poAutoRefresh的选项。(它有从数据库刷新更新的记录的作用)
2。在TDatasetProvider的 BeforeUpdateRecord事件中把主表的单号传给子表。
*。这种方式没有试过也可能不行。
方法二。1.在数据库中创建一个将返回下一个唯一个单号的存储过程。
2.打开TDatasetProvider的poPropogateChanges的选项。
3.在单号的字段的ProviderFlags中包含pfInKey设置。
4.为TDatasetProvider的BeforeUpdateRecord事件提供一个事件处理器
如:begin
if UpdateKind = ukInsert then
if trim(DeltaDS.Fieldbyname('单号').OldValue)='' then
begin
DeltaDs.Fieldbyname('单号').NewValue := GetNextNO;
// Detail(子表).Fieldbyname('单 号').value:=DeltaDs.Fieldbyname('单号').Value//或者也可以在了表这个事件中采用同样的方法。当然这样可能还要循环把值付给子表
end;

end;
GetNextID函数如下所示:
Function TFrmmain.GetNextNO: String;
begin
sqlNO.Execsql;
Result := sqlNO.paramByName('AValue').AsString;
end;
注:sqlNO是一个执行数据库服务器上的存储过程。通过存储过程得到单号。再进行相关的付值动作。我觉得这个方法应该可行。
 
to miker_fan
GetNextNO是可以取得单号,但由于是多用户环境因此必须有如下语句:
DeltaDs.Fieldbyname('单号').NewValue := GetNextNO;
Detail(子表).Fieldbyname('单 号').value:=DeltaDs.Fieldbyname('单号').Value
但TDatasetProvider的BeforeUpdateRecord事件只能传一个数据集。(即DeltaDs或Detail(子表)中的一个,可查看BeforeUpdateRecord的参数)
Detail(子表).Fieldbyname('单 号').value:=DeltaDs.Fieldbyname('单号').Value
并不可行。
因为TDatasetProvider的BeforeUpdateRecord事件参数只能传一个数据集
Detail(子表),DeltaDs
希望你在百忙之中能给个简单例子,谢。
 
另因为想提高效率及可靠性,本人使用协调对象读写数据,客户端不可能使用delphi的主从
自动更新。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
后退
顶部