Datensatz splitten

quidnovi

Erfahrenes Mitglied
Hallo Gemeinde,

mit folgender Abfrage
PHP:
$sql = "SELECT * FROM r_abrechnung WHERE datTag BETWEEN '$von' AND '$bis' ORDER BY 'datTag' asc";

(echo $sql: SELECT * FROM r_abrechnung WHERE datTag BETWEEN '2007-01-01' AND '2007-01-03' ORDER BY 'datTag' asc)

erhalte ich folgendes Ergebnis, welches in eine txt Datei geschrieben wird.
1.1.2007;10;155;1;5;
1.1.2007;20;155;1;4; (dieser Eintrag ist zu ändern)
2.1.2007;20;100;1;5;
2.1.2007;20;100;1;4; (dieser Eintrag ist zu ändern)

Erkläre:
Datum
Auftragsnummer(n):10, 20
Mitarbeiternummer(n): 155, 100
Lohnart: 1
Stunden pro Eintrag: 5, 4

Die Stunden werden pro Tag und Mitarbeiter addiert.
Also hat der Mitarbeiter 155 am 1.1.2007 9h geleistet. Nun muss ich aus dem Eintrag der die Endzeit 16:30 hat, die 30 Minuten abziehen und einen neuen Eintrag mit dieser halben Stunde hinzufügen.
Das Ganz Prozedere wird aber nur dann benötigt wenn der Mitarbeiter über 8,5h geleistet hat, denn diese 0,5h haben die Lohnart 29, während die 8,5h die Lohnart 1 haben.

Die Einträge die zu ändern sind:
a) 12:30 - 16:30 (Lohnart 1)
b) 12:30 - 16:30 (Lohnart 1)

sollen dann so aussehen:
a) 12:30 - 16:00 (Lohnart 1)
16:00 - 16:30 (Lohnart 29)

b) 12:30 - 16:00 (Lohnart 1)
16:00 - 16:30 (Lohnart 29)

damit die txt Datei im Endeffekt so aussieht:
1.1.2007;10;155;1;5;
1.1.2007;20;155;1;3.5;
1.1.2007;20;155;29;0.5;

2.1.2007;20;100;1;5;
2.1.2007;20;100;1;3.5;
2.1.2007;20;100;29;0.5;


Also muss ich die betreffenden Datensätze splitten, ob im txt File oder in der DB ist eigentlich egal.
Bitte nennt mir einen Weg, auf dem ich das lösen kann, weiß momentan nicht einmal wo ich überhaupt ansetzen soll.

Bitte um Hilfe, danke
 
Zuletzt bearbeitet:
Ich würde in der Datei gar ned so gross rumschreiben, sondern das schon vor dem DB-Insert machen. Meine Idee dazu: Du errechnest die Differenz zwischen "normal-Arbeitszeit" und "geleisteter Arbeit", indem Du beide Daten in einen UNIX-Zeitstempel umwandelst (mit Datum und Uhrzeit) und damit als Ergebnis erstmal Sekunden als Differenz erhalten wirst, mit denen Du dann einen neuen Eintrag in der DB generierst - Die daten müssen ja vor dem Insert bekannt sein, ergo kann man das ja VOR dem Insert-Befehl so lösen denke ich mal

LG
Andy
 
das habe ich vergessen zu erwähnen:
Die Arbeitszeiten werden von ca 50 User über ein Eingabeformular in die Db eingetragen. Auf diesem Formular kann man diese Einträge auch wieder verändern.

Somit habe ich die Daten erst nach dem Insert.

Natürlich könnte ich die Daten, sobald sie in die Db eingegeben werden, immer wieder neu berechnen.
Nur käme mir der Aufwand geringer vor, diese Berechnungen erst dann durchzuführen, wenn die Tage abgeschlossen werden.

Oder liege ich da falsch?
 
Alternativ könntest du auch ein XML-File generieren - somit brauchst du keine DB und bist flexibel, um die Daten zu ändern. Zudem sparst du das Parsen eines Textfiles
 
Hallo, ich greife mal den Ansatz von andy72 auf:

mit timestamps zu arbeiten, finde ich im Vergleich zu anderen Möglichkeiten einfacher (na gut ich mach das jetzt auch schon 2 Jahre so, für mich ist es also selbstverständlich)

Die Arbeitszeiten werden von ca 50 User über ein Eingabeformular in die Db eingetragen. Auf diesem Formular kann man diese Einträge auch wieder verändern.

Ist absolut kein Problem:
Du hast beispielsweise ein Inputfeld "date" mit dem Value "01.01.2007 16:30" (bzw. könnten es die User so einragen). Nach dem Abschicken des Formulars nutzt du den folgenden Codeschnipsel
PHP:
$date = $_POST['date']; // etwas übersichtlicher als überall $_POST[] zu schreiben
$datetime = explode(" ", trim($date)); $date_d = explode(".", $datetime[0]); $date_t = explode(":", $datetime[1]);
if ( ( $date_t[0] >= 0 ) && ( $date_t[0] <= 24 ) && ( $date_t[1] >= 0 ) && ( $date_t[1] < 60 ) && ( $date_d[1] >= 1 ) && ( $date_d[1] <= 12 ) && ( $date_d[0] >= 1 ) && ( $date_d[0] <= 31 ) )
$date = mktime($date_t[0], $date_t[1], 00, $date_d[1], $date_d[0], $date_d[2]);
Dieser wandelt dir das Datum "01.01.2007 16:30" in einen Timestamp um.

Wenn du die Werte aus der Datenbank auslesen tust, kannst du das mit der Funktion strftime() nach deinem Wunsch formatieren und zb beim Bearbeiten durch den Mitarbeiter direkt in das Formularfeld schreiben. Bsp:
PHP:
// zeigt das Datum dann im Format tt.mm.jjjj hh:mm an zb: 01.01.2007 16:30
<input type="text" name="date" value="<?=strftime("%d.%m.%Y %H:%M", $row['date'])?>">

Das ganze kannst du für jedes beliebige Formularfeld mit Zeitangabe nutzen ... Formular-Feldnamen beachten.
Kleines Gimmick am Rande: du kannst deinem User voreingestellte Werte beim erstmaligen ausfüllen anbieten, bsp:

PHP:
// das momentane Datum zum Zeitpunkt des Seitenaufrufs zb: 01.01.2007 12:45
<input type="text" name="date" value="<?=strftime("%d.%m.%Y %H:%M", time())?>">

Rechnen kannst du dann sozusagen immer mit Sekunden und dir deine Zeiten beliebig "zerlegen".

mfg
 
bringt denn strftime() einen Vorteil gegenüber date() ?
einfacher zu tippen ist doch date("d.m.Y H:i") als strftime, womit ich 2 Funktionen aufrufe ;)
abgesehen davon kann man einen zeitstempel in Form mit date("Y-m-d H:i:s") in der DB speichern und mit date("d.m.Y H:i", strtotime($row['datum'])) wieder rausholen *find*
 
Sicher das wäre auch eine Möglichkeit, ich finde aber strftime in dem Fall kompfortabler, denn mit dem reinen Timestamp zb 117564358934 kann man wesentlich leichter rechnen.
Aber das ist nur meine Meinung dazu. Wie in vielen Dingen entscheidet hier die Geschmacksfrage.

mfg
 
Hi,

boah, mit so einer Resonanz habe ich jetzt nicht gerechnet. Vielen Dank für Euer Bemühen.

Das mit der Zeit in Sekunden ist eine hervorragende Idee! Das eröffnet ja mehrere Möglichkeiten, wie zum Beispiel auszufiltern, dass es den 31.Februar nicht geben kann, usw.

Des Weiteren lässt sich wirklich viel leichter rechnen. Werde das mal so umsetzen.

Bin immer wieder begeistert von diesem Forum!!
 
Zuletzt bearbeitet:
Zurück