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