起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: trickle

请问所谓的重复键问题是什么问题,如何解决**

[复制链接]
发表于 2008-6-24 15:33:47 | 显示全部楼层
不要原来的代码了,只用第二次给你的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:43:40 | 显示全部楼层
原来的代码我已经注释掉了,都用{}括起来了
现在改后的代码就是我在20楼里面贴的那些
另外,我把您说的afterPost里面的方法写到BeforePost里面去,aterPost里面的注释掉,试验一下,新增节点然后保存的时候跟我报:Dataset not in edit or insert mode,具体见图,但是+1功能正常了,只是不能保存数据。如果在关闭功能的时候选择保存数据,则又是20楼的那个错误

2.jpg

34.54 KB, 下载次数: 136

回复 支持 反对

使用道具 举报

发表于 2008-6-24 15:47:34 | 显示全部楼层
“我把您说的afterPost里面的方法写道BeforePost里面去”
在AfterPost中有问题吗?
回复 支持 反对

使用道具 举报

发表于 2008-6-24 15:49:44 | 显示全部楼层
不用主动去刷新数据集,他提交后会自动刷新的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:52:44 | 显示全部楼层
如果写在afterPost中,按保存按钮的时候就直接异常退出,画面如20楼所示
写在beforePost中,按保存按钮后能够看到后面的序号+1了,如22楼所示,序号从第一条往下排列是 3 2 1 ,前两条记录+1的结果
写在beforePost中,能够看到+1,但是同时出现22楼所示的对话框。说是不在edit modle我觉得很奇怪阿,循环里面明明写了Dataset.Edit;这句嘛
难道是因为每次循环结束就DataSet.Post;了?觉得这个好像也说不通,那该怎么办啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:55:30 | 显示全部楼层

回24楼

把AfterApplyUpdates里面的代码都注释掉了,还是22楼那个结果
procedure TXLXX.DataSetQYLJSJJ2AfterApplyUpdates(Sender: TObject; var OwnerData: object);
begin
// DataSetQYLJSJJ2.ApplyUpdates;
// DataSetQYLJSJJ2.Refresh;
end;
回复 支持 反对

使用道具 举报

发表于 2008-6-24 16:06:20 | 显示全部楼层
回24楼,你在循环后面加个DataSet.Edit吧。满足一下提示说的要求:(

回26楼,我这里除了我给你的那段代码之外,没有其它代码,运行正常,可以新增,可以修改。不知你那是什么个情况,是不是还有别的代码影响,重新编译呢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 16:16:28 | 显示全部楼层
嗯,我刚加上了DataSet.Edit,还是不行呢
请问您那个运行正常的都是怎么改的方法,是写在beforePost里面还是afterPost?有没有加DataSet.Edi这句?
现在我的是:
procedure TXLXX.DataSetQYLJSJJ2BeforePost(DataSet: TDataSet);   
var
  nId : Integer;
  sId : WideString;
begin
  DataSetQYLJSJJ2.BeforePost := nil;
  with DataSetQYLJSJJ2 do
  begin
    sId := DataSet.FieldByName('QYLJID').Text;
    nId := DataSet.FieldByName('XH').AsInteger;
    DataSet.First;
    while not DataSet.Eof do
    begin
      if (sId <> DataSet.FieldByName('QYLJID').Text)
        and (nId <= DataSet.FieldByName('XH').AsInteger) then
      begin
        Dataset.Edit;
        DataSet.FieldByName('XH').AsInteger := DataSet.FieldByName('XH').AsInteger + 1;
        DataSet.Post;
      end;
      DataSet.Next;
    end;
  end;
  DataSet.Edit;
  DataSetQYLJSJJ2.BeforePost := DataSetQYLJSJJ2BeforePost;
end;

procedure TXLXX.DataSetQYLJSJJ2AfterApplyUpdates(Sender: TObject; var OwnerData: object);
begin
//DataSetQYLJSJJ2.ApplyUpdates;
DataSetQYLJSJJ2.Refresh;
end;

请问大致是这样吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 16:19:50 | 显示全部楼层
DataSetQYLJSJJ2.Refresh;
另外,只要有这句,就说数据集的数据已经修改,需要提交或者会滚数据
@_@
回复 支持 反对

使用道具 举报

发表于 2008-6-24 16:22:04 | 显示全部楼层
我的只有这段,别的没有
procedure TMainForm.DataSetBroker1AfterPost(DataSet: TDataSet);
var
  nId : Integer;
  sId : WideString;
begin
  DataSetBroker1.AfterPost := nil;
  with dATAsETbROKER1 do
  begin
    sId := DataSet.FieldByName('YQID').Text;
    nId := DataSet.FieldByName('ZD').AsInteger;
    DataSet.First; //从第一条开始
    while not DataSet.Eof do
    begin
      if (sId <> DataSet.FieldByName('YQID').Text)
        and (nId < DataSet.FieldByName('ZD').AsInteger) then
      begin
        Dataset.Edit;
        DataSet.FieldByName('ZD').AsInteger := DataSet.FieldByName('ZD').AsInteger + 1;
        DataSet.Post;
      end;
      DataSet.Next;
    end;
  end;
  DataSetBroker1.AfterPost := DataSetBroker1AfterPost;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 12:35 , Processed in 0.044104 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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