PHP während einer while Schleife Zwischensumme bilden
Eine mysql Abfrage liefert mir verschiedene Benutzer mit verschiedenen Daten (hier explizit Zeiten). Wenn ein neuer Benutzer in der while Schleife erkannt wird, soll eine Zwischensumme seiner Zeiten ausgegeben werde. Wie stele ich das am geschicktesten an?
Hallo Forum,
eine Monatsabfrage einer Mysql Datenbank liefert mir nach Person sortiert eine Menge Daten, die ich in einer while Schleife ausgebe.
Sie sieht vereinfacht so aus:
MA1, 01.09.2009, 8 Stunden
MA1, 02.09.2009, 6,5 Stunden
MA2, 01.09.2009, 4 Stunden
MA2, 02,09,2009, 6,25 Stunden
MA3,...
MA3,...
MA4,...
MA4,...
usw.
Wenn in der while Schleife von MA1 auf MA2 gewechselt wird, sollen alle Zeiten des MA1 summiert in einer Zwischensumme ausgegeben werden. Am Ende sollen alle Zwischensummen als Gesamtssumme des ausgewählten Zeitraumes erscheinen.
Wie stelle ich das am geschicktesten an?
Vielen Dank für jede Idee
Schöne Grüße
Christof
Hallo Forum,
eine Monatsabfrage einer Mysql Datenbank liefert mir nach Person sortiert eine Menge Daten, die ich in einer while Schleife ausgebe.
Sie sieht vereinfacht so aus:
MA1, 01.09.2009, 8 Stunden
MA1, 02.09.2009, 6,5 Stunden
MA2, 01.09.2009, 4 Stunden
MA2, 02,09,2009, 6,25 Stunden
MA3,...
MA3,...
MA4,...
MA4,...
usw.
Wenn in der while Schleife von MA1 auf MA2 gewechselt wird, sollen alle Zeiten des MA1 summiert in einer Zwischensumme ausgegeben werden. Am Ende sollen alle Zwischensummen als Gesamtssumme des ausgewählten Zeitraumes erscheinen.
Wie stelle ich das am geschicktesten an?
Vielen Dank für jede Idee
Schöne Grüße
Christof
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 124457
Url: https://administrator.de/contentid/124457
Ausgedruckt am: 25.11.2024 um 04:11 Uhr
13 Kommentare
Neuester Kommentar
wenn dir die Datenbank schon die Zeiten liefert, dann rechne doch auch mit Ihnen. Sobald du einen MA durch hast, lässt du dir nur die Stunden des MA ausgeben und rechnest die zusammen. Dabei behälst du immer das letzte Ergebnis, gibst es aus und rechnest es dann deiner Gesamtsumme zu. Die gibst du dann ganz am Ende aus. Du brauchst also 2 Schleifen.
nunja, ich dachte mir das so, dass du eine äussere schleife hast, die die MA's durchläuft und die Innere jeweils die einzelnen Einträge für den momentanen MA.
In der Inneren Schleife gibst du einfach die Einträge aus und am Ende jeder Ausgabe (bzw. innerem schleifendurchlauf) addierst du die MA Zeiten aufeinander ($zwsumme+=$zeittemp).
Sobald du einen MA durch hast, also am Fuß der äusseren Schleife bist, gibst du $zwsumme aus, rechnest $zwsumme dann zu $gesamtzeit hinzu und nullst $zwsumme dann wieder.
kurz:
stark vereinfacht... aber das Prinzip sollte klar sein
hoffe das hilft
Snow
sollte mal wieder php üben...
In der Inneren Schleife gibst du einfach die Einträge aus und am Ende jeder Ausgabe (bzw. innerem schleifendurchlauf) addierst du die MA Zeiten aufeinander ($zwsumme+=$zeittemp).
Sobald du einen MA durch hast, also am Fuß der äusseren Schleife bist, gibst du $zwsumme aus, rechnest $zwsumme dann zu $gesamtzeit hinzu und nullst $zwsumme dann wieder.
kurz:
while ... { //äussere Schleife
$zper=<MA-Nummer>;
for ($i = 1; $i <= <Anzahl Listeneinträge>; $i++) { //Innere Schleife
Echo <Eintrag Nr. $i von $zper>; //Ausgabe Listeneintrag
$zeittemp=<Zeit von Eintrag $i von MA $zper>;
$zwsumme+=$zeittemp;
}
Echo "$zwsumme";
$gesamtzeit+=$zwsumme;
$zwsumme=0;
}
stark vereinfacht... aber das Prinzip sollte klar sein
hoffe das hilft
Snow
sollte mal wieder php üben...
Hallo,
naja ich würd mir das ganze recht elegant basteln.
Nachdem in $zper die personalnummer drinne ist und dich ja eigentlich nur die Gesamtsumme interessiert,
würde ich das so angehen:
das wäre so meien Idee grob umrissen. Ich glaub du wirst da noch ein paar Umwandlungen brauchen aber sonst dürft das so funktionieren wie ich das Verstanden habe.
@stingermac
Ich glaube das mit dem Berechnungen in der DB wird nciht hinhauen wenn ers so zerlegen muss.
naja ich würd mir das ganze recht elegant basteln.
Nachdem in $zper die personalnummer drinne ist und dich ja eigentlich nur die Gesamtsumme interessiert,
würde ich das so angehen:
$stunden = array();
while( mysql_fetch.... ) {
if(array_key_exists($zper, $stunden))
$stunden[$zper] = $stunden[$zper]+$zeit;
else
$stunden[$zper] = $zeit;
}
das wäre so meien Idee grob umrissen. Ich glaub du wirst da noch ein paar Umwandlungen brauchen aber sonst dürft das so funktionieren wie ich das Verstanden habe.
@stingermac
Ich glaube das mit dem Berechnungen in der DB wird nciht hinhauen wenn ers so zerlegen muss.
wow! - also das Datum kannst du Dir auch gleich in der SQL Abfrage umwandeln.
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
..hoffe ich habe das so richtig verstanden wie die Zeiten gespeichert werden !?
Zwischensummen:
Man könnte eine Temporäre MYSQL Tabelle erstellen, diese mit den einzelnen Einträgen (s.o.) füllen und anschließend noch mit den Zwischensummen - oder auch gleich eine UNION Abfrage generieren.
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
SELECT
...
SEC_TO_TIME( MAX(UNIX_TIMESTAMP(zdat)) - MIN(UNIX_TIMESTAMP(zdat)) ) AS 'zeit'
// ggf geht auch: SEC_TO_TIME( UNIX_TIMESTAMP(MAX(zdat)) - MIN(zdat)) ) AS 'zeit'
...
GROUP BY
DATE( zdat )
Zwischensummen:
Man könnte eine Temporäre MYSQL Tabelle erstellen, diese mit den einzelnen Einträgen (s.o.) füllen und anschließend noch mit den Zwischensummen - oder auch gleich eine UNION Abfrage generieren.
Hi Christof,
diese Strategie . . .
. . . würde ich mal überdenken. Wenn du Einfluß darauf hast, würde ich
Ein- und Ausstempeln in einen Datensatz packen/packen lassen.
Dann ist das Summieren von Zeiten ohne if und else und temporären Variablen
in ein paar Zeilen erledigt.
Dein Code, um Datum und Zeit(en) aus dem Feld zdat zu filtern, ist auch nicht
notwendig, da MySQL Funktionen bereitstellt, die mit dem Datentyp datetime umgehen können:
- DATE_FORMAT(Spaltenname,"%Y-%m-%d") oder DATE_FORMAT(Spaltenname,"%d.%m.%Y") - Datum
- TIME_TO_SEC(Spaltenname) - Uhrzeit in Sekunden
So hättest du alle Stunden/MA in ZwiSum abgelegt(Datum hab ich bei mir in einer sep. Spalte).
Jetzt wird das Ergebnis ausgewertet:
Gruß
Günni
diese Strategie . . .
Zitat von @gechger:
. . . Morgens einstempeln ergibt einen Datensatz,
abends ausstempeln einen weiteren. . . .
. . . Morgens einstempeln ergibt einen Datensatz,
abends ausstempeln einen weiteren. . . .
. . . würde ich mal überdenken. Wenn du Einfluß darauf hast, würde ich
Ein- und Ausstempeln in einen Datensatz packen/packen lassen.
Dann ist das Summieren von Zeiten ohne if und else und temporären Variablen
in ein paar Zeilen erledigt.
Dein Code, um Datum und Zeit(en) aus dem Feld zdat zu filtern, ist auch nicht
notwendig, da MySQL Funktionen bereitstellt, die mit dem Datentyp datetime umgehen können:
- DATE_FORMAT(Spaltenname,"%Y-%m-%d") oder DATE_FORMAT(Spaltenname,"%d.%m.%Y") - Datum
- TIME_TO_SEC(Spaltenname) - Uhrzeit in Sekunden
$query_sum = 'select id,sum((time_to_sec(ende)-time_to_sec(beginn))/60/60) as ZwiSum'
. ' from tabelle2 join zeiten on tabelle2.id=zeiten.u_id'
. ' where datum between "'.$vonTag.'" and "'.$bisTag.'"'
. ' group by id';
$result_sum = mysql_query($query_sum);
So hättest du alle Stunden/MA in ZwiSum abgelegt(Datum hab ich bei mir in einer sep. Spalte).
Jetzt wird das Ergebnis ausgewertet:
while($row_sum = mysql_fetch_array($result_sum,MYSQL_ASSOC)){
$id=$row_sum['id'];
/*
Innerhalb dieser Schleife erfolgt eine Abfrage der Zeiten nach id, gruppiert wird wie oben
nach id, zusätzlich noch nach Datum.
*/
$sql = 'SELECT id,z_id,vorname,nachname,datum,beginn,ende,sum((time_to_sec(ende)-time_to_sec(beginn))/60/60) as summe from zeiten'
. ' join tabelle2 on tabelle2.id=zeiten.u_id'
. ' where datum between "'.$vonTag.'" and "'.$bisTag.'"'
. ' and id = "'.$id.'"'
. ' group by id,datum';
$result = mysql_query($sql);
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
//Alle Stunden zusammenaddieren
$gesamtsumme+=$row['summe'];
//MA + Datum + Beginn/Ende + Std/Tag ausgeben
echo implode(" | ",$row)."<br>";
}// while2 Ende
/*
Nach Ausgabe der einzelnen Tage die Zwischensummme Std/MA ausgeben,
die in der ersten Abfrage ermittelt wurde
*/
echo "Zwischensumme/MA: $row_sum[ZwiSum]<br><br>";
}// while1 Ende
//Zum Schluß Gesamtstunden aller MA ausgeben
echo $gesamtsumme;
Gruß
Günni
Hi Christof,
Das ist natürlich Pech, wenn die Stempeluhrsoftware das nicht kann. Dein Code zum
Ermitteln von Daten und Zeiten, Zuordnen von Zwischensummen zu ID's mit den endlosen
Variablen, if/else-Konstrukten sowie den substr-Operationen ist mir ehrlich gesagt
ein bißchen zu verworren, will sagen: schwer lesbar.
Ich ziehe es vor, die Daten und Zeiten gleich bei der Abfrage mit Hilfe von MySQL-Funktionen
zu ermitteln. Die MA-ID, das Datum und die Ein/Ausstempelzeit habe ich durch zwei
Abfragen/Schleifen in einem Array als Arrays gespeichert.
Erste Abfrage mit Einstempelzeit:
Zweite Abfrage mit Ausstempelzeit:
In dem Array $zeiten befinden sich nun Arrays, die folg. enthalten:
ID der MA, Arbeitstag, Einstempel-/Ausstempelzeit
Errechnen und Ausgabe der Stunden/MA, Ausgabe der Zwischensummen und der Gesamtstunden erfolgt nach dem
nächsten Zitat
Ich vermute mal, du setzt eine Abfrage ab, und willst durch entspr. if/else/then-Kontrollen prüfen, wann
der Wechsel von einer ID zur nächsten ID erfolgt um dann die Zwischensumme auszugeben. Erstens glaube ich nicht,
das das geht, und wenn, dann nur mit erheblichem Aufwand. Da ist es erheblich einfacher, zwei Schleifen zu programmieren,
so wie es Snowman schon geschrieben hat, bzw. wie es in meinem Beispiel steht:
Eine Schleife, die dir das Kriterium liefert, nach dem eine Zusammenfassung erfolgen soll, innerhalb dieser Schleife eine weitere,
die die Zusammenfassung vornimmt. Wenn dann die "innere" Schleife die Zusammenfassung erledigt hat, wird sie beendet und die
Zusammenfassung wird NACH dem Beenden der inneren Schleife ausgegeben. Kurz ausgedrückt:
Die "äußere" Schleife liefert dir einen Wert(z.B. eine ID), die "innere" Schleife findet nur Werte, die zu der ID passen,
die dir die "äußere" Schleife liefert.
Die "innere" Schleife hab ich ja oben schon abgekaspert(Eigentlich waren es ja zwei Schleifen, wegen doppelter Datensätze), und
hab mir daraus ein Array erstellt, mit Arrays, die Werte zu versch. MA haben. Die ID's der MA sind auch in den Arrays vorhanden.
Die Werte der Arrays in diesem Array kann ich nun z.B. mit einer foreach-Schleife abrufen. Jetzt will ich aber, dass mir diese
foreach-Schleife nacheinander nur Werte zusammenfasst, die zu einem bestimmten Wert(einer ID) gehören. Diesen Wert(ID) liefert mir
eine Schleife, in der ich die ID's der MA abrufe:
Und wenn die "äußere" Schleife endet, wird die Summe aller Stunden ausgegeben.
Das Script:
Gruß
Günni
Das ist natürlich Pech, wenn die Stempeluhrsoftware das nicht kann. Dein Code zum
Ermitteln von Daten und Zeiten, Zuordnen von Zwischensummen zu ID's mit den endlosen
Variablen, if/else-Konstrukten sowie den substr-Operationen ist mir ehrlich gesagt
ein bißchen zu verworren, will sagen: schwer lesbar.
Ich ziehe es vor, die Daten und Zeiten gleich bei der Abfrage mit Hilfe von MySQL-Funktionen
zu ermitteln. Die MA-ID, das Datum und die Ein/Ausstempelzeit habe ich durch zwei
Abfragen/Schleifen in einem Array als Arrays gespeichert.
Erste Abfrage mit Einstempelzeit:
<?php
/*
Aus dem Feld zeit(Datentyp datetime) wird das Datum extrahiert sowie die Uhrzeit in Sekunden.
Die Funktion min ermittelt den kleineren Zeitwert als Beginn
*/
$query='select u_id,date_format(zeit,"%d.%m.%Y") as Datum,min(time_to_sec(zeit)) as Beginn'
.' from zeiten2 where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by u_id,Datum';
$result=mysql_query($query);
/*
Die Ergebnisse werden als Arrays in einem Array abgelegt. Der Endzeitwert wird in den Arrays auf Null
gesetzt, er wird in einer weiteren Abfrage ermittelt.
*/
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$zeiten = array("ID" => $row['u_id'],"Datum" => $row['Datum'],"Beginn" => $row['Beginn'],"Ende" => 0);
}
?>
Zweite Abfrage mit Ausstempelzeit:
<?php
/*
Die Abfrage wird erneut abgesetzt, diesmal wird der größere Zeitwert in Sekunden durch die Funktion max
als Ende extrahiert.
*/
$query='select u_id,date_format(zeit,"%d.%m.%Y") as Datum,max(time_to_sec(zeit)) as Ende'
.' from zeiten2 where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by u_id,Datum';
$result=mysql_query($query);
/*
Der Index 'Ende' der Arrays kann nun gesetzt werden.
*/
$i=0;
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$zeiten[$i][Ende] = $row['Ende'];
$i++;
}
?>
In dem Array $zeiten befinden sich nun Arrays, die folg. enthalten:
ID der MA, Arbeitstag, Einstempel-/Ausstempelzeit
Errechnen und Ausgabe der Stunden/MA, Ausgabe der Zwischensummen und der Gesamtstunden erfolgt nach dem
nächsten Zitat
Zitat von @gechger:
. . . Zwischensummen bekomme ich dank der Hilfe des Forums auch schon,
nur nicht an der Stelle, wo ich sie ausgegeben haben möchte. . . .
. . . Zwischensummen bekomme ich dank der Hilfe des Forums auch schon,
nur nicht an der Stelle, wo ich sie ausgegeben haben möchte. . . .
Ich vermute mal, du setzt eine Abfrage ab, und willst durch entspr. if/else/then-Kontrollen prüfen, wann
der Wechsel von einer ID zur nächsten ID erfolgt um dann die Zwischensumme auszugeben. Erstens glaube ich nicht,
das das geht, und wenn, dann nur mit erheblichem Aufwand. Da ist es erheblich einfacher, zwei Schleifen zu programmieren,
so wie es Snowman schon geschrieben hat, bzw. wie es in meinem Beispiel steht:
Eine Schleife, die dir das Kriterium liefert, nach dem eine Zusammenfassung erfolgen soll, innerhalb dieser Schleife eine weitere,
die die Zusammenfassung vornimmt. Wenn dann die "innere" Schleife die Zusammenfassung erledigt hat, wird sie beendet und die
Zusammenfassung wird NACH dem Beenden der inneren Schleife ausgegeben. Kurz ausgedrückt:
Die "äußere" Schleife liefert dir einen Wert(z.B. eine ID), die "innere" Schleife findet nur Werte, die zu der ID passen,
die dir die "äußere" Schleife liefert.
Die "innere" Schleife hab ich ja oben schon abgekaspert(Eigentlich waren es ja zwei Schleifen, wegen doppelter Datensätze), und
hab mir daraus ein Array erstellt, mit Arrays, die Werte zu versch. MA haben. Die ID's der MA sind auch in den Arrays vorhanden.
Die Werte der Arrays in diesem Array kann ich nun z.B. mit einer foreach-Schleife abrufen. Jetzt will ich aber, dass mir diese
foreach-Schleife nacheinander nur Werte zusammenfasst, die zu einem bestimmten Wert(einer ID) gehören. Diesen Wert(ID) liefert mir
eine Schleife, in der ich die ID's der MA abrufe:
<?php
/*
Aus der Tabelle der MA werden die ID's abgefragt, die auch in der Tabelle
Zeiterfassung sind.
*/
$query='select id from tabelle2'
.' join zeiten2 on tabelle2.id=zeiten2.u_id'
.' where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by id';
$result=mysql_query($query);
?>
<?php
/*
Jetzt werden die zwei Schleifen verschachtelt:
*/
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
foreach($zeiten as $zeit){
if($zeit[ID]==$row['id']){
$std=(($zeit[Ende]-$zeit[Beginn])/60/60);
/*
Die ID/MA, die Stunden MA/Tag werden ausgegeben
*/
echo $zeit[ID]."-".$zeit[Datum]."-".$std." Std<br>";
/*
Stunden der MA summieren
*/
$zwisum+=$std;
/*
Alle Stunden summieren
*/
$gesamtsumme+=$std;
}
}
/*
Summe Stunden/Tage/MA ausgeben, Var. $zwisum auf Null setzen
**nach** Beenden der "inneren" Schleife
*/
echo "Zwischensumme MA/$row[id]: $zwisum Std<br><br>";
$zwisum=0;
}
?>
Und wenn die "äußere" Schleife endet, wird die Summe aller Stunden ausgegeben.
<?php
echo $gesamtsumme;
?>
Das Script:
<?php
/*********************************************** Script Zeitauswertung *************************************************/
/*
Datumsbereich
*/
$vonTag="2009-09-01";
$bisTag="2009-09-30";
/*
Gesamtstunden
*/
$gesamtsumme=0;
/*
Zwischensummen
*/
$zwisum=0;
/*
Aus dem Feld zeit(Datentyp datetime) wird das Datum extrahiert sowie die Uhrzeit in Sekunden.
Die Funktion min ermittelt den kleineren Zeitwert als Beginn
*/
$query='select u_id,date_format(zeit,"%d.%m.%Y") as Datum,min(time_to_sec(zeit)) as Beginn'
.' from zeiten2 where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by u_id,Datum';
$result=mysql_query($query);
/*
Die Ergebnisse werden als Arrays in einem Array abgelegt. Der Endzeitwert wird in den Arrays auf Null
gesetzt, er wird in einer weiteren Abfrage ermittelt.
*/
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$zeiten = array("ID" => $row['u_id'],"Datum" => $row['Datum'],"Beginn" => $row['Beginn'],"Ende" => 0);
}
/*
Die Abfrage wird erneut abgesetzt, diesmal wird der größere Zeitwert in Sekunden durch die Funktion max
als Ende extrahiert.
*/
$query='select u_id,date_format(zeit,"%d.%m.%Y") as Datum,max(time_to_sec(zeit)) as Ende'
.' from zeiten2 where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by u_id,Datum';
$result=mysql_query($query);
/*
Der Index 'Ende' der Arrays kann nun gesetzt werden.
*/
$i=0;
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$zeiten[$i][Ende] = $row['Ende'];
$i++;
}
/*
Aus der Tabelle der MA werden die ID's abgefragt, die auch in der Tabelle
Zeiterfassung sind.
*/
$query='select id from tabelle2'
.' join zeiten2 on tabelle2.id=zeiten2.u_id'
.' where date_format(zeit,"%Y-%m-%d") between "'.$vonTag.'" and "'.$bisTag.'"'
.' group by id';
$result=mysql_query($query);
/*
Ausgabe des Erfassungszeitraums.
In der foreach-Schleife werden die ID's in den Arrays mit den ID's aus der letzten
Abfrage verglichen. Bei Übereinstimmung werden
- die Arbeitsstunden pro Tag berechnet($std)
- die Stunden/MA summiert($zwisum)
- Stunden aller MA summiert($gesamtsumme)
ausgegeben.
*/
echo "Zeiterfassung vom $vonTag bis zum $bisTag<br><br>";
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
foreach($zeiten as $zeit){
if($zeit[ID]==$row['id']){
$std=(($zeit[Ende]-$zeit[Beginn])/60/60);
/*
Die ID/MA, die Stunden MA/Tag werden ausgegeben
*/
echo $zeit[ID]."-".$zeit[Datum]."-".$std." Std<br>";
$zwisum+=$std;
$gesamtsumme+=$std;
}
}
/*
Summe Stunden/Tage/MA ausgeben, Var. $zwisum auf Null setzen
*/
echo "Zwischensumme MA/$row[id]: $zwisum Std<br><br>";
$zwisum=0;
}
/*
Ausgabe Stunden/Aller MA
*/
echo "Stunden aller MA: $gesamtsumme Std<br>";
/*********************************************** Script Zeitauswertung Ende *********************************************/
?>
Gruß
Günni
Hi Christof,
Knackpunkt deiner Anwendung scheint ja die Zwischensumme zu sein. Ich versuch jetzt mal
zu erklären, warum das mit zwei Schleifen einfacher, wenn nicht sogar logischer zu
lösen ist.
Ich frage jetzt die Zeiten zu einer ID ab und summiere diese:
Innerhalb der while-Schleife können noch deine Berechnungen etc. erfolgen.
Um jetzt die gleichen Werte für jede ID abzufragen/zu berechnen, müßte ich
den Ausdruck "where u_id=1" jedesmal ändern bzw. die ID über ein Formular eingeben.
Da liegt es doch nahe, den Ausdruck "dynamisch" zu erstellen, sprich, einen Algorithmus
zu entwickeln, der mir "solange wie vorhanden" ID's liefert:
Eine while-Schleife liefert mit die ID, und weitere Details, der MA, die in der Personaltabelle ist
sowie in der Zeitentabelle, sprich, wer gestempelt hat.
Innerhalb dieser äußeren Schleife packe ich nun den oben prog. Code und ersetzte den
Ausdruck "where u_id=1" durch "where u_id=".$row1['id'].
Vereinfacht heißt das:
Solange die äußere Schleife eine ID liefert, wird die innere Schleife ausgeführt, macht Berechnungen,
gibt Details zur ID aus etc.. Wenn keine ID mehr kommt, wird die innere Schleife auch nicht mehr ausgeführt.
Zum Problem date_format( . . .
Auch in meiner Tabelle liegt die Ein-/Ausstempelzeit im Format "Jahr-Monat-Tag Stunde:Minute:Sekunde" vor.
Die Funktion ist in der Lage, den Datumsanteil in deutscher Schreibweise auszugeben:
select date_format(feldname,"%d.%m.%Y") as Datum , . . . usw.
Ich kann aber den Alias Datum nicht in der where-Klausel verwenden,
auch wenn ich schreiben würde:
select date_format(feldname,"%Y-%m-%d") as Datum, weil Datum kein gültiger Spaltenname ist.
Da muß ich tatsächlich schreiben ". . . where date_format(spaltenname,"%Y-%m-%d) . . . "
Zur Tabelle der MA:
Das Feld "Projektzugehörigkeit" gehört in die Tabelle, in der die Zeiten erfasst werden.
Denn nur so erfahre ich, wieviele Std ein MA anwelchem Projekt gearbeitet hat.
Gruß
Günni
Knackpunkt deiner Anwendung scheint ja die Zwischensumme zu sein. Ich versuch jetzt mal
zu erklären, warum das mit zwei Schleifen einfacher, wenn nicht sogar logischer zu
lösen ist.
Ich frage jetzt die Zeiten zu einer ID ab und summiere diese:
<?php
$query="select . . . from tabelle2 where u_id=1";
. . .
while($row=mysql_fetch_array( . . . usw.)){
echo "Ausgabe der abgefragten Felder";
$zwisum+=$row['std']; /* Wobei die Stunden bei dir berechnet werden. */
}
/* Nach Beenden der Schleife wird die Zwischensumme ausgegeben. */
echo $zwisum;
?>
Innerhalb der while-Schleife können noch deine Berechnungen etc. erfolgen.
Um jetzt die gleichen Werte für jede ID abzufragen/zu berechnen, müßte ich
den Ausdruck "where u_id=1" jedesmal ändern bzw. die ID über ein Formular eingeben.
Da liegt es doch nahe, den Ausdruck "dynamisch" zu erstellen, sprich, einen Algorithmus
zu entwickeln, der mir "solange wie vorhanden" ID's liefert:
<?php
$query1="select id, . . . from tabelle1 join tabelle2 on tabelle1.id=tabelle2.u_id";
?>
Eine while-Schleife liefert mit die ID, und weitere Details, der MA, die in der Personaltabelle ist
sowie in der Zeitentabelle, sprich, wer gestempelt hat.
Innerhalb dieser äußeren Schleife packe ich nun den oben prog. Code und ersetzte den
Ausdruck "where u_id=1" durch "where u_id=".$row1['id'].
Vereinfacht heißt das:
Solange die äußere Schleife eine ID liefert, wird die innere Schleife ausgeführt, macht Berechnungen,
gibt Details zur ID aus etc.. Wenn keine ID mehr kommt, wird die innere Schleife auch nicht mehr ausgeführt.
Zum Problem date_format( . . .
Auch in meiner Tabelle liegt die Ein-/Ausstempelzeit im Format "Jahr-Monat-Tag Stunde:Minute:Sekunde" vor.
Die Funktion ist in der Lage, den Datumsanteil in deutscher Schreibweise auszugeben:
select date_format(feldname,"%d.%m.%Y") as Datum , . . . usw.
Ich kann aber den Alias Datum nicht in der where-Klausel verwenden,
auch wenn ich schreiben würde:
select date_format(feldname,"%Y-%m-%d") as Datum, weil Datum kein gültiger Spaltenname ist.
Da muß ich tatsächlich schreiben ". . . where date_format(spaltenname,"%Y-%m-%d) . . . "
Zur Tabelle der MA:
Das Feld "Projektzugehörigkeit" gehört in die Tabelle, in der die Zeiten erfasst werden.
Denn nur so erfahre ich, wieviele Std ein MA anwelchem Projekt gearbeitet hat.
Gruß
Günni