起步软件技术论坛-X3

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

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

[复制链接]
发表于 2008-6-20 15:43:47 | 显示全部楼层
楼主在beforePost里面写+1sql做什么啊,

9楼2条说的是在afterPost里面,对当前数据集做循环,判断如果大于新的序号,就加1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-20 15:50:28 | 显示全部楼层
不好意思,+1 sql是在afterPost里面写的
10楼那个写习惯了,就写成beforePost了~
就是在afterPost里面写的+1 sql,没错把,运行结果就是如10楼所说了
回复 支持 反对

使用道具 举报

发表于 2008-6-20 15:53:28 | 显示全部楼层
[对当前数据集做循环,判断如果大于新的序号,就加1 [/B]

用while do对数据集循环,
回复 支持 反对

使用道具 举报

发表于 2008-6-20 16:11:15 | 显示全部楼层
参考,仅仅是参考
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;
    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;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 14:48:13 | 显示全部楼层
请问楼上的代码,我以下的理解是否正确
sId := DataSet.FieldByName('YQID').Text;  这句里面的sid是新增加的记录的 'YQID' 的值?

或者请教:这里面是如何区分刚刚新增的记录,和以前数据集里面的各条记录的?
分别如何表示的?
回复 支持 反对

使用道具 举报

发表于 2008-6-24 14:52:06 | 显示全部楼层
楼主理解的是正确的
sID是新增ID的值,nID是路径序号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:04:11 | 显示全部楼层
嗯,多谢
DataSet.FieldByName('YQID').Text,那么这个应该是数据集当前所指记录的xxx字段吧
如果上面这句话理解正确,那么请往下看;如果理解错误请指出并且直接忽略下面的话

如果这样的话我有个问题需要搞清楚
就是,循环中应该是检测数据集中的所有数据,与新增记录的两个值对比吧
那么只需要while not DataSet.Eof do 和DataSet.Next;两个控制条件就可以了吗,循环是从什么地方开始的啊
或者说,是否需要把数据集的指向记录的指针挪到第一条记录,如果需要的话该怎么写
谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:11:09 | 显示全部楼层
还有,这句代码DataSetQYLJSJJ2.ApplyUpdates;还需要吗,是不是也放在AfterApplyUpdates里面?
或者是只需要DataSetQYLJSJJ2.Refresh就可以了?
回复 支持 反对

使用道具 举报

发表于 2008-6-24 15:14:30 | 显示全部楼层
1.在while do 语句前加:
DataSet.First;                    //从第一条开始

2.不用代码写ApplyUpdates,按保存按钮就相当于ApplyUpdates
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-24 15:22:10 | 显示全部楼层
使用这种方法以后,运行的时候按保存按钮,直接异常中止了
代码:
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;

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


图片如下:

1.jpg

57.96 KB, 下载次数: 127

回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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