Nochmal vielen Dank, ich werde mir Deine Tips zu Herzen nehmen.
Das Benutzer-Array sieht so aus:
[0] => Array ( [uid] => 3 [persnr] => 58 [persnr4] => 0058 [nachname] => K.. [vorname] => S.. [anteil] => 100 [kst] => 2302 [sollzeit] => 160 [lohn] => 0 [stdsatz_soll] => 0 ) [1] => Array ( [uid] => 4 [persnr] => 52 [persnr4] => 0052 [nachname] => R.. [vorname] => E.. [anteil] => 100 [kst] => 2302 [sollzeit] => 64 [lohn] => 0 [stdsatz_soll] => 0 ) [2] => Array ( [uid] => 5 [persnr] => 45 [persnr4] => 0045 [nachname] => F.. [vorname] => R.. [anteil] => 70 [kst] => 2400 [sollzeit] => 100 [lohn] => 0 [stdsatz_soll] => 0 ) [3] => Array ( [uid] => 5 [persnr] => 45 [persnr4] => 0045 [nachname] => F.. [vorname] => R.. [anteil] => 30 [kst] => 2500 [sollzeit] => 100 [lohn] => 0 [stdsatz_soll] => 0 )
[2] und [3] sind identisch bis auf kst und anteil, deswegen weiß ich nicht wie ich das Array anders organisieren kann.
Hier der ausführliche Code:
$q = "SELECT * from stunden WHERE datum>='$von' and datum<='$bis' and ((tid>=200 and tid<300) or (tid>=800 and tid<900)) order by uid";
$r = mysql_query($q, $cid);
while ($row = mysql_fetch_object($r)) {
Benutzerdaten ermitteln; //wie gesagt, die hole ich aus dem Benutzer-Array
//das Benutzer-Array zu erstellen mache ich einmal (bzw. bis 3 mal wenn ich mehrere Zeiträume auswerte),
//->das dauert nicht lange, das habe ich schon getestet
if ($user_array!=NULL) {
foreach($user_array AS $i) {
$uid = $i[uid];
if ($_uid==$uid) //$_uid kommt aus dem SELECT
{
Werte berechnen;
$betrag_leistung = (($_dauer / 3600) * $i[stdsatz_soll]);
$betrag_leistung2 = (($_dauer / 3600) * $_satz_stunden);
if (($betrag_leistung != 0) || ($betrag_leistung2 != 0)) {
//Kostenstelle wird vorrangig aus der Zeiterfassung gezogen, wenn leer dann von Benutzer
if ($_kostnr!=NULL) {
$kst = $_kostnr;
$anteil = 100;
//bei eingetragener Kostenstelle in stunden nur einen Benutzer verwenden, deshalb am Ende ein break setzen
} else {
$kst = $i[kst] . $i[persnr4];
$anteil = $i[anteil];
}
$anteil = $i[anteil];
$betrag_leistung = ($betrag_leistung / 100 * $anteil);
$betrag_leistung2 = ($betrag_leistung2 / 100 * $anteil);
Satz in Zwischentabelle schreiben;
// Abfrage ob Satz schon importiert
$qb = "SELECT id from kore_leistungsanalyse WHERE id_stunden=$_id";
$rb = mysql_query($qb, $cid);
$count_stunden = mysql_num_rows($rb);
mysql_free_result($rb);
if ($count_stunden==0) //die Abfrage brauche ich, da es sonst bei mehreren sich überschneidenden
//Zeiträumen zu mehrfachen Einträgen kommen würde
{
$qi = "INSERT INTO kore_leistungsanalyse (verteilung_id,typ,kst,uid,name,betrag,betrag2,muid) VALUES (0,'M',$kst,$uid,'$i[nachname]',$betrag_leistung,$betrag_leistung2,$zuid)";
//sind eigentlich noch ein paar Felder mehr, die der Kategorisierung dienen
mysql_query($qi, $cid) OR die("Error: $qi <br>" . mysql_error());
}
}
}
Ich werde mal die Dauer der einzelnen Abschnitte messen. Wenn es haupsächlich am INSERT liegt, kann ich da nicht viel machen. Das Anzeigen der Daten nur aus der Zwischentabelle geht ruck-zuck, das möchte ich auch so lassen.
Es sind halt viele Schleifendurchläufe, da machen wahrscheinlich kleine Verbesserungen etwas aus.
Gruß
Tilo