Moin moin,
zum einstand gleich mal ein kleines Problemchen. Wahrscheinlich bin ich das ganze nur falsch angegangen und sehe jetzt den Wald vor lauter Bäumen nicht. Also seid bitte nachsichtig ich lerne noch.
Ich möchte mir die Preisentwicklung eines Artikels aus der Datenbank grafisch anzeigen lassen. Funktioniert auch soweit ganz gut nur die Beschriftung der X-Achse bringt mich noch um den Verstand.
Hier erstmal der komplette Quellcode
und das kommt dabei raus

Der Fehler liegt wohl hier irgendwo.
Es fehlt teilweise die KW 13 und und die Abstände zwischen KW 9 und 13 sowie KW 41 und 45 stimmen nicht.
Ich denke er kann die Wochen nicht richtig bestimmen. Mit
Sollte er doch eigentlich KW 13 immer ausspucken. Also liegt der Fehler wohl hier.
Ich dachte es reicht wenn ich den Timestamp immer um 7*86400 erhöhe und so in die nächste Woche Rutsche. Anscheinend wohl nicht.
Kennt jemand vielleicht eine elegantere und vor allem funktionierend Lösung?
Viele Dank schon einmal.
Gruß Steve
zum einstand gleich mal ein kleines Problemchen. Wahrscheinlich bin ich das ganze nur falsch angegangen und sehe jetzt den Wald vor lauter Bäumen nicht. Also seid bitte nachsichtig ich lerne noch.
Ich möchte mir die Preisentwicklung eines Artikels aus der Datenbank grafisch anzeigen lassen. Funktioniert auch soweit ganz gut nur die Beschriftung der X-Achse bringt mich noch um den Verstand.
Hier erstmal der komplette Quellcode
PHP-Code:
header("Content-type: image/png");
require_once '../../class/bs.class.php';
$bs = new blueball_db_modul();
$string = $_GET['artikel'];
$qry = "select (bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit)),bestellungenpositionen.rabattsatz1,bestellungenpositionen.Lieferdatum from artikel left join bestellungenpositionen on artikel.Artikel = bestellungenpositionen.Artikelnummer where bestellungenpositionen.Bestellmenge not like '0' AND artikel.Artikel='{$string}' order by bestellungenpositionen.Lieferdatum asc;";
$data = $bs->MySQLQuery($qry);
$qry = "select min(bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit)),max((bestellungenpositionen.Einkaufspreis/pow(10,bestellungenpositionen.Einkaufspreiseinheit))) from artikel left join bestellungenpositionen on artikel.Artikel = bestellungenpositionen.Artikelnummer where bestellungenpositionen.Bestellmenge not like '0' AND artikel.Artikel='bl-00004' order by bestellungenpositionen.Lieferdatum asc;";
$ek_max_min = $bs->MySQLQuery($qry);
$kw_first_day = strtotime(date(Y,strtotime($data[0][2])) ."-W".date(W,strtotime($data[0][2])));
$kw_last_day = strtotime(date(Y,strtotime($data[(count($data)-1)][2])) ."-W".date(W,strtotime($data[(count($data)-1)][2]))."-7");
$anz_tage = ($kw_last_day - $kw_first_day)/86400;
$hoehe = (ceil($ek_max_min[0][1]*10)-floor($ek_max_min[0][0]*10))*10+75;
$breite = $anz_tage+125;
$hoehe_y = $hoehe-50;
// erstellen eines leeren Bildes mit 1024px Breite und 768px Höhe
$im = imagecreatetruecolor($breite, $hoehe);
// definieren der Farben
$background = imagecolorallocate($im, 201, 201, 201);
$black = imagecolorallocate($im, 0, 0, 0);
$red = imagecolorallocate($im, 255, 0, 0);
$green = imagecolorallocate($im, 0, 100, 0);
// Hintergrundfarbe für Bild setzen
imagefilledrectangle ($im, 0, 0, $breite,$hoehe, $background);
// Achsen
imageline($im,100,$hoehe_y,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,100,13,100,$hoehe_y,$black); // Y-Achse
// Pfeile
imageline($im,100+$anz_tage,$hoehe_y-2,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,100+$anz_tage,$hoehe_y+2,(100+$anz_tage+10),$hoehe_y,$black); // X-Achse
imageline($im,98,18,100,8,$black); // Y-Achse
imageline($im,102,18,100,8,$black); // Y-Achse
// Beschriftung X-Achse
for($j=0;$j<$anz_tage;$j+=7){
$x = 100+$j;
$kw = date(W,($kw_first_day+($j*86400))-7);
if($kw%4==1){
if($kw=='01'){
imagestring($im, 3, $x-14, $hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
imageline($im,$x,18,$x,$hoehe_y+30,$red);
}else{
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
imageline($im,$x,$hoehe_y,$x,$hoehe_y+7,$red);
}
}else{
imageline($im,$x,$hoehe_y,$x,$hoehe_y+5,$black);
}
}
// Differrenz zur Y 0 Achse
$min_y = floor($ek_max_min[0][0]*10)*10;
$max_y = ceil($ek_max_min[0][1]*10)*10;
// Beschriftung Y-Achse
for($j=$min_y;$j<=$max_y;$j+=10){
$y = $hoehe_y+$min_y-$j;
if($j%50==0){
imageline($im,90,$y,100,$y,$black);
imagestring($im, 3, 60, $y-6,number_format($j/100,2,',','.'), $black);
}else{//*/
imageline($im,95,$y,100,$y,$black);
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
}
}
// Diagramm schreiben
$last_x = 100;
$last_y = $hoehe_y;
foreach ($data as $value) {
$x = 100+(strtotime($value[2])-$kw_first_day)/86400;
$y = $hoehe_y + $min_y - ($value[0]*100);
imageline($im,$last_x,$last_y,$x,$y,$green);
imagestring($im, 3, $x, $y,$value[0], $black);
$last_x = $x;
$last_y = $y;
}
// Ausgabe des Bildes
imagepng($im);

Der Fehler liegt wohl hier irgendwo.
PHP-Code:
// Beschriftung X-Achse
for($j=0;$j<$anz_tage;$j+=7){
$x = 100+$j;
$kw = date(W,($kw_first_day+($j*86400))-7);
if($kw%4==1){
if($kw=='01'){
imagestring($im, 3, $x-14, $hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
imageline($im,$x,18,$x,$hoehe_y+30,$red);
}else{
imagestring($im, 3, $x-7, $hoehe_y+9,"$kw", $black);
imageline($im,$x,$hoehe_y,$x,$hoehe_y+7,$red);
}
}else{
imageline($im,$x,$hoehe_y,$x,$hoehe_y+5,$black);
}
}
Ich denke er kann die Wochen nicht richtig bestimmen. Mit
PHP-Code:
$kw%4==1
PHP-Code:
$kw = date(W,($kw_first_day+($j*86400))-7);
Kennt jemand vielleicht eine elegantere und vor allem funktionierend Lösung?
Viele Dank schon einmal.
Gruß Steve
Kommentar