Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DB Design, Zeiterfassung Wochenweise bündeln (https://www.delphipraxis.net/106399-db-design-zeiterfassung-wochenweise-buendeln.html)

Salomon 10. Jan 2008 10:45

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

mkinzler 10. Jan 2008 10:51

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

Salomon 10. Jan 2008 10:59

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?

mkinzler 10. Jan 2008 11:13

Re: DB Design, Zeiterfassung Wochenweise bündeln
 
Zitat:

Wie bekomme ich denn raus welche Wochen noch nicht abgenommen wurden?
Wenn noch Zeiten dieser Woche vorliegen.

shmia 10. Jan 2008 11:45

Re: DB Design, Zeiterfassung Wochenweise bündeln
 
Für dein Problem könnte dir auch eine Kalendertabelle mit allen Tagen des Jahres helfen:
Code:
Date      | KW | Feiertag|Industrietag|Arbeitstag
==================================================
01.01.2008 |  1 | True   | 1          | False
02.01.2008 |  1 | False  | 2          | True
....
Der Inhalt dieser Tabelle wird vom Programm im vorraus befüllt. Das Feld "Datum" ist der Primärschlüssel.
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

Salomon 10. Jan 2008 11:58

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:
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]))
Am Ende soll's so aussehen:

W02 - 2008 | 07.01.2008 - 13.01.2008 | xy Hours [Bestätigen]

mkinzler 10. Jan 2008 12:09

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.

Jelly 10. Jan 2008 12:14

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.

Salomon 14. Jan 2008 16:26

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;

Salomon 7. Feb 2008 11:11

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.
Seite 1 von 2  1 2      

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