Skip to content

Commit e38961c

Browse files
committed
Improved demo, now it adds a third level of sub-grid ( Customers -> Orders -> Order Details )
1 parent 6a5d5f6 commit e38961c

5 files changed

Lines changed: 81 additions & 16 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ demos/FireMonkey/TeeGridFeatures/Win32/
4848
*.rsm
4949
demos/VirtualData/Custom Sorting/__recovery/
5050
__recovery
51+
*.vlb

demos/FireMonkey/Database/Master_Detail_FireDAC/Customer_Orders.dfm

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
object SampleData: TSampleData
22
OnCreate = DataModuleCreate
3-
Height = 337
3+
Height = 479
44
Width = 267
55
object Sqlite_demoConnection: TFDConnection
66
Params.Strings = (
@@ -37,7 +37,22 @@ object SampleData: TSampleData
3737
end>
3838
end
3939
object FDStanStorageBinLink1: TFDStanStorageBinLink
40-
Left = 104
41-
Top = 216
40+
Left = 108
41+
Top = 288
42+
end
43+
object OrderDetailsTable: TFDQuery
44+
Connection = Sqlite_demoConnection
45+
FetchOptions.AssignedValues = [evRecordCountMode]
46+
FetchOptions.RecordCountMode = cmTotal
47+
SQL.Strings = (
48+
'SELECT * FROM "Order Details"'
49+
'where OrderID = :Order')
50+
Left = 109
51+
Top = 211
52+
ParamData = <
53+
item
54+
Name = 'ORDER'
55+
ParamType = ptInput
56+
end>
4257
end
4358
end

demos/FireMonkey/Database/Master_Detail_FireDAC/Customer_Orders.pas

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ TSampleData = class(TDataModule)
1717
CustomersTable: TFDQuery;
1818
OrdersTable: TFDQuery;
1919
FDStanStorageBinLink1: TFDStanStorageBinLink;
20+
OrderDetailsTable: TFDQuery;
2021
procedure DataModuleCreate(Sender: TObject);
2122
private
2223
{ Private declarations }
@@ -26,6 +27,7 @@ TSampleData = class(TDataModule)
2627
{ Public declarations }
2728

2829
function OrdersOfCustomer(const ARecNo:Integer):TDataSet;
30+
function OrderDetailsOfOrder(const ARecNo:Integer):TDataSet;
2931
end;
3032

3133
var
@@ -64,6 +66,28 @@ function TSampleData.OrdersOfCustomer(const ARecNo:Integer):TDataSet;
6466
result:=CloneData(OrdersTable);
6567
end;
6668

69+
function TSampleData.OrderDetailsOfOrder(const ARecNo:Integer):TDataSet;
70+
71+
// Return the OrderID for row: ARow
72+
function OrderID:String;
73+
begin
74+
OrdersTable.RecNo:=ARecNo;
75+
result:=OrdersTable.FieldByName('OrderID').AsString;
76+
end;
77+
78+
// Execute OrderDetailsTable query for a given OrderID
79+
procedure FilterOrderDetails(const AOrderID:String);
80+
begin
81+
OrderDetailsTable.Close;
82+
OrderDetailsTable.ParamByName('Order').AsString:=AOrderID;
83+
OrderDetailsTable.Open;
84+
end;
85+
86+
begin
87+
FilterOrderDetails(OrderID);
88+
result:=CloneData(OrderDetailsTable);
89+
end;
90+
6791
// Return a new clone copy of ADataSet data, all rows
6892
function TSampleData.CloneData(const ADataSet:TFDDataSet):TDataSet;
6993
var tmp : TMemoryStream;

demos/FireMonkey/Database/Master_Detail_FireDAC/Master_Detail_FireDAC.fmx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ object MasterDetail: TMasterDetail
4949
Size.PlatformDefault = False
5050
TabOrder = 1
5151
Text = '&Open/Close All'
52-
TextSettings.Trimming = None
5352
OnClick = Button1Click
5453
end
5554
end

demos/FireMonkey/Database/Master_Detail_FireDAC/Master_Detail_FireDAC.pas

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ interface
2121

2222
FMXTee.Control, FMXTee.Grid,
2323

24-
Tee.Renders, Tee.Grid.RowGroup, Customer_Orders, Data.Bind.Controls,
24+
Tee.Format, Tee.Renders, Tee.Grid.RowGroup, Customer_Orders, Data.Bind.Controls,
2525
Data.Bind.Components, Data.Bind.DBScope, Data.DB, Fmx.Bind.Navigator;
2626

2727
type
@@ -39,11 +39,16 @@ TMasterDetail = class(TForm)
3939
private
4040
{ Private declarations }
4141

42-
Expander : TExpanderRender;
43-
4442
procedure DetailNewGroup(const Sender,NewGroup:TRowGroup);
43+
44+
procedure EnableDisableSubGrid(const AGroup:TRowGroup; const AEvent:TExpanderGetDataEvent);
45+
46+
// Sub-Grid level 1
4547
procedure GetOrders(const Sender: TExpanderRender; const ARow:Integer; out AData:TObject);
4648

49+
// Sub-Grid level 2
50+
procedure GetOrderItems(const Sender: TExpanderRender; const ARow:Integer; out AData:TObject);
51+
4752
public
4853
{ Public declarations }
4954
end;
@@ -89,37 +94,47 @@ procedure TMasterDetail.Button1Click(Sender: TObject);
8994
End;
9095
end;
9196

92-
procedure TMasterDetail.CBEnabledChange(Sender: TObject);
97+
// This method is used for any sub-grid level, in this example it is used
98+
// twice, one for Customer->Orders, and another for Orders->Order Details
99+
procedure TMasterDetail.EnableDisableSubGrid(const AGroup:TRowGroup; const AEvent:TExpanderGetDataEvent);
100+
var Expander : TExpanderRender;
93101
begin
94102
if CBEnabled.IsChecked then
95103
begin
96104
// Create "Expander"
97-
Expander:=TeeGrid1.Grid.Current.NewExpander;
105+
Expander:=AGroup.NewExpander;
98106

99-
// Setup event
100-
Expander.OnGetData:=GetOrders;
107+
// Setup data event
108+
Expander.OnGetData:=AEvent;
101109

102110
// We don't know in advance if a row can be expanded or not, so set Always
103111
Expander.AlwaysExpand:=True;
104112

105113
// Set to first Column
106-
if TeeGrid1.Columns.Count>0 then
107-
TeeGrid1.Columns[0].Render:=Expander;
114+
if AGroup.Columns.Count>0 then
115+
AGroup.Columns[0].Render:=Expander;
108116
end
109117
else
110118
begin
111119
// Remove all detail grids
112-
TeeGrid1.Rows.Children.Clear;
120+
AGroup.Rows.Children.Clear;
113121

114122
// Set first column render to default (no expander)
115-
if TeeGrid1.Columns.Count>0 then
116-
TeeGrid1.Columns[0].Render:=nil;
123+
if AGroup.Columns.Count>0 then
124+
AGroup.Columns[0].Render:=nil;
117125
end;
118126
end;
119127

128+
procedure TMasterDetail.CBEnabledChange(Sender: TObject);
129+
begin
130+
EnableDisableSubGrid(TeeGrid1.Grid.Current,GetOrders);
131+
end;
132+
120133
procedure TMasterDetail.DetailNewGroup(const Sender,NewGroup:TRowGroup);
121134
var tmpTot : TColumnTotals;
122135
begin
136+
EnableDisableSubGrid(NewGroup,GetOrderItems);
137+
123138
// Create a Totals band
124139
tmpTot:=TColumnTotals.Create(NewGroup.Footer); // <--- set to Footer
125140

@@ -149,4 +164,15 @@ procedure TMasterDetail.GetOrders(const Sender: TExpanderRender; const ARow:Inte
149164
TVirtualDBData(AData).OwnsData:=True;
150165
end;
151166

167+
// Called when a new sub-sub-grid has been created, to obtain the sub-sub-grid Data
168+
// The "Order Items" for the current "Order" for the current "Customer"
169+
procedure TMasterDetail.GetOrderItems(const Sender: TExpanderRender; const ARow:Integer; out AData:TObject);
170+
begin
171+
// Return a new Data using a clone of Order Items rows for a given Order of a given Customer
172+
AData:=TVirtualDBData.From(SampleData.OrderDetailsOfOrder(ARow+1));
173+
174+
// Data should be destroyed automatically
175+
TVirtualDBData(AData).OwnsData:=True;
176+
end;
177+
152178
end.

0 commit comments

Comments
 (0)