ADOQuery1中的sql语句是:
ls_sql:='select * from tbText';
在一个定时器中写了以下语句向服务器查询记录变化:
ADOQuery1.ReQuery;
如发现有新增记录,则将新增记录的某个文本字段显示在一个Memo中。
现在的问题是,ADOQuery能否确定那条记录是最后增加的(即定时器上次未查询到的记录)?

解决方案 »

  1.   

    设置思路:
     1、设置一个全局变量
     2、先将此表中的最后一条记录的关键字传给全局变量
     3、在定时器中:
      3.0查询大于全局变量的记录
      3.1如果记录不为空,添加字段到Memo1中.记录为空将转到3.3执行
         3.2将这个最后一条记录的关键字传给全局变量
      3.3循环3.0
      

  2.   

    最好的办法是在表中增加一个状态标志State.这个标志可以标明该记录是否为新记录或被修改的记录(0:无变化,1:新增,2:修改),甚至你还可以加上删除标志。设置状态可在触发器中写入。
      

  3.   

    如果设为新增标志,再次新增记录时原来增加的记录标志也是新增,如果用Requery刷新后仍然无法确定那条记录是最后新增的。
    而且,在定时器刷新期间可能新增若干条记录。
    当然有一种间接办法,就是在Requery把记录添加至memo后,将所有记录标志改为“原来”,但这样记录多时,定时器定时到服务器取记录肯定会影响效率
    期待更好的办法
      

  4.   

    是个问题。再研究研究,模拟一下PB的DW处理方式,应该有条最佳路径。
      

  5.   

    而且在表中设置新增标志,如果A客户端将某记录改为"原来"并更新到数据库,B客户端因为A客户端的更改导致不能查询到该记录
      

  6.   

    那就增加一个自增长字段(如: FID)吧。这个方法简单适用。只需要把上次取出的最大FID记录下来,本次FID大于上次FID的记录就是新增记录.
      

  7.   

    本次FID大于上次最大FID的记录就是新增记录.
      

  8.   

    谢谢老冯,我的表中有一个datetime字段,如果这个字段的值大于上次最后的记录就记录在memo中.
    我再试试
      

  9.   

    我觉得老冯说的用标志字段区分是有道理的,我以前做过一个3层的,某表的主键是用时间和当日记录号来区分的,但是这个时间主键不能在客户端设置,一是因为客户机的系统时间不可能和服务器同步,二是客户有可能同时发送记录,这样容易造成混乱,所以客户端发送的记录主键为空,在服务器端的TDataSetProvider上写代码完成的:procedure TZfInfoServer.NewProviderBeforeUpdateRecord(Sender: TObject;
      SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
      var Applied: Boolean);
    begin  // 如果客户程序插入信息记录同时未设定主键,
      // 从主窗口获取唯一的记录主键(发送时间和当日记录序号)
      if (UpdateKind = ukInsert) and (DeltaDS.FieldByName('NUM').Asinteger <= 0) then
      begin
        DeltaDS.Edit;
        DeltaDS.FieldByName('NUM').AsInteger := ServerMainForm.RecNumber;
        DeltaDS.FieldByName('SENDDATE').AsDateTime := ServerMainForm.SendDate;
      end;
    end;那么这个空主键的代码绝对是新增记录,应该和楼主的要求类似,如果楼主不是3层的,可以在触发器处理也是一样的,供楼主借鉴。
      

  10.   

    好。不过如果没有任何标识的话,也应该可以判断是否有新增记录。在PB的DW中就设置有这样的缓冲区。这个问题在完全OO的系统中对于构建自己的数据集是很有用的。
      

  11.   

    UpdateKind = ukInsert这个就是新插入的
      

  12.   

    检测数据个数,大与上次,就是有新记录了,然后添加last记录
      

  13.   

    检测数据个数,大与上次,就是有新记录了,然后添加last记录
    ===
    这样不太合适,因为在ReQuery之前还有可能删除了某些记录。
      

  14.   

    onNewrecord事件能感知你这个adoquery的新加记录,但是若其他的adoquery里新加了记录就不能感知了