起步软件技术论坛-X3

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

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

[复制链接]
发表于 2008-6-24 16:25:10 | 显示全部楼层
回29楼,不是说不要那两句了吗?
要不这样,楼主可以先做大体的功能,对于排序号这类细化的功能,也可以最后来做的。
放在后面,也不会影响开发进度的。您说呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 16:40:54 | 显示全部楼层

又一种尝试

如果只写beforePost中的方法,其他都不写,然后点按钮后可以正常的+1,但是同时出现对话框:重复键问题
运行结果如图

重复键2.jpg

41.35 KB, 下载次数: 99

回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 16:45:18 | 显示全部楼层

回31楼

我现在也没管什么排序的功能阿,而且也不用作排序的
是不是因为我的数据集跨了两个表,并且其中有个字段是主数据集的主键,难道这里有问题?:(
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 16:51:51 | 显示全部楼层
我现在也改的只有afterPost一个方法了,代码如下
procedure TXLXX.DataSetQYLJSJJ2AfterPost(DataSet: TDataSet);   
var
  nId : Integer;
  sId : WideString;
begin
  DataSetQYLJSJJ2.AfterPost := 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;
  DataSetQYLJSJJ2.AfterPost := DataSetQYLJSJJ2AfterPost;
end;
运行以后,按保存后的确是+1了,但是弹出来一个对话框,又是重复键的那个
请问该怎么收拾
真郁闷啊!!!!!!!!!!!!!!!!!!!!!!
是不是因为我的数据集跨了两个表啊还是怎么搞的

重复键2.jpg

41.35 KB, 下载次数: 100

回复 支持 反对

使用道具 举报

发表于 2008-6-24 16:55:53 | 显示全部楼层
如果写在beforePost中,这样写应没有问题。另外,楼主最好想好思路,然后再设计。不然会步步为坚的。
以下的思路是:当保存当前记录后,就查一遍数据集,以调整序号。
procedure TMainForm.DataSetBroker1BeforePost(DataSet: TDataSet);
var
  nId : Integer;
  sId : WideString;
begin
  DataSetBroker1.BeforePost := 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;
    DataSet.Edit;
  end;
  DataSetBroker1.BeforePost := DataSetBroker1BeforePost;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 17:02:41 | 显示全部楼层
您做的那个不是运行得很正常吗,那就按照您那个来做
可是我这个为什么不可以阿,真是郁闷
回复 支持 反对

使用道具 举报

发表于 2008-6-24 17:27:31 | 显示全部楼层
是啊,我也很迷惑哦。慢慢来吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 08:39:19 | 显示全部楼层
嗯,我昨天单独做了个功能测试了一下,结果运行很好,也可以增加删除修改。方法就只写了beforePost里面的那些,具体是
procedure TXLXX.DataSetQYLJCSSJJBeforePost(DataSet: TDataSet);
var
  nId : Integer;
  sId : WideString;
  xId : WideString;
begin
  DataSetQYLJCSSJJ.BeforePost := nil;
  with DataSetQYLJCSSJJ do
  begin
    sId := DataSet.FieldByName('QYLJID').Text;
    nId := DataSet.FieldByName('XH').AsInteger;
    xId := DataSet.FieldByName('XLID').Text;
    DataSet.First;
    while not DataSet.Eof do
    begin
      if (sId <> DataSet.FieldByName('QYLJID').Text)
        and (nId <= DataSet.FieldByName('XH').AsInteger)
        and (xID = DataSet.FieldByName('XLID').Text) then
      begin
        Dataset.Edit;
        DataSet.FieldByName('XH').AsInteger := DataSet.FieldByName('XH').AsInteger + 1;
        DataSet.Post;
      end;
      DataSet.Next;
    end;
    DataSet.Edit;
  end;
  DataSetQYLJCSSJJ.BeforePost := DataSetQYLJCSSJJBeforePost;
end;

因此,怀疑运行结果出现重复键怀疑是数据集的问题
因为我的那个区域路径数据集是一个从数据集,并且其中包含主数据集的字段
是不是因为这个的原因?
回复 支持 反对

使用道具 举报

发表于 2008-6-25 08:47:05 | 显示全部楼层
业务信息和数据集都是新做的吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 08:58:21 | 显示全部楼层
新增加的测试功能,在原业务信息中新建了一个数据集,然后新建了表单,新建的功能
数据表用的还是原来那个表,不过数据集没有跨表建了,就只用了区域路径表着一个表的所有字段
然后功能的行为和代码就对上了,也没有出现什么异常
所以我在想,重复键是不是因为数据集跨表建,与主数据集出现了什么冲突造成的。是不是重复主键问题。但是对于后面的机制不是很明白,所以这个地方想来想去也没想出有什么冲突的地方,很头疼~
期待指教
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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