三层的中间层BeforeUpdateRecord保存子表的的奇怪问题...(100分)

  • 主题发起人 主题发起人 pendy3721
  • 开始时间 开始时间
P

pendy3721

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TMainRDM.dspOrderMstBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
var
iMONO:string;
begin
if SourceDS=sqlOrderDtl then
//如果是明细表
if UpdateKind=ukInsert then
begin
//如果是新增时
iMONO:=LVL+GetMaxMONO;
DeltaDS.FieldByName('MONO').NewValue:=iMONO;
//写入最大的生产号
end;
end;

我在客户端的订单明细中新增几条记录并保存,正常. 但当我马上修改这两条数据时,就出现
Record not found or changed by another user 的错误
如果退出客户端系统(服务器也自动退出了) 再进入客户端系统,重新修改前面的两条记录,保存.这样就能正常保存了.
或者我刷新一下数据表就可以正常保存
请问这是怎么回事啊
 
将DataSetProvider的UpdateMode设为upWhereKeyOnly试试.
 
不行啊,这样新增都会出现下面的错误
Unable to find record. No key specified
 
在客户端将你的索引建字段的ProviderFlag 的 PfinKey都设为True试试
 
我用的是巢状方式.我现在修改的是明细表
 
ding 啊, Up啊
 
我知道原因了,是因为我在服务修改了MONO字段的值,所以保存到数据库里的MONO字段的值就与客户端中当前的MONO的值不同.
当我即时修改记录再提交时DataSetProvider 就会跟据我提交的数据的每一个字段在数据库比较(每个字段的 pfInWhere In Providerflags).,查找到完全相同的记录就提交,找不到就出这个错误了.
但为什么我将MONO字段的pfInWhere设为False.也不行呢???
 
为什么没人理呢我,给个理由吧.
 
if SourceDS=sqlOrderDtl then
//如果是明细表
if UpdateKind=ukInsert then
begin
//如果是新增时
iMONO:=LVL+GetMaxMONO;
DeltaDS.FieldByName('MONO').NewValue:=iMONO;
//写入最大的生产号
[red]Applied := True[/red];
//加一句这个试试。
end;
 
这是设计上的逻辑错误。
技术支持QQ:136293586
 
var
iMONO:string;
begin
if SourceDS=sqlOrderDtl then
//如果是明细表
if UpdateKind=ukInsert then
begin
//如果是新增时
iMONO:=LVL+GetMaxMONO;
DeltaDS.FieldByName('MONO').NewValue:=iMONO;
//写入最大的生产号
DeltaDS.Apply(...);
//再加一句这个试试
Applied := True;
end;
end;
 
谢谢zqw0117, bbscom
to zqw0117
我不能Applied := True;因为我没有自已写代码保存数据.只是想修改 DeltaDS.FieldByName('MONO').NewValue再让他自已产生SQL语句自已更新数据
DeltaDS.Apply(...);
这个我没有试过.让我试试.
 
从表的关联外键,
我都是在dataset的OnNewRecord中,
把主表的的主键值写入,
从来没有什么问题。
如果有数据改变之类的问题,
检查server的触发器,缺省值,
一般是这些东西在作怪,
说到底还是自己设计的东西要清晰,
找问题就容易。
 
to stlont 谢谢!
你讲的我都知道.
我现在的问题在Server 和 Client之间的数据据没有同步.是下面这句告成的:
DeltaDS.FieldByName('MONO').NewValue:=iMONO;
//(在Server写入最大的生产号)

但我修改了MONO字段的pfInWhere设为False.他还是有问题!
 
to zqw0117
DeltaDS 好像没有Apply()方法,只有ApplyUpdates()方法.但这个方法应不是这里用的.
我试过ApplyUpdates().更是有问题
 
用UpdateSQL控件指定数据集的更新字段。
 
to fccu
我用的是AdoDataSet 不能用UpdateSQL
 
恩,这样吧,将DataSetProvider的UpdateMode设为upWhereKeyOnly,
但是这样还没完,根据提示,你更新不了是因为没有主建,或者是DataSet里面没有设定主建,你可以从载AdoDataSet获取主建的方法(叫什么倒是忘记了,你自己查查吧,看看ADODataSet的代码就知道了,很明显的),利用SQL语句来自己获取主键。
 
非常谢谢 kkkchenA
请问主键不是在SQL里面设了主键就可以了吗,还要自已在程序中取得主键吗??
我不知道AdoDataSet获取主建的方法,我查看源码看看吧.希望我有能力看懂AdoDataSet 的源码
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
594
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部