Ankündigung

Einklappen
Keine Ankündigung bisher.

Kalenderwochen werden nicht richtig angezeigt

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kalenderwochen werden nicht richtig angezeigt

    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
    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($im201201201);
    $black         imagecolorallocate($im000);
    $red        imagecolorallocate($im25500);
    $green        imagecolorallocate($im01000);

    // Hintergrundfarbe für Bild setzen
    imagefilledrectangle ($im00$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($im3$x-14$hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
                
    imageline($im,$x,18,$x,$hoehe_y+30,$red);
            }else{
                
    imagestring($im3$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($im360$y-6,number_format($j/100,2,',','.'), $black);
        }else{
    //*/
            
    imageline($im,95,$y,100,$y,$black);
            
    imagestring($im3$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($im3$x$y,$value[0], $black);
        
    $last_x $x;
        
    $last_y $y;
    }

    // Ausgabe des Bildes
    imagepng($im); 
    und das kommt dabei raus



    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($im3$x-14$hoehe_y+32,date(Y,($kw_first_day+($j*86400))), $red);
                
    imageline($im,$x,18,$x,$hoehe_y+30,$red);
            }else{
                
    imagestring($im3$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);
        }

    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
    PHP-Code:
    $kw%4==
    Sollte er doch eigentlich KW 13 immer ausspucken. Also liegt der Fehler wohl hier.
    PHP-Code:
    $kw date(W,($kw_first_day+($j*86400))-7); 
    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


  • #2
    Kannst du dafür nicht Javascript benutzen? Du hst ca 10 mal weniger Code, dafür 100mal mehr Funktionen. (Zoomen, Achsenanpassungen, Popovers, ..)

    Beispiel: http://morrisjs.github.io/morris.js/

    Kommentar


    • #3
      Kannst du dafür nicht Javascript benutzen? Du hst ca 10 mal weniger Code, dafür 100mal mehr Funktionen. (Zoomen, Achsenanpassungen, Popovers, ..)

      Beispiel: http://morrisjs.github.io/morris.js/
      Erstmal danke für die schnelle Antwort. Meistens bekommt man nur Google als Antwort. Als wenn ich da nicht schon seit Stunden geschaut hätte.

      Hab es mir gerade angeschaut sieht echt super aus und werde es für die Seite mal versuchen. Leider brauche ich das Bild auch um es in einen PDF-Report zu packen. Da sind meines Wissens die grenzen von Javascript erreicht.

      Kommentar


      • #4
        Für PDF würde ich den Umweg über HTML gehen und das dann in ein PDF konvertieren: http://dompdf.github.io/

        Ansonsten gibt es auch Libraries die direkt in PHP grafen erzeugen können (als Bild). Aber irgendwie finde ich die nicht sonderlich schön: http://jpgraph.net/

        Kommentar


        • #5
          Cool http://jpgraph.net/ und https://github.com/dompdf/dompdf geht schon mal in die richtige Richtung. Bei jpgraph kann ich über $sampling die Skalierung auf der x-Achse einstellen Aber die Beschriftung sehe ich noch nicht ganz durch wenn ich keinen Datensatz hab. Ich werde es mal probieren, wird aber definitiv nicht kürzer als mein Skript. DomPDF klingt vielversprechend mal sehen ob es hält was es verspricht.

          Zu dem Fehler in meinem Script kannst du mir anscheinend leider nichts sagen oder? (Die Hoffnung stirbt zuletzt)

          Danke

          Kommentar


          • #6
            Ich kann keine konkrete Frage bzgl. deiner Wochenproblematik erkennen, aber willst du aus einer beliebigen KW das Beginn-Datum dieser KW daraus erzeugen? Das würde zB so gehen:

            PHP-Code:
            function getDateFromWeek($week$format "Y-m-d"$timezone "Europe/Berlin") {
                
            $oDT = new DateTime($week, new DateTimezone($timezone));
                return 
            $oDT->format($format); 
            }

            echo 
            getDateFromWeek("2014-W01");  // 2013-12-30
            echo getDateFromWeek("2014-W33");  // 2013-12-30
            echo getDateFromWeek("2014-W51""d.m.Y");  // 15.12.2014 
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar

            Lädt...
            X