Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zeiterfassung in DB, generelle Vorgehensweise? (https://www.delphipraxis.net/101319-zeiterfassung-db-generelle-vorgehensweise.html)

Salomon 11. Okt 2007 10:53

Datenbank: MS SQL 2005 • Zugriff über: ADO

Zeiterfassung in DB, generelle Vorgehensweise?
 
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

mkinzler 11. Okt 2007 10:57

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
Ich würde nur die jeweiligen Beginn- und Endzeitpunkte erfassen und die Dauer bei Bedarf ohne Überschneidungen berechnen.

Salomon 11. Okt 2007 11:18

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
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.

Andreas H. 11. Okt 2007 11:22

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
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 :cry:

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?

Phoenix 11. Okt 2007 11:23

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
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.

Salomon 11. Okt 2007 11:28

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
Ah, das sollte gehen. Danke :)

Dann mach ich mich erstmal an die Umsetzung und melde mich wenn ich wieder irgendwo hänge.

mkinzler 11. Okt 2007 11:36

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
http://www.delphipraxis.net/internal...t.php?t=120385

Salomon 12. Okt 2007 09:19

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
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 :gruebel:

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

stahli 12. Okt 2007 09:40

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

Salomon 12. Okt 2007 09:55

Re: Zeiterfassung in DB, generelle Vorgehensweise?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.
Seite 1 von 5  1 23     Letzte »    

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