AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Arbeitszeit - Summe Sollstunden
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeitszeit - Summe Sollstunden

Ein Thema von scrat1979 · begonnen am 2. Dez 2016 · letzter Beitrag vom 6. Dez 2016
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

Arbeitszeit - Summe Sollstunden

  Alt 2. Dez 2016, 20:12
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
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!
Michael Kübler
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#2

AW: Arbeitszeit - Summe Sollstunden

  Alt 2. Dez 2016, 20:38
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?
Ich verwende sowas dafür:

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 ...
Alexander
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Arbeitszeit - Summe Sollstunden

  Alt 2. Dez 2016, 20:58
Tabelle Logs: id, fk_mitarbeiter, StartDate, StartTime, EndTime, MinutesWorked (berechnet)
Falls StartDate ein Date und StartTime, EndTime vom Typ Time sind, könnte es
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.
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Arbeitszeit - Summe Sollstunden

  Alt 2. Dez 2016, 21:55
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

Nachtrag: Ach jetzt sehe ich es natürlich In der Schleife werden ja die Output-Variablen gefüllt. Dann ist alles klar!
Michael Kübler
  Mit Zitat antworten Zitat
galex9

Registriert seit: 3. Nov 2006
17 Beiträge
 
#5

AW: Arbeitszeit - Summe Sollstunden

  Alt 5. Dez 2016, 18:37
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;
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Arbeitszeit - Summe Sollstunden

  Alt 5. Dez 2016, 18:43
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Arbeitszeit - Summe Sollstunden

  Alt 6. Dez 2016, 09:31
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Arbeitszeit - Summe Sollstunden

  Alt 6. Dez 2016, 09:57
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.
Ralph
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Arbeitszeit - Summe Sollstunden

  Alt 6. Dez 2016, 11:05
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.
Ich wundere mich immer wieder, dass jeder seine eigenes schreibt. Gefühlt muss es tausende davon geben. Hightlight war bei mir mal 2 (bis 3 je nach Perspektive) plus Stundenzettel als Externer.

Irgendwann muss ich statistisch gesehen wahrscheinlich auch eins schreiben.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:10 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