git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@21 05c56307-c608-d34a-929d-697000501d7a
363 lines
12 KiB
ObjectPascal
363 lines
12 KiB
ObjectPascal
unit main;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
Db, DBTables, Grids, DBGrids, dxMasterView, StdCtrls, ExtCtrls, ComCtrls;
|
|
|
|
type
|
|
TfmMain = class(TForm)
|
|
MasterView: TdxMasterView;
|
|
Panel1: TPanel;
|
|
Level1: TdxMasterViewLevel;
|
|
tbCustomers: TTable;
|
|
tbCustomersID: TIntegerField;
|
|
tbCustomersCustomerName: TStringField;
|
|
tbCustomersCompany: TStringField;
|
|
tbCustomersAddress: TStringField;
|
|
tbCustomersCustomer: TBooleanField;
|
|
tbCustomersCity: TStringField;
|
|
tbCustomersState: TStringField;
|
|
tbCustomersHomePhone: TStringField;
|
|
dsCustomers: TDataSource;
|
|
Level1ID: TdxMasterViewColumn;
|
|
Level1CustomerName: TdxMasterViewColumn;
|
|
Level1Company: TdxMasterViewColumn;
|
|
Level1Address: TdxMasterViewColumn;
|
|
Level1Customer: TdxMasterViewColumn;
|
|
Level1City: TdxMasterViewColumn;
|
|
Level1State: TdxMasterViewColumn;
|
|
Level1HomePhone: TdxMasterViewColumn;
|
|
ProgressBar: TProgressBar;
|
|
tbOrders: TTable;
|
|
dsOrders: TDataSource;
|
|
tbOrdersOrderNo: TIntegerField;
|
|
tbOrdersCustomerNo: TIntegerField;
|
|
tbOrdersPaymentAmount: TCurrencyField;
|
|
Level2: TdxMasterViewLevel;
|
|
Level2OrderNo: TdxMasterViewColumn;
|
|
Level2CustomerNo: TdxMasterViewColumn;
|
|
Level2PaymentType: TdxMasterViewColumn;
|
|
Level2PaymentAmount: TdxMasterViewColumn;
|
|
tbOrdersPaymentType: TStringField;
|
|
StatusBar: TStatusBar;
|
|
btnCustomize: TButton;
|
|
btnFullCollapse: TButton;
|
|
btnFullExpand: TButton;
|
|
chbSmartLoadLevel1: TCheckBox;
|
|
Level1PurchaseDate: TdxMasterViewColumn;
|
|
tbCustomersPurchaseDate: TDateTimeField;
|
|
btnReloadDataset: TButton;
|
|
tbItems: TTable;
|
|
dsItems: TDataSource;
|
|
tbItemsItemNo: TIntegerField;
|
|
tbItemsOrderNo: TIntegerField;
|
|
tbItemsPartNo: TIntegerField;
|
|
tbItemsQty: TIntegerField;
|
|
Level3: TdxMasterViewLevel;
|
|
Level3ItemNo: TdxMasterViewColumn;
|
|
Level3OrderNo: TdxMasterViewColumn;
|
|
Level3PartNo: TdxMasterViewColumn;
|
|
Level3Qty: TdxMasterViewColumn;
|
|
chbSmartLoadLevel2: TCheckBox;
|
|
chbSmartLoadLevel3: TCheckBox;
|
|
procedure FormActivate(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure btnCustomizeClick(Sender: TObject);
|
|
procedure btnFullExpandClick(Sender: TObject);
|
|
procedure btnFullCollapseClick(Sender: TObject);
|
|
procedure chbSmartLoadLevel1Click(Sender: TObject);
|
|
procedure btnReloadDatasetClick(Sender: TObject);
|
|
procedure chbSmartLoadLevel2Click(Sender: TObject);
|
|
procedure chbSmartLoadLevel3Click(Sender: TObject);
|
|
public
|
|
DataFile: String;
|
|
procedure TablesCreate;
|
|
procedure BeforeLoadData;
|
|
procedure AfterLoadData;
|
|
end;
|
|
|
|
var
|
|
fmMain: TfmMain;
|
|
EmptyTables: Boolean;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
const
|
|
// Table fields
|
|
ArrayLen = 10;
|
|
stCustomerName: array [0 .. ArrayLen - 1] of String = (
|
|
'John Doe', 'Jennie Valentine', 'Sam Hill', 'Karen Holmes', 'Bobbie Valentine',
|
|
'Ricardo Menendez', 'Frank Frankson', 'Christa Christie', 'Alfred Newman', 'James Johnson');
|
|
|
|
stCompany: array [0 .. ArrayLen - 1] of String = (
|
|
'Doe Enterprises', 'Hill Corporation', 'Holmes World', 'Valentine Hearts', 'Menedez Development',
|
|
'Frankson Media', 'Christies House of Design', 'Jones & Assoc', 'Newman Systems', 'Development House');
|
|
|
|
stAddress: array [0 .. ArrayLen - 1] of String = (
|
|
'123 Home Lane', '45 Hill St.', '9333 Holmes Dr.', '933 Heart St. Suite 1', '939 Center Street',
|
|
'121 Media Center Drive', '349 Graphic Design Lane', '990 King Lane', '900 Newman Center', '93900 Carter Lane');
|
|
|
|
stCity: array [0 .. ArrayLen - 1] of String = (
|
|
'Homesville', 'Hillsville', 'Johnsonville', 'Chicago', 'Atlanta',
|
|
'New York', 'Kingsville', 'Newman', 'Cartersville', 'Los Angeles');
|
|
|
|
stState: array [0 .. ArrayLen - 1] of String = (
|
|
'CA', 'NJ', 'NY', 'IL', 'GA', 'OK', 'OH', 'CT', 'MI', 'MA');
|
|
|
|
stHomePhone: array [0 .. ArrayLen - 1] of String = (
|
|
'(111)111-1111', '(222)222-2222', '(333)333-3333', '(898)745-1511', '(151)615-1611',
|
|
'(339)339-3939', '(930)930-3093', '(029)020-9090', '(923)022-0834', '(228)320-8320');
|
|
|
|
stPaymentType: array [0 .. 3] of String = (
|
|
'CASH', 'VISA', 'MASTER', 'AMEX');
|
|
|
|
function GetRandomValue(A: array of String): String;
|
|
begin
|
|
Result := A[Low(A) + Random(High(A)-Low(A) + 1)];
|
|
end;
|
|
|
|
//generate a random PaymentType value
|
|
function GetRandomPTValue: String;
|
|
begin
|
|
case Random(100)+1 of
|
|
1..50: Result := 'VISA';
|
|
51..80: Result := 'MASTER';
|
|
81..95: Result := 'AMEX';
|
|
else Result := 'CASH';
|
|
end;
|
|
end;
|
|
|
|
procedure TfmMain.FormActivate(Sender: TObject);
|
|
begin
|
|
if EmptyTables then //If tables were not created
|
|
begin
|
|
if MessageBox(Handle, 'The tables is empty.'#13'Do you wish to generate 100 000 records?', 'Question',
|
|
MB_ICONQUESTION or MB_YESNO) = ID_YES then TablesCreate;
|
|
end
|
|
else
|
|
if MessageBox(Handle, 'The tables is full.'#13'Do you wish to generate new 100 000 records?', 'Question',
|
|
MB_ICONQUESTION or MB_YESNO) = ID_YES then TablesCreate
|
|
else
|
|
try
|
|
BeforeLoadData; //update StatusBar
|
|
tbCustomers.Active := true;
|
|
tbOrders.Active := true;
|
|
tbItems.Active := true;
|
|
except
|
|
end;
|
|
AfterLoadData; //update StatusBar
|
|
end;
|
|
|
|
procedure TfmMain.FormCreate(Sender: TObject);
|
|
var
|
|
AFileName : String;
|
|
begin
|
|
EmptyTables := true; //initialize the variable
|
|
with tbCustomers do
|
|
begin
|
|
DatabaseName := ExtractFilePath(Application.ExeName);
|
|
AFileName := DatabaseName;
|
|
if AFileName <> '' then
|
|
if AFileName[Length(AFileName)] <> '\' then
|
|
AFileName := AFileName + '\';
|
|
AFileName := AFileName + tbCustomers.TableName + '.db';
|
|
// If the Customers table file exists
|
|
if FileExists(AFileName) then
|
|
EmptyTables := false;
|
|
// set the CheckBoxs value
|
|
if (lodSmartLoad in Level1.OptionsDB) then chbSmartLoadLevel1.Checked := true
|
|
else chbSmartLoadLevel1.Checked := false;
|
|
if (lodSmartLoad in Level2.OptionsDB) then chbSmartLoadLevel2.Checked := true
|
|
else chbSmartLoadLevel2.Checked := false;
|
|
if (lodSmartLoad in Level3.OptionsDB) then chbSmartLoadLevel3.Checked := true
|
|
else chbSmartLoadLevel3.Checked := false;
|
|
end;
|
|
end;
|
|
|
|
// build the Customers, Orders, Items tables
|
|
procedure TfmMain.TablesCreate;
|
|
var
|
|
I, J: Integer;
|
|
CustId, OrderId, ItemId: Integer;
|
|
OrdRecCount, ItmRecCount: Integer;
|
|
begin
|
|
Screen.Cursor := crHourGlass;
|
|
StatusBar.Panels.Items[1].Text := 'Creating tables';
|
|
OrderId := 1; ItemId := 1;
|
|
StatusBar.Refresh;
|
|
tbCustomers.Active := False;
|
|
tbOrders.Active := False;
|
|
tbItems.Active := False;
|
|
tbCustomers.IndexDefs.Clear;
|
|
tbOrders.IndexDefs.Clear;
|
|
tbItems.IndexDefs.Clear;
|
|
// specify new indexes for the tables
|
|
tbCustomers.IndexDefs.Add('ID', 'ID', [ixPrimary]);
|
|
tbOrders.IndexDefs.Add('OrderNo', 'OrderNo', [ixPrimary]);
|
|
tbOrders.IndexDefs.Add('CustomerNo', 'CustomerNo', []);
|
|
// set the secondary index for the detail dataset by DetailKey
|
|
tbOrders.IndexFieldNames := 'CustomerNo';
|
|
tbItems.IndexDefs.Add('ItemNo', 'ItemNo', [ixPrimary]);
|
|
tbItems.IndexDefs.Add('OrderNo', 'OrderNo', []);
|
|
// set the secondary index for the detail dataset by DetailKey
|
|
tbItems.IndexFieldNames := 'OrderNo';
|
|
tbCustomers.CreateTable;
|
|
tbOrders.CreateTable;
|
|
tbItems.CreateTable;
|
|
Screen.Cursor := crHourGlass;
|
|
tbCustomers.DisableControls;
|
|
tbOrders.DisableControls;
|
|
tbItems.DisableControls;
|
|
ProgressBar.Parent := StatusBar;
|
|
try
|
|
tbCustomers.Active := True;
|
|
tbOrders.Active := True;
|
|
tbItems.Active := True;
|
|
ProgressBar.Max := 1000;
|
|
ProgressBar.Width := StatusBar.Panels[0].Width;
|
|
ProgressBar.Height := StatusBar.ClientHeight - 2;
|
|
ProgressBar.Left := 0;
|
|
ProgressBar.Top := 2;
|
|
ProgressBar.Visible := True;
|
|
// add records to the Customers table
|
|
for CustId := 1 to ProgressBar.Max do
|
|
begin
|
|
tbCustomers.Append;
|
|
tbCustomers.FieldByName('ID').AsInteger := CustId;
|
|
tbCustomers.FieldByName('CustomerName').AsString := GetRandomValue(stCustomerName);
|
|
tbCustomers.FieldByName('Company').AsString := GetRandomValue(stCompany);
|
|
tbCustomers.FieldByName('Address').AsString := GetRandomValue(stAddress);
|
|
tbCustomers.FieldByName('City').AsString := GetRandomValue(stCity);
|
|
tbCustomers.FieldByName('State').AsString := GetRandomValue(stState);
|
|
tbCustomers.FieldByName('Customer').AsBoolean := Boolean(Random(2));
|
|
tbCustomers.FieldByName('PurchaseDate').AsDateTime := Date - 100 + Random(100);
|
|
tbCustomers.FieldByName('HomePhone').AsString := GetRandomValue(stHomePhone);
|
|
tbCustomers.Post;
|
|
ProgressBar.Position := CustId;
|
|
//create the Order table
|
|
OrdRecCount := Random(19) + 1;
|
|
for I := 1 to OrdRecCount do
|
|
begin
|
|
tbOrders.Append;
|
|
tbOrders.FieldByName('OrderNo').AsInteger := OrderId;
|
|
tbOrders.FieldByName('CustomerNo').AsInteger := CustId;
|
|
tbOrders.FieldByName('PaymentType').AsString := GetRandomPTValue;
|
|
tbOrders.FieldByName('PaymentAmount').AsFloat := 49 + Random(200);
|
|
tbOrders.Post;
|
|
|
|
//create the Items table
|
|
ItmRecCount := Random(19) + 1;
|
|
for J := 1 to ItmRecCount do
|
|
begin
|
|
tbItems.Append;
|
|
tbItems.FieldByName('ItemNo').AsInteger := ItemId;
|
|
tbItems.FieldByName('OrderNo').AsInteger := OrderId;
|
|
tbItems.FieldByName('PartNo').AsInteger := Random(1500) + 900;
|
|
tbItems.FieldByName('Qty').AsInteger := Random(100);
|
|
tbItems.Post;
|
|
Inc(ItemId);
|
|
end;
|
|
Inc(OrderId);
|
|
end;
|
|
end;
|
|
finally
|
|
ProgressBar.Visible := False;
|
|
StatusBar.Panels.Items[1].Text := 'Creating tables is successfully complete';
|
|
StatusBar.Refresh;
|
|
BeforeLoadData;
|
|
tbCustomers.EnableControls;
|
|
tbOrders.EnableControls;
|
|
tbItems.EnableControls;
|
|
Screen.Cursor := crDefault;
|
|
end;
|
|
end;
|
|
|
|
//show/hide the Customization Form
|
|
procedure TfmMain.btnCustomizeClick(Sender: TObject);
|
|
begin
|
|
MasterView.Customizing := not MasterView.Customizing;
|
|
end;
|
|
|
|
//full expand
|
|
procedure TfmMain.btnFullExpandClick(Sender: TObject);
|
|
begin
|
|
BeforeLoadData;
|
|
MasterView.FullExpand;
|
|
AfterLoadData;
|
|
end;
|
|
|
|
//full collapse
|
|
procedure TfmMain.btnFullCollapseClick(Sender: TObject);
|
|
begin
|
|
MasterView.FullCollapse;
|
|
end;
|
|
|
|
// activate SmartLoad mode for Level1
|
|
procedure TfmMain.chbSmartLoadLevel1Click(Sender: TObject);
|
|
begin
|
|
BeforeLoadData;
|
|
if chbSmartLoadLevel1.Checked then
|
|
Level1.OptionsDB := Level1.OptionsDB + [lodSmartLoad]
|
|
else
|
|
Level1.OptionsDB := Level1.OptionsDB - [lodSmartLoad];
|
|
AfterLoadData;
|
|
end;
|
|
|
|
//reload all datasets
|
|
procedure TfmMain.btnReloadDatasetClick(Sender: TObject);
|
|
begin
|
|
BeforeLoadData;
|
|
try
|
|
tbCustomers.Active := false;
|
|
tbOrders.Active := false;
|
|
tbItems.Active := false;
|
|
tbCustomers.Active := true;
|
|
tbOrders.Active := true;
|
|
tbItems.Active := true;
|
|
except
|
|
end;
|
|
AfterLoadData;
|
|
end;
|
|
|
|
// activate SmartLoad mode for Level2
|
|
procedure TfmMain.chbSmartLoadLevel2Click(Sender: TObject);
|
|
begin
|
|
BeforeLoadData;
|
|
if chbSmartLoadLevel2.Checked then
|
|
Level2.OptionsDB := Level2.OptionsDB + [lodSmartLoad]
|
|
else
|
|
Level2.OptionsDB := Level2.OptionsDB - [lodSmartLoad];
|
|
AfterLoadData;
|
|
end;
|
|
|
|
// activate SmartLoad mode for Level3
|
|
procedure TfmMain.chbSmartLoadLevel3Click(Sender: TObject);
|
|
begin
|
|
BeforeLoadData;
|
|
if chbSmartLoadLevel3.Checked then
|
|
Level3.OptionsDB := Level3.OptionsDB + [lodSmartLoad]
|
|
else
|
|
Level3.OptionsDB := Level3.OptionsDB - [lodSmartLoad];
|
|
AfterLoadData;
|
|
end;
|
|
|
|
// mark the beginning of data loading
|
|
procedure TfmMain.BeforeLoadData;
|
|
begin
|
|
StatusBar.Panels.Items[1].Text := 'Loading data';
|
|
StatusBar.Refresh;
|
|
end;
|
|
|
|
// mark the end of data loading
|
|
procedure TfmMain.AfterLoadData;
|
|
begin
|
|
StatusBar.Panels.Items[1].Text := '';
|
|
StatusBar.Refresh;
|
|
end;
|
|
|
|
end.
|