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 1 von 5  1 23     Letzte »    
Benutzerbild von Salomon
Salomon

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

Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 10:53
Datenbank: MS SQL 2005 • Zugriff über: ADO
Hallo DPler,
ich bin gerade dabei eine Art Zeiterfassung zu programmieren. Jeder User soll pro Tag mehrere Zeiträume eingeben können in denen er gearbeitet hat, und woran.

Später soll mit FastReports ein monatlicher Report erstellt werden, indem die Stunden für die einzelnen Arbeitstage aufgelistet sind.

Nun stellt sich mir die Frage wie ich dies am besten in der Datenbank abbilde. Empfiehlt es sich für jeden Zeitraum einen Datensatz anzulegen? z.B. in einer solchen Tabelle

TB_Hours
=========
UserID
Date
FromTo
ToHour
Task


Sollte ich die Zeiträume Minutengenau aufnehmen oder die Industriezeit verwenden?

Ich weiß das das noch relative ungenaue Fragen sind, brauche aber einfach ein paar Ideen zur Vorgehensweise. Evtl. hat ja schon einer Erfahrung.

Gruß
Marcus
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 10:57
Ich würde nur die jeweiligen Beginn- und Endzeitpunkte erfassen und die Dauer bei Bedarf ohne Überschneidungen berechnen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 11:18
Quasi so wie meine Tabelle oben. Ich habe mich da ein wenig mit den Namen vertan...

Wie prüfe ich mit SQL Allerdings ab, ob die neue Zeitspanne nicht schon in eine existierende fällt, oder sich mit einer überschneidet? das ist mir noch nicht so klar.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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

Registriert seit: 3. Mär 2006
Ort: Schopfloch
163 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 11:22
Hallo,

mit diesem Thema habe ich mich auch mal beschäftigt. Ich gebe mkinzler recht.
Damals habe ich Ereignisse gespeichert und die Salden durch Abklappern aller Ereignisse berechnet.
Damit lassen sich dann auch automatische Pausen, unplanmäßgie Pausen, Kommentare/Meilensteine und Zeiträume über Taggrenzen hnweg leicht bearbeiten. Auch lassen sich so Anwesenheiten und Aufwandserfassung mit dem gleichen Datenmodell beschreiben.
Der Datensatz sah etwa so aus:
Delphi-Quellcode:
Satzart: set(kommt, geht, Pause Anfang, Pause Ende, etc.)
Zeitpunkt: timestamp
Kommentar: string
Zur Speicherung habe ich damals XML benutzt, da das Ganze stand alone laufen sollte. Ist auch nie richtig fertig geworden

Allerdings ist der Progrmmieraufwand natürlich größer, als wenn Du Deine atensätze "formularmäßig" aufbaust.

Ich bin an dem Thema immer noch interessiert. Vielleicht kannst Du mich auf dem Laufenden halten?

Gruß Andreas

ps. mit meinem Modell ist hast Du die Problematik nicht, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#5

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 11:23
Wenn der Tag gleich ist, dann darf
  • Ein neuer Startzeipunkt nicht zwischen einem Start- und Ende oder
  • ein neuer Endzeitpunkt nicht zwischen einem Start- und Ende
eines bereits existierenden Datensatzes liegen.

That's it.

Bzw. in SQL

SQL-Code:
select count(*) from table where
(start < NeuStart and NeuStart < ende) OR
(start < NeuEnde and NeuEnde < ende)
Ist Count > 0 gibts ne Überschneidung.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 11:28
Ah, das sollte gehen. Danke

Dann mach ich mich erstmal an die Umsetzung und melde mich wenn ich wieder irgendwo hänge.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 11. Okt 2007, 11:36
http://www.delphipraxis.net/internal...t.php?t=120385
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 12. Okt 2007, 09:19
Mmh, von meinem MSSQL Server bekomme ich mit dem folgenden SQL Statement immer 0 zurück, obwohl für den Zeitraum ein Datensatz vorhanden ist. Kann das daran liegen das FromHour und ToHour in der DB als DateTime Datentyp deklariert sind?

Sieht für mich sonst ganz gut aus

Delphi-Quellcode:
  ADOQuery.SQL.Text :='SELECT COUNT(*) as DataExists FROM TB_AM_Hours WHERE' +
                      ' ((:FromHour BETWEEN FromHour and ToHour) ' +
                      ' or ' +
                      ' (:ToHour BETWEEN FromHour and ToHour))' +
                      ' and FK_UserID = :FK_UserID '+
                      ' and FK_ProgramID = :FK_ProgramID ' +
                      ' and Date = :Date ;';

                       ADOQuery.Parameters.ParamByName('FK_UserID').Value := 1
                       ADOQuery.Parameters.ParamByName('FK_ProgramID').Value := 1;
                       ADOQuery.Parameters.ParamByName('Date').Value := ActualDate;
                       ADOQuery.Parameters.ParamByName('FromHour').Value := FromTime.Time;
                       ADOQuery.Parameters.ParamByName('ToHour').Value := ToTime.time;

  ADOQuery.Open;

  if ADOQuery.FindField('DataExists').AsInteger > 0 then
  begin
    showmessage('Zeitraum belegt!');
  end;
MfG
Marcus
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
 
#9

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 12. Okt 2007, 09:40
Hallo Salomon,

ich habe mal sowas für unser Amt geschrieben. (SK=Stechkarte)
Allerdings mit der BDE und Paradox. Läuft amer auch im Netzwerk ordentlich.

Die Zeiten speichere ich als Minuten. So lassen sich die Differenzen am besten berechnen. In dem Fall sind nur Zeiten über Mitternacht hinaus nicht möglich. (Aber so lange arbeiten wir ja nicht )
Über GetText und SetText wird die Ein- und Ausgabe dann formatiert. Ein großer Vorteil dabei:
16:45 Uhr kann auch als "16,45" über den Nummernblock oder "16 45" eingegeben werden. Das ist für den Nutzer sehr komfortabel.

Mein Programm erzeugt im Adminmodus monatliche Reports über die Überstunden der Nutzer für das Personalamt, gruppiert nach Nutzergruppen (Teilzeitarbeiter, Vorruheständler etc.)

Ich bin nicht wirklich stolz drauf (ist ziemliches Stückelwerk), aber wenn Du es als Anregung mal haben willst, kann ich es am WE mal hochladen...

Stahli

Nachtrag:
- die Überstunden werden automatisch in den nächsten Monat übernommen
- ist ein Monat vollständig eingegeben, kann der "Chef" die Einträge vergleichen und bestätigen
- danach kann der Nutzer nichts mehr ändern
- Feiertage, Urlaub etc. werden im Feld Status eingetragen
- Feld Extra steht für sonstige Zeiten, die nicht in´s normale Schema passen
- gewerkschaftliche Mindestpausen werden automatisch von der Arbeitszeit abgezogen
Miniaturansicht angehängter Grafiken
sk-admin_720.gif   sk_198.gif  
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

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

Re: Zeiterfassung in DB, generelle Vorgehensweise?

  Alt 12. Okt 2007, 09:55
Hallo Stahli,
das ist natürlich ein super Angebot Ein Beispiel kann ich gut gebrauchen.
Mein Programm wird etwas anders laufen, da die Mitarbeiter Ihre Zeiten selbst eintragen müssen. Darauf bassierend soll dann ihr monatlicher Report generiert werden, der auch zur Gehaltsabrechnung verwendet wird.

Mein Programmcode ist auch nicht der beste. Das ist kein Problem für mich. Man lernt halt immer weiter und merkt erst später wie umständlich man Teile realisiert hat.

Gruß
Marcus
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 18:44 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