Arbeitsstunden berechnen falsch

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hallo,

ich arbeite jetzt an meiner 2. DB wo es mal wieder nicht so will wie ich.

Warum ich eine DB benutze ist das auch den Arbeitsstunden eine Rechnung und einen Liste dann über den bericht erstellt werden soll.
Deswegen kein Calc.

Folgendes Problem ich habe eine einfache Tabelle in der Datum, Arbeitsbeginn, Arbeitsende, Pause und Arbeitsort drinne steht.

Um die Arbeitszeit zu berechnen habe ich in der Abfrage geschrieben : DATEDIFF ('hh' , "Arbeitsbeginn", "Arbeitsende") und da errechnet er mir - 17

Arbeitsbeginn: 21:00
Arbeitsende: 04:00

Ich denke es liegt daran das die Arbeitszeit in den nächsten Tag rein geht.
Aber da nicht immer in der Nacht gearbeitet wird weiß ich jetzt nicht so richtig wie ich es schreiben kann.

Für eure Hilfe wäre ich sehr dankbar.

Gruß Vanessa

Ich hänge mal die DB mit ran.
Dateianhänge
Abrechnung.odb
(4.75 KiB) 126-mal heruntergeladen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

die Datenbank kann nicht wissen, dass die Zeiten an verschiedenen Tagen liegen. Wenn Du über einen Tag hinaus Zeiten berechnen willst, so musst Du stattdessen Zeitstempelfelder nehmen: Tabelle → bearbeiten → Feldtyp → Arbeitsbeginn → Datum/Zeit (gleiches für Arbeitsende). Das führende Datum ist dann in der Tabelle wohl überflüssig.

Gruß

Robert
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hi,

jetzt habe ich das in der Tabelle abgeändert, wenn ich jetzt eine Abfrage mache mit der Formel bekomme ich immer eine Fehlermeldung. wie kann ich die Formel Bauen und die pause noch mit einberechnen.

Gruß Vanessa
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

hier der Code, den ich erst einmal nutzen würde:
---korrigierte Version---

Code: Alles auswählen

SELECT "ID", "Datum", "Arbeitsbeginn", "Arbeitsende", "Pause", "Arbeitsort", (DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ))/60.00 "Arbeitszeit", (DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) - HOUR("Pause")*60 - MINUTE("Pause"))/60.00 "Arbeitszeit-Pause" FROM "Stunden"
Zeiten kannst Du nicht einfach voneinander subtrahieren. Es fehlt so eine Funktion wie TIME_ADD. Deswegen alles in Zahlen umwandeltn, die Stunden wegen der Minuten mit 60 multiplizieren. Alles dann wider durch 60.00 dividieren. Die Nachkommastellen sind wichtig, damit auch Nachkommastellen beim Ergebnis rausgegeben werden.

Gruß

Robert
Zuletzt geändert von RobertG am Mo, 08.02.2016 15:48, insgesamt 1-mal geändert.
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hallo Robert,

ich danke dir schon mal. soweit hat das alles geklappt. auch mit der Pause aber er rechnet in der Arbeitszeit keine min. ich hänge dir einfach mal die Datei an. habe jetzt noch ein Feld hinzugefügt mit Arbeitslohn auch diese berechnung stimmt so weit außer das mit den Min.

Könntest du mir da noch mal helfen bitte?

Gruß Vanessa
Dateianhänge
Abrechnung.odb
(5.14 KiB) 136-mal heruntergeladen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

prinzipiell werden ja die Minuten als Nachkommastellen von Stunden korrekt dargestellt. Wenn Du unbedingt die Minuten- und Stundendarstellung haben möchtest, dann geht so etwas allein für die "Arbeitszeit-Pause"-Spalte ziemlich umständlich:
---korrigierte Version ---

Code: Alles auswählen

RIGHT('0'||(( DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) - HOUR( "Pause" ) * 60 - MINUTE( "Pause" ) ) / 60),2) ||':'||
REPLACE(LEFT((((( DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) - HOUR( "Pause" ) * 60 - MINUTE( "Pause" ) ) /60.00)-(( DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) - HOUR( "Pause" ) * 60 - MINUTE( "Pause" ) ) / 60))*60),2),'.','0')
 "Arbeitszeit-Pause"
Mit || werden Textteile aneinandergefügt. Wird nur /60 statt /60.00 geschrieben, so erhältst Du nur die Stunden. Über RIGHT(...) wird die ermittelte Stundenzahl zuerst vorne mit einer '0' versehen und dann der Text von rechts aus auf 2 Stellen beschnitten.
Jetzt muss noch nach ':' die Minutenzahl neu berechnet werden. Hierzu nutze ich die Berechnung der Stundenzahl mit Nachkommastellen und subtrahiere davon die Anzahl der ganzen Stunden. Das Ganze multipliziere ich mit 60, damit aus den Stundenbruchteilen wieder Minuten werden. Damit auch '00' korrekt dargestellt werden kann muss in dem so erstellten Text noch der Dezimalpunkt durch eine '0' ersetzt werden.
Alles reichlich umständlich, ist mir aber spontan nicht besser eingefallen.

Gruß

Robert
Zuletzt geändert von RobertG am Mo, 08.02.2016 15:47, insgesamt 1-mal geändert.
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hi Robert,

Danke für deine mühe. Raufe mir gleich die Haare entweder bin ich zu blond und die Formel einzubauen oder kein Plan. Erst habe ich es in der SQL Ansicht eingebaut da kam dann immer Syntax Fehler. Dann habe ich es einfach in der Entwurfsansicht eingebaut. So macht er auch eine abfage aber immer noch nicht auf die Minuten. Ich finde den verdammten Fehler nicht.

Ich hänge die Datei noch mal an wie sie jetzt ist.
Dateianhänge
Abrechnung.odb
(5.31 KiB) 131-mal heruntergeladen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

vergiss den ersten Ansatz. Da war ein Schreibfehler drin und deswegen ging alles daneben. Liegt daran, dass ich gerade ein anderes Projekt mache, in dem ich Zeiten in Dezimalzahlen umwandeln muss. In den Abfragen ist irrtümlich 'mm' statt 'mi' enthalten. So reicht die folgende Abfrage völlig:

Code: Alles auswählen

SELECT "ID", "Arbeitsbeginn", "Arbeitsende", "Pause", "Arbeitsort", DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) / 60.00 AS "Arbeitszeit", DATEDIFF( 'mi', "Arbeitsbeginn", "Arbeitsende" ) / 60.00 - HOUR( "Pause" ) - MINUTE( "Pause" )/60.00 AS "Arbeitszeit-Pause"  FROM "Stunden"
Mit dieser Abfrage erhältst Du die Zeiten korrekt, aber eben nicht in der formatierten Fassung. Das war, wenn ich das recht verstehe, auch gar nicht Dein Ziel. Die halbe Stunde in der ersten Zeile habe ich völlig übersehen. Und mit einer 'mm'-Abfrage wäre ja nur die Differenz in Monaten noch zusätzlich draufgerechnet worden.

Gruß

Robert
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hallo Robert,

Danke für deine Hilfe. So langsam verstehe ich es mit der Zeit berechnen.

Jetzt habe ich noch ein anderes Problem ich möchte über ein Formular eine Abfrage machen damit er mir im bericht nur ein bestimmten Zeitraum anzeigt. Ich habe dazu auch was im Forum gefunden http://www.oooforum.de/viewtopic.php?t=63016 aber so klappt es bei mir überhaupt nicht. Ich denke mal das ich irgendein fehler drinne habe oder es geht nicht da ich nicht rein das Datum nehmen. Hast du oder jemand anders eine Idee wie ich das bauen kann. häge mal die DB an so weit wie ich bin.

Gruß Vanessa
Dateianhänge
Abrechnung.odb
(14.36 KiB) 107-mal heruntergeladen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

zuerst einmal ein paar Änderungen in der Tabelle "Filter". Das Feld "ID_F" würde ich als Ja/Nein-Feld setzen. Du schreibst nur einen Filterwert. Weitere Zeilen werden nicht gebraucht. Die Felder "von" und "bis" müssen wie in der Tabelle "Stunden" als Datums/Zeit-Felder ausgelegt werden - ansonsten gibt es Probleme mit dem Vergleich.
Wenn Du all das gemacht hast, dann klappt der folgende Code in einer Abfrage:

Code: Alles auswählen

SELECT * FROM "Stunden" WHERE 
"Arbeitsbeginn" BETWEEN IFNULL((SELECT "von" FROM "Filter" WHERE "ID_F" = TRUE),"Arbeitsbeginn") AND  IFNULL((SELECT "bis" FROM "Filter" WHERE "ID_F" = TRUE), "Arbeitsbeginn") AND 
"Arbeitsende" BETWEEN IFNULL((SELECT "von" FROM "Filter" WHERE "ID_F" = TRUE),"Arbeitsende") AND  IFNULL((SELECT "bis" FROM "Filter" WHERE "ID_F" = TRUE),"Arbeitsende")
Statt immer wieder mit >= und <= zu operieren wird mit BETWEEN abgefragt. Ist der Eintrag in der Tabelle "Filter" leer, so wird einfach mit dem Feld der jeweiligen Zeile verglichen. Alle Datensätze, die einen Eintrag in dem Feld haben, werden dargestellt.

Gruß

Robert
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hallo Robert,

Danke für deine mühe.

Also das soll am Ende so werden das die Daten über ein Formular eingetragen werden. Über ein weiteres Formular wollte ich die Abfrage machen das mir nur die Datensätze vom Januar angezeigt werde und dann wollte ich einen bericht erstellen der über diese Abfrage läuft. Bedeutet das ein bericht mit einer Vorgeschriebenen Rechnung und einmal einen Bericht als Stunden nachweiß. So das diese Person es nur noch Ausdrucken brauch und als Rechnung weiterleiten kann. Deswegen auch diese abfrage über das Formular. es soll nicht groß irgendwo rum gefummelt werden.
Ich hoffe du verstehst so einiger maßen was ich meine.

Wenn ich das jetzt richtig verstanden habe muss ja jedesmal ein hacken im IDf gesetzt werden und wieder rausgenommen werden wenn ich Ihn nicht mehr sehen will.
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

Du benötigst dafür nicht verschiedene Formulare. Schau Dir einmal genau das Formular an, was ich dafür zusammengestellt habe. Da kannst Du Daten eintragen und Daten Filtern - und natürlich den gefilterten Inhalt auch als Basis für einen Bericht nehmen. Um den Bericht aus dem Formular zu starten brauchst Du nur ein ganz kleines Makro. Dann hast Du alles aus einem Formular bedienbar.

Gruß

Robert
Dateianhänge
Abrechnung_Filter.odb
(22.5 KiB) 126-mal heruntergeladen
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Hi Robert,


genauso meinte ich es.

So habe ich das auch im anderen Thread gesehen aber ich habe es nicht hin bekommen zu basteln. Vielen Lieben dank. Wieviele Kaffee schulde ich dir jetzt? :D

Danke Danke Danke


Gruß Vanessa
Vanessa Sturm
**
Beiträge: 27
Registriert: Di, 19.01.2016 17:41

Re: Arbeitsstunden berechnen falsch

Beitrag von Vanessa Sturm »

Huhu,

So nun habe ich endlich wieder die Zeit gefunden an der DB weiter zuarbeiten. Ich wollte jetzt die Berichte erstellen. Da ist mir eingefallen das ich ja nur von eine (Tabelle oder Abfrage) Arbeiten kann. Also habe ich noch mal eine Abfrage erstellt wo die gefilterten Daten und die Errechneten Daten zu sehen sind. Hat auch alles so weit geklappt. Es wird nur das Datum Angezeigt was ich gefiltert habe. Aber jetzt kommst. Er zeitgt es mir 2 x an. Wie kann ich das jetzt machen das er es mir nur einmal anzeigt. Zum leichteren Verständnis hänge ich die DB an.

Gruß Vanessa
Dateianhänge
Abrechnung_Filter.odb
(23.24 KiB) 139-mal heruntergeladen
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Arbeitsstunden berechnen falsch

Beitrag von RobertG »

Hallo Vanessa,

Deine Abfrage enthält zwei Tabellen, die nicht miteinander verknüpft sind. Damit multiplizierst Du die Datensätze der Tabellen miteinander. Da die Filtertabelle nur einen Datensatz enthält, die Tabelle "Stunden" aber 2 Datensätze, kombiniert die Abfrage eben alle Datensätze der Tabelle "Filter" mit der aus "Stunden". Einen Sinn ergibt das so nicht.

Warum nutzt Du für den Bericht nicht direkt die Abfrage "Stunden_Filter"? Die zeigt doch die gefilterten Datensätze. Wenn Du noch zusätzlich die Filterwerte erhalten willst, dann ergänze die Abfrage bzw. tausche einfach den SQL-Code dazu aus:

Code: Alles auswählen

SELECT "Stunden".*,( SELECT "von" FROM "Filter" WHERE "ID_F" = TRUE ) AS "von",( SELECT "bis" FROM "Filter" WHERE "ID_F" = TRUE ) AS "bis" FROM "Stunden" WHERE "Arbeitsbeginn" BETWEEN IFNULL( ( SELECT "von" FROM "Filter" WHERE "ID_F" = TRUE ), "Arbeitsbeginn" ) AND IFNULL( ( SELECT "bis" FROM "Filter" WHERE "ID_F" = TRUE ), "Arbeitsbeginn" ) AND "Arbeitsende" BETWEEN IFNULL( ( SELECT "von" FROM "Filter" WHERE "ID_F" = TRUE ), "Arbeitsende" ) AND IFNULL( ( SELECT "bis" FROM "Filter" WHERE "ID_F" = TRUE ), "Arbeitsende" )
Nicht irritiert sein: "von" und "bis" werden als Zahlen wiedergegeben. Das kannst Du aber durch Formate im Bericht wieder zu Datums- und Zeitwerten abändern.

Gruß

Robert
Antworten