先有一问题如下:procedure Tmain.BitBtn7Click(Sender: TObject);
begin
   adotable1.Open;
   adotable1.First;
   if (Edit1.Text='') or (Edit2.Text='') then
   begin
     showmessage('你还未登陆系统!');
   end
   else
   if not adotable1.Eof then
   begin
   //控制员工一天只能签到一次,但现在有点问题!
     while not adotable1.Eof do
     begin
       if (datetostr(date)=adotable1.FieldValues['建表时间']) and (Edit1.Text=adotable1.FieldValues['编号'])then
       begin
         showmessage('你已经签过到了,一天只能签一次到!');
       end;
       adotable1.Next;
     end;
   end
   else
   begin
     BitBtn7.Visible:=false;
     with adodataset1 do
     begin
       append;
       fieldvalues['编号']:=Edit1.Text;
       fieldvalues['姓名']:=Edit2.Text;
       fieldvalues['建表时间']:=datetostr(date);
       fieldvalues['签到时间']:=timetostr(time);
       fieldvalues['签到状态']:=0;
       post;
       //签到的时间状态存入数据库;
     end;
   end;
end;
其中有一段代码是判断用户有没有在同一天中重复按键,如果有的话,提示'你已经签过到了,一天只能签一次到!'并返回。现在问题就出来了,在程序不从新启动的情况下,用户可以无限次的按键。但是当程序从新启动后,按键后提示'你已经签过到了,一天只能签一次到!'。这应该是数据库刷新的问题,请高手帮我看看应该如何及时的刷新数据库或者让程序能够及时的知道数据库已经更新了?
我在最后面加了个refresh如下:
with adodataset1 do
     begin
       append;
       fieldvalues['编号']:=Edit1.Text;
       fieldvalues['姓名']:=Edit2.Text;
       fieldvalues['建表时间']:=datetostr(date);
       fieldvalues['签到时间']:=timetostr(time);
       fieldvalues['签到状态']:=0;
       post;
       refresh;
       //签到的时间状态存入数据库;
     end;结果程序报错。

解决方案 »

  1.   

    是fieldvalues['']的问题,它不能把数据持久存储到数据库中,重新启动后,就会没有了.
    如果你fieldbyname('').value来复制的话就可以持久的存储到数据库中了.
      

  2.   

    从你的代码看,你插入记录后,用户第二次签到时循环并没从第一条记录开始,而你插入的记录可能是在开始循环记录的前面,所以检测不到相同记录,用户就能重复按键.
    建议有sql来检测:
    begin
        query1.close;
        query1.sql.clear;
        query1.sql.add('select * from table where 建表时间='+quotedstr(datetostr   (date))+' and 编号='+quotedstr(edit1.text));
        query1.prepared;
        query1.open;
        if query1.recordcount>0 then showmessage('你已经签过到了,一天只能签一次到!')
        else begin
             //  插入一条新记录
          end;
    end;