Subversion Repositories delphiutils

Rev

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.