一般从数据库读出的数据必须经过处理,添加一些数据列才能满足我们的显示要求,这里

就可以用TdataSet为中介,把读取的数据处理后再显示到dbGrid上,废话不多,上代码呵

View Code
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, DBClient;

type
TForm1
= class(TForm)
Dbgrd1: TDBGrid;
Dbgrd2: TDBGrid;
Btn1: TButton;
Con1: TADOConnection;
Query1: TADOQuery;
ClDsMaster: TClientDataSet;
ClDsDetail: TClientDataSet;
Ds1: TDataSource;
Ds2: TDataSource;
procedure FormCreate(Sender: TObject);
procedure Btn1Click(Sender: TObject);
private
DSMaster: TDataSet;
DSDetail: TDataSet;
procedure CreateMemoryTable;
procedure SumData;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
str : String;
begin
str :
= 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=ReportData.mdb;Persist Security Info=True';
Con1.Connected :
= False;
Con1.ConnectionString :
= str;
Con1.Connected :
= True;
end;

procedure TForm1.Btn1Click(Sender: TObject);
begin
if not Query1.Active then
Query1.Active :
= True;

//建立内存表
CreateMemoryTable;

//汇总数据写入主数据集中
SumData;
end;

procedure TForm1.CreateMemoryTable;
begin
DSMaster:
=TDataSet.Create(self);
with DSMaster.FieldDefs do
begin
Add(
'分组',ftInteger,0,False);
Add(
'数量',ftInteger,0,False);
Add(
'金额',ftInteger,0,False);
end;

DSDetail :
= TDataSet.Create(Self);
with dsDetail.FieldDefs do
begin
Add(
'分组',ftInteger,0,False);
Add(
'编号',ftInteger,0,False);
Add(
'名字',ftString,30,False);
Add(
'数量',ftInteger,0,False);
Add(
'金额',ftInteger,0,False);
end;
ClDsMaster.FieldDefs.Assign(DSMaster.FieldDefs);
ClDsMaster.CreateDataSet;
ClDsMaster.Open;

ClDsDetail.FieldDefs.Assign(DSDetail.FieldDefs);
ClDsDetail.CreateDataSet;
ClDsDetail.Open;
end;

procedure TForm1.SumData;
const
DEFAULT_PAGE_COUNT
=20;
var
iGroup,iNum,iMoney:integer;
//分组号,数量汇总,金额汇总
bSum:Boolean;
//当前组是否已汇总
begin
bSum:
=False;
iGroup:
=1;
iNum:
=0;
iMoney:
=0;
while not Query1.Eof do //添加数据
begin
ClDsDetail.Append;
ClDsDetail.FieldByName(
'分组').Value:=iGroup;
ClDsDetail.FieldByName(
'编号').Value:=Query1.fieldByName('编号').Value;
ClDsDetail.FieldByName(
'名字').Value := Query1.FieldByName('名字').Value;
ClDsDetail.FieldByName(
'数量').Value := Query1.FieldByName('数量').Value;
ClDsDetail.FieldByName(
'金额').Value := Query1.FieldByName('金额').Value;
ClDsDetail.Post;
bSum:
=True; //开始汇总
inum:
=iNum +query1.FieldByName('数量').value;
iMoney:
=iMoney+query1.fieldByName('金额').Value;
if(Query1.RecNo mod DEFAULT_PAGE_COUNT)=0 then
begin
ClDsMaster.Append;
ClDsMaster.FieldByName(
'分组').Value := iGroup;
ClDsMaster.FieldByName(
'数量').Value := iNum;
ClDsMaster.FieldByName(
'金额').Value := iMoney;
ClDsMaster.Post;

Inc(iGroup);
bSum :
= False;
iNum :
= 0;
iMoney :
= 0;
end;
Query1.Next;
end;
if bSum then //对不足一页的数据处理
begin
ClDsMaster.Append;
ClDsMaster.FieldByName(
'分组').Value := iGroup;
ClDsMaster.FieldByName(
'数量').Value := iNum;
ClDsMaster.FieldByName(
'金额').Value := iMoney;
ClDsMaster.Post;
end;
end;
procedure TForm1.ClDsMasterAfterScroll(DataSet: TDataSet);
begin
  if not ClDsMaster.FieldByName('分组').IsNull then //添加的过滤功能
  begin
    ClDsDetail.Filtered := False;
    ClDsDetail.Filter := ' 分组=' + ClDsMaster.FieldByName('分组').AsString;
    ClDsDetail.Filtered := True;
  end;
end;
 


end.
完整程序:/Files/gaiyang/用TdataSet设计主从表.rar
posted on 2011-03-22 11:56  cnby  阅读(424)  评论(0编辑  收藏  举报