Datenbank: MS SQL • Zugriff über: ADO
DB Design, Zeiterfassung Wochenweise bündeln
Hallo,
ich erfasse in einer Tabelle die täglichen Stunden der Mitarbeiter. Das sieht ungefähr so aus: TB_Hours ======== Date From To Task Nun muss ich die einzelnen Tage irgendwie Wochenweise bündeln und von einer Person mit einem Klick bestätigrn lassen. Danach müssen alle Stunden für die Woche gesperrt werden. Wie setze ich sowas in einer DB um? Thanx Marcus |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Gibt es mehrere Datensätze pro Tag?
Erweitere Tabelle um Feld für Sperre. Die Termine einer Woche würde ich nur per Select filtern |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Hi mkinzler,
ja ein Tag besteht meist aus mehreren Datensätzen. Die einzlenen Zeitabschnitte eines Tages per "Sperrflag" zu makieren hatte ich auch schon überlegt. Mit dem Bestätigen der Zeiten könnte man es ähnlich machen. Wie bekomme ich denn raus welche Wochen noch nicht abgenommen wurden? |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Zitat:
|
Re: DB Design, Zeiterfassung Wochenweise bündeln
Für dein Problem könnte dir auch eine Kalendertabelle mit allen Tagen des Jahres helfen:
Code:
Der Inhalt dieser Tabelle wird vom Programm im vorraus befüllt. Das Feld "Datum" ist der Primärschlüssel.
Date | KW | Feiertag|Industrietag|Arbeitstag
================================================== 01.01.2008 | 1 | True | 1 | False 02.01.2008 | 1 | False | 2 | True .... Für 10 Jahre in die Zukunft musst du mit ~ 3650 Datensätzen rechnen; das sollte kein Problem sein. Damit kann man leicht JOINs mit deiner Tabelle TB_Hours herstellen. Folgende Abfrage liefert alle Zeiten aus Kalenderwoche 2:
SQL-Code:
SELECT TB_Hours.* FROM
TB_Hours INNER TB_Kalender ON TB_Hours.Date=TB_Kalender.Date WHERE TB_Kalender.KW = 2 |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Hi Andreas,
deine Methode müsste ganz gut funktionieren :) Daran probiere ich mich mal. Tageweise kann ich die Stunden ja wie folgt bündeln:
SQL-Code:
Am Ende soll's so aussehen:
Select ActivityDate, SUM(TimeSpan) as TimeSpan from tb_am_hours
where locked = 0 group by ActivityDate; Zeitspannen speichere mit in der TB_Hours ab: (datediff(minute,[FromHour],[ToHour])) W02 - 2008 | 07.01.2008 - 13.01.2008 | xy Hours [Bestätigen] |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Ob sich eine eigene Tabelle für die Arbeitstage lohnt, kommt darauf an, wie oft man die Auswertung braucht. Obwohl diese keine Brot frisst.
Man könnte das natürlich auch dynamisch z.B. mit einer SP machen. |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Eine Kalendertabelle halte ich auch für eine gute Idee, denn dort kannst du auch nachträglich eventuell noch interessante Flags anbinden (Feiertag z.B.)
Das Ganze zu joinen sollte kaum Resourcen fressen. Zur Berechnung der Kalenderwoche zu einem Datum kannst du die Funktion DatePart aus T-SQL nutzen, und dann danach gruppieren. |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Hier mal ne kurze Procedure um die Tabelle zu füllen:
Delphi-Quellcode:
procedure TFRM_AM_Administration.Button22Click(Sender: TObject);
Var Date : TDate; i : integer; ADOQuery : TADOQuery; begin ADOQuery := TADOQuery.Create(self); ADOQuery.Connection := FRM_Main.ReadConnection; Date := StartOfAYear(2008); for I := 1 to DaysInYear(Date) do begin Listbox5.Items.Add(DateToStr(Date)+ '|'+ IntToStr(WeekOf(Date))); ADOQuery.sql.text := 'INSERT INTO TB_AM_Calendar (Date, KW) VALUES '+ ' (:Date, :KW)'; ADOQuery.Parameters.ParamByName('Date').Value := Date; ADOQuery.Parameters.ParamByName('KW').Value := WeekOf(Date); ADOQuery.ExecSQL; sleep(10); Date := IncDay(Date,1); end; ADOQuery.free; end; |
Re: DB Design, Zeiterfassung Wochenweise bündeln
Hallo,
ich muss diesen Thread noch einmal reaktvieren. Wie handhabe ich denn den Jahreswechsel? KW1 von 2009 hat ja auch Tage in 2008... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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