界面有个Edit,Button和DBGrid,实现安下按钮后添加一条记录在表SplitCutProductionData中,并按时间倒序排列,即新添加的始终在DBGrid的第一行,
Button的代码:
if DataModule2.ProductFormADODataSet.Active=False then
    DataModule2.ProductFormADODataSet.Active:=True;DataModule2.ProductFormADODataSet.Insert;//set value:
DataModule2.ProductFormADODataSet.FieldByName('COIL_WEIGHT').AsInteger:=StrToInt(Edit1.Text);
DataModule2.ProductFormADODataSet.FieldByName('PRODUCTION_TIME').AsDateTime :=Now;
DataModule2.ProductFormADODataSet.Post;
DataModule2.ProductFormADODataSet.CommandText := 'select * from SplitCutProductionData Order By PRODUCTION_TIME desc';
//////代码1///DataModule2.ProductFormADODataSet.Active :=false;
/////代码2///DataModule2.ProductFormADODataSet.Active :=true;
DBGrid1.DataSource:=DataModule2.ProductDataSource;
这样DBGrid显示的并不是按倒序排列的,如果我把数据集关闭再打开,也就是上面的两句注释行去掉注释,才可以按倒序排列,是什么原因呢,有什么好的办法解决吗?update和refresh可以吗?具体怎么用啊?

解决方案 »

  1.   

    你写了DataModule2.ProductFormADODataSet.CommandText := 'select * from SplitCutProductionData Order By PRODUCTION_TIME desc';
    这句话以后当然要执行了,不让怎么会刷新呢
    或者用OPen都一样的
      

  2.   

    其实你更不就不用写DataModule2.ProductFormADODataSet.CommandText := 'select * from SplitCutProductionData Order By PRODUCTION_TIME desc';如果你在ProductFormADODataSet.CommandText 中原来就是上面那个语句的话
    只需要Active:= False;Active:= True就可以了
      

  3.   

    refresh命令好象只对BDE访问方式,且是文件型的表还要设置好主键后才可以的。
    这种情况最好是刷新一下。如果你是网络上的程序,想避免网络传输负荷过大的话,可以设置adoQuery的LockType为ltBatchOptimistic
    另外向你推荐Ehlib组件,你可以设置它的排序方式,然后新增的记录它自动排序。这种排序不需要重新打开数据集了,因为它是针对当前数据缓冲排序的!
      

  4.   

    我下载安装了一个PDBGridEh1,看了一些相关资料,不过仍然有些问题:
    1、新建一个窗体,添加ADOConnection1,ADODataSet1,DataSourse1,PDBGridEh1,Button1,
    2、建立连接后在设计窗体中PDBGridEh1可以正常显示一个表的数据了
    3、Button1中写入:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ADODataSet1.Insert;
     ADODataSet1.FieldByName('COIL_Weight').AsInteger:=3110;
     ADODataSet1.FieldByName('PRODUCTION_TIME').AsDateTime :=Now;
     ADODataSet1.Post ;
    end;
    4、如果这张表只有这两个字段的话,我要实现每次按下Button1后,新添加的记录都显示在PDBGridEh1表格的第一行,也就是按PRODUCTION_TIME字段排倒序,
       1.在Unit1单元中的Uses中加入EhlibADO;
       2.把PRODUCTION_TIME字段属性的title->titlebutton属性设置位true
       3.PDBGridEh1的OptionsEh的dgAutoSortMarking 属性设置为 True;问题如下:
      1、排序完全是乱的,点击表中的PRODUCTION_TIME列值,也得不到预定效果
      2、如果把把PRODUCTION_TIME字段属性的title->titlebutton属性设置位false,点击表中的PRODUCTION_TIME列值使按降序排列,这时添加的记录才能在最上面一行显示,但每次都要点击,也不是我的预期效果,请问怎么才能达到我的要求呢?问题出在哪里了呢?
      

  5.   

    Ado控件有Sort属性,可以排序如ADOQuery1.Sort := 'LastName ASC, DateDue DESC';
      

  6.   

    如果针对我上面的操作,是没有ADOQuary组件的,应该如何修改啊?
      

  7.   

    第一 数据库数据改变要刷新数据集 refresh也可以  用法就是再更新数据以后            ADOQuery1.refresh第二 楼上说的很对 数据集有自己本身排序的属性 procedure TForm1.Button1Click(Sender: TObject);
    begin
     ADODataSet1.Insert;
     ADODataSet1.FieldByName('COIL_Weight').AsInteger:=3110;
     ADODataSet1.FieldByName('PRODUCTION_TIME').AsDateTime :=Now;
     ADODataSet1.Post ;
    end;
    这种写法不是很好 如果是网络版的话 客户端一多就会耗费太多资源 尽量写成
    ADOQuery1.close;
    ADOQuery1.open;
    ADOQuery1.Insert;
    ADOQuery1.FieldByName('COIL_Weight').AsInteger:=3110;
    ADOQuery1.FieldByName('PRODUCTION_TIME').AsDateTime :=Now;
    ADOQuery1.Post ;
    ADOQuery1.refresh;
    ADOQuery1.close;
      

  8.   

    我现在都用了4层了,ADOConnection1,ADODataSet1,DataSourse1,PDBGridEh1,再加ADOQuery就有5层了!!ADODataSet不可以刷新吗?难道要删除ADODataSet1,而使用ADOQuery???
    还有上述代码中如果加入ADODataSet1.Active:=false;是不是就不浪费网络资源了呢?
      

  9.   

    同样的问题:
    更新问题:
        在画面上放置一个EDIT和一个TIMER,TIMER扫描signal表的weight字段,EDIT用来显示此字段的值,如果这个字段值发生改变,EDIT要随时更新,代码如下:
    procedure TPrintLabel.Timer1Timer(Sender: TObject);
    var
    PWeight:integer;
    begin
         //sinal form
      if DataModule2.SignalFormADODataSet.Active=False then
         DataModule2.SignalFormADODataSet.Active:=True;
         DataModule2.SignalFormADODataSet.First;
         PWeight:=DataModule2.SignalFormADODataSet.FieldByName('WEIGHT').AsInteger;
      if PWeight<>0 then
        begin
          edtPruductWeight.Text:=IntToStr(PWeight);
          DataModule2.SignalFormADODataSet.Active :=false;
          DataModule2.SignalFormADODataSet.Active :=true;
        end
      else
          edtPruductWeight.Text:=IntToStr(Global.PWeight);
    这里用了个笨办法,把数据集关闭然后再打开,可这种法子不好,这段程序将在各个客户端执行,就会出问题,有什么好的办法吗?如果用ADOQuery代替ADODataSet我想可以,但如果不用ADOQuery怎么实现数据集的更新?