一般从数据库读出的数据必须经过处理,添加一些数据列才能满足我们的显示要求,这里
就可以用TdataSet为中介,把读取的数据处理后再显示到dbGrid上,废话不多,上代码呵
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.