Subversion Repositories delphiutils

Rev

Rev 80 | Rev 83 | 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.     procedure ADOTable1BeforeScroll(DataSet: TDataSet);
  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
  90. // IDEE: Wochenend-Multiplikator
  91. // IDEE: Manche Tage nicht mitrechnen
  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.  
  120. function MinutenZuHF_Int(min: integer): string;
  121. var
  122.   d: integer;
  123. begin
  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
  139.   if IstLeer(f) then
  140.   begin
  141.     result := '';
  142.   end
  143.   else
  144.   begin
  145.     result := MinutenZuHF_Int(f.AsInteger);
  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;
  218.   ADOTable1.Requery();
  219.  
  220.   bakEv := ADOTable1.AfterPost;
  221.   ADOTable1.AfterPost := nil;
  222.   ADOTable1.DisableControls;
  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;
  248.     ADOTable1.EnableControls;
  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.  
  312. procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
  313. begin
  314.   if (DataSet.State = dsInsert) and (not ADOTable1TAG.IsNull) then Dataset.Post;
  315. end;
  316.  
  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
  343.     if Pos(':', Text) = 0 then
  344.       ADOTable1GEHEN.AsString := Text + ':00'
  345.     else
  346.       ADOTable1GEHEN.AsString := Text;
  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
  364.     if Pos(':', Text) = 0 then
  365.       ADOTable1KOMMEN.AsString := Text + ':00'
  366.     else
  367.       ADOTable1KOMMEN.AsString := Text;
  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;
  381.     test.SQL.Text := 'select * from TAGE where TAG = ''' + DateToStr(Date) + ''' and USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  382.     test.Open;
  383.     if test.RecordCount = 0 then
  384.     begin
  385.  
  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
  412.     if Pos(':', Text) = 0 then
  413.       ADOTable1PAUSE_ENDE.AsString := Text + ':00'
  414.     else
  415.       ADOTable1PAUSE_ENDE.AsString := Text;
  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
  434.     if Pos(':', Text) = 0 then
  435.       ADOTable1PAUSE_START.AsString := Text + ':00'
  436.     else
  437.       ADOTable1PAUSE_START.AsString := Text;
  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
  456.     if Pos(':', Text) = 0 then
  457.       ADOTable1SONSTIGER_ABZUG.AsString := Text + ':00'
  458.     else
  459.       ADOTable1SONSTIGER_ABZUG.AsString := Text;
  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
  473.   if IstLeer(Sender) then
  474.     Text := Sender.AsString
  475.   else
  476.     Text := DateToStr(EchtesDatum(Sender));
  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
  530.     if Pos(':', Text) = 0 then
  531.       ADOTable1ZUHAUSE.AsString := Text + ':00'
  532.     else
  533.       ADOTable1ZUHAUSE.AsString := Text;
  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
  544.   Label2.Caption := MinutenZuHF_Int(RegelArbeitszeit) + ' Std.';
  545.  
  546.   ADOTable1.DisableControls;
  547.  
  548.   ADOTable1.Active := false;
  549.   ADOTable1.ReadOnly := false;
  550.   ADOTable1.Filter := 'USERNAME = ''' + SQL_Escape(ComboBox1.Text) + '''';
  551.   ADOTable1.Filtered := true;
  552.   ADOTable1.Active := true;
  553.  
  554.   ReorgAll;
  555.  
  556.   ADOTable1.Active := false;
  557.   ADOTable1.ReadOnly := ComboBox1.Text <> WUserName;
  558.   ADOTable1.Active := true;
  559.  
  560.   ADOTable1.Last;
  561.   Button1.Enabled := not ADOTable1.ReadOnly;
  562.  
  563.   ADOTable1.EnableControls;
  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.  
  633.   if (Field.FieldName = ADOTable1WOCHENTAG.FieldName) or
  634.      (Field.FieldName = ADOTable1BERSTUNDEN.FieldName) or
  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.
  658.