AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Zeiterfassung in DB, generelle Vorgehensweise?
Thema durchsuchen
Ansicht
Themen-Optionen

Zeiterfassung in DB, generelle Vorgehensweise?

Ein Thema von Salomon · begonnen am 11. Okt 2007 · letzter Beitrag vom 17. Okt 2007
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#31

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 16. Okt 2007, 08:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#32

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 16. Okt 2007, 08:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#33

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 16. Okt 2007, 09:05
... 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.
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#34

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 16. Okt 2007, 11:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#35

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 09:31
@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

Zitat:
Die Differenz zweier TDateTime-Werte ist aber kein Datum sondern ein Float-Wert, der die Anzahl der Tage (ink. Dezimalwerten) wiederspiegelt. Insofern ist die Differenz hier 1 + 30/1440, oder 1,020833. Und das ist doch genau das Ergebnis, das wir haben wollen.
Wenn Du das in Minuten umrechnest, musst Du nur mit 1440 multiplizieren und erhälst als Ergebnis 1470. Was willst Du mehr?
Mit welchen Befehl wandel ich den DateTime Wert in einen Time Wert um? Wie ich guidok verstanden habe ist die Differenzberechnung dann wohl einfacher.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#36

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 09:39
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#37

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 10:00
Zitat von Salomon:
So ganz klar ist mir das allerdings noch nicht

Zitat:
Die Differenz zweier TDateTime-Werte ist aber kein Datum sondern ein Float-Wert, ....
Mit welchen Befehl wandel ich den DateTime Wert in einen Time Wert um? Wie ich guidok verstanden habe ist die Differenzberechnung dann wohl einfacher.
Also:
1. Mit Delphi
Delphi-Quellcode:
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;
2. Mit MSSQL

SQL-Code:
Select DateDiff (Minute, ZeitBis, ZeitVon) as DauerInMinuten
From MeineZeiterfassung
Der SQL-Server berechnet sowas 'wupps' mal eben (dazu sind sie ja da).

Ich würde also eine Auswertung, wer wieviel gearbeitet hat, so machen:

SQL-Code:
select Person,
       Sum (DateDiff (Minute, ZeitBis, ZeitVon)) as Arbeitsdauer
from MeineZeiterfassung
Group By Person
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.

Dann siehst du bei einem Select immer die Dauer
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#38

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 10:35
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...
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#39

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 10:42
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 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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#40

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 17. Okt 2007, 10:53
Zitat von Salomon:
@alzaimar: Einrichten des Feldes Dauer ist bei mir glaube ich nicht Möglich, da ich die Express Version des Servers nutze.
Doch doch, passt scho'. Kukustu;

ALTER TABLE dbo.MeineZeiterfassung ADD   Dauer AS DateDiff(Minute, ZeitVon, ZeitBis), Einfach ausführen, und schon hast Du die Spalte.

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).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz