Rev 78 | Rev 80 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
78 | daniel-mar | 1 | unit ZeiterfassungMain; |
2 | |||
3 | interface |
||
4 | |||
5 | uses |
||
6 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, |
||
7 | Dialogs, DB, ADODB, Grids, Wwdbigrd, Wwdbgrid, ExtCtrls, DBCtrls, StdCtrls; |
||
8 | |||
9 | type |
||
10 | TForm1 = class(TForm) |
||
11 | ADOConnection1: TADOConnection; |
||
12 | wwDBGrid1: TwwDBGrid; |
||
13 | ADOTable1: TADOTable; |
||
14 | DataSource1: TDataSource; |
||
15 | ADOTable1TAG: TWideStringField; |
||
16 | ADOTable1KOMMEN: TWideStringField; |
||
17 | ADOTable1PAUSE_START: TWideStringField; |
||
18 | ADOTable1PAUSE_ENDE: TWideStringField; |
||
19 | ADOTable1GEHEN: TWideStringField; |
||
20 | ADOTable1SONSTIGER_ABZUG: TWideStringField; |
||
21 | ADOTable1ZUHAUSE: TWideStringField; |
||
22 | ADOTable1BERSTUNDEN_SALDO: TIntegerField; |
||
23 | ADOTable1BERSTUNDEN: TIntegerField; |
||
24 | ADOTable1FREIER_TAG: TBooleanField; |
||
25 | Panel1: TPanel; |
||
26 | Button1: TButton; |
||
27 | DBNavigator1: TDBNavigator; |
||
28 | ADOTable1WOCHENTAG: TStringField; |
||
29 | ADOTable1USERNAME: TStringField; |
||
30 | ComboBox1: TComboBox; |
||
31 | Label1: TLabel; |
||
32 | Label2: TLabel; |
||
79 | daniel-mar | 33 | ADOTable1BEMERKUNG: TStringField; |
78 | daniel-mar | 34 | procedure ADOTable1NewRecord(DataSet: TDataSet); |
35 | procedure FormClose(Sender: TObject; var Action: TCloseAction); |
||
36 | procedure ADOTable1BeforePost(DataSet: TDataSet); |
||
37 | procedure ADOTable1BERSTUNDEN_SALDOGetText(Sender: TField; var Text: string; |
||
38 | DisplayText: Boolean); |
||
39 | procedure ADOTable1BERSTUNDENGetText(Sender: TField; var Text: string; |
||
40 | DisplayText: Boolean); |
||
41 | procedure wwDBGrid1CalcCellColors(Sender: TObject; Field: TField; |
||
42 | State: TGridDrawState; Highlight: Boolean; AFont: TFont; ABrush: TBrush); |
||
43 | procedure ADOTable1AfterPost(DataSet: TDataSet); |
||
44 | procedure Button1Click(Sender: TObject); |
||
45 | procedure ADOTable1TAGChange(Sender: TField); |
||
46 | procedure ADOTable1SONSTIGER_ABZUGSetText(Sender: TField; |
||
47 | const Text: string); |
||
48 | procedure ADOTable1ZUHAUSESetText(Sender: TField; const Text: string); |
||
49 | procedure ADOTable1GEHENSetText(Sender: TField; const Text: string); |
||
50 | procedure ADOTable1PAUSE_ENDESetText(Sender: TField; const Text: string); |
||
51 | procedure ADOTable1PAUSE_STARTSetText(Sender: TField; const Text: string); |
||
52 | procedure ADOTable1KOMMENSetText(Sender: TField; const Text: string); |
||
53 | procedure FormShow(Sender: TObject); |
||
54 | procedure ADOTable1WOCHENTAGGetText(Sender: TField; var Text: string; |
||
55 | DisplayText: Boolean); |
||
56 | procedure ComboBox1Change(Sender: TObject); |
||
57 | procedure ADOTable1TAGSetText(Sender: TField; const Text: string); |
||
58 | procedure ADOTable1AfterDelete(DataSet: TDataSet); |
||
59 | procedure ADOTable1TAGGetText(Sender: TField; var Text: string; |
||
60 | DisplayText: Boolean); |
||
61 | procedure ADOTable1KOMMENGetText(Sender: TField; var Text: string; |
||
62 | DisplayText: Boolean); |
||
63 | procedure ADOTable1PAUSE_STARTGetText(Sender: TField; var Text: string; |
||
64 | DisplayText: Boolean); |
||
65 | procedure ADOTable1PAUSE_ENDEGetText(Sender: TField; var Text: string; |
||
66 | DisplayText: Boolean); |
||
67 | procedure ADOTable1GEHENGetText(Sender: TField; var Text: string; |
||
68 | DisplayText: Boolean); |
||
69 | procedure ADOTable1SONSTIGER_ABZUGGetText(Sender: TField; var Text: string; |
||
70 | DisplayText: Boolean); |
||
71 | procedure ADOTable1ZUHAUSEGetText(Sender: TField; var Text: string; |
||
72 | DisplayText: Boolean); |
||
73 | private |
||
74 | function GueltigeZeile: boolean; |
||
75 | protected |
||
76 | procedure ReorgDataSet; |
||
77 | procedure ReorgAll; |
||
78 | function RegelArbeitszeit: integer; |
||
79 | end; |
||
80 | |||
81 | var |
||
82 | Form1: TForm1; |
||
83 | |||
84 | implementation |
||
85 | |||
86 | {$R *.dfm} |
||
87 | |||
88 | // TODO: Trennstriche zwischen Wochen oder zwischen Urlauben |
||
79 | daniel-mar | 89 | // IDEE: Wochenend-Multiplikator |
78 | daniel-mar | 90 | |
91 | uses |
||
92 | DateUtils, StrUtils, IniFiles; |
||
93 | |||
94 | {$REGION 'Hilfsfunktionen'} |
||
95 | |||
96 | function SQL_Escape(const s: string): string; |
||
97 | begin |
||
98 | result := StringReplace(s, '''', '\''', [rfReplaceAll]); |
||
99 | end; |
||
100 | |||
101 | function IstLeer(f: TField): boolean; |
||
102 | begin |
||
103 | result := f.IsNull or (f.AsString = '') or (f.AsString = '00:00:00'); |
||
104 | end; |
||
105 | |||
106 | function Minuten(f: TField): integer; |
||
107 | begin |
||
108 | if IstLeer(f) then |
||
109 | begin |
||
110 | result := 0; |
||
111 | end |
||
112 | else |
||
113 | begin |
||
114 | result := MinuteOfTheDay(f.AsDateTime); |
||
115 | end; |
||
116 | end; |
||
117 | |||
79 | daniel-mar | 118 | function MinutenZuHF_Int(min: integer): string; |
78 | daniel-mar | 119 | var |
120 | d: integer; |
||
121 | begin |
||
79 | daniel-mar | 122 | d := min; |
123 | if d < 0 then |
||
124 | begin |
||
125 | result := '-'; |
||
126 | d := -d; |
||
127 | end |
||
128 | else |
||
129 | begin |
||
130 | result := ''; |
||
131 | end; |
||
132 | result := result + Format('%.2d:%.2d', [d div 60, d mod 60]); |
||
133 | end; |
||
134 | |||
135 | function MinutenZuHF(f: TField): string; |
||
136 | begin |
||
78 | daniel-mar | 137 | if IstLeer(f) then |
138 | begin |
||
139 | result := ''; |
||
140 | end |
||
141 | else |
||
142 | begin |
||
79 | daniel-mar | 143 | result := MinutenZuHF_Int(f.AsInteger); |
78 | daniel-mar | 144 | end; |
145 | end; |
||
146 | |||
147 | function EchtesDatum(f: TField): TDate; |
||
148 | begin |
||
149 | if Copy(f.AsString, 5, 1) = '-' then |
||
150 | begin |
||
151 | result := EncodeDate( |
||
152 | StrtoInt(Copy(f.AsString, 1, 4)), |
||
153 | StrtoInt(Copy(f.AsString, 6, 2)), |
||
154 | StrtoInt(Copy(f.AsString, 9, 2)) |
||
155 | ); |
||
156 | end |
||
157 | else |
||
158 | result := StrToDate(f.AsString); |
||
159 | end; |
||
160 | |||
161 | function WUserName: String; |
||
162 | var |
||
163 | nSize: DWord; |
||
164 | begin |
||
165 | nSize := 1024; |
||
166 | SetLength(Result, nSize); |
||
167 | if GetUserName(PChar(Result), nSize) then |
||
168 | SetLength(Result, nSize-1) |
||
169 | else |
||
170 | RaiseLastOSError; |
||
171 | end; |
||
172 | |||
173 | {$ENDREGION} |
||
174 | |||
175 | function TForm1.RegelArbeitszeit: integer; |
||
176 | var |
||
177 | test: TADOQuery; |
||
178 | begin |
||
179 | test := TADOQuery.Create(nil); |
||
180 | try |
||
181 | test.Connection := ADOConnection1; |
||
182 | test.Close; |
||
183 | test.SQL.Text := 'select MINUTEN from REGELARBEITSZEIT where USERNAME = ''' + SQL_Escape(ComboBox1.Text) + ''''; |
||
184 | test.Open; |
||
185 | if test.RecordCount = 0 then |
||
186 | begin |
||
187 | result := 8 * 60; |
||
188 | end |
||
189 | else |
||
190 | begin |
||
191 | result := test.FieldByName('MINUTEN').AsInteger; |
||
192 | end; |
||
193 | finally |
||
194 | test.Free; |
||
195 | end; |
||
196 | end; |
||
197 | |||
198 | procedure TForm1.ReorgAll; |
||
199 | var |
||
200 | saldo: integer; |
||
201 | baks: string; |
||
202 | bakEv: TDataSetNotifyEvent; |
||
203 | dead: boolean; |
||
204 | begin |
||
205 | if ADOTable1TAG.IsNull then |
||
206 | begin |
||
207 | baks := ''; |
||
208 | end |
||
209 | else |
||
210 | begin |
||
211 | if Copy(ADOTable1TAG.AsString, 5, 1) = '-' then |
||
212 | baks := ADOTable1TAG.AsString |
||
213 | else |
||
214 | DateTimeToString(baks, 'YYYY-MM-DD', ADOTable1TAG.AsDateTime); |
||
215 | end; |
||
79 | daniel-mar | 216 | ADOTable1.Requery(); |
217 | |||
78 | daniel-mar | 218 | bakEv := ADOTable1.AfterPost; |
219 | ADOTable1.AfterPost := nil; |
||
79 | daniel-mar | 220 | ADOTable1.DisableControls; |
78 | daniel-mar | 221 | try |
222 | ADOTable1.First; |
||
223 | saldo := 0; |
||
224 | dead := false; |
||
225 | while not ADOTable1.Eof do |
||
226 | begin |
||
227 | ADOTable1.Edit; |
||
228 | if not dead then ReorgDataSet; |
||
229 | dead := dead or ADOTable1BERSTUNDEN.IsNull; |
||
230 | if dead then |
||
231 | begin |
||
232 | ADOTable1BERSTUNDEN_SALDO.Clear; |
||
233 | end |
||
234 | else |
||
235 | begin |
||
236 | saldo := saldo + ADOTable1BERSTUNDEN.AsInteger; |
||
237 | ADOTable1BERSTUNDEN_SALDO.AsInteger := saldo; |
||
238 | saldo := ADOTable1BERSTUNDEN_SALDO.AsInteger; |
||
239 | end; |
||
240 | ADOTable1.Post; |
||
241 | ADOTable1.Next; |
||
242 | end; |
||
243 | finally |
||
244 | if baks <> '' then ADOTable1.Locate('USERNAME;TAG', VarArrayOf([WUserName, baks]), []); |
||
245 | ADOTable1.AfterPost := bakEv; |
||
79 | daniel-mar | 246 | ADOTable1.EnableControls; |
78 | daniel-mar | 247 | end; |
248 | end; |
||
249 | |||
250 | procedure TForm1.ADOTable1AfterDelete(DataSet: TDataSet); |
||
251 | begin |
||
252 | ReorgAll; |
||
253 | end; |
||
254 | |||
255 | procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet); |
||
256 | begin |
||
257 | ReorgAll; |
||
258 | end; |
||
259 | |||
260 | function TForm1.GueltigeZeile: boolean; |
||
261 | begin |
||
262 | result := false; |
||
263 | |||
264 | if IstLeer(ADOTable1KOMMEN) <> IstLeer(ADOTable1GEHEN) then exit; |
||
265 | if IstLeer(ADOTable1PAUSE_START) <> IstLeer(ADOTable1PAUSE_ENDE) then exit; |
||
266 | if not IstLeer(ADOTable1PAUSE_START) and (ADOTable1PAUSE_START.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit; |
||
267 | if not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1PAUSE_ENDE.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit; |
||
268 | if not IstLeer(ADOTable1GEHEN) and (ADOTable1GEHEN.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit; |
||
269 | if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_START) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit; |
||
270 | if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_ENDE.AsDateTime) then exit; |
||
271 | |||
272 | result := true; |
||
273 | end; |
||
274 | |||
275 | procedure TForm1.ReorgDataSet; |
||
276 | var |
||
277 | m: integer; |
||
278 | begin |
||
279 | if GueltigeZeile then |
||
280 | begin |
||
281 | m := (Minuten(ADOTable1GEHEN) - Minuten(ADOTable1KOMMEN)) |
||
282 | - (Minuten(ADOTable1PAUSE_ENDE) - Minuten(ADOTable1PAUSE_START)) |
||
283 | - Minuten(ADOTable1SONSTIGER_ABZUG) |
||
284 | + Minuten(ADOTable1ZUHAUSE); |
||
285 | |||
286 | if not ADOTable1FREIER_TAG.AsBoolean then |
||
287 | begin |
||
288 | m := m - RegelArbeitszeit; |
||
289 | end; |
||
290 | |||
291 | ADOTable1BERSTUNDEN.AsInteger := m; |
||
292 | end |
||
293 | else |
||
294 | begin |
||
295 | ADOTable1BERSTUNDEN.Clear; |
||
296 | end; |
||
297 | end; |
||
298 | |||
299 | procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); |
||
300 | begin |
||
301 | if (ADOTable1.State = dsInsert) and ADOTable1TAG.IsNull then |
||
302 | begin |
||
303 | AdoTable1.Cancel; |
||
304 | Abort; |
||
305 | end; |
||
306 | |||
307 | ReorgDataSet; |
||
308 | end; |
||
309 | |||
310 | procedure TForm1.ADOTable1BERSTUNDENGetText(Sender: TField; var Text: string; |
||
311 | DisplayText: Boolean); |
||
312 | begin |
||
313 | Text := MinutenZuHF(ADOTable1BERSTUNDEN); |
||
314 | end; |
||
315 | |||
316 | procedure TForm1.ADOTable1BERSTUNDEN_SALDOGetText(Sender: TField; |
||
317 | var Text: string; DisplayText: Boolean); |
||
318 | begin |
||
319 | Text := MinutenZuHF(ADOTable1BERSTUNDEN_SALDO); |
||
320 | end; |
||
321 | |||
322 | procedure TForm1.ADOTable1GEHENGetText(Sender: TField; var Text: string; |
||
323 | DisplayText: Boolean); |
||
324 | begin |
||
325 | Text := Copy(Sender.AsString, 1, 5); |
||
326 | end; |
||
327 | |||
328 | procedure TForm1.ADOTable1GEHENSetText(Sender: TField; const Text: string); |
||
329 | begin |
||
330 | if Text = '' then |
||
331 | begin |
||
332 | ADOTable1GEHEN.Clear; |
||
333 | end |
||
334 | else |
||
335 | begin |
||
336 | ADOTable1GEHEN.AsString := Text; |
||
337 | end; |
||
338 | end; |
||
339 | |||
340 | procedure TForm1.ADOTable1KOMMENGetText(Sender: TField; var Text: string; |
||
341 | DisplayText: Boolean); |
||
342 | begin |
||
343 | Text := Copy(Sender.AsString, 1, 5); |
||
344 | end; |
||
345 | |||
346 | procedure TForm1.ADOTable1KOMMENSetText(Sender: TField; const Text: string); |
||
347 | begin |
||
348 | if Text = '' then |
||
349 | begin |
||
350 | ADOTable1KOMMEN.Clear; |
||
351 | end |
||
352 | else |
||
353 | begin |
||
354 | ADOTable1KOMMEN.AsString := Text; |
||
355 | end; |
||
356 | end; |
||
357 | |||
358 | procedure TForm1.ADOTable1NewRecord(DataSet: TDataSet); |
||
359 | var |
||
360 | test: TADOQuery; |
||
361 | begin |
||
362 | ADOTable1FREIER_TAG.AsBoolean := false; |
||
363 | ADOTable1USERNAME.AsString := WUserName; |
||
364 | test := TADOQuery.Create(nil); |
||
365 | try |
||
366 | test.Connection := ADOConnection1; |
||
367 | test.Close; |
||
79 | daniel-mar | 368 | test.SQL.Text := 'select * from TAGE where TAG = ''' + DateToStr(Date) + ''' and USERNAME = ''' + SQL_Escape(ComboBox1.Text) + ''''; |
78 | daniel-mar | 369 | test.Open; |
370 | if test.RecordCount = 0 then |
||
371 | begin |
||
372 | ADOTable1TAG.AsDateTime := Date; |
||
373 | ADOTable1KOMMEN.AsString := TimeToStr(Time); |
||
374 | ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(Date) = 1{Sunday}) or |
||
375 | (DayOfWeek(Date) = 7{Saturday}); |
||
376 | end; |
||
377 | finally |
||
378 | test.Free; |
||
379 | end; |
||
380 | |||
381 | wwDBGrid1.SelectedField := ADOTable1TAG; |
||
382 | end; |
||
383 | |||
384 | procedure TForm1.ADOTable1PAUSE_ENDEGetText(Sender: TField; var Text: string; |
||
385 | DisplayText: Boolean); |
||
386 | begin |
||
387 | Text := Copy(Sender.AsString, 1, 5); |
||
388 | end; |
||
389 | |||
390 | procedure TForm1.ADOTable1PAUSE_ENDESetText(Sender: TField; const Text: string); |
||
391 | begin |
||
392 | if Text = '' then |
||
393 | begin |
||
394 | ADOTable1PAUSE_ENDE.Clear; |
||
395 | end |
||
396 | else |
||
397 | begin |
||
398 | ADOTable1PAUSE_ENDE.AsString := Text; |
||
399 | end; |
||
400 | end; |
||
401 | |||
402 | procedure TForm1.ADOTable1PAUSE_STARTGetText(Sender: TField; var Text: string; |
||
403 | DisplayText: Boolean); |
||
404 | begin |
||
405 | Text := Copy(Sender.AsString, 1, 5); |
||
406 | end; |
||
407 | |||
408 | procedure TForm1.ADOTable1PAUSE_STARTSetText(Sender: TField; |
||
409 | const Text: string); |
||
410 | begin |
||
411 | if Text = '' then |
||
412 | begin |
||
413 | ADOTable1PAUSE_START.Clear; |
||
414 | end |
||
415 | else |
||
416 | begin |
||
417 | ADOTable1PAUSE_START.AsString := Text; |
||
418 | end; |
||
419 | end; |
||
420 | |||
421 | procedure TForm1.ADOTable1SONSTIGER_ABZUGGetText(Sender: TField; |
||
422 | var Text: string; DisplayText: Boolean); |
||
423 | begin |
||
424 | Text := Copy(Sender.AsString, 1, 5); |
||
425 | end; |
||
426 | |||
427 | procedure TForm1.ADOTable1SONSTIGER_ABZUGSetText(Sender: TField; |
||
428 | const Text: string); |
||
429 | begin |
||
430 | if Text = '' then |
||
431 | begin |
||
432 | ADOTable1SONSTIGER_ABZUG.Clear; |
||
433 | end |
||
434 | else |
||
435 | begin |
||
436 | ADOTable1SONSTIGER_ABZUG.AsString := Text; |
||
437 | end; |
||
438 | end; |
||
439 | |||
440 | procedure TForm1.ADOTable1TAGChange(Sender: TField); |
||
441 | begin |
||
442 | ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(ADOTable1TAG.AsDateTime) = 1{Sunday}) or |
||
443 | (DayOfWeek(ADOTable1TAG.AsDateTime) = 7{Saturday}); |
||
444 | // TODO: "Wochentag" Feld aktualisieren |
||
445 | end; |
||
446 | |||
447 | procedure TForm1.ADOTable1TAGGetText(Sender: TField; var Text: string; |
||
448 | DisplayText: Boolean); |
||
449 | begin |
||
79 | daniel-mar | 450 | if IstLeer(Sender) then |
451 | Text := Sender.AsString |
||
452 | else |
||
453 | Text := DateToStr(EchtesDatum(Sender)); |
||
78 | daniel-mar | 454 | end; |
455 | |||
456 | procedure TForm1.ADOTable1TAGSetText(Sender: TField; const Text: string); |
||
457 | var |
||
458 | i, punktCount: integer; |
||
459 | begin |
||
460 | punktCount := 0; |
||
461 | for i := 1 to Length(Text) do |
||
462 | begin |
||
463 | if Text[i] = '.' then inc(punktCount); |
||
464 | end; |
||
465 | |||
466 | if punktCount = 1 then |
||
467 | begin |
||
468 | ADOTable1TAG.AsString := Text + '.' + IntToStr(CurrentYear); |
||
469 | end |
||
470 | else if (PunktCount = 2) and EndsStr('.',Text) then |
||
471 | begin |
||
472 | ADOTable1TAG.AsString := Text + IntToStr(CurrentYear); |
||
473 | end |
||
474 | else |
||
475 | begin |
||
476 | ADOTable1TAG.AsString := Text; |
||
477 | end; |
||
478 | end; |
||
479 | |||
480 | procedure TForm1.ADOTable1WOCHENTAGGetText(Sender: TField; var Text: string; |
||
481 | DisplayText: Boolean); |
||
482 | begin |
||
483 | try |
||
484 | if ADOTable1TAG.AsString <> '' then |
||
485 | Text := ShortDayNames[DayOfWeek(EchtesDatum(ADOTable1TAG))] |
||
486 | else |
||
487 | Text := ''; |
||
488 | except |
||
489 | Text := '??'; |
||
490 | end; |
||
491 | end; |
||
492 | |||
493 | procedure TForm1.ADOTable1ZUHAUSEGetText(Sender: TField; var Text: string; |
||
494 | DisplayText: Boolean); |
||
495 | begin |
||
496 | Text := Copy(Sender.AsString, 1, 5); |
||
497 | end; |
||
498 | |||
499 | procedure TForm1.ADOTable1ZUHAUSESetText(Sender: TField; const Text: string); |
||
500 | begin |
||
501 | if Text = '' then |
||
502 | begin |
||
503 | ADOTable1ZUHAUSE.Clear; |
||
504 | end |
||
505 | else |
||
506 | begin |
||
507 | ADOTable1ZUHAUSE.AsString := Text; |
||
508 | end; |
||
509 | end; |
||
510 | |||
511 | procedure TForm1.Button1Click(Sender: TObject); |
||
512 | begin |
||
513 | ReorgAll; |
||
514 | end; |
||
515 | |||
516 | procedure TForm1.ComboBox1Change(Sender: TObject); |
||
517 | begin |
||
79 | daniel-mar | 518 | Label2.Caption := MinutenZuHF_Int(RegelArbeitszeit) + ' Std.'; |
519 | |||
520 | ADOTable1.DisableControls; |
||
521 | |||
78 | daniel-mar | 522 | ADOTable1.Active := false; |
79 | daniel-mar | 523 | ADOTable1.ReadOnly := false; |
78 | daniel-mar | 524 | ADOTable1.Filter := 'USERNAME = ''' + SQL_Escape(ComboBox1.Text) + ''''; |
525 | ADOTable1.Filtered := true; |
||
526 | ADOTable1.Active := true; |
||
79 | daniel-mar | 527 | |
528 | ReorgAll; |
||
529 | |||
530 | ADOTable1.Active := false; |
||
531 | ADOTable1.ReadOnly := ComboBox1.Text <> WUserName; |
||
532 | ADOTable1.Active := true; |
||
533 | |||
78 | daniel-mar | 534 | ADOTable1.Last; |
535 | Button1.Enabled := not ADOTable1.ReadOnly; |
||
536 | |||
79 | daniel-mar | 537 | ADOTable1.EnableControls; |
78 | daniel-mar | 538 | end; |
539 | |||
540 | procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); |
||
541 | begin |
||
542 | if ADOTable1.State in [dsEdit, dsInsert] then |
||
543 | begin |
||
544 | try |
||
545 | ADOTable1.Post; |
||
546 | except |
||
547 | on E: EAbort do |
||
548 | begin |
||
549 | exit; |
||
550 | end; |
||
551 | end; |
||
552 | end; |
||
553 | end; |
||
554 | |||
555 | procedure TForm1.FormShow(Sender: TObject); |
||
556 | var |
||
557 | test: TADOQuery; |
||
558 | ini: TMemIniFile; |
||
559 | resourcestring |
||
560 | DefaultConnectionString = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Zeiterfassung;' + |
||
561 | 'Data Source=SHS\FiVe,49007;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=MARSCHALL;Use Encryption for Data=False;Tag with column collation when possible=False;'; |
||
562 | begin |
||
563 | ini := TMemIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + ChangeFileExt(ExtractFileName(ParamStr(0)), '.ini')); |
||
564 | try |
||
565 | ADOConnection1.ConnectionString := ini.ReadString('Connection', 'ConnectionString', DefaultConnectionString); |
||
566 | finally |
||
567 | ini.Free; |
||
568 | end; |
||
569 | ADOConnection1.Connected := true; |
||
570 | |||
571 | {$REGION 'Username Combobox füllen'} |
||
572 | test := TADOQuery.Create(nil); |
||
573 | try |
||
574 | test.Connection := ADOConnection1; |
||
575 | test.Close; |
||
576 | test.SQL.Text := 'select distinct USERNAME from TAGE'; |
||
577 | test.Open; |
||
578 | ComboBox1.Items.Clear; |
||
579 | while not test.EOF do |
||
580 | begin |
||
581 | ComboBox1.Items.Add(test.FieldByName('USERNAME').AsString); |
||
582 | test.Next; |
||
583 | end; |
||
584 | finally |
||
585 | test.Free; |
||
586 | end; |
||
587 | |||
588 | if ComboBox1.Items.IndexOf(WUserName) = -1 then |
||
589 | ComboBox1.Items.Add(WUserName); |
||
590 | |||
591 | ComboBox1.Sorted := true; |
||
592 | |||
593 | ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(WUserName); |
||
594 | |||
595 | ComboBox1Change(ComboBox1); |
||
596 | {$ENDREGION} |
||
597 | |||
598 | if wwDBGrid1.CanFocus then wwDBGrid1.SetFocus; |
||
599 | wwDBGrid1.SelectedField := ADOTable1TAG; |
||
600 | end; |
||
601 | |||
602 | procedure TForm1.wwDBGrid1CalcCellColors(Sender: TObject; Field: TField; |
||
603 | State: TGridDrawState; Highlight: Boolean; AFont: TFont; ABrush: TBrush); |
||
604 | begin |
||
605 | if Highlight then exit; |
||
606 | |||
79 | daniel-mar | 607 | if (Field.FieldName = ADOTable1WOCHENTAG.FieldName) or |
608 | (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) or |
||
78 | daniel-mar | 609 | (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then |
610 | begin |
||
611 | ABrush.Color := clBtnFace; |
||
612 | end; |
||
613 | |||
614 | if (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) then |
||
615 | begin |
||
616 | if ADOTable1BERSTUNDEN.AsInteger < 0 then |
||
617 | begin |
||
618 | AFont.Color := clRed; |
||
619 | end; |
||
620 | end; |
||
621 | |||
622 | if (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then |
||
623 | begin |
||
624 | if ADOTable1BERSTUNDEN_SALDO.AsInteger < 0 then |
||
625 | begin |
||
626 | AFont.Color := clRed; |
||
627 | end; |
||
628 | end; |
||
629 | end; |
||
630 | |||
631 | end. |