📄 masterdetail.pas
字号:
unit MasterDetail;
interface
uses
{$IFNDEF LINUX}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, Grids, DBGrids, StdCtrls, ToolWin, ComCtrls, Buttons, OdacVcl,
{$ELSE}
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs, QStdCtrls,
QDBCtrls, QComCtrls, QExtCtrls, QGrids, QDBGrids, QButtons, OdacClx,
{$ENDIF}
Db, DBAccess, Ora, MemDS, OraSmart, OdacDemoForm, OdacDemoFrame,
DAScript, OraScript;
type
TMasterDetailFrame = class(TOdacDemoFrame)
DBGrid: TDBGrid;
ToolBar: TPanel;
Splitter1: TSplitter;
ToolBar1: TPanel;
DBGrid1: TDBGrid;
dsDetail: TDataSource;
dsMaster: TDataSource;
Panel1: TPanel;
DBNavigator1: TDBNavigator;
Panel2: TPanel;
btOpen: TSpeedButton;
btClose: TSpeedButton;
DBNavigator: TDBNavigator;
quMaster: TOraQuery;
quDetail: TOraQuery;
quMasterDEPTNO: TIntegerField;
quMasterDNAME: TStringField;
quMasterLOC: TStringField;
quDetailEMPNO: TIntegerField;
quDetailENAME: TStringField;
quDetailJOB: TStringField;
quDetailMGR: TIntegerField;
quDetailHIREDATE: TDateTimeField;
quDetailSAL: TFloatField;
quDetailCOMM: TFloatField;
quDetailDEPTNO: TIntegerField;
quDetailDEPTNO_CALCULATED: TIntegerField;
quMasterDEPTNO_CALCULATED: TIntegerField;
Panel3: TPanel;
rbSQL: TRadioButton;
Panel6: TPanel;
cbCacheCalcFields: TCheckBox;
rbSimpleFields: TRadioButton;
rbCalcFields: TRadioButton;
Panel7: TPanel;
cbLocalMasterDetail: TCheckBox;
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure rbLinkTypeClick(Sender: TObject);
procedure cbCacheCalcFieldsClick(Sender: TObject);
procedure quCalcFields(DataSet: TDataSet);
procedure cbLocalMasterDetailClick(Sender: TObject);
private
procedure SetupMasterDetail;
public
procedure Initialize; override;
procedure SetDebug(Value: boolean); override;
end;
implementation
uses
{$IFNDEF VER130} { Delphi 6 or higher }
Variants,
{$ENDIF}
OraError;
{$IFDEF CLR}
{$R *.nfm}
{$ENDIF}
{$IFDEF WIN32}
{$R *.dfm}
{$ENDIF}
{$IFDEF LINUX}
{$R *.xfm}
{$ENDIF}
procedure TMasterDetailFrame.btOpenClick(Sender: TObject);
begin
quMaster.Open;
quDetail.Open;
end;
procedure TMasterDetailFrame.btCloseClick(Sender: TObject);
begin
quMaster.Close;
quDetail.Close;
end;
procedure TMasterDetailFrame.Initialize;
begin
inherited;
quMaster.Connection:= Connection;
quDetail.Connection := Connection;
SetupMasterDetail;
end;
procedure TMasterDetailFrame.SetDebug(Value: boolean);
begin
quMaster.Debug:= Value;
quDetail.Debug := Value;
end;
procedure TMasterDetailFrame.SetupMasterDetail;
var
OldActive: boolean;
begin
OldActive := quMaster.Active;
if OldActive then
btCloseClick(nil);
cbCacheCalcFields.Enabled := rbCalcFields.Checked;
if rbSQL.Checked then begin
quDetail.SQL.Text := 'SELECT * FROM Emp WHERE DeptNo = :DeptNo';
quDetail.DetailFields := '';
quDetail.MasterFields := '';
quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False;
quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False;
cbLocalMasterDetail.Checked := False;
cbLocalMasterDetail.Enabled := False;
cbCacheCalcFields.Enabled := False;
end
else
if rbSimpleFields.Checked then begin
quDetail.SQL.Text := 'SELECT * FROM Emp';
quDetail.DetailFields := 'DEPTNO';
quDetail.MasterFields := 'DEPTNO';
quMaster.FieldByName('DEPTNO_CALCULATED').Visible := False;
quDetail.FieldByName('DEPTNO_CALCULATED').Visible := False;
cbLocalMasterDetail.Enabled := True;
cbCacheCalcFields.Enabled := False;
end
else begin
quDetail.SQL.Text := 'SELECT * FROM Emp';
quDetail.DetailFields := 'DEPTNO_CALCULATED';
quDetail.MasterFields := 'DEPTNO_CALCULATED';
quMaster.FieldByName('DEPTNO_CALCULATED').Visible := True;
quDetail.FieldByName('DEPTNO_CALCULATED').Visible := True;
cbLocalMasterDetail.Enabled := True;
cbLocalMasterDetail.Checked := True;
cbCacheCalcFields.Enabled := True;
end;
cbCacheCalcFieldsClick(nil);
if OldActive then
btOpenClick(nil);
end;
procedure TMasterDetailFrame.rbLinkTypeClick(Sender: TObject);
begin
SetupMasterDetail;
end;
procedure TMasterDetailFrame.cbCacheCalcFieldsClick(Sender: TObject);
var
OldActive: boolean;
begin
OldActive := quMaster.Active;
if OldActive then
btCloseClick(nil);
quMaster.Options.CacheCalcFields := cbCacheCalcFields.Checked and cbCacheCalcFields.Enabled;
quDetail.Options.CacheCalcFields := quMaster.Options.CacheCalcFields;
if OldActive then
btOpenClick(nil);
end;
procedure TMasterDetailFrame.quCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('DEPTNO_CALCULATED').AsInteger :=
DataSet.FieldByName('DEPTNO').AsInteger * 2;
end;
procedure TMasterDetailFrame.cbLocalMasterDetailClick(Sender: TObject);
begin
try
quDetail.Options.LocalMasterDetail := cbLocalMasterDetail.Checked;
except
cbLocalMasterDetail.Checked := quDetail.Options.LocalMasterDetail;
raise;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -