用TdataSet设计主从表关系

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

就可以用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

你可能感兴趣的:(Data)