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