ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/examples/local-employeedb/unit1.pas
Revision: 37
Committed: Mon Feb 15 14:44:25 2016 UTC (8 years, 2 months ago) by tony
Content type: text/x-pascal
File size: 14592 byte(s)
Log Message:
Committing updates for Release R1-4-0

File Contents

# User Rev Content
1 tony 37 unit Unit1;
2    
3     {$mode objfpc}{$H+}
4    
5     interface
6    
7     uses
8     Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, DBGrids,
9     StdCtrls, ActnList, EditBtn, DbCtrls, ExtCtrls, Buttons, IBDatabase, IBQuery,
10     IBCustomDataSet, IBSQL, IBDynamicGrid, IBLookupComboEditBox,
11     IBLocalDBSupport, db, DBExtCtrls, Menus;
12    
13     const
14     RequiredVersionNo = 2;
15    
16     type
17    
18     { TForm1 }
19    
20     TForm1 = class(TForm)
21     CheckVersionTablePresent: TIBSQL;
22     DBImage1: TDBImage;
23     EmployeesPHOTO1: TBlobField;
24     GetDBVersionNoQuery: TIBSQL;
25     MenuItem6: TMenuItem;
26     MenuItem7: TMenuItem;
27     Panel3: TPanel;
28     Quit: TAction;
29     MainMenu1: TMainMenu;
30     MenuItem1: TMenuItem;
31     MenuItem2: TMenuItem;
32     MenuItem3: TMenuItem;
33     MenuItem4: TMenuItem;
34     MenuItem5: TMenuItem;
35     RestoreDatabase: TAction;
36     SaveDatabase: TAction;
37     NewDatabase: TAction;
38     DBEdit6: TDBEdit;
39     EmployeesDEPT_KEY_PATH: TIBStringField;
40     EmployeesDEPT_PATH: TIBStringField;
41     IBLocalDBSupport1: TIBLocalDBSupport;
42     IBLookupComboEditBox1: TIBLookupComboEditBox;
43     IBLookupComboEditBox2: TIBLookupComboEditBox;
44     IBQuery1DEPT_NO: TIBStringField;
45     IBQuery1EMP_NO: TSmallintField;
46     IBQuery1FIRST_NAME: TIBStringField;
47     IBQuery1FULL_NAME: TIBStringField;
48     IBQuery1HIRE_DATE: TDateTimeField;
49     IBQuery1JOB_CODE: TIBStringField;
50     IBQuery1JOB_COUNTRY: TIBStringField;
51     IBQuery1JOB_GRADE: TSmallintField;
52     IBQuery1LAST_NAME: TIBStringField;
53     IBQuery1PHONE_EXT: TIBStringField;
54     IBQuery1SALARY: TIBBCDField;
55     SelectDept: TAction;
56     Button4: TButton;
57     Button5: TButton;
58     CancelChanges: TAction;
59     SalaryRange: TComboBox;
60     CountrySource: TDataSource;
61     BeforeDate: TDateEdit;
62     AfterDate: TDateEdit;
63     DeptsSource: TDataSource;
64     Depts: TIBQuery;
65     JobCodeSource: TDataSource;
66     DBEdit1: TDBEdit;
67     DBEdit2: TDBEdit;
68     DBEdit3: TDBEdit;
69     DBEdit4: TDBEdit;
70     DBEdit5: TDBEdit;
71     DBText1: TDBText;
72     Employees: TIBDataSet;
73     EmployeesDEPT_NO: TIBStringField;
74     EmployeesEMP_NO: TSmallintField;
75     EmployeesFIRST_NAME: TIBStringField;
76     EmployeesFULL_NAME: TIBStringField;
77     EmployeesHIRE_DATE: TDateTimeField;
78     EmployeesJOB_CODE: TIBStringField;
79     EmployeesJOB_COUNTRY: TIBStringField;
80     EmployeesJOB_GRADE: TSmallintField;
81     EmployeesLAST_NAME: TIBStringField;
82     EmployeesPHONE_EXT: TIBStringField;
83     EmployeesSALARY: TIBBCDField;
84     IBDateEdit1: TDBDateEdit;
85     IBDynamicGrid1: TIBDynamicGrid;
86     Countries: TIBQuery;
87     JobCodes: TIBQuery;
88     JobGradeDBComboBox: TDBComboBox;
89     Label10: TLabel;
90     Label11: TLabel;
91     Label12: TLabel;
92     Label13: TLabel;
93     Label3: TLabel;
94     Label4: TLabel;
95     Label5: TLabel;
96     Label6: TLabel;
97     Label7: TLabel;
98     Label8: TLabel;
99     Label9: TLabel;
100     Panel1: TPanel;
101     Panel2: TPanel;
102     EmployeeEditorPanel: TPanel;
103     SpeedButton1: TSpeedButton;
104     JobGradeChangeTimer: TTimer;
105     JobCodeChangeTimer: TTimer;
106     TotalsQueryTOTALSALARIES: TIBBCDField;
107     TotalsSource: TDataSource;
108     TotalsQuery: TIBQuery;
109     Label1: TLabel;
110     Label2: TLabel;
111     SaveChanges: TAction;
112     DeleteEmployee: TAction;
113     EditEmployee: TAction;
114     AddEmployee: TAction;
115     ActionList1: TActionList;
116     Button1: TButton;
117     Button2: TButton;
118     Button3: TButton;
119     EmployeeSource: TDataSource;
120     IBDatabase1: TIBDatabase;
121     IBTransaction1: TIBTransaction;
122     procedure DBImage1DBImageRead(Sender: TObject; S: TStream;
123     var GraphExt: string);
124     procedure EmployeesAfterPost(DataSet: TDataSet);
125     procedure EmployeesValidatePost(Sender: TObject; var CancelPost: boolean);
126     procedure IBDatabase1AfterConnect(Sender: TObject);
127     procedure IBLocalDBSupport1GetDBVersionNo(Sender: TObject;
128     var VersionNo: integer);
129     procedure JobCodeChangeTimerTimer(Sender: TObject);
130     procedure JobGradeChangeTimerTimer(Sender: TObject);
131     procedure JobGradeDBComboBoxCloseUp(Sender: TObject);
132     procedure NewDatabaseExecute(Sender: TObject);
133     procedure QuitExecute(Sender: TObject);
134     procedure RestoreDatabaseExecute(Sender: TObject);
135     procedure SaveDatabaseExecute(Sender: TObject);
136     procedure SelectDeptExecute(Sender: TObject);
137     procedure AddEmployeeExecute(Sender: TObject);
138     procedure BeforeDateChange(Sender: TObject);
139     procedure CancelChangesExecute(Sender: TObject);
140     procedure CountriesBeforeOpen(DataSet: TDataSet);
141     procedure DeleteEmployeeExecute(Sender: TObject);
142     procedure EditEmployeeExecute(Sender: TObject);
143     procedure EditEmployeeUpdate(Sender: TObject);
144     procedure EmployeesAfterInsert(DataSet: TDataSet);
145     procedure EmployeesAfterOpen(DataSet: TDataSet);
146     procedure EmployeesAfterScroll(DataSet: TDataSet);
147     procedure EmployeesBeforeClose(DataSet: TDataSet);
148     procedure EmployeesBeforeOpen(DataSet: TDataSet);
149     procedure EmployeesJOB_CODEChange(Sender: TField);
150     procedure EmployeesJOB_GRADEChange(Sender: TField);
151     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
152     procedure FormShow(Sender: TObject);
153     procedure EmployeesAfterDelete(DataSet: TDataSet);
154     procedure EmployeesAfterTransactionEnd(Sender: TObject);
155     procedure EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
156     var DataAction: TDataAction);
157     procedure EmployeesSALARYGetText(Sender: TField; var aText: string;
158     DisplayText: Boolean);
159     procedure JobCodesBeforeOpen(DataSet: TDataSet);
160     procedure SaveChangesExecute(Sender: TObject);
161     procedure SaveChangesUpdate(Sender: TObject);
162     private
163     FCurrentDBVersion: integer;
164     { private declarations }
165     FDirty: boolean;
166     FNoAutoReopen: boolean;
167     procedure Reopen(Data: PtrInt);
168     function GetDBVersionNo: integer;
169     public
170     { public declarations }
171     property CurrentDBVersion: integer read FCurrentDBVersion;
172     end;
173    
174     var
175     Form1: TForm1;
176    
177     implementation
178    
179     {$R *.lfm}
180    
181     uses IB, Unit2;
182    
183     const
184     sNoName = '<no name>';
185    
186     function ExtractDBException(msg: string): string;
187     var Lines: TStringList;
188     begin
189     Lines := TStringList.Create;
190     try
191     Lines.Text := msg;
192     if pos('exception',Lines[0]) = 1 then
193     Result := Lines[2]
194     else
195     Result := msg
196     finally
197     Lines.Free
198     end;
199     end;
200    
201     { TForm1 }
202    
203     procedure TForm1.EmployeesSALARYGetText(Sender: TField; var aText: string;
204     DisplayText: Boolean);
205     begin
206     if DisplayText then
207     begin
208     if Sender.IsNUll then
209     aText := ''
210     else
211     aText := FormatFloat('$#,##0.00',Sender.AsFloat)
212     end
213     else
214     aText := Sender.AsString
215     end;
216    
217     procedure TForm1.JobCodesBeforeOpen(DataSet: TDataSet);
218     begin
219     JobCodes.ParamByName('JOB_GRADE').AsInteger := EmployeesJOB_GRADE.AsInteger;
220     JobCodes.ParamByName('JOB_COUNTRY').AsString := EmployeesJOB_COUNTRY.AsString
221     end;
222    
223     procedure TForm1.SaveChangesExecute(Sender: TObject);
224     begin
225     Employees.Transaction.Commit
226     end;
227    
228     procedure TForm1.SaveChangesUpdate(Sender: TObject);
229     begin
230     (Sender as TAction).Enabled := FDirty
231     end;
232    
233     procedure TForm1.Reopen(Data: PtrInt);
234     begin
235     with IBTransaction1 do
236     if not InTransaction then StartTransaction;
237     Countries.Active := true;
238     Employees.Active := true;
239     JobCodes.Active := true;
240     Depts.Active := true;
241     end;
242    
243     function TForm1.GetDBVersionNo: integer;
244     begin
245     FCurrentDBVersion := 0;
246     Result := 0;
247     FNoAutoReopen := true;
248     try
249     with IBTransaction1 do
250     if not InTransaction then StartTransaction;
251     try
252     with CheckVersionTablePresent do
253     begin
254     ExecQuery;
255     try
256     if EOF then Exit;
257     finally
258     Close;
259     end;
260     end;
261    
262     with GetDBVersionNoQuery do
263     begin
264     ExecQuery;
265     try
266     Result := FieldByName('VersionNo').AsInteger;
267     FCurrentDBVersion := Result;
268     finally
269     Close;
270     end;
271     end;
272     finally
273     IBTransaction1.Commit;
274     end;
275     finally
276     FNoAutoReopen := false
277     end;
278     end;
279    
280    
281     procedure TForm1.AddEmployeeExecute(Sender: TObject);
282     begin
283     Employees.Append
284     end;
285    
286     procedure TForm1.SelectDeptExecute(Sender: TObject);
287     var Dept_No: string;
288     begin
289     if SelectDeptDlg.ShowModal(EmployeesDEPT_KEY_PATH.AsString,Dept_No) = mrOK then
290     begin
291     Employees.Edit;
292     EmployeesDEPT_NO.AsString := Dept_No;
293     try
294     Employees.Post;
295     except
296     Employees.Cancel;
297     raise;
298     end;
299     IBDynamicGrid1.ShowEditorPanel;
300     end;
301     end;
302    
303     procedure TForm1.EmployeesAfterPost(DataSet: TDataSet);
304     begin
305     Employees.Refresh
306     end;
307    
308     procedure TForm1.DBImage1DBImageRead(Sender: TObject; S: TStream;
309     var GraphExt: string);
310     begin
311     GraphExt := 'png';
312     end;
313    
314     procedure TForm1.EmployeesValidatePost(Sender: TObject; var CancelPost: boolean
315     );
316     begin
317     {Cancel if no name entered}
318     CancelPost := (EmployeesLAST_NAME.AsString = sNoName) and (EmployeesFIRST_NAME.AsString = sNoName);
319     end;
320    
321     procedure TForm1.IBDatabase1AfterConnect(Sender: TObject);
322     begin
323     with IBLocalDBSupport1 do
324     if CurrentDBVersionNo = RequiredVersionNo then
325     ReOpen(0);
326     end;
327    
328     procedure TForm1.IBLocalDBSupport1GetDBVersionNo(Sender: TObject;
329     var VersionNo: integer);
330     begin
331     VersionNo := GetDBVersionNo;
332     end;
333    
334     procedure TForm1.JobCodeChangeTimerTimer(Sender: TObject);
335     begin
336     Countries.Active := false;
337     Countries.Active := true;
338     JobCodeChangeTimer.Interval := 0;
339     end;
340    
341     procedure TForm1.JobGradeChangeTimerTimer(Sender: TObject);
342     begin
343     Countries.Active := false;
344     JobCodes.Active := false;
345     Countries.Active := true;
346     JobCodes.Active := true;
347     JobGradeChangeTimer.Interval := 0;
348     end;
349    
350     procedure TForm1.JobGradeDBComboBoxCloseUp(Sender: TObject);
351     begin
352     JobGradeDBComboBox.EditingDone; //See http://bugs.freepascal.org/view.php?id=27186
353     end;
354    
355     procedure TForm1.NewDatabaseExecute(Sender: TObject);
356     begin
357     FNoAutoReopen := true;
358     try
359     {Ensure Transaction End}
360     if IBTransaction1.InTransaction then
361     IBTransaction1.Rollback;
362     finally
363     FNoAutoReopen := false;
364     end;
365     IBLocalDBSupport1.NewDatabase;
366     end;
367    
368     procedure TForm1.QuitExecute(Sender: TObject);
369     begin
370     Close;
371     end;
372    
373     procedure TForm1.RestoreDatabaseExecute(Sender: TObject);
374     begin
375     FNoAutoReopen := true;
376     try
377     {Ensure all changes saved}
378     if IBTransaction1.InTransaction then
379     IBTransaction1.Commit;
380     finally
381     FNoAutoReopen := false;
382     end;
383     IBLocalDBSupport1.RestoreDatabase;
384     end;
385    
386     procedure TForm1.SaveDatabaseExecute(Sender: TObject);
387     begin
388     FNoAutoReopen := true;
389     try
390     {Ensure all changes saved}
391     if IBTransaction1.InTransaction then
392     IBTransaction1.Commit;
393     finally
394     FNoAutoReopen := false;
395     end;
396     IBLocalDBSupport1.SaveDatabase;
397     {Start new Transaction and open dataset}
398     ReOpen(0);
399     end;
400    
401     procedure TForm1.BeforeDateChange(Sender: TObject);
402     begin
403     Employees.Active := false;
404     Employees.Active := true
405     end;
406    
407     procedure TForm1.CancelChangesExecute(Sender: TObject);
408     begin
409     Employees.Transaction.Rollback
410     end;
411    
412     procedure TForm1.CountriesBeforeOpen(DataSet: TDataSet);
413     begin
414     Countries.ParamByName('JOB_GRADE').AsInteger := EmployeesJOB_GRADE.AsInteger;
415     Countries.ParamByName('JOB_CODE').AsString := EmployeesJOB_CODE.AsString
416     end;
417    
418     procedure TForm1.DeleteEmployeeExecute(Sender: TObject);
419     begin
420     if MessageDlg(
421     Format('Remove %s from Employee List?',[Employees.FieldByName('Full_Name').AsString]),
422     mtConfirmation,[mbYes,mbNo],0) = mrYes then
423     Employees.Delete
424     end;
425    
426     procedure TForm1.EditEmployeeExecute(Sender: TObject);
427     begin
428     IBDynamicGrid1.ShowEditorPanel;
429     end;
430    
431     procedure TForm1.EditEmployeeUpdate(Sender: TObject);
432     begin
433     (Sender as TAction).Enabled := Employees.Active and (Employees.RecordCount > 0)
434     end;
435    
436     procedure TForm1.EmployeesAfterInsert(DataSet: TDataSet);
437     begin
438     EmployeesJOB_COUNTRY.AsString := 'USA';
439     EmployeesJOB_CODE.AsString := 'SRep';
440     EmployeesJOB_GRADE.AsInteger := 4;
441     EmployeesSALARY.AsCurrency := 20000;
442     EmployeesFIRST_NAME.AsString := sNoName;
443     EmployeesLAST_NAME.AsString := sNoName;
444     EmployeesHIRE_DATE.AsDateTime := now;
445     EmployeesDEPT_NO.AsString := '000';
446     FDirty := true;
447     end;
448    
449     procedure TForm1.EmployeesAfterOpen(DataSet: TDataSet);
450     begin
451     TotalsQuery.Active := true;
452     IBDynamicGrid1.SetFocus;
453     end;
454    
455     procedure TForm1.EmployeesAfterScroll(DataSet: TDataSet);
456     begin
457     JobGradeChangeTimer.Interval := 200;
458     end;
459    
460     procedure TForm1.EmployeesBeforeClose(DataSet: TDataSet);
461     begin
462     TotalsQuery.Active := false
463     end;
464    
465     procedure TForm1.EmployeesBeforeOpen(DataSet: TDataSet);
466     begin
467     if BeforeDate.Date > 0 then
468     (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE < :BeforeDate');
469     if AfterDate.Date > 0 then
470     (DataSet as TIBParserDataSet).Parser.Add2WhereClause('HIRE_DATE > :AfterDate');
471    
472     case SalaryRange.ItemIndex of
473     1:
474     (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary < 40000');
475     2:
476     (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 40000 and Salary < 100000');
477     3:
478     (DataSet as TIBParserDataSet).Parser.Add2WhereClause('Salary >= 100000');
479     end;
480    
481    
482    
483     {Parameter value must be set after all SQL changes have been made}
484     if BeforeDate.Date > 0 then
485     (DataSet as TIBParserDataSet).ParamByName('BeforeDate').AsDateTime := BeforeDate.Date;
486     if AfterDate.Date > 0 then
487     (DataSet as TIBParserDataSet).ParamByName('AfterDate').AsDateTime := AfterDate.Date;
488    
489     end;
490    
491     procedure TForm1.EmployeesJOB_CODEChange(Sender: TField);
492     begin
493     JobCodeChangeTimer.Interval := 200;
494     end;
495    
496     procedure TForm1.EmployeesJOB_GRADEChange(Sender: TField);
497     begin
498     JobGradeChangeTimer.Interval := 200;
499     end;
500    
501     procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
502     begin
503     FNoAutoReopen := true;
504     if IBTransaction1.InTransaction then
505     IBTransaction1.Commit;
506     end;
507    
508     procedure TForm1.FormShow(Sender: TObject);
509     begin
510     try
511     IBDatabase1.Connected := true;
512     except On E:Exception do
513     begin
514     MessageDlg(E.Message,mtError,[mbOK],0);
515     Close;
516     Exit
517     end;
518     end;
519    
520     {If upgrade failed or downgrade not pending then exit}
521     with IBLocalDBSupport1 do
522     if (CurrentDBVersionNo < RequiredVersionNo) or
523     ((CurrentDBVersionNo > RequiredVersionNo) and not DowngradePending) then
524     Close;
525     end;
526    
527     procedure TForm1.EmployeesAfterDelete(DataSet: TDataSet);
528     begin
529     FDirty := true
530     end;
531    
532     procedure TForm1.EmployeesAfterTransactionEnd(Sender: TObject);
533     begin
534     FDirty := false;
535     if not FNoAutoReopen then
536     Application.QueueAsyncCall(@Reopen,0)
537     end;
538    
539     procedure TForm1.EmployeesPostError(DataSet: TDataSet; E: EDatabaseError;
540     var DataAction: TDataAction);
541     begin
542     if E is EIBError then
543     begin
544     MessageDlg(ExtractDBException(EIBError(E).message),mtError,[mbOK],0);
545     DataSet.Cancel;
546     DataAction := daAbort
547     end;
548     end;
549    
550     end.
551