ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/examples/isqlmonitor/MainForm.pas
Revision: 209
Committed: Wed Mar 14 12:48:51 2018 UTC (6 years, 1 month ago) by tony
Content type: text/x-pascal
File size: 11668 byte(s)
Log Message:
Fixes Merged

File Contents

# Content
1 (*
2 * IBX For Lazarus (Firebird Express)
3 *
4 * The contents of this file are subject to the Initial Developer's
5 * Public License Version 1.0 (the "License"); you may not use this
6 * file except in compliance with the License. You may obtain a copy
7 * of the License here:
8 *
9 * http://www.firebirdsql.org/index.php?op=doc&id=idpl
10 *
11 * Software distributed under the License is distributed on an "AS
12 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
13 * implied. See the License for the specific language governing rights
14 * and limitations under the License.
15 *
16 * The Initial Developer of the Original Code is Tony Whyman.
17 *
18 * The Original Code is (C) 2015 Tony Whyman, MWA Software
19 * (http://www.mwasoftware.co.uk).
20 *
21 * All Rights Reserved.
22 *
23 * Contributor(s): ______________________________________.
24 *
25 *)
26
27 unit MainForm;
28
29 {$mode objfpc}{$H+}
30
31 interface
32
33 uses
34 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, DBGrids,
35 StdCtrls, ActnList, EditBtn, DbCtrls, ExtCtrls, Buttons, IBDatabase, IBQuery,
36 IBCustomDataSet, IBUpdateSQL, IBDynamicGrid, IBLookupComboEditBox,
37 db, DBExtCtrls;
38
39 type
40
41 { TForm1 }
42
43 TForm1 = class(TForm)
44 DBEdit6: TDBEdit;
45 EmployeesDEPT_KEY_PATH: TIBStringField;
46 EmployeesDEPT_PATH: TIBStringField;
47 IBLookupComboEditBox1: TIBLookupComboEditBox;
48 IBLookupComboEditBox2: TIBLookupComboEditBox;
49 IBQuery1DEPT_NO: TIBStringField;
50 IBQuery1EMP_NO: TSmallintField;
51 IBQuery1FIRST_NAME: TIBStringField;
52 IBQuery1FULL_NAME: TIBStringField;
53 IBQuery1HIRE_DATE: TDateTimeField;
54 IBQuery1JOB_CODE: TIBStringField;
55 IBQuery1JOB_COUNTRY: TIBStringField;
56 IBQuery1JOB_GRADE: TSmallintField;
57 IBQuery1LAST_NAME: TIBStringField;
58 IBQuery1PHONE_EXT: TIBStringField;
59 IBQuery1SALARY: TIBBCDField;
60 SelectDept: TAction;
61 Button4: TButton;
62 Button5: TButton;
63 CancelChanges: TAction;
64 SalaryRange: TComboBox;
65 CountrySource: TDataSource;
66 BeforeDate: TDateEdit;
67 AfterDate: TDateEdit;
68 DeptsSource: TDataSource;
69 Depts: TIBQuery;
70 JobCodeSource: TDataSource;
71 DBEdit1: TDBEdit;
72 DBEdit2: TDBEdit;
73 DBEdit3: TDBEdit;
74 DBEdit4: TDBEdit;
75 DBEdit5: TDBEdit;
76 DBText1: TDBText;
77 Employees: TIBDataSet;
78 EmployeesDEPT_NO: TIBStringField;
79 EmployeesEMP_NO: TSmallintField;
80 EmployeesFIRST_NAME: TIBStringField;
81 EmployeesFULL_NAME: TIBStringField;
82 EmployeesHIRE_DATE: TDateTimeField;
83 EmployeesJOB_CODE: TIBStringField;
84 EmployeesJOB_COUNTRY: TIBStringField;
85 EmployeesJOB_GRADE: TSmallintField;
86 EmployeesLAST_NAME: TIBStringField;
87 EmployeesPHONE_EXT: TIBStringField;
88 EmployeesSALARY: TIBBCDField;
89 IBDateEdit1: TDBDateEdit;
90 IBDynamicGrid1: TIBDynamicGrid;
91 Countries: TIBQuery;
92 JobCodes: TIBQuery;
93 JobGradeDBComboBox: TDBComboBox;
94 Label10: TLabel;
95 Label11: TLabel;
96 Label12: TLabel;
97 Label13: TLabel;
98 Label3: TLabel;
99 Label4: TLabel;
100 Label5: TLabel;
101 Label6: TLabel;
102 Label7: TLabel;
103 Label8: TLabel;
104 Label9: TLabel;
105 Panel1: TPanel;
106 Panel2: TPanel;
107 EmployeeEditorPanel: TPanel;
108 SpeedButton1: TSpeedButton;
109 JobGradeChangeTimer: TTimer;
110 JobCodeChangeTimer: TTimer;
111 TotalsQueryTOTALSALARIES: TIBBCDField;
112 TotalsSource: TDataSource;
113 TotalsQuery: TIBQuery;
114 Label1: TLabel;
115 Label2: TLabel;
116 SaveChanges: TAction;
117 DeleteEmployee: TAction;
118 EditEmployee: TAction;
119 AddEmployee: TAction;
120 ActionList1: TActionList;
121 Button1: TButton;
122 Button2: TButton;
123 Button3: TButton;
124 EmployeeSource: TDataSource;
125 IBDatabase1: TIBDatabase;
126 IBTransaction1: TIBTransaction;
127 procedure EmployeesAfterPost(DataSet: TDataSet);
128 procedure EmployeesValidatePost(Sender: TObject; var CancelPost: boolean);
129 procedure JobCodeChangeTimerTimer(Sender: TObject);
130 procedure JobGradeChangeTimerTimer(Sender: TObject);
131 procedure JobGradeDBComboBoxCloseUp(Sender: TObject);
132 procedure SelectDeptExecute(Sender: TObject);
133 procedure AddEmployeeExecute(Sender: TObject);
134 procedure BeforeDateChange(Sender: TObject);
135 procedure CancelChangesExecute(Sender: TObject);
136 procedure DeleteEmployeeExecute(Sender: TObject);
137 procedure EditEmployeeExecute(Sender: TObject);
138 procedure EditEmployeeUpdate(Sender: TObject);
139 procedure EmployeesAfterInsert(DataSet: TDataSet);
140 procedure EmployeesAfterOpen(DataSet: TDataSet);
141 procedure EmployeesBeforeClose(DataSet: TDataSet);
142 procedure EmployeesBeforeOpen(DataSet: TDataSet);
143 procedure EmployeesJOB_CODEChange(Sender: TField);
144 procedure EmployeesJOB_GRADEChange(Sender: TField);
145 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
146 procedure FormShow(Sender: TObject);
147 procedure EmployeesAfterDelete(DataSet: TDataSet);
148 procedure EmployeesAfterTransactionEnd(Sender: TObject);
149 procedure EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
150 var DataAction: TDataAction);
151 procedure EmployeesSALARYGetText(Sender: TField; var aText: string;
152 DisplayText: Boolean);
153 procedure SaveChangesExecute(Sender: TObject);
154 procedure SaveChangesUpdate(Sender: TObject);
155 private
156 { private declarations }
157 FDirty: boolean;
158 FClosing: boolean;
159 procedure Reopen(Data: PtrInt);
160 procedure DoOpenDatabase(Data: PtrInt);
161 public
162 { public declarations }
163 end;
164
165 var
166 Form1: TForm1;
167
168 implementation
169
170 {$R *.lfm}
171
172 uses IB, SelectDeptDlgUnit,MonitorFormUnit;
173
174 const
175 sNoName = '<no name>';
176
177 function ExtractDBException(msg: string): string;
178 var Lines: TStringList;
179 begin
180 Lines := TStringList.Create;
181 try
182 Lines.Text := msg;
183 if pos('exception',Lines[0]) = 1 then
184 Result := Lines[2]
185 else
186 Result := msg
187 finally
188 Lines.Free
189 end;
190 end;
191
192 { TForm1 }
193
194 procedure TForm1.EmployeesSALARYGetText(Sender: TField; var aText: string;
195 DisplayText: Boolean);
196 begin
197 if DisplayText then
198 begin
199 if Sender.IsNUll then
200 aText := ''
201 else
202 aText := FormatFloat('$#,##0.00',Sender.AsFloat)
203 end
204 else
205 aText := Sender.AsString
206 end;
207
208 procedure TForm1.SaveChangesExecute(Sender: TObject);
209 begin
210 Employees.Transaction.Commit
211 end;
212
213 procedure TForm1.SaveChangesUpdate(Sender: TObject);
214 begin
215 (Sender as TAction).Enabled := FDirty
216 end;
217
218 procedure TForm1.Reopen(Data: PtrInt);
219 begin
220 with IBTransaction1 do
221 if not InTransaction then StartTransaction;
222 Depts.Active := true;
223 Employees.Active := true;
224 end;
225
226 procedure TForm1.DoOpenDatabase(Data: PtrInt);
227 begin
228 repeat
229 try
230 IBDatabase1.Connected := true;
231 except
232 on E:EIBClientError do
233 begin
234 Close;
235 Exit
236 end;
237 On E:Exception do
238 MessageDlg(E.Message,mtError,[mbOK],0);
239 end;
240 until IBDatabase1.Connected;
241 Reopen(0);
242 MonitorForm.BringToFront;
243 end;
244
245 procedure TForm1.AddEmployeeExecute(Sender: TObject);
246 begin
247 Employees.Append
248 end;
249
250 procedure TForm1.SelectDeptExecute(Sender: TObject);
251 var Dept_No: string;
252 begin
253 if SelectDeptDlg.ShowModal(EmployeesDEPT_KEY_PATH.AsString,Dept_No) = mrOK then
254 begin
255 Employees.Edit;
256 EmployeesDEPT_NO.AsString := Dept_No;
257 try
258 Employees.Post;
259 except
260 Employees.Cancel;
261 raise;
262 end;
263 IBDynamicGrid1.ShowEditorPanel;
264 end;
265 end;
266
267 procedure TForm1.EmployeesAfterPost(DataSet: TDataSet);
268 begin
269 Employees.Refresh
270 end;
271
272 procedure TForm1.EmployeesValidatePost(Sender: TObject; var CancelPost: boolean
273 );
274 begin
275 {Cancel if no name entered}
276 CancelPost := (EmployeesLAST_NAME.AsString = sNoName) and (EmployeesFIRST_NAME.AsString = sNoName);
277 end;
278
279 procedure TForm1.JobCodeChangeTimerTimer(Sender: TObject);
280 begin
281 Countries.Active := false;
282 Countries.Active := true;
283 JobCodeChangeTimer.Interval := 0;
284 end;
285
286 procedure TForm1.JobGradeChangeTimerTimer(Sender: TObject);
287 begin
288 Countries.Active := false;
289 JobCodes.Active := false;
290 Countries.Active := true;
291 JobCodes.Active := true;
292 JobGradeChangeTimer.Interval := 0;
293 end;
294
295 procedure TForm1.JobGradeDBComboBoxCloseUp(Sender: TObject);
296 begin
297 JobGradeDBComboBox.EditingDone; //See http://bugs.freepascal.org/view.php?id=27186
298 end;
299
300 procedure TForm1.BeforeDateChange(Sender: TObject);
301 begin
302 Employees.Active := false;
303 Employees.Active := true
304 end;
305
306 procedure TForm1.CancelChangesExecute(Sender: TObject);
307 begin
308 Employees.Transaction.Rollback
309 end;
310
311 procedure TForm1.DeleteEmployeeExecute(Sender: TObject);
312 begin
313 if MessageDlg(
314 Format('Remove %s from Employee List?',[Employees.FieldByName('Full_Name').AsString]),
315 mtConfirmation,[mbYes,mbNo],0) = mrYes then
316 Employees.Delete
317 end;
318
319 procedure TForm1.EditEmployeeExecute(Sender: TObject);
320 begin
321 IBDynamicGrid1.ShowEditorPanel;
322 end;
323
324 procedure TForm1.EditEmployeeUpdate(Sender: TObject);
325 begin
326 (Sender as TAction).Enabled := Employees.Active and (Employees.RecordCount > 0)
327 end;
328
329 procedure TForm1.EmployeesAfterInsert(DataSet: TDataSet);
330 begin
331 EmployeesJOB_COUNTRY.AsString := 'USA';
332 EmployeesJOB_CODE.AsString := 'SRep';
333 EmployeesJOB_GRADE.AsInteger := 4;
334 EmployeesSALARY.AsCurrency := 20000;
335 EmployeesFIRST_NAME.AsString := sNoName;
336 EmployeesLAST_NAME.AsString := sNoName;
337 EmployeesHIRE_DATE.AsDateTime := now;
338 EmployeesDEPT_NO.AsString := '000';
339 FDirty := true;
340 end;
341
342 procedure TForm1.EmployeesAfterOpen(DataSet: TDataSet);
343 begin
344 TotalsQuery.Active := true;
345 Countries.Active := true;
346 JobCodes.Active := true;
347 IBDynamicGrid1.SetFocus;
348 end;
349
350 procedure TForm1.EmployeesBeforeClose(DataSet: TDataSet);
351 begin
352 TotalsQuery.Active := false;
353 Countries.Active := false;
354 JobCodes.Active := false;
355 end;
356
357 procedure TForm1.EmployeesBeforeOpen(DataSet: TDataSet);
358 begin
359 if BeforeDate.Date > 0 then
360 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE < :BeforeDate');
361 if AfterDate.Date > 0 then
362 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE > :AfterDate');
363
364 case SalaryRange.ItemIndex of
365 1:
366 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary < 40000');
367 2:
368 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 40000 and Salary < 100000');
369 3:
370 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 100000');
371 end;
372
373
374
375 {Parameter value must be set after all SQL changes have been made}
376 if BeforeDate.Date > 0 then
377 (DataSet as TIBParserDataSet).ParamByName('BeforeDate').AsDateTime := BeforeDate.Date;
378 if AfterDate.Date > 0 then
379 (DataSet as TIBParserDataSet).ParamByName('AfterDate').AsDateTime := AfterDate.Date;
380
381 end;
382
383 procedure TForm1.EmployeesJOB_CODEChange(Sender: TField);
384 begin
385 JobCodeChangeTimer.Interval := 200;
386 end;
387
388 procedure TForm1.EmployeesJOB_GRADEChange(Sender: TField);
389 begin
390 JobGradeChangeTimer.Interval := 200;
391 end;
392
393 procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
394 begin
395 FClosing := true;
396 if IBTransaction1.InTransaction then
397 IBTransaction1.Commit;
398 end;
399
400 procedure TForm1.FormShow(Sender: TObject);
401 begin
402 MonitorForm.Visible := true;
403 Application.QueueAsyncCall(@DoOpenDatabase,0);
404 end;
405
406 procedure TForm1.EmployeesAfterDelete(DataSet: TDataSet);
407 begin
408 FDirty := true
409 end;
410
411 procedure TForm1.EmployeesAfterTransactionEnd(Sender: TObject);
412 begin
413 FDirty := false;
414 if not FClosing then
415 Application.QueueAsyncCall(@Reopen,0)
416 end;
417
418 procedure TForm1.EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
419 var DataAction: TDataAction);
420 begin
421 if E is EIBError then
422 begin
423 MessageDlg(ExtractDBException(EIBError(E).message),mtError,[mbOK],0);
424 DataSet.Cancel;
425 DataAction := daAbort
426 end;
427 end;
428
429 end.
430