Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] FPDF und Schleifen Problem

Einklappen

Neue Werbung 2019

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

  • [Erledigt] FPDF und Schleifen Problem

    Hallo Gemeinde,

    ich habe ein Schleifenproblem.

    Zum Sachverhalt: Ich arbeite gerade an einer Auswertung für Betriebsdaten. Diese sieht auch einen PDF Export vor. Ich baue mir mit FPDF eine PDF in zwei Schleifen auf.

    Leider wird die erste Schleife scheinbar nur einmal durchlaufen, da der Titeltext nur einmal erscheint. Wie kann ich das Problem umgehen?

    Hier mein Quellcode:
    PHP-Code:
    //Aufbau der PDF
    $pdf=new MYPDF('P','mm','A4');
    $pdf->AliasNbPages();
    $pdf->SetMargins($pdf->left$pdf->top$pdf->right);
    $pdf->AddPage();$pdf->SetFont('Arial','B',16);


    //Beginn Datenabfrage AZS Timing für Mitarbeiter
    $azs_name_query        =    "SELECT PNR, VNAME, NAME FROM PZSTAMM WHERE ABT='3' AND BEZ1 IS NOT NULL ORDER BY PNR";
    $azs_name_result    =    odbc_exec($azs$azs_name_query);
    while (
    $row    =    odbc_fetch_object($azs_name_result)) {
        
    $pnr    =    $row->PNR;
        
    $vname    =    $row->VNAME;
        
    $name    =    $row->NAME;
        
            
    //Aufbau des Titels
        
    $str_titeltext        =    'Betriebsdatenauswertung für '.$vname.' '.$name;
        
    $pdf->SetFont('Arial','B',16);
        
    $pdf->MultiCell(180,10$str_titeltext);
        
    $pdf->SetFont('Arial','B',12);
            
        
    //Arbeitszeiten aus der AZS Timing auslesen
        
    if (!empty($zeit_bis)) {
            
    $zeit    =    "AND zeit.DATUM>='".str_replace("-"""date_german2mysql($zeit_von))."' AND zeit.DATUM<='".str_replace("-"""date_german2mysql($zeit_bis))."' GROUP BY zeit.DATUM, stamm.NAME, stamm.VNAME, stamm.BEZ1";
        } else {
            
    $zeit    =    "AND zeit.DATUM='".str_replace("-"""date_german2mysql($zeit_von))."'";
        }
        
        
    //Datenbank nach Zeiten abfragen
        
    $azs_query_zeiten        =    "SELECT min(zeit.ZEITVON_M) as ZEITVON_M, max(zeit.ZEITBIS_M) as ZEITBIS_M, stamm.NAME, stamm.VNAME, stamm.BEZ1, zeit.DATUM FROM PZBEWINT zeit, PZSTAMM stamm WHERE zeit.PNR=stamm.PNR AND zeit.KTONR<>'13' AND zeit.KTONR<>'14' AND stamm.PNR='".$pnr."' ".$zeit;
        
    $azs_result_zeiten        =    odbc_exec($azs$azs_query_zeiten);
        
    $uhrzeit            =    "";
        while (
    $row    =    odbc_fetch_object($azs_result_zeiten)) {
            
    $bez1            =    $row->BEZ1;
            
    $zeitvon        =    $row->ZEITVON_M;
            
    $zeitbis        =    $row->ZEITBIS_M;
            
    $datum            =    $row->DATUM;
            
    $datum_2        =    $datum;
        
            
    $vonzeit        =    gmdate("H:i",$zeitvon);
            
    $biszeit        =    gmdate("H:i",$zeitbis);
        
            
    $zeitanwesend    =    gmdate("H:i",$zeitbis-$zeitvon);
        
            
    $zeitanwesend    =    get_time_difference_std("00:45"$zeitanwesend);
        
            
    //Datum und Uhrzeit zusammenfassenfassen, um Gesamtstunden zu ermitteln
            
    $uhrzeit_von    =    explode(":"$vonzeit);
            
    $uhrzeit_bis    =    explode(":"$biszeit);
            
    $datum            =    explode("."date_mysql2german($datum));
            
    $vonzeit        =    mktime($uhrzeit_von[0],$uhrzeit_von[1],"00",$datum[1],$datum[0],$datum[2]);
            
    $biszeit        =    mktime($uhrzeit_bis[0],$uhrzeit_bis[1],"00",$datum[1],$datum[0],$datum[2]);
            
    $pausezeit        =    mktime("02","45","00",$datum[1],$datum[0],$datum[2]);
        
            
    $uhrzeit_summe    =    (($biszeit-$vonzeit)-$pausezeit);
            
    $uhrzeit_summe    =    explode(":"gmdate("H:i",$uhrzeit_summe));
            
    $uhrzeit        =    (($uhrzeit_summe[0]*3600)+($uhrzeit_summe[1]*60))+$uhrzeit;
        
            
    $stunden        =    floor($uhrzeit/3600);
            
    $minuten        =    floor(($uhrzeit-($stunden*3600))/60);
            
            
    //Aufbau des PDF Kopfes
            
    $str_l_arbeitszeit_von    =    $pdf->GetStringWidth($str_arbzeit_von)+2;
            
    $str_l_arbeitszeit_bis    =    $pdf->GetStringWidth($str_arbzeit_bis)+2;
            
    $str_l_zeitvon            =    $pdf->GetStringWidth($zeit_von)+10;
            
    $str_l_zeitbis            =    $pdf->GetStringWidth($zeit_bis)+10;
            
    $str_l_uhrzeit            =    $pdf->GetStringWidth($stunden.":".$minuten)+10;
            
    // create table
            
    $columns = array();
            
    // header col
            
    $col = array();
            
    $col[] = array('text' => $str_arbzeit_von'width' => $str_l_arbeitszeit_von'height' => '5''align' => 'C''font_name' => 'Arial''font_size' => '8''font_style' => 'B''fillcolor' => '0,134,117''textcolor' => '255,255,255''drawcolor' => '0,0,0''linewidth' => '0.4''linearea' => 'LTBR');
            
    $col[] = array('text' => $zeit_von'width' => $str_l_zeitvon'height' => '5''align' => 'C''font_name' => 'Arial''font_size' => '8''font_style' => 'B''fillcolor' => '0,134,117''textcolor' => '255,255,255''drawcolor' => '0,0,0''linewidth' => '0.4''linearea' => 'LTBR');
            
    $col[] = array('text' => $str_arbzeit_bis'width' => $str_l_arbeitszeit_bis'height' => '5''align' => 'C''font_name' => 'Arial''font_size' => '8''font_style' => 'B''fillcolor' => '0,134,117''textcolor' => '255,255,255''drawcolor' => '0,0,0''linewidth' => '0.4''linearea' => 'LTBR');
            
    $col[] = array('text' => $zeit_bis'width' => $str_l_zeitbis'height' => '5''align' => 'C''font_name' => 'Arial''font_size' => '8''font_style' => 'B''fillcolor' => '0,134,117''textcolor' => '255,255,255''drawcolor' => '0,0,0''linewidth' => '0.4''linearea' => 'LTBR');
            
    $col[] = array('text' => $stunden.":".$minuten'width' => $str_l_uhrzeit'height' => '5''align' => 'C''font_name' => 'Arial''font_size' => '8''font_style' => 'B''fillcolor' => '0,134,117''textcolor' => '255,255,255''drawcolor' => '0,0,0''linewidth' => '0.4''linearea' => 'LTBR');
            
    $columns[] = $col;
        
            
    //Prüfen, ob Mitarbeiter bereits im Array ist
            /*if (in_array($bez1, $pnr_arr)==FALSE) {
                $pnr_arr[]        =    $bez1;
            }*/    
        
    }    
        
    $pdf->WriteTable($columns);
        
    //neue Seite im Dokument;
        
    $pdf->AddPage();
    }

    $pdf->Output('auswertung.pdf'); 
    Vielen Dank für eure Hilfe


  • #2
    Wird die Schleife denn sonst mehrmals durchlaufen? Gibt es überhaupt mehr als einen Datensatz? Hast du die Abfrage mal in einem anderen System analysiert?

    PHP-Code:
    while ($row    =    odbc_fetch_object($azs_name_result)) {
    ...
        while (
    $row    =    odbc_fetch_object($azs_result_zeiten)) { 
    Da überschreibst du natürlich das Ergebnis aus der ersten Abfrage.
    You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

    Kommentar


    • #3
      Die zweite Schleife wird mehrfach durchlaufen.

      In der PDF werden für jeden Mitarbeiter seine Arbeitszeit angezeigt. Leider bleibt aber ab dem zweiten Durchlauf der Titel leer, es sieht so aus, als ob er die erste Schleife nur einmal durchläuft.

      Ich habe es hier bisher nur auf meinem Linux System getestet, da ich mit Windows schlechte Erfahrungen gemacht habe.

      MfG

      Kommentar


      • #4
        Zitat von chorn Beitrag anzeigen
        PHP-Code:
        while ($row    =    odbc_fetch_object($azs_name_result)) {
        ...
            while (
        $row    =    odbc_fetch_object($azs_result_zeiten)) { 
        Da überschreibst du natürlich das Ergebnis aus der ersten Abfrage.
        oder mit anderen Worten nimm für die innere mal $row2 ...
        PHP-Klassen auf github

        Kommentar


        • #5
          Zitat von jspit Beitrag anzeigen
          oder mit anderen Worten nimm für die innere mal $row2 ...
          Hab ich schon gemacht, das Ergebnis bleibt dasselbe.

          PHP-Code:
          while ($row_ma    =    odbc_fetch_object($azs_name_result)) {
              
          while (
          $row_az    =    odbc_fetch_object($azs_result_zeiten)) {
                  }

          Kommentar


          • #6
            Hast du mal versucht das Problem auf die notwenidgsten Zeilen zu reduzieren (Minimalcode) und einfach ein paar Werte ausgeben zu lassen?
            You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

            Kommentar


            • #7
              Ich habe das Problem soeben gelöst.

              Problem waren nicht die Schleifen, sondern die Textfarbe der vorhergehenden Zelle in der PDF Erstellung.

              Diese ware weiß. Da ich die Textfarbe nicht wieder auf schwarz zurückgestellt habe, blieben die Texte der ersten Schleife auch weiß, was für mich so aus sah, als ob die Schleife nicht mehr durchlaufen wurde.

              Wie ich darauf aufmerksam wurde. Mit meinem Minimalbeispiel mit dem Tipp von chorn, hat es funktioniert und sobald ich die Funktion zur PDF Erstellung in der zweiten Schleife hinzuzog, ging es nicht mehr, also lag hier der Hase im Pfeffer.

              Es hat allerdings einige Zeit gedauert, bis ich auf die Textfarbe gekommen bin.

              Vielen Dank für die Lösungsansätze.

              MfG

              aPeu

              Kommentar

              Lädt...
              X