界面有个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可以吗?具体怎么用啊?
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可以吗?具体怎么用啊?
这句话以后当然要执行了,不让怎么会刷新呢
或者用OPen都一样的
只需要Active:= False;Active:= True就可以了
这种情况最好是刷新一下。如果你是网络上的程序,想避免网络传输负荷过大的话,可以设置adoQuery的LockType为ltBatchOptimistic
另外向你推荐Ehlib组件,你可以设置它的排序方式,然后新增的记录它自动排序。这种排序不需要重新打开数据集了,因为它是针对当前数据缓冲排序的!
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列值使按降序排列,这时添加的记录才能在最上面一行显示,但每次都要点击,也不是我的预期效果,请问怎么才能达到我的要求呢?问题出在哪里了呢?
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;
还有上述代码中如果加入ADODataSet1.Active:=false;是不是就不浪费网络资源了呢?
更新问题:
在画面上放置一个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怎么实现数据集的更新?