Subversion Repositories delphiutils

Rev

Rev 78 | Rev 80 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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;
  33.     ADOTable1BEMERKUNG: TStringField;
  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
  89. // IDEE: Wochenend-Multiplikator
  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.  
  118. function MinutenZuHF_Int(min: integer): string;
  119. var
  120.   d: integer;
  121. begin
  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
  137.   if IstLeer(f) then
  138.   begin
  139.     result := '';
  140.   end
  141.   else
  142.   begin
  143.     result := MinutenZuHF_Int(f.AsInteger);
  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;
  216.   ADOTable1.Requery();
  217.  
  218.   bakEv := ADOTable1.AfterPost;
  219.   ADOTable1.AfterPost := nil;
  220.   ADOTable1.DisableControls;
  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;
  246.     ADOTable1.EnableControls;
  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;
  368.     test.SQL.Text := 'select * from TAGE where TAG = ''' + DateToStr(Date) + ''' and USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  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
  450.   if IstLeer(Sender) then
  451.     Text := Sender.AsString
  452.   else
  453.     Text := DateToStr(EchtesDatum(Sender));
  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
  518.   Label2.Caption := MinutenZuHF_Int(RegelArbeitszeit) + ' Std.';
  519.  
  520.   ADOTable1.DisableControls;
  521.  
  522.   ADOTable1.Active := false;
  523.   ADOTable1.ReadOnly := false;
  524.   ADOTable1.Filter := 'USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  525.   ADOTable1.Filtered := true;
  526.   ADOTable1.Active := true;
  527.  
  528.   ReorgAll;
  529.  
  530.   ADOTable1.Active := false;
  531.   ADOTable1.ReadOnly := ComboBox1.Text <> WUserName;
  532.   ADOTable1.Active := true;
  533.  
  534.   ADOTable1.Last;
  535.   Button1.Enabled := not ADOTable1.ReadOnly;
  536.  
  537.   ADOTable1.EnableControls;
  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.  
  607.   if (Field.FieldName = ADOTable1WOCHENTAG.FieldName) or
  608.      (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) or
  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.
  632.