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!
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;");
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;");
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}
(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· 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.