ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/examples/employee/unit1.pas
Revision: 143
Committed: Fri Feb 23 12:11:21 2018 UTC (6 years, 2 months ago) by tony
Content type: text/x-pascal
File size: 11983 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 Unit1;
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 EmployeesTEst: TStringField;
48 IBLookupComboEditBox1: TIBLookupComboEditBox;
49 IBLookupComboEditBox2: TIBLookupComboEditBox;
50 IBQuery1DEPT_NO: TIBStringField;
51 IBQuery1EMP_NO: TSmallintField;
52 IBQuery1FIRST_NAME: TIBStringField;
53 IBQuery1FULL_NAME: TIBStringField;
54 IBQuery1HIRE_DATE: TDateTimeField;
55 IBQuery1JOB_CODE: TIBStringField;
56 IBQuery1JOB_COUNTRY: TIBStringField;
57 IBQuery1JOB_GRADE: TSmallintField;
58 IBQuery1LAST_NAME: TIBStringField;
59 IBQuery1PHONE_EXT: TIBStringField;
60 IBQuery1SALARY: TIBBCDField;
61 SelectDept: TAction;
62 Button4: TButton;
63 Button5: TButton;
64 CancelChanges: TAction;
65 SalaryRange: TComboBox;
66 CountrySource: TDataSource;
67 BeforeDate: TDateEdit;
68 AfterDate: TDateEdit;
69 DeptsSource: TDataSource;
70 Depts: TIBQuery;
71 JobCodeSource: TDataSource;
72 DBEdit1: TDBEdit;
73 DBEdit2: TDBEdit;
74 DBEdit3: TDBEdit;
75 DBEdit4: TDBEdit;
76 DBEdit5: TDBEdit;
77 DBText1: TDBText;
78 Employees: TIBDataSet;
79 EmployeesDEPT_NO: TIBStringField;
80 EmployeesEMP_NO: TSmallintField;
81 EmployeesFIRST_NAME: TIBStringField;
82 EmployeesFULL_NAME: TIBStringField;
83 EmployeesHIRE_DATE: TDateTimeField;
84 EmployeesJOB_CODE: TIBStringField;
85 EmployeesJOB_COUNTRY: TIBStringField;
86 EmployeesJOB_GRADE: TSmallintField;
87 EmployeesLAST_NAME: TIBStringField;
88 EmployeesPHONE_EXT: TIBStringField;
89 EmployeesSALARY: TIBBCDField;
90 IBDateEdit1: TDBDateEdit;
91 IBDynamicGrid1: TIBDynamicGrid;
92 Countries: TIBQuery;
93 JobCodes: TIBQuery;
94 JobGradeDBComboBox: TDBComboBox;
95 Label10: TLabel;
96 Label11: TLabel;
97 Label12: TLabel;
98 Label13: TLabel;
99 Label3: TLabel;
100 Label4: TLabel;
101 Label5: TLabel;
102 Label6: TLabel;
103 Label7: TLabel;
104 Label8: TLabel;
105 Label9: TLabel;
106 Panel1: TPanel;
107 Panel2: TPanel;
108 EmployeeEditorPanel: TPanel;
109 SpeedButton1: TSpeedButton;
110 JobGradeChangeTimer: TTimer;
111 JobCodeChangeTimer: TTimer;
112 TotalsQueryTOTALSALARIES: TIBBCDField;
113 TotalsSource: TDataSource;
114 TotalsQuery: TIBQuery;
115 Label1: TLabel;
116 Label2: TLabel;
117 SaveChanges: TAction;
118 DeleteEmployee: TAction;
119 EditEmployee: TAction;
120 AddEmployee: TAction;
121 ActionList1: TActionList;
122 Button1: TButton;
123 Button2: TButton;
124 Button3: TButton;
125 EmployeeSource: TDataSource;
126 IBDatabase1: TIBDatabase;
127 IBTransaction1: TIBTransaction;
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 CountriesBeforeOpen(DataSet: TDataSet);
137 procedure DeleteEmployeeExecute(Sender: TObject);
138 procedure EditEmployeeExecute(Sender: TObject);
139 procedure EditEmployeeUpdate(Sender: TObject);
140 procedure EmployeesAfterInsert(DataSet: TDataSet);
141 procedure EmployeesAfterOpen(DataSet: TDataSet);
142 procedure EmployeesAfterScroll(DataSet: TDataSet);
143 procedure EmployeesBeforeClose(DataSet: TDataSet);
144 procedure EmployeesBeforeOpen(DataSet: TDataSet);
145 procedure EmployeesJOB_CODEChange(Sender: TField);
146 procedure EmployeesJOB_GRADEChange(Sender: TField);
147 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
148 procedure FormShow(Sender: TObject);
149 procedure EmployeesAfterDelete(DataSet: TDataSet);
150 procedure EmployeesAfterTransactionEnd(Sender: TObject);
151 procedure EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
152 var DataAction: TDataAction);
153 procedure EmployeesSALARYGetText(Sender: TField; var aText: string;
154 DisplayText: Boolean);
155 procedure JobCodesBeforeOpen(DataSet: TDataSet);
156 procedure SaveChangesExecute(Sender: TObject);
157 procedure SaveChangesUpdate(Sender: TObject);
158 private
159 { private declarations }
160 FDirty: boolean;
161 FClosing: boolean;
162 procedure Reopen(Data: PtrInt);
163 public
164 { public declarations }
165 end;
166
167 var
168 Form1: TForm1;
169
170 implementation
171
172 {$R *.lfm}
173
174 uses IB, Unit2;
175
176 const
177 sNoName = '<no name>';
178
179 function ExtractDBException(msg: string): string;
180 var Lines: TStringList;
181 begin
182 Lines := TStringList.Create;
183 try
184 Lines.Text := msg;
185 if pos('exception',Lines[0]) = 1 then
186 Result := Lines[2]
187 else
188 Result := msg
189 finally
190 Lines.Free
191 end;
192 end;
193
194 { TForm1 }
195
196 procedure TForm1.EmployeesSALARYGetText(Sender: TField; var aText: string;
197 DisplayText: Boolean);
198 begin
199 if DisplayText then
200 begin
201 if Sender.IsNUll then
202 aText := ''
203 else
204 aText := FormatFloat('$#,##0.00',Sender.AsFloat)
205 end
206 else
207 aText := Sender.AsString
208 end;
209
210 procedure TForm1.JobCodesBeforeOpen(DataSet: TDataSet);
211 begin
212 JobCodes.ParamByName('JOB_GRADE').AsInteger := EmployeesJOB_GRADE.AsInteger;
213 JobCodes.ParamByName('JOB_COUNTRY').AsString := EmployeesJOB_COUNTRY.AsString
214 end;
215
216 procedure TForm1.SaveChangesExecute(Sender: TObject);
217 begin
218 Employees.Transaction.Commit
219 end;
220
221 procedure TForm1.SaveChangesUpdate(Sender: TObject);
222 begin
223 (Sender as TAction).Enabled := FDirty
224 end;
225
226 procedure TForm1.Reopen(Data: PtrInt);
227 begin
228 with IBTransaction1 do
229 if not InTransaction then StartTransaction;
230 Countries.Active := true;
231 Employees.Active := true;
232 JobCodes.Active := true;
233 Depts.Active := true;
234 end;
235
236 procedure TForm1.AddEmployeeExecute(Sender: TObject);
237 begin
238 Employees.Append
239 end;
240
241 procedure TForm1.SelectDeptExecute(Sender: TObject);
242 var Dept_No: string;
243 begin
244 if SelectDeptDlg.ShowModal(EmployeesDEPT_KEY_PATH.AsString,Dept_No) = mrOK then
245 begin
246 Employees.Edit;
247 EmployeesDEPT_NO.AsString := Dept_No;
248 try
249 Employees.Post;
250 except
251 Employees.Cancel;
252 raise;
253 end;
254 IBDynamicGrid1.ShowEditorPanel;
255 end;
256 end;
257
258 procedure TForm1.EmployeesValidatePost(Sender: TObject; var CancelPost: boolean
259 );
260 begin
261 {Cancel if no name entered}
262 CancelPost := (EmployeesLAST_NAME.AsString = sNoName) and (EmployeesFIRST_NAME.AsString = sNoName);
263 end;
264
265 procedure TForm1.JobCodeChangeTimerTimer(Sender: TObject);
266 begin
267 Countries.Active := false;
268 Countries.Active := true;
269 JobCodeChangeTimer.Interval := 0;
270 end;
271
272 procedure TForm1.JobGradeChangeTimerTimer(Sender: TObject);
273 begin
274 Countries.Active := false;
275 JobCodes.Active := false;
276 Countries.Active := true;
277 JobCodes.Active := true;
278 JobGradeChangeTimer.Interval := 0;
279 end;
280
281 procedure TForm1.JobGradeDBComboBoxCloseUp(Sender: TObject);
282 begin
283 JobGradeDBComboBox.EditingDone; //See http://bugs.freepascal.org/view.php?id=27186
284 end;
285
286 procedure TForm1.BeforeDateChange(Sender: TObject);
287 begin
288 Employees.Active := false;
289 Employees.Active := true
290 end;
291
292 procedure TForm1.CancelChangesExecute(Sender: TObject);
293 begin
294 Employees.Transaction.Rollback
295 end;
296
297 procedure TForm1.CountriesBeforeOpen(DataSet: TDataSet);
298 begin
299 Countries.ParamByName('JOB_GRADE').AsInteger := EmployeesJOB_GRADE.AsInteger;
300 Countries.ParamByName('JOB_CODE').AsString := EmployeesJOB_CODE.AsString
301 end;
302
303 procedure TForm1.DeleteEmployeeExecute(Sender: TObject);
304 begin
305 if MessageDlg(
306 Format('Remove %s from Employee List?',[Employees.FieldByName('Full_Name').AsString]),
307 mtConfirmation,[mbYes,mbNo],0) = mrYes then
308 Employees.Delete
309 end;
310
311 procedure TForm1.EditEmployeeExecute(Sender: TObject);
312 begin
313 IBDynamicGrid1.ShowEditorPanel;
314 end;
315
316 procedure TForm1.EditEmployeeUpdate(Sender: TObject);
317 begin
318 (Sender as TAction).Enabled := Employees.Active and (Employees.RecordCount > 0)
319 end;
320
321 procedure TForm1.EmployeesAfterInsert(DataSet: TDataSet);
322 begin
323 EmployeesJOB_COUNTRY.AsString := 'USA';
324 EmployeesJOB_CODE.AsString := 'SRep';
325 EmployeesJOB_GRADE.AsInteger := 4;
326 EmployeesSALARY.AsCurrency := 20000;
327 EmployeesFIRST_NAME.AsString := sNoName;
328 EmployeesLAST_NAME.AsString := sNoName;
329 EmployeesHIRE_DATE.AsDateTime := now;
330 EmployeesDEPT_NO.AsString := '000';
331 FDirty := true;
332 end;
333
334 procedure TForm1.EmployeesAfterOpen(DataSet: TDataSet);
335 begin
336 TotalsQuery.Active := true;
337 IBDynamicGrid1.SetFocus;
338 end;
339
340 procedure TForm1.EmployeesAfterScroll(DataSet: TDataSet);
341 begin
342 JobGradeChangeTimer.Interval := 200;
343 end;
344
345 procedure TForm1.EmployeesBeforeClose(DataSet: TDataSet);
346 begin
347 TotalsQuery.Active := false
348 end;
349
350 procedure TForm1.EmployeesBeforeOpen(DataSet: TDataSet);
351 begin
352 if BeforeDate.Date > 0 then
353 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE < :BeforeDate');
354 if AfterDate.Date > 0 then
355 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE > :AfterDate');
356
357 case SalaryRange.ItemIndex of
358 1:
359 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary < 40000');
360 2:
361 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 40000 and Salary < 100000');
362 3:
363 (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 100000');
364 end;
365
366
367
368 {Parameter value must be set after all SQL changes have been made}
369 if BeforeDate.Date > 0 then
370 (DataSet as TIBParserDataSet).ParamByName('BeforeDate').AsDateTime := BeforeDate.Date;
371 if AfterDate.Date > 0 then
372 (DataSet as TIBParserDataSet).ParamByName('AfterDate').AsDateTime := AfterDate.Date;
373
374 end;
375
376 procedure TForm1.EmployeesJOB_CODEChange(Sender: TField);
377 begin
378 JobCodeChangeTimer.Interval := 200;
379 end;
380
381 procedure TForm1.EmployeesJOB_GRADEChange(Sender: TField);
382 begin
383 JobGradeChangeTimer.Interval := 200;
384 end;
385
386 procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
387 begin
388 FClosing := true;
389 if IBTransaction1.InTransaction then
390 IBTransaction1.Commit;
391 end;
392
393 procedure TForm1.FormShow(Sender: TObject);
394 begin
395 repeat
396 try
397 IBDatabase1.Connected := true;
398 except
399 on E:EIBClientError do
400 begin
401 Close;
402 Exit
403 end;
404 On E:Exception do
405 MessageDlg(E.Message,mtError,[mbOK],0);
406 end;
407 until IBDatabase1.Connected;
408 Reopen(0);
409 end;
410
411 procedure TForm1.EmployeesAfterDelete(DataSet: TDataSet);
412 begin
413 FDirty := true
414 end;
415
416 procedure TForm1.EmployeesAfterTransactionEnd(Sender: TObject);
417 begin
418 FDirty := false;
419 if not FClosing then
420 Application.QueueAsyncCall(@Reopen,0)
421 end;
422
423 procedure TForm1.EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
424 var DataAction: TDataAction);
425 begin
426 if E is EIBError then
427 begin
428 MessageDlg(ExtractDBException(EIBError(E).message),mtError,[mbOK],0);
429 DataSet.Cancel;
430 DataAction := daAbort
431 end;
432 end;
433
434 end.
435