Subversion Repositories delphiutils

Rev

Rev 83 | 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
83 daniel-mar 91
// TODO: "Gehen um" Anzeige
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;
88 daniel-mar 203
  baks, baku: string;
78 daniel-mar 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;
88 daniel-mar 218
  baku := ADOTable1USERNAME.AsString;
79 daniel-mar 219
  ADOTable1.Requery();
220
 
78 daniel-mar 221
  bakEv := ADOTable1.AfterPost;
222
  ADOTable1.AfterPost := nil;
79 daniel-mar 223
  ADOTable1.DisableControls;
78 daniel-mar 224
  try
225
    ADOTable1.First;
226
    saldo := 0;
227
    dead := false;
228
    while not ADOTable1.Eof do
229
    begin
230
      ADOTable1.Edit;
231
      if not dead then ReorgDataSet;
232
      dead := dead or ADOTable1BERSTUNDEN.IsNull;
233
      if dead then
234
      begin
235
        ADOTable1BERSTUNDEN_SALDO.Clear;
236
      end
237
      else
238
      begin
239
        saldo := saldo + ADOTable1BERSTUNDEN.AsInteger;
240
        ADOTable1BERSTUNDEN_SALDO.AsInteger := saldo;
241
        saldo := ADOTable1BERSTUNDEN_SALDO.AsInteger;
242
      end;
243
      ADOTable1.Post;
244
      ADOTable1.Next;
245
    end;
246
  finally
88 daniel-mar 247
    if baks <> '' then ADOTable1.Locate('USERNAME;TAG', VarArrayOf([baku, baks]), []);
78 daniel-mar 248
    ADOTable1.AfterPost := bakEv;
79 daniel-mar 249
    ADOTable1.EnableControls;
78 daniel-mar 250
  end;
251
end;
252
 
253
procedure TForm1.ADOTable1AfterDelete(DataSet: TDataSet);
254
begin
255
  ReorgAll;
256
end;
257
 
258
procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
259
begin
260
  ReorgAll;
261
end;
262
 
263
function TForm1.GueltigeZeile: boolean;
264
begin
265
  result := false;
266
 
267
  if IstLeer(ADOTable1KOMMEN) <> IstLeer(ADOTable1GEHEN) then exit;
268
  if IstLeer(ADOTable1PAUSE_START) <> IstLeer(ADOTable1PAUSE_ENDE) then exit;
269
  if not IstLeer(ADOTable1PAUSE_START) and (ADOTable1PAUSE_START.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit;
270
  if not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1PAUSE_ENDE.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit;
271
  if not IstLeer(ADOTable1GEHEN) and (ADOTable1GEHEN.AsDateTime < ADOTable1KOMMEN.AsDateTime) then exit;
272
  if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_START) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_START.AsDateTime) then exit;
273
  if not IstLeer(ADOTable1GEHEN) and not IstLeer(ADOTable1PAUSE_ENDE) and (ADOTable1GEHEN.AsDateTime < ADOTable1PAUSE_ENDE.AsDateTime) then exit;
274
 
275
  result := true;
276
end;
277
 
278
procedure TForm1.ReorgDataSet;
279
var
280
  m: integer;
281
begin
282
  if GueltigeZeile then
283
  begin
284
    m :=   (Minuten(ADOTable1GEHEN) - Minuten(ADOTable1KOMMEN))
285
         - (Minuten(ADOTable1PAUSE_ENDE) - Minuten(ADOTable1PAUSE_START))
286
         - Minuten(ADOTable1SONSTIGER_ABZUG)
287
         + Minuten(ADOTable1ZUHAUSE);
288
 
289
    if not ADOTable1FREIER_TAG.AsBoolean then
290
    begin
291
      m := m - RegelArbeitszeit;
292
    end;
293
 
294
    ADOTable1BERSTUNDEN.AsInteger := m;
295
  end
296
  else
297
  begin
298
    ADOTable1BERSTUNDEN.Clear;
299
  end;
300
end;
301
 
302
procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet);
303
begin
304
  if (ADOTable1.State = dsInsert) and ADOTable1TAG.IsNull then
305
  begin
306
    AdoTable1.Cancel;
307
    Abort;
308
  end;
309
 
310
  ReorgDataSet;
311
end;
312
 
81 daniel-mar 313
procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
314
begin
315
  if (DataSet.State = dsInsert) and (not ADOTable1TAG.IsNull) then Dataset.Post;
316
end;
317
 
78 daniel-mar 318
procedure TForm1.ADOTable1BERSTUNDENGetText(Sender: TField; var Text: string;
319
  DisplayText: Boolean);
320
begin
321
  Text := MinutenZuHF(ADOTable1BERSTUNDEN);
322
end;
323
 
324
procedure TForm1.ADOTable1BERSTUNDEN_SALDOGetText(Sender: TField;
325
  var Text: string; DisplayText: Boolean);
326
begin
327
  Text := MinutenZuHF(ADOTable1BERSTUNDEN_SALDO);
328
end;
329
 
330
procedure TForm1.ADOTable1GEHENGetText(Sender: TField; var Text: string;
331
  DisplayText: Boolean);
332
begin
333
  Text := Copy(Sender.AsString, 1, 5);
334
end;
335
 
336
procedure TForm1.ADOTable1GEHENSetText(Sender: TField; const Text: string);
337
begin
338
  if Text = '' then
339
  begin
340
    ADOTable1GEHEN.Clear;
341
  end
342
  else
343
  begin
80 daniel-mar 344
    if Pos(':', Text) = 0 then
345
      ADOTable1GEHEN.AsString := Text + ':00'
346
    else
347
      ADOTable1GEHEN.AsString := Text;
78 daniel-mar 348
  end;
349
end;
350
 
351
procedure TForm1.ADOTable1KOMMENGetText(Sender: TField; var Text: string;
352
  DisplayText: Boolean);
353
begin
354
  Text := Copy(Sender.AsString, 1, 5);
355
end;
356
 
357
procedure TForm1.ADOTable1KOMMENSetText(Sender: TField; const Text: string);
358
begin
359
  if Text = '' then
360
  begin
361
    ADOTable1KOMMEN.Clear;
362
  end
363
  else
364
  begin
80 daniel-mar 365
    if Pos(':', Text) = 0 then
366
      ADOTable1KOMMEN.AsString := Text + ':00'
367
    else
368
      ADOTable1KOMMEN.AsString := Text;
78 daniel-mar 369
  end;
370
end;
371
 
372
procedure TForm1.ADOTable1NewRecord(DataSet: TDataSet);
373
var
374
  test: TADOQuery;
375
begin
376
  ADOTable1FREIER_TAG.AsBoolean := false;
88 daniel-mar 377
  ADOTable1USERNAME.AsString := ComboBox1.Text;
78 daniel-mar 378
  test := TADOQuery.Create(nil);
379
  try
380
    test.Connection := ADOConnection1;
381
    test.Close;
79 daniel-mar 382
    test.SQL.Text := 'select * from TAGE where TAG = ''' + DateToStr(Date) + ''' and USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
78 daniel-mar 383
    test.Open;
384
    if test.RecordCount = 0 then
385
    begin
81 daniel-mar 386
 
78 daniel-mar 387
      ADOTable1TAG.AsDateTime := Date;
388
      ADOTable1KOMMEN.AsString := TimeToStr(Time);
389
      ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(Date) = 1{Sunday}) or
390
                                       (DayOfWeek(Date) = 7{Saturday});
391
    end;
392
  finally
393
    test.Free;
394
  end;
395
 
396
  wwDBGrid1.SelectedField := ADOTable1TAG;
397
end;
398
 
399
procedure TForm1.ADOTable1PAUSE_ENDEGetText(Sender: TField; var Text: string;
400
  DisplayText: Boolean);
401
begin
402
  Text := Copy(Sender.AsString, 1, 5);
403
end;
404
 
405
procedure TForm1.ADOTable1PAUSE_ENDESetText(Sender: TField; const Text: string);
406
begin
407
  if Text = '' then
408
  begin
409
    ADOTable1PAUSE_ENDE.Clear;
410
  end
411
  else
412
  begin
80 daniel-mar 413
    if Pos(':', Text) = 0 then
414
      ADOTable1PAUSE_ENDE.AsString := Text + ':00'
415
    else
416
      ADOTable1PAUSE_ENDE.AsString := Text;
78 daniel-mar 417
  end;
418
end;
419
 
420
procedure TForm1.ADOTable1PAUSE_STARTGetText(Sender: TField; var Text: string;
421
  DisplayText: Boolean);
422
begin
423
  Text := Copy(Sender.AsString, 1, 5);
424
end;
425
 
426
procedure TForm1.ADOTable1PAUSE_STARTSetText(Sender: TField;
427
  const Text: string);
428
begin
429
  if Text = '' then
430
  begin
431
    ADOTable1PAUSE_START.Clear;
432
  end
433
  else
434
  begin
80 daniel-mar 435
    if Pos(':', Text) = 0 then
436
      ADOTable1PAUSE_START.AsString := Text + ':00'
437
    else
438
      ADOTable1PAUSE_START.AsString := Text;
78 daniel-mar 439
  end;
440
end;
441
 
442
procedure TForm1.ADOTable1SONSTIGER_ABZUGGetText(Sender: TField;
443
  var Text: string; DisplayText: Boolean);
444
begin
445
  Text := Copy(Sender.AsString, 1, 5);
446
end;
447
 
448
procedure TForm1.ADOTable1SONSTIGER_ABZUGSetText(Sender: TField;
449
  const Text: string);
450
begin
451
  if Text = '' then
452
  begin
453
    ADOTable1SONSTIGER_ABZUG.Clear;
454
  end
455
  else
456
  begin
80 daniel-mar 457
    if Pos(':', Text) = 0 then
458
      ADOTable1SONSTIGER_ABZUG.AsString := Text + ':00'
459
    else
460
      ADOTable1SONSTIGER_ABZUG.AsString := Text;
78 daniel-mar 461
  end;
462
end;
463
 
464
procedure TForm1.ADOTable1TAGChange(Sender: TField);
465
begin
466
  ADOTable1FREIER_TAG.AsBoolean := (DayOfWeek(ADOTable1TAG.AsDateTime) = 1{Sunday}) or
467
                                   (DayOfWeek(ADOTable1TAG.AsDateTime) = 7{Saturday});
468
  // TODO: "Wochentag" Feld aktualisieren
469
end;
470
 
471
procedure TForm1.ADOTable1TAGGetText(Sender: TField; var Text: string;
472
  DisplayText: Boolean);
473
begin
79 daniel-mar 474
  if IstLeer(Sender) then
475
    Text := Sender.AsString
476
  else
477
    Text := DateToStr(EchtesDatum(Sender));
78 daniel-mar 478
end;
479
 
480
procedure TForm1.ADOTable1TAGSetText(Sender: TField; const Text: string);
481
var
482
  i, punktCount: integer;
483
begin
484
  punktCount := 0;
485
  for i := 1 to Length(Text) do
486
  begin
487
    if Text[i] = '.' then inc(punktCount);
488
  end;
489
 
490
  if punktCount = 1 then
491
  begin
492
    ADOTable1TAG.AsString := Text + '.' + IntToStr(CurrentYear);
493
  end
494
  else if (PunktCount = 2) and EndsStr('.',Text) then
495
  begin
496
    ADOTable1TAG.AsString := Text + IntToStr(CurrentYear);
497
  end
498
  else
499
  begin
500
    ADOTable1TAG.AsString := Text;
501
  end;
502
end;
503
 
504
procedure TForm1.ADOTable1WOCHENTAGGetText(Sender: TField; var Text: string;
505
  DisplayText: Boolean);
506
begin
507
  try
508
    if ADOTable1TAG.AsString <> '' then
509
      Text := ShortDayNames[DayOfWeek(EchtesDatum(ADOTable1TAG))]
510
    else
511
      Text := '';
512
  except
513
    Text := '??';
514
  end;
515
end;
516
 
517
procedure TForm1.ADOTable1ZUHAUSEGetText(Sender: TField; var Text: string;
518
  DisplayText: Boolean);
519
begin
520
  Text := Copy(Sender.AsString, 1, 5);
521
end;
522
 
523
procedure TForm1.ADOTable1ZUHAUSESetText(Sender: TField; const Text: string);
524
begin
525
  if Text = '' then
526
  begin
527
    ADOTable1ZUHAUSE.Clear;
528
  end
529
  else
530
  begin
80 daniel-mar 531
    if Pos(':', Text) = 0 then
532
      ADOTable1ZUHAUSE.AsString := Text + ':00'
533
    else
534
      ADOTable1ZUHAUSE.AsString := Text;
78 daniel-mar 535
  end;
536
end;
537
 
538
procedure TForm1.Button1Click(Sender: TObject);
539
begin
540
  ReorgAll;
541
end;
542
 
543
procedure TForm1.ComboBox1Change(Sender: TObject);
544
begin
79 daniel-mar 545
  Label2.Caption := MinutenZuHF_Int(RegelArbeitszeit) + ' Std.';
546
 
547
  ADOTable1.DisableControls;
548
 
78 daniel-mar 549
  ADOTable1.Active := false;
79 daniel-mar 550
  ADOTable1.ReadOnly := false;
78 daniel-mar 551
  ADOTable1.Filter := 'USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
552
  ADOTable1.Filtered := true;
553
  ADOTable1.Active := true;
79 daniel-mar 554
 
555
  ReorgAll;
556
 
557
  ADOTable1.Active := false;
88 daniel-mar 558
  ADOTable1.ReadOnly := (ComboBox1.Text <> WUserName) and (WUserName <> 'Administrator');
79 daniel-mar 559
  ADOTable1.Active := true;
560
 
78 daniel-mar 561
  ADOTable1.Last;
562
  Button1.Enabled := not ADOTable1.ReadOnly;
563
 
79 daniel-mar 564
  ADOTable1.EnableControls;
78 daniel-mar 565
end;
566
 
567
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
568
begin
569
  if ADOTable1.State in [dsEdit, dsInsert] then
570
  begin
571
    try
572
      ADOTable1.Post;
573
    except
574
      on E: EAbort do
575
      begin
576
        exit;
577
      end;
578
    end;
579
  end;
580
end;
581
 
582
procedure TForm1.FormShow(Sender: TObject);
583
var
584
  test: TADOQuery;
585
  ini: TMemIniFile;
586
resourcestring
88 daniel-mar 587
  DefaultConnectionString = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=ZEITERFASSUNG;' +
588
                            'Data Source=SHS\CORA2017,49011;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;';
78 daniel-mar 589
begin
590
  ini := TMemIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + ChangeFileExt(ExtractFileName(ParamStr(0)), '.ini'));
591
  try
592
    ADOConnection1.ConnectionString := ini.ReadString('Connection', 'ConnectionString', DefaultConnectionString);
593
  finally
594
    ini.Free;
595
  end;
596
  ADOConnection1.Connected := true;
597
 
598
  {$REGION 'Username Combobox füllen'}
599
  test := TADOQuery.Create(nil);
600
  try
601
    test.Connection := ADOConnection1;
602
    test.Close;
603
    test.SQL.Text := 'select distinct USERNAME from TAGE';
604
    test.Open;
605
    ComboBox1.Items.Clear;
606
    while not test.EOF do
607
    begin
608
      ComboBox1.Items.Add(test.FieldByName('USERNAME').AsString);
609
      test.Next;
610
    end;
611
  finally
612
    test.Free;
613
  end;
614
 
615
  if ComboBox1.Items.IndexOf(WUserName) = -1 then
616
    ComboBox1.Items.Add(WUserName);
617
  ComboBox1.Sorted := true;
618
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(WUserName);
619
 
620
  ComboBox1Change(ComboBox1);
621
  {$ENDREGION}
622
 
623
  if wwDBGrid1.CanFocus then wwDBGrid1.SetFocus;
624
  wwDBGrid1.SelectedField := ADOTable1TAG;
625
end;
626
 
627
procedure TForm1.wwDBGrid1CalcCellColors(Sender: TObject; Field: TField;
628
  State: TGridDrawState; Highlight: Boolean; AFont: TFont; ABrush: TBrush);
629
begin
630
  if Highlight then exit;
631
 
79 daniel-mar 632
  if (Field.FieldName = ADOTable1WOCHENTAG.FieldName) or
633
     (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) or
78 daniel-mar 634
     (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then
635
  begin
636
    ABrush.Color := clBtnFace;
637
  end;
638
 
639
  if (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) then
640
  begin
641
    if ADOTable1BERSTUNDEN.AsInteger < 0 then
642
    begin
643
      AFont.Color := clRed;
644
    end;
645
  end;
646
 
647
  if (Field.FieldName = ADOTable1BERSTUNDEN_SALDO.FieldName) then
648
  begin
649
    if ADOTable1BERSTUNDEN_SALDO.AsInteger < 0 then
650
    begin
651
      AFont.Color := clRed;
652
    end;
653
  end;
654
end;
655
 
656
end.