起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 718|回复: 23

【搞定】数据集post方法以及AfterApplyUpdates事件的Close+Open方法无效**

[复制链接]
发表于 2007-6-26 17:08:43 | 显示全部楼层 |阅读模式
第一个问题:申请修改功能,如果不注释掉Button1Click里的dsbMain.DataSet.Post;则,修改一条数据后点击其他记录,虽然此时没滚动,但再点击Button就报告数据集不在编辑状态了。注释直接ApplyUpdates不会报错。为什么呢?

第二个问题:修改一条数据后点系统自带的导航条提交数据,suiran 。虽然在dsbMainAfterApplyUpdates写了Close+Open,但是无效,必须点Button1 才有效,为啥呢

procedure TMainForm.Button1Click(Sender: TObject);
begin
  //dsbMain.DataSet.Post;
  dsbMain.DataSet.ApplyUpdates;
  dsbMain.DataSet.Close;
  dsbMain.DataSet.Open;
end;

Post.rar

49.12 KB, 下载次数: 95

回复

使用道具 举报

 楼主| 发表于 2007-6-27 10:20:30 | 显示全部楼层
自己顶。。。。。。
回复 支持 反对

使用道具 举报

发表于 2007-6-27 11:00:33 | 显示全部楼层
这个可以参考delphi的dataset帮助,哪些动作应该在哪个事件上做处理,例如不能在beforeApplyUpdates 去修改字段的值,然后提交到数据库上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-27 11:56:40 | 显示全部楼层
上面的方法和我提的问题关系不大吧,我上面传的附件已经可以重现我的问题,请给我一个准确的答复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-27 15:09:13 | 显示全部楼层
自己顶一下
回复 支持 反对

使用道具 举报

发表于 2007-6-27 15:26:59 | 显示全部楼层
第一个问题:申请修改功能,如果不注释掉Button1Click里的dsbMain.DataSet.Post;则,修改一条数据后点击其他记录,虽然此时没滚动,
没有滚动?不可能吧,已经点击到其他的记录上还没有滚动,那啥时怎么叫点击到其他的记录,怎么看出来已经移动到其他记录上的

但再点击Button就报告数据集不在编辑状态了。注释直接ApplyUpdates不会报错。为什么呢?
因为记录已经滚动了,已经做了数据集post动作了,那么此时数据集的状态已经从dsEdit 或者dsInsert 修改 dsBrowse 再去post,就会弹出 DataSet not in edit or insert mode,而不是因为ApplyUpdates这个动作提示出来的,
回复 支持 反对

使用道具 举报

发表于 2007-6-27 15:30:40 | 显示全部楼层
第二个问题:修改一条数据后点系统自带的导航条提交数据,suiran 。虽然在dsbMainAfterApplyUpdates写了Close+Open,但是无效,必须点Button1 才有效,为啥呢
当然了,你在dsbMain  的 AfterApplyUpdates 事件上,对dsbMain数据集进行  close、opne怎么可以呢,整个提交动作还没有真正完成,在button 当然可以了,触发的时机就不是一个

这两点,你都可以问问高工,他对这个已经滚瓜烂熟了。
回复 支持 反对

使用道具 举报

发表于 2007-6-27 17:20:40 | 显示全部楼层
其实你跟踪一下字段值就知道了
Dialogs.showmessage(DataSetBroker1.Info.DataSetByID('MainSqlDataSet').FieldByName('CODE_NO').AsString);
  DataSetBroker1.DataSet.Close;
  DataSetBroker1.DataSet.Open;
  Dialogs.showmessage(DataSetBroker1.Info.DataSetByID('MainSqlDataSet').FieldByName('CODE_NO').AsString);
这两次取出的值是不一样的,前面的是提交后的数据,后面的是未提交前的数据,至于为什么我也很想知道,其实数据已经录入了,当2次刷新的时候该数据就出来的,会不会和存储的机制有关系
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-27 17:24:20 | 显示全部楼层
第一个问题:请好好看看我们的例子,我们控制了不让滚动
第二个问题:对于Bug的确认高工也无能为力
回复 支持 反对

使用道具 举报

发表于 2007-6-27 17:55:40 | 显示全部楼层
第一个问题:x3这部分的处理类似delphi的clintdataset,我摘了一段代码:
   function TCustomClientDataSet.ApplyUpdates(MaxErrors: Integer): Integer;
var
  RootDataset: TCustomClientDataset;
begin
  CheckBrowseMode;
  RootDataset := Self;
  while RootDataset.FParentDataSet <> nil do
    RootDataset := RootDataset.FParentDataset;
  with RootDataset do
    if ChangeCount = 0 then
      Result := 0 else
      Reconcile(DoApplyUpdates(Delta, MaxErrors, Result));
end;


procedure TDataSet.CheckBrowseMode;
begin
  CheckActive;
  DataEvent(deCheckBrowseMode, 0);
  case State of
    dsEdit, dsInsert:
      begin
        UpdateRecord;
        if Modified then Post else Cancel;
      end;
    dsSetKey:
      Post;
  end;
end;

ApplyUpdates 会自动检测状态,不在编辑状态,直接cancel
POST不会,所以报错!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-23 06:35 , Processed in 0.046153 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表