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