讓DBGRILD 只顯示本次輸入的資料(100分)

  • 主题发起人 主题发起人 yodjvk
  • 开始时间 开始时间
Y

yodjvk

Unregistered / Unconfirmed
GUEST, unregistred user!
FORM中有DBGRILD,有控制項table,datasource,設好別名,資料庫,ACTIVE爲TRUE,
有一輸入記錄FORM2,我想讓DBGRILD只顯示本次輸入的資料,以方便列印本次輸入的記
錄,(不知可有其他思路)。另那裏有關於資料庫編程例子download,並帶有源碼?
 
那干脆用StringGrid好了,用dbgrid太浪费资源了。
 
你可以加个标志字段过滤,在本次输入全部完成并刷新或列印完成后改变标志字段的值.
 
你增加一个单据流水之类的东西,然后打印的时候是按单据流水来打印就可以了
单据流水是按日期来定的,那就不会有重复了 
 
可以用BOOKMARK吧,用FILTER过滤
 
請問TXFZR﹐具體應該怎 樣做﹐我不太明白。謝謝﹗﹗﹗﹗
 
增加一个字段保存增加时的日期时间,再用Filter过滤。
 
比如说你可以在数据库中增加一个字符型字段BZ,将其作为是否本次输入的标志字段,如设
其值为'Y'是本次输入的记录,并且定制在DBGRID中显示的字段,不要把BZ这个字段显示出来,
因为这个字段只是来作一下判断是否是本次输入的记录的,在Table控件的Afteropen事件中
用bz='Y'执行过滤,这样DBGRID中为空了,然后在Table控件的beforepost事件中设置自动将
当前记录的bz字段置'Y'等,并用bz='Y'来执行一次索引,这样当前输入一条或几条记录后,
显示的就只有本次输入的记录了,当你列印或完成操作后将其BZ的值置为'N'或空,下一次
你输入时就又重复本次的过程了,对于以上所说我没有亲自试过,不知道操作起来是不是有
问题,不行的话,我们再探讨探讨.
关于资料库编程例子,好多DELPHI网站上都有下载,你可以多转转,我推荐几个网站给你:
DELPHI窑洞 http://202.117.210.31/
DELPHI宝典 http://kingron.myetang.com
 
推荐使用 ADO 控件组。(以下内容摘自李维《Delphi 5.X ADO_MTS_COM+高级程序设计篇》)
A D O 的B a t c h U p d a t e 除了具备过滤数据的功能之外,也可以让程序员检查目前
每一笔数据的状态。对于每一笔数据的状态,可以从A D O 数据集的U p d a t e S t a t u s 方
法回传的数值得到。下面的表格列出了UpdateStatus 可以回传的数值以及回传数值
的意义:
常数数值意义
usUnmodified 目前这笔数据没有被修改过
usModified 目前这笔数据已经被修改过
usInserted 这笔数据是新增的数据
usDeleted 这笔数据已经被删除了

 
对不起,上次有个地方是笔误,不应是用BZ='Y'执行索引,而应是用BZ='Y'作为条件进行过滤,
另外,如果你要求不高的话,我觉得另一个思路比较简单,就是使用临时库,在输入时链接一个
与主库库结构相同的临时数据库,这样你不用任何处理在DBGRID中显示的就是本次输入的资
料,在一次输入记录完成并列印后,用BATCHMOVE控件把临时库中的文件追加到主库中去,并
把临时库清空,当然假如以后你还需要对本次输入的数据进行列印的话,还应该加一个单据号
的标记字段,以便以后能根据单据号把某次输入的记录过滤出来.
 
临时数据库是怎样建立
 
这个所谓的临时数据库不一定要是在程序运行时才生成的内存数据库,你可以在建立主库时
就一并建立.当然如果你想用运行时动态建立的临时库也是可以的,我介绍给你两种方法:
1.使用查询控件创建临时表
  第1步:在窗体上放入查询控件(TQuery),并设置好所连接的数据控件。
  第2步:在Query中加入查询出主库中记录的SQL语句,再加入Where子语句,要求加入
这条Where子语句后SQL查询结果为空。
  例如:
  SELECT *
  FROM mymainbase
  where bz=′Y′
  这样临时表就建立好了。
  2.使用代码创建临时表
  函数代码如下:
  function CreateTableInMemory(const AFieldDefs:TFieldDefs):
  TDataSet;
  var TempTable:TClientDataSet;
  begin
  TempTable:=nil;
  Result:=nil;
  if AFieldDefs〈〉nil then
  begin
  try
  TempTable:=TClientDataSet.Create(Application);
  TempTable.FieldDefs.Assign(AFieldDefs);
  TempTable.CreateDataSet;
  Result:=(TempTable as TDataSet);
  Except
  if TempTable〈〉nil then TempTable.Free;
  Result:=nil;
  raise;
  end
  end
  end;
  在程序中按如下方法调用:
  procedure TForm1.Button1Click(Sender: TObject);
  var ADataSet:TDataSet;
  begin
  ADataSet:=TDataSet.Create(Self);
  with ADataSet.FieldDefs do
  begin
  Add(′Name′,ftString,30,False);
  Add(′Value′,ftInteger,0,False);
  end;
  with DataSource1 do
  begin
  DataSet:=CreateTableInMemory(ADataSet.FieldDefs);
  DataSet.Open;
  end;
  ADataSet.Free;
  end;
  这样,临时表就创建完成。
  
 
用filter
或者设置Query或table的recordrount属性
 
一个很土的方法:也就是说先在form1中插入你需要的数据,而在form2中的dbgrid的连接的adoquery1
(假如说是adoquery1)中用sql语句再选择一下,相信应该是可以的吧(方法很笨):
procedure TForm1.Button1Click(Sender: TObject);
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.add('insert into aaa(name)');
sql.add('values('''+edit1.text+''')');
execsql;
end;
form2.show;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from aaa');
sql.add('where name='''+form1.edit1.text+'''');
open;
end;
end;
关于ado的设置和连接相信你也一定会!
 
你可以用clientdataset来做
 
我觉得你们完全把问题复杂化了,最简单的方法,可以把DBGrid
的字体颜色设成白色(或者和DBGrid底色相同的),这样输入的时
候,肯定是只显示你当前输入的记录了,不信你试试。

至于说打印的时候,完全可以用一个Query,一句简单的查询语句
select * from XXXX where XXX=XXX
搞定。
 
输入要方便就用DBEdit等输入类感知控件。
显示,打印的话可以做过滤吗!
用表的主键作filter
filtered:=false;
filter:='主键名='+键值;
filtered:=true;
 
后退
顶部