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

# User Rev Content
1 tony 143 (*
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 tony 31 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 tony 209 Depts.Active := true;
223 tony 31 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 tony 209 Countries.Active := true;
346     JobCodes.Active := true;
347 tony 31 IBDynamicGrid1.SetFocus;
348     end;
349    
350     procedure TForm1.EmployeesBeforeClose(DataSet: TDataSet);
351     begin
352 tony 209 TotalsQuery.Active := false;
353     Countries.Active := false;
354     JobCodes.Active := false;
355 tony 31 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