![]() |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Ich (als Hobbyprogrammierer) würde das aber nicht als Mehrfachspeicherung ansehen.
Mehrfachspeicherung würde ich so sehen, dass ein Name oder eine Uhrzeit MEHRFACH in der Datenbank abgelegt sind. Das ist ja aber nicht der Fall. Ich berechne speichere lediglich berechnete Werte in der Datenbank ab und gehe für weitere Berechnungen von diesen aus. Sonst müsste man ja bei jeder Datensatzänderung "unendlich weit" zurück gehen und alles neu ausrechnen. Und was ist, wenn sich inzwischen Regeländerungen bezüglich der Berechnung ergeben haben oder ein früherer Datensatz verändert wurde? Wie geht man denn mit solchen berechneten Werten korrekt vor? Soll man die nicht in einer Datenbank speichern dürfen? stahli |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Die Vorgehensweise ist vielleicht nicht so verkehrt, wenn du dann die alten Daten vor deinem Saldo irgendwann löschst, und stattdessen nur einen Sammelrecord einfügst mit den Übernahmestunden. Kein Mensch wird von dir verlangen, dass du die letzten 40 Jahre deiner Beamtenstunden archivierst.
Öhm... Wieso brauchen Beamten so ein Tool. Ich dacht die machen eh keine Überstunden. :duck: |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
... ja doch, brauchen wir wenn der Wecker kaputt ist, und man länger als bis zum Feierabend schläft ;-)
Ich könnte z.B. jetzt alle Datensätze vor 1899 löschen und das würde die Funktionsweise nicht weiter stören. Man könnte natürlich auch eine extra Tabelle T_BerechneteWerte einführen. Das hielt ich aber nicht unbedingt für sinnvoll, das es für jeden Tag nur einen Datensatz gibt. |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Letztendlich hängt es davon ab, wie die jeweiligen Anforderungen sind. Beim Threadersteller sieht es wohl so aus:
Person X, Tätigkeit A, von, bis Person X, Tätigkeit B, von, bis Person Y, Tätigkeit A, von, bis Ohne jetzt genau zu wissen, wie schnell die Berechnung innerhalb der DB durchgeführt wird, würde ich die Salden aus den "von" und "bis" Zeiten berechnen lassen. |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
@guidok: Genau so siehts jetzt bei mir aus. Ich habe mich nun doch entschieden für die von/bis Felder den MS SQL DateTime Typ zu verwenden. Mein Formular zum Aufnehmen der Zeiten funktioniert jetzt soweit :)
Nun bin ich dabei die Zeitspannen zu Berechenen. (In stunde/min zwischen zwei DateTime Werten) Einige Infos dazu habt ihr ja schon weiter oben aufgeführt. So ganz klar ist mir das allerdings noch nicht :gruebel: Zitat:
|
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Der ganzzahlige Teil von TDateTime enthält den Tag, der Nachkommateil die Stunden, Minuten, Sekunden und Millisekunden (0,5 entspricht 12 Uhr Mittags).
Du kannst die Differenzzeit von DateTime genau so ermitteln wie von Time. Bei Umwandlung in Time musst Du noch beachten, dass Du nicht über einen Tageswechsel hinaus kommst. Sonst funktioniert das ganze natürlich nicht mehr (1:00 Uhr - 23:00 Uhr). Also kannst Du die Zeiten besser einfach aus den TDateTime berechnen. Die Formatierung der Ausgabe (z.B. "2:45 h") musst Du dann programmseitig übernehmen. stahli |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Zitat:
1. Mit Delphi
Delphi-Quellcode:
2. Mit MSSQL
Var
a,b : TDateTime; d : Double; m : Integer; Begin a := StrToDateTime('24.10.2007 13:50'); b := StrToDateTime('26.10.2007 19:19'); d := b-a; // Delphi kann das m := Trunc (1440*d+0.5); // Aufgeerundete Minuten ausrechnen End;
SQL-Code:
Der SQL-Server berechnet sowas 'wupps' mal eben (dazu sind sie ja da).
Select DateDiff (Minute, ZeitBis, ZeitVon) as DauerInMinuten
From MeineZeiterfassung Ich würde also eine Auswertung, wer wieviel gearbeitet hat, so machen:
SQL-Code:
Wenn Du nun immer wieder auf die Differenz in Minuten zugreifen willst, dann richte dir in der Datenbank ein 'berechnetes Feld' ein. Dazu gehst Du im Enterprise-Manager von MSSQL in den Designer-Modus der Tabelle, richtest ein Feld 'Dauer' vom Datentyp 'int' ein und weist den Feldeigenschaften (unten) in der Zeile 'Formula' den Wert 'DateDiff (Minute, ZeitBis, ZeitVon)' zu.
select Person,
Sum (DateDiff (Minute, ZeitBis, ZeitVon)) as Arbeitsdauer from MeineZeiterfassung Group By Person Dann siehst du bei einem Select immer die Dauer ;-) |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Und mit Hilfe geeigneter SQL-Abfragen kannst du jetzt alle möglichen weiteren Informationen (Kombinationen) aus deinen Daten holen, z.B. Tätigkeitsbeschreibung und Dauer die Person X im Zeitraum von A-B ausgeführt hat usw.
Zum Thema redundante Informationen: Falls zur "Person" noch mehr Informationen gehören, z.B. Personalnummer, Adresse, usw. dann solltest du dafür eine weitere Tabelle anlegen mit eben diesen Daten und in der Zeittabelle anstatt der Person die Personalnummer als Verknüpfungsfeld speichern. Aber das weißt du ja eh... |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Wow, danke euch beiden. Jetzt ist Blick ich da durch :)
Was mich wundert, ist das man bei der Datums/Zeitdifferenz * 1440 Nachkommastellen erhält, obwohl z.B. genau eine halbe Stunde rauskomen müsste. Ich denke das wird wohl an den Millisekunden liegen. Mit dem Aufrunden wie in alzaimar Code scheint das ganze aber zuverlässig zu funktionieren. @alzaimar: Die SQL DateDiff Funktion ist ja super :-D Die kann ich für Auswertung wirklich gut gebrauchen. Das Einrichten des Feldes Dauer ist bei mir glaube ich nicht Möglich, da ich die Express Version des Servers nutze. Ansonsten ist das auch eine gute Sache. Hoffen wir mal das mein DB Server für die Berechnungen später schnell genug ist. Sonst muss der aufgerüstet werden, oder ein "vollwertiger" MS SQL Server her ;) @guidok: Danke für den Hinweis auf weitere Tabellen. Das ganze habe ich auch schon so vor. Es gibt dann noch ein paar weitere Tabellen: ua. TB_Activities TB_ActivityType (z.B. billable, travel holiday) etc. TB_Users Tb_Projects (die Zeiten sollen einem User und einem Project zugewiesen werden) Um die Infos alle wieder per SQL auszuwerten werde ich sicher noch einige Fragen stellen ;) |
Re: Zeiterfassung in DB, generelle Vorgehensweise?
Zitat:
Delphi-Quellcode:
Einfach ausführen, und schon hast Du die Spalte.
ALTER TABLE dbo.MeineZeiterfassung ADD Dauer AS DateDiff(Minute, ZeitVon, ZeitBis),
Die Express-Version ist fast genauso gut wie die teure Version. Du müsstest eigentlich die Tools (Enterprise Manager o.ä.) dabei haben. Aber wenn nicht, auch egal. Die Expressversion hat nur Einschränkungen hinsichtlich der Anzahl der CPU (wird maximal eine unterstützt) und -glaube ich- RAM. Aber für deine Anwendung reicht es allemal aus (ist tendenziell sogar ein Overkill). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz