-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathOrdersDM.pas
138 lines (117 loc) · 3.5 KB
/
OrdersDM.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
unit OrdersDM;
interface
uses
SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
FireDAC.Stan.Async, FireDAC.DApt, System.ImageList, Vcl.ImgList, uniImageList,
uniGUIBaseClasses, uniGUIClasses, System.Actions, Vcl.ActnList, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client;
type
TdmOrders = class(TDataModule)
dsOrders: TDataSource;
dsItems: TDataSource;
tblCustomers: TFDTable;
tblCustomersID: TIntegerField;
tblCustomersUserName: TStringField;
tblProducts: TFDTable;
tblProductsID: TIntegerField;
tblProductsDescription: TStringField;
tblProductsPrice: TCurrencyField;
tblOrders: TFDTable;
tblOrdersID: TIntegerField;
tblOrdersCustomerID: TIntegerField;
tblOrdersCustomer: TStringField;
tblOrdersPosted: TDateTimeField;
tblOrdersTotal: TCurrencyField;
tblOrdersPaid: TDateTimeField;
tblItems: TFDTable;
tblItemsOrderID: TIntegerField;
tblItemsProductID: TIntegerField;
tblItemsProduct: TStringField;
tblItemsQuantity: TIntegerField;
tblItemsPrice: TCurrencyField;
tblItemsTotal: TCurrencyField;
dsCustomers: TDataSource;
dsProducts: TDataSource;
ActionList1: TActionList;
actMarkAsPaid: TAction;
procedure tblOrdersCalcFields(DataSet: TDataSet);
procedure tblItemsCalcFields(DataSet: TDataSet);
procedure tblItemsAfterPost(DataSet: TDataSet);
procedure actMarkAsPaidExecute(Sender: TObject);
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function dmOrders: TdmOrders;
implementation
{$R *.dfm}
uses
Variants,
UniGUIVars, uniGUIMainModule, MainModule;
function dmOrders: TdmOrders;
begin
Result := TdmOrders(UniMainModule.GetModuleInstance(TdmOrders));
end;
procedure TdmOrders.actMarkAsPaidExecute(Sender: TObject);
begin
if tblOrders.State = dsBrowse then
tblOrders.Edit;
tblOrdersPaid.Value := Now;
tblOrders.Post;
end;
procedure TdmOrders.DataModuleCreate(Sender: TObject);
begin
tblCustomers.Open;
tblProducts.Open;
tblOrders.Open;
tblItems.Open;
end;
procedure TdmOrders.DataModuleDestroy(Sender: TObject);
begin
tblItems.Close;
tblOrders.Close;
tblProducts.Close;
tblCustomers.Close;
end;
procedure TdmOrders.tblItemsAfterPost(DataSet: TDataSet);
begin
// After posting a change in items, force a recalculation of the order
tblOrders.Edit;
tblOrdersCalcFields(tblOrders);
tblOrders.Post;
end;
procedure TdmOrders.tblItemsCalcFields(DataSet: TDataSet);
begin
if tblItems.Connection.Connected and not tblItemsQuantity.IsNull and not tblItemsPrice.IsNull then
tblItemsTotal.Value := tblItemsQuantity.Value * tblItemsPrice.Value;
end;
procedure TdmOrders.tblOrdersCalcFields(DataSet: TDataSet);
var
t : Variant;
begin
t :=
tblOrders.Connection.ExecSQLScalar
(
Format
(
'SELECT' +
' sum(i.Quantity * p.Price) ' +
'FROM' +
' Orders o' +
' INNER JOIN Items i ON o.ID = i.OrderID' +
' INNER JOIN Products p ON i.ProductID = p.ID ' +
'WHERE o.ID = %d',
[tblOrdersID.Value]
)
);
if VarIsNull(t) then
t := 0;
tblOrdersTotal.Value := t;
end;
initialization
RegisterModuleClass(TdmOrders);
end.