![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Arbeitszeit - Summe Sollstunden
Liebe Delphi-Gemeinde,
Ich richte mich wieder mit einem Problem an euch und bin mir sicher, dass ihr mir auf die richtigen Sprünge helfen könnt. Wie der Titel bereits vermuten lässt, möchte ich für meinen Betrieb eine kleine Zeiterfassung programmieren. Es soll sich dabei nicht um ein professionelles System handeln (wenn es mal eines wird ist es nicht schlimm :) ) sondern soll mir lediglich einen groben Überblick über den aktuellen Status meiner Mitarbeiter vermitteln. Gelogged wird morgens das erscheinen und abends das gehen. Schichten etc. gibt es nicht - die Ausgangslage ist also erstaunlich einfach. Da es trotzdem mehrere Zeitmodelle für verschiedenes Personal gibt (unter anderem Teilzeit) habe ich die folgende Tabellen (gekürzt auf das nötigste und Tabellennamen der Einfachheit halber teilweise geändert - das tut aber nichts zur Sache): Tabelle Mitarbeiter: id, Name, Zeitmodell Tabelle Zeitmodell-Detail: id, DadOfWeek, Arbeitsstunden, fk_zeitmodell Tabelle Zeitmodell: id, Beschreibung Tabelle Logs: id, fk_mitarbeiter, StartDate, StartTime, EndTime, MinutesWorked (berechnet) Das wäre die Ausgangssituation vereinfacht ausgedrückt. Mein Problem ist folgendes: ich möchte die Soll-Arbeitszeit im Monat x für das Zeitmodell y berechnen. Dazu müsste ich quasi die Tage (genauer DayOfWeek) zB 1.12.17-31.12.17 mit den in Zeitmodell-Details hingelegten Daten (Arbeitsstunden) summieren. Aber ich habe keine Tabelle in welcher die Tage 1.12.17...31.12.17 hingelegt sind - sonst könnte man dies ja ganz einfach über einen Join und SUM lösen. Geht das über eine StoredProc? Damit habe ich leider überhaupt keine Erfahrung. In einem ehemaligen Programm (Dienstplaner) habe ich es quick&dirty so gelöst, dass zunächst im Programm geprüft wird ob der Monat x schon existiert und ggf. angelegt wird (das heißt ich hatte hier eine Tabelle mit den einzelnen Tagen des entsprechenden Monats und konnte schön mittels Joins arbeiten). Zweites Problem (welches sich vielleicht alleine über Problem 1 klärt, daher hier im Thread gestellt) ist das herausfinden eines Fehltages eines Mitarbeiters. Natürlich kann man einen Fehlgrund eintragen - aber man kann es auch vergessen. Das heißt die Spalte Logs hätte dann für Mitarbeiter x an Tag y keinen Eintrag. Diese müsste man herausfinden können. Problem wie bei 1. - es fehlt eine Tabelle über die man über die Wochentage mittels Join verbinden kann. Dann wäre das kein Problem. Ich hoffe ihr habt das Problem verstanden und könnt mir weiterhelfen :) verzeiht mir eventuelle Schreibfehler- ich schreibe gerade vom Handy aus und da spielt mir die Rechtschreibprüfung oft unschöne Streiche :) Liebe Grüße und schönes Wochenende! |
AW: Arbeitszeit - Summe Sollstunden
Zitat:
Code:
create or alter procedure SP_JJMMTT (
ADATUM_VON date, ADATUM_BIS date) returns ( DATUM date, JAHR integer, MONAT integer, TAG integer) AS begin JAHR = EXTRACT(YEAR FROM CURRENT_DATE); MONAT = EXTRACT(MONTH FROM CURRENT_DATE); IF (ADATUM_VON is NULL) THEN BEGIN ADATUM_VON = CAST(JAHR||'-'||MONAT||'-01' AS DATE); END IF (ADATUM_BIS is NULL) THEN BEGIN ADATUM_BIS = CAST(JAHR||'-'||MONAT||'-01' AS DATE); ADATUM_BIS = DATEADD( 1 MONTH to ADATUM_BIS); ADATUM_BIS = DATEADD( -1 DAY to ADATUM_BIS); END JAHR = NULL; MONAT = NULL; DATUM = ADATUM_VON; WHILE (DATUM <= ADATUM_BIS) DO BEGIN JAHR = EXTRACT(YEAR from DATUM); MONAT = EXTRACT(MONTH from DATUM); TAG = EXTRACT(DAY from DATUM); suspend; DATUM = DATEADD( 1 DAY to DATUM); END end
Code:
select
TT.DATUM, TT.MONAT, TT.TAG .... from SP_JJMMTT('01.12.2017', '31.12.2017') TT left join DeineTabelle ... |
AW: Arbeitszeit - Summe Sollstunden
Zitat:
problematisch werden, wenn mal doch jemand - ganz ausnahmsweise - ein paar Überstunden machen muss und erst nach 00:00 Uhr Feierabend macht. Dann hast du ein Problem mit EndTime. Mein Vorschlag wäre: StartDate weglassen und StartTime, EndTime als TimeStamp. Damit wären auch mehrere Einträge je Tag möglich. |
AW: Arbeitszeit - Summe Sollstunden
Besten Dank für Deine Antwort. Ich werde mir Deine Lösung mal genau anschauen, momentan ist mir noch nicht ganz klar, was die StoredProc genau macht. Bisher kenne ich nur StoredProcs mit "SELECT...INTO" - aber ich werde schon durchblicken :-) Immerhin scheint es exakt die Lösung für das Problem zu sein, was ich habe.
Das Problem mit dem StartTime und EndTime ist mir wohl bewußt, aber ich kann Überstunden bis 00:00 Uhr definitv ausschließen :-) Trotzdem wäre es schöner, es gleich "richtig" zu machen, also werde ich es so machen wie von Dir vorgeschlagen. Zwei Einträge pro Tag wären aber bei mir auch möglich, dann gibt es eben 2 Einträge mit dem gleichen StartDatum und verschiedenen Zeitspannen. Nochmals danke für Deine schnelle Lösung - werde es gleich mal versuchen zu verstehen und dann mal auf meine Tabelle anwenden :thumb: Nachtrag: Ach jetzt sehe ich es natürlich :-) In der Schleife werden ja die Output-Variablen gefüllt. Dann ist alles klar! |
AW: Arbeitszeit - Summe Sollstunden
Ich würde solche Berechnungen nicht in der DB machen, da man auch Wochenenden und Feiertage berücksichtigen muss.
Damit die Sollzeit nicht jedes mal berechnet wird kann man die pro Mitarbeiter und Monat ruhig in DB speichern.
Code:
function WorkDaysInMonth(AMonth: TDate): Byte;
var i: Word; CalcDate: TDate; begin if not FCalculateTime then Result := ReadWorkDaysFromDb() else begin Result := 0; CalcDate := StartOfTheMonth(AMonth); for i := 1 to DaysInMonth(CalcDate) do begin // Wochenende und Feiertage nicht berechnen if (DayOfTheWeek(CalcDate) < DaySaturday) and (not IsHoliday(CalcDate)) then Inc(Result); CalcDate := IncDay(CalcDate); end; end end; ..... WorkTimeInMonth := WorkDaysInMonth(Date) * WorkTimePerDayForEmployee; |
AW: Arbeitszeit - Summe Sollstunden
Da kann ich der Empfehlung von Galex nur zustimmen. Damit bist du vor allem
flexibel, wenn doch mal Schichtsystem oder Überstunden usw. darüber laufen sollen. |
AW: Arbeitszeit - Summe Sollstunden
Ich weiß nicht ob ich Dich da richtig verstanden habe, aber wenn Du die Daten auch für die Vergangenheit benötigst, sollte die Sollarbeitszeit (was immer man darunter versteht) in der DB als Datum vorhanden sein. Das muß nicht für jeden Tag und Mitarbeiter ein Datensatz sein, U.U. reicht auch eine Berechnungsvorschrift, wäre aber meiner Meinung nach empfehlenswert. Auch die Aussage "nie über Mitternacht hinaus" ist etwas kurzsichtig. Umrüstung von Produktionsmaschinen oder Wartung von Servern hält sich oft nicht an solche Begrenzungen.
Gruß K-H |
AW: Arbeitszeit - Summe Sollstunden
Auch wenn man es ursprünglich nicht will und meint in seiner Branche es vllt. nicht zu brauchen, so werden solche Zeiterfassungstools doch schnell aufwendiger als gedacht. Was ich von solchen Programmen weiß ist, dass es Sinn machen kann mit (ggf. unterschiedlichen) Zeitkonten und Salden zu arbeiten und diese durch einen automatischen nächtlichen Job auf den neuesten Stand bringen zu lassen.
|
AW: Arbeitszeit - Summe Sollstunden
Zitat:
Irgendwann muss ich statistisch gesehen wahrscheinlich auch eins schreiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz