Forum: PC-Programmierung Zeiterfassung - mySQL


von Viktor (Gast)


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:
1
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:
1
db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE Datum = DATE(\'now\');");
2
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:
1
db.execSQL("INSERT INTO Zeiterfassung (Datum, Kommen) VALUES (DATE(\'now\'),\"" + time + "\");");

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

Zur anfänglichen Erzeugung der DB nutze ich das hier:
1
 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!

von sw (Gast)


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;");

von Viktor (Gast)


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
1
db.execSQL("UPDATE Zeiterfassung SET Gehen = \"" + time + "\" WHERE Datum = DATE(\'now\') AND  Gehen = NULL;");
2
3
db.execSQL("  UPDATE Zeiterfassung SET Arbeitszeit=time(strftime(\'%s\', Gehen) - strftime(\'%s\',Kommen), \'unixepoch\') AND  Arbeitszeit = NULL;");

Was stimmt da nicht? :-(/

von Viktor (Gast)


Lesenswert?

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

Gruß

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

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

Gruß
Frank

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


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


Vielleicht statt dem SQL-Murx mal kleinere Broetchen backen.

von Viktor (Gast)


Lesenswert?

@sw:

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

von Pandur S. (jetztnicht)


Lesenswert?

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

von Toto mit Harry (Gast)


Lesenswert?

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

wieso

von Martin G. (Firma: www.engyneer.at) (martin_g697)


Lesenswert?

Und was passiert wenn du 2x auf Kommen drückst?

von Danny Wilde (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.