mikrocontroller.net

Forum: PC-Programmierung Zeiterfassung - mySQL


Autor: Viktor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

da unsere Firma bisher nicht in ein Zeiterfassungssystem investiert hat, 
habe ich mir eine kleine App fürs Android-Handy geschrieben.
Die App besteht aus zwei simplen Button "Kommen" und "Gehen". Außerdem 
enthält die App eine SQLite-DB, in der Datum, Kommenszeit, Gehenszeit 
und Arbeitszeit gelistet werden soll.

Nun Schritt für Schritt:

1) Ich komme in die Arbeit und klicke auf "Kommen".
Die Software bucht mittels SQL-Query die Kommenszeit am jeweiligen Tag:
INSERT INTO Zeiterfassung (Datum, Kommen) VALUES (DATE('now'),TIME('now'));
Das klappt auch. Ausgabe der App:
[quote]
 DATUM       KOMMEN      GEHEN       ARB.ZEIT
02.12.2017 | 08:05:00  | null   |    null
[/quote]

2) Ich klicke zu Beginn meiner Mittagszeit (diese ist nämlich variabel, 
deshalb kann ich keine feste Pausenzeit vorgeben) auf "Gehen":
Dafür habe ich den SQL-Code geschrieben:
db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE Datum = DATE(\'now\');");
db.execSQL("  UPDATE Zeiterfassung SET Arbeitszeit=time(strftime(\'%s\', Gehen) - strftime(\'%s\',Kommen), \'unixepoch\');");

Dabei wird auch das korrekt angezeigt:
[quote]
 DATUM       KOMMEN      GEHEN       ARB.ZEIT
02.12.2017 | 08:05:00  | 12:05:00   | 04:00:00
[/quote]

3) Ich komme aus der Pause (also am selben Tag) und klicke wieder auf 
"Kommen". Gleicher SQL-Code wie oben bei 1), mit folgender Ausgabe:
[quote]
 DATUM       KOMMEN      GEHEN       ARB.ZEIT
02.12.2017 | 08:05:00  | 12:05:00   | 04:00:00
02.12.2017 | 13:00:00  | null       | null
[/quote]


4) Und HIER NUN DAS PROBLEM. Ich gehe nun final an diesem Tag aus der 
Firma. Ich klicke wieder auf "Gehen" (mit dem selben Code von 2) ) und 
ich erhalte folgende Ausgabe:

[quote]
 DATUM       KOMMEN      GEHEN       ARB.ZEIT
02.12.2017 | 08:05:00  | 16:00:00   | 07:55:00
02.12.2017 | 13:00:00  | 16:00:00   | 03:00:00
[/quote]

Korrekt wäre natürlich folgende Ausgabe:
[quote]
 DATUM       KOMMEN      GEHEN       ARB.ZEIT
02.12.2017 | 08:05:00  | 12:05:00   | 04:00:00
02.12.2017 | 13:00:00  | 16:00:00   | 03:00:00
[/quote]


Hier nochmal die SQL-Abfragen für den Button "Kommen" und "Gehen":

KOMMEN:
db.execSQL("INSERT INTO Zeiterfassung (Datum, Kommen) VALUES (DATE(\'now\'),\"" + time + "\");");

GEHEN:
db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE Datum = DATE(\'now\');");
 db.execSQL("  UPDATE Zeiterfassung SET Arbeitszeit=time(strftime(\'%s\', Gehen) - strftime(\'%s\',Kommen), \'unixepoch\');");

Zur anfänglichen Erzeugung der DB nutze ich das hier:
 db.execSQL("CREATE TABLE IF NOT EXISTS Zeiterfassung(ID INTEGER PRIMARY KEY AUTOINCREMENT, Datum DATE NULL , Kommen TIME NULL, Gehen TIME NULL , Arbeitszeit TIME);");


Wie lautet eine SQL-Abfrage: "wenn ich am gleichen Tag das zweite Mal 
auf "GEHEN" drücke, soll der erste Eintrag vom gleichen Tag der 
Gehenszeit nicht verändert werden, sondern nur der des zweiten 
Eintrags"?

Ich hoffe ihr könnt mir helfen, ich stehe seit Freitag auf dem Schlauch.

Danke schonmal!

Autor: sw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da alle Einträge von DATE(\'now\') upgedatet werden, muss eine 
zusätzliche Bedingung erfüllt werden. Der Inhalt muss "null" sein.


db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE 
Datum = DATE(\'now\') where Gehen IS NULL;");
 db.execSQL("  UPDATE Zeiterfassung SET 
Arbeitszeit=time(strftime(\'%s\', Gehen) - strftime(\'%s\',Kommen), 
\'unixepoch\') where Arbeitszeit IS NULL;");

Autor: Viktor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo sw,

danke für den Vorschlag, aber leider scheint es nicht zu funktionieren.

Habe deinen Code nun mit einer AND-Verknüpfung umgeschrieben, siehe 
Code. Nachdem ich jeweils einmal KOMMEN und dann GEHEN gedrückt habe, 
erscheint:

>  03.12.2017 | 22:35:00 |  null  | null
db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE Datum = DATE(\'now\') AND  Gehen = NULL;");

db.execSQL("  UPDATE Zeiterfassung SET Arbeitszeit=time(strftime(\'%s\', Gehen) - strftime(\'%s\',Kommen), \'unixepoch\') AND  Arbeitszeit = NULL;");


Was stimmt da nicht? :-(/

Autor: Viktor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah sorry...hatte mit der Hin- und Herkopiererei selber einen Fehler 
gemacht.
Ich melde mich!

Gruß

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Viktor
Arbeitszeit = null wird nicht funktionieren. Korrekt ist Arbeitszeit Is 
null.

Gruß
Frank

Autor: (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas hab ich mit der unter Android verfuegbaren "ash" und
einer simplen Textdatei auch zusammengebaut.

Da gibt es aber nur "Kommen", "Gehen" und "Mittag".
Die Daten werden mit einem Kennzeichner in die Datei geschrieben:

20171020 A 07:45
20171020 M 12:00
20171020 E 14:00
20171024 A 08:00
20171024 E 12:00
20171025 A 08:00

Die Auswertelogik macht ein awk-script:

/ A /{L=$1;A=$3;M=0}
/ M /{M=-0.5}
/ E /{if(L!=$1){print("ERROR: missing data",L,$1);exit}
AS=substr(A,1,2);AM=substr(A,4,2)*60/3600;AN=AS+AM
ES=substr($3,1,2);EM=substr($3,4,2)*60/3600;EN=ES+EM
T=EN-AN+M;TL=TL+T
if(M==0){printf("%10s %5s %5s       \t%6.2f\n",substr(L,7,2)"/"substr(L,5,2)"/"substr(L,1,4),A,$3,T)}
if(M<0) {printf("%10s %5s %5s -00:30\t%6.2f\n",substr(L,7,2)"/"substr(L,5,2)"/"substr(L,1,4),A,$3,T)}
}
END{print("--------------------------------------")
printf("Summe %7s:\t\t\t%6.2f\n",substr(L,5,2)"/"substr(L,1,4),TL)
}



Vielleicht statt dem SQL-Murx mal kleinere Broetchen backen.

Autor: Viktor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sw:

Danke für deinen Ansatz, hat funktioniert! :-)

Autor: Zitronen F. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir scheint das Konzept Schrott zu sein, da es zustandsbehaftet ist. Es 
sollte zustandsfrei sein.

Autor: Toto mit Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde da jeden Stamp einmalig inserten und am Ende einen SQLite view 
erzeugen und verarbeiten, ohne Update..

wieso

Autor: Martin G. (martin_g697)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was passiert wenn du 2x auf Kommen drückst?

Autor: Danny Wilde (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag 
#5231948:
> Sowas hab ich mit der unter Android verfuegbaren "ash" und
> einer simplen Textdatei auch zusammengebaut.
Toll, du hast die Funktionen einer DB schlecht nachgepfuscht und nicht 
die schon vorhandene DB mit ihren Funktionen genutzt und dann noch 
unnötigerweise mit der Shell rumpfuschen. Ich hoffe du schreibst 
beruflich keine Software.

> Vielleicht statt dem SQL-Murx mal kleinere Broetchen backen.
Wer kein SQL kann ist dazu verdammt entspr. Funktionalität schlecht 
nachzubilden. Flatfiles als DB-Ersatz ist immer Murks^10, auch bei so 
einem Furzprojekt. Flatfiles mit ihren Problemen waren DER Grund warum 
man Datenbanken entwickelte.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.