falsche Rechnung, aber warum?

rich

Mitglied
Moin ihr lieben,
hab da mal wieder was zusammengepfuscht und verstehe was nicht so ganz...

es bestehen Datensätze in der DB...
die ausgelesen und in einer PDF - Datei per GET angezeigt werden.

es soll in einer Tabelle eine Auflistung mit Preisen stattfinden.
dies ist so auch ok, zum schluss zusammen rechnen und fertig.

im folgenden Code (übrigends ist der nur für Interne zwecke)
lasse ich die Zahlen, die in der DB mit VACHAR gespeichert sind formatieren.
(größerer absatz im quellcode, hier aber nicht aktiv)

PHP:
<?php
//Pfad zum font Ordner definieren
define('FPDF_FONTPATH','font/');
require('fpdf.php');

//PDF_MC_Table einbinden
include_once('fpdf_tables.php');

//Neues PDF Anlegen
//Syntax FPDF(Seitenlayout,Maßeinheit,Papierformat)
//$pdf=new FPDF('P','mm','A4');
$pdf=new PDF_MC_Table('P', 'mm', 'A4');

//Neue Seite erzeugen
//Syntax: AddPage([Seitenlayout])
$pdf->AddPage();

require("config.php");

$id=$_GET['id'];
$result = mysql_query("SELECT * FROM angebot where id='".$_GET[id]."'");

while ($daten = mysql_fetch_array($result))
{
$id = $daten['id'];
$anrede = $daten['anrede'];
$name = $daten['name'];
$vorname = $daten['vorname'];
$straße = $daten['straße'];
$plz = $daten['plz'];
$wohnort = $daten['wohnort'];
$kundennummer = $daten['kundennummer'];
$bestellung = $daten['bestellung'];
$bearbeiter = $daten['bearbeiter'];
$email = $daten['email'];
}
$datum = date("d.m.Y", (time()));

//$pdf->Image($foto,146,19,36, 0);
$pdf->Image('logo.jpg',165,10,40, 0);
$pdf->Image('velux.jpg',120,19,36, 0);

$pdf->SetFont('Arial','U',8);
$pdf->Text(20,59,'Adresse-Überschrift');

$pdf->SetFont('Arial','',8);
$pdf->Text(20,63,'Name Empfänger');
$pdf->Text(20,67,'z.H.'.' '.$anrede.' '.$vorname.' '.$name);
$pdf->Text(20,71,$straße);
$pdf->Text(20,75,$plz.' '.$wohnort);

$pdf->SetFont('Arial','',8);
$pdf->Text(20,88,'Kunden- Nr.:'.' '.$kundennummer);
$pdf->Text(20,92,'Bearbeiter:'.' '.$bearbeiter);
$pdf->Text(20,96,'Email:'.' '.$email);
$pdf->Text(20,100,'Datum:'.' '.$datum);

$pdf->SetFont('Arial','B',8);
$pdf->Text(20,110,'Angebot Nr.'.' '.$id);

$pdf->SetFont('Arial','',9);
$pdf->Text(20,120,'Sehr geehrte/r'.' '.$anrede.' '.$name);
$pdf->Text(20,124,'TEXT.');
$pdf->Text(20,128,'TEXT.');


//Tabellenformatierung
$zellenbreite_pos="10"; // Zellenbreite Pos.
$zellenbreite_menge="15"; // Zellenbreite Menge
$zellenbreite_me="15"; // Zellenbreite ME
$zellenbreite_bez="70"; // Zellenbreite Bezeichnung
$zellenbreite_einzelp="20"; // Zellenbreite Einzelpreis
$zellenbreite_gesamtp="20"; // Zellenbreite Gesamtpreis

//Y-Position der Tabellenzeile setzen
//Syntax: setY(Y-Wert)
$pdf->setY(135); // Position der Höhe für Tabelle
$setxtiefe="20"; // Position der Tiefe für Tabelle

//Breite der einzelnen Spalten der Tabellezeile setzen.
//Die Anzahl der Werte die Übergeben werden,ist die Anzahl der Spalten die generiert werden
$pdf->SetWidths(array($zellenbreite_pos,$zellenbreite_menge,$zellenbreite_me,$zellenbreite_bez,$zellenbreite_einzelp,$zellenbreite_gesamtp)); // Länge der einzelenen Zellen

//Zeile erzeugen
//Syntax: Row(array $Spaltenwerte)
$pdf->SetFillColor(180,180,180); //geht nicht
$pdf->SetTextColor(000,000,000); // Textfarbe, Schwarz
$pdf->SetDrawColor(000,000,000); // Rahmenfarbe, Schwarz
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetAligns(array('C','C','C','L','R','L'));
$pdf->Row(array('Pos.','Menge','ME','Bezeichnung','Einzelpreis','Gesamtpreis'));

//Zeilenumkbruch erzeugen
//Syntax: Ln(Höhe)
$pdf->Ln(1);

$pos=0; //startposition der Pos. in Tabelle
$pos++; //Pos in Tabelle immer +1

// Datensätze aus der Datenbank auslesen
$sql = mysql_query("SELECT * FROM angebot_matereal where verkn_bestellung=$bestellung");
while ($daten = mysql_fetch_array($sql))
{
$id = $daten['id'];
$menge = $daten['menge'];
$me = $daten['me'];
$bezeichnung = $daten['bezeichnung'];
$einzelpreis = $daten['einzelpreis'];
//$gesamtpreis = $daten['gesamtpreis'];

$gesamtpreis = $einzelpreis * $menge; // hier wird der einzelpreis bei Stückzahlen Mal genommen und als Gesamtpreis ausgegeben.
$einzelpreis = number_format($einzelpreis , 2 , ',' , '.'); // Rundet das ergebis der enbtsprechenden zahl (hier 2)
$gesamtpreis = number_format($gesamtpreis , 2 , ',' , '.'); // Rundet das ergebis der enbtsprechenden zahl (hier 2)

$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle

//Spaltenbreite setzen und Zeile erzeugen
$pdf->SetWidths(array($zellenbreite_pos,$zellenbreite_menge,$zellenbreite_me,$zellenbreite_bez,$zellenbreite_einzelp,$zellenbreite_gesamtp)); // Länge der einzelenen Zellen
$pdf->Row(array($pos++,
                $menge,
                $me,
                $bezeichnung,
                $einzelpreis.' '.'€',
                $gesamtpreis.' '.'€'));
}
$pdf->Ln();

// ab hier wird zusammengerechnet
$query = "SELECT SUM(einzelpreis*menge) as einzelpreis, menge FROM angebot_matereal WHERE verkn_bestellung=$bestellung";
$gesamtwert = mysql_result(mysql_query($query), 0);









//$gesamtwert = number_format($gesamtwert , 2 , ',' , '.'); // Rundet das ergebis der enbtsprechenden zahl (hier 2)












$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array($zellenbreite_pos,$zellenbreite_menge,$zellenbreite_me,$zellenbreite_bez,$zellenbreite_einzelp,$zellenbreite_gesamtp)); // Länge der einzelenen Zellen
$pdf->Row(array('-',
                '',
                '',
                'Nettosumme',
                '',
                $gesamtwert.' '.'€'));

$steuer = $gesamtwert / 100 * 19; //berechnung UMST
$steuer = number_format($steuer , 2 , ',' , '.'); // Rundet das ergebis der enbtsprechenden zahl (hier 2)

$zuzahlen = $gesamtwert / 100 * 19 + $gesamtwert; //berechnung inkl. UMST
$zuzahlen = number_format($zuzahlen , 2 , ',' , '.'); // Rundet das ergebis der enbtsprechenden zahl (hier 2)

$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array($zellenbreite_pos,$zellenbreite_menge,$zellenbreite_me,$zellenbreite_bez,$zellenbreite_einzelp,$zellenbreite_gesamtp)); // Länge der einzelenen Zellen
$pdf->Row(array('-','','','19 %',' ',$steuer.' '.'€'));
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->Row(array('-',
                '',
                '',
                'zzgl. Umsatzsteuer 19 %',
                ' ',
                $zuzahlen.' '.'€'));

$pdf->Ln(5);

$pdf->SetFillColor(180,180,180); //geht nicht
$pdf->SetTextColor(000,000,000); // Textfarbe, Schwarz
$pdf->SetDrawColor(999,999,999); // Rahmenfarbe, Weiß
$pdf->SetAligns(array('L')); // Tabelle mit Text auf Links setzen
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array(150)); // Länge der einzelenen Zellen
$pdf->Row(array('Text')); // anklickbar machen aus DB!
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array(150)); // Länge der einzelenen Zellen
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
//$pdf->Row(array('Text'));
$pdf->Row(array('Text'));
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array(150)); // Länge der einzelenen Zellen
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->Row(array('Text.'));

$pdf->Ln(5);

$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->Row(array('Mit freundlichem Gruß'));
$pdf->setX($setxtiefe); // Position der Tiefe für Tabelle
$pdf->SetWidths(array(150)); // Länge der einzelenen Zellen
$pdf->Row(array($bearbeiter));

//Ausgabe
//Syntax Output(Dateiname, Ausgabe Art)
//http://fpdf.de/funktionsreferenz/Output/
//$pdf->Output('multicell_table.pdf', 'D');
$pdf->Output();

als Ergebnis erhalte ich folgendes (s. Bild o_format.png).
was auch soweit richtig ist.
allerdings zeigt er bei der Nettosumme einen punkt und kein komma,
soweit dachte ich mir ja gut fällt nicht so auf und nicht so wild
aber wenn man kleinere Beträge rechnet wie in Bild (o2_format.png)
wird dort die zweite nachkommastelle abgeschnitten und das ja blöd.

also im Quelltext für die Zelle
PHP:
$gesamtwert = number_format($gesamtwert , 2 , ',' , '.');
eingefügt
bzw die // entfernt.

hat auch funktioniert nur war das Ergebnis dann falsch ?!
Bild (m_format.png) ähm ja warum?
in Bild (m2_format.png)
stimmte nun die Formatierung aber Ergebnis auch nicht mehr so ganz richtig ^^

ich nehme an, dass er mit der Formatierung die als betag in der DB hinterlegten 01.22 nicht so rechnet sondern 1.22
kann das angehen?

und habt ihr ne Idee man das machen kann, dass richtig in der Formatierung und Rechnung ist ?

hoffe doch ich hab das soweit Verständlich beschrieben.
liebe grüße
 

Anhänge

  • o_format.PNG
    o_format.PNG
    14,6 KB · Aufrufe: 8
  • m_format.PNG
    m_format.PNG
    14,5 KB · Aufrufe: 11
  • o2_format.PNG
    o2_format.PNG
    13,5 KB · Aufrufe: 16
  • m2_format.PNG
    m2_format.PNG
    13,5 KB · Aufrufe: 13
  • db.PNG
    db.PNG
    8,3 KB · Aufrufe: 14
Ohne mir jetzt den Quellcode genauer angesehen zu haben:

In der Programmierung IMMER das Komma als . (Punkt) schreiben und auch damit rechnen. Floatwerte auch so in die Datenbank schreiben!

Erst für die Ausgabe entsprechende Umformungen vornehmen! (Dann sollte auch nichts schief gehen)
 
...lasse ich die Zahlen, die in der DB mit VACHAR gespeichert sind formatieren...

Warum bitte werden die Zahlen nicht als Zahl gespeichert. Dann könntest du die Berechnung bereits in der SQL-Abfrage erledigen und hättest den ganzen Ärger nicht.

Außerdem behaupte ich mal das der Text am Ende der Rechnung auch falsch ist. Das steht der Endbetrag in dem die Mehrwertsteuer enthalten ist und du schreibst davor "zzgl. Umsatzsteuer 19%".
 
In der Programmierung IMMER das Komma als . (Punkt) schreiben und auch damit rechnen

Ja das hab ich auch schon feststellen können, dass nur mit . geht aber danke.


Erst für die Ausgabe entsprechende Umformungen vornehmen! (Dann sollte auch nichts schief gehen)

naja das geht ja eben nicht ^^


Warum bitte werden die Zahlen nicht als Zahl gespeichert.
Dann könntest du die Berechnung bereits in der SQL-Abfrage erledigen und hättest den ganzen Ärger nich

mit INT oder FLOAT oder wie?
mit den Typen der DB bin ich noch nie zurecht gekommen ^^

Außerdem behaupte ich mal das der Text am Ende der Rechnung auch falsch ist. Das steht der Endbetrag in dem die Mehrwertsteuer enthalten ist und du schreibst davor "zzgl. Umsatzsteuer 19%".

Jap, hast recht danke,
irgendwann sieht man so etwas nicht mehr wenn man den ganzen tag davor hockt.
 
Float, Double oder Decimal. Gucks du hier.

Auf keinen Fall INT, das lässt nur ganze Zahlen zu und du hast ja auch Nachkommastellen!
 
Die Frage ist wie die bereits gespeicherten Zahlen jetzt nach der Typumwandlung in der Datenbank stehen.

Eine als Text gespeicherte Zahl wie zum Beispiel 123,45 wurde dabei sicher in 123 umgewandelt.
 
richtig, dies hab ich aber wieder geändert.
bei zahlen über bzw ab 10 ist das auch kein problem mehr mit der berechnung.

allerdings die Zahlen darunter 1-9,
eigentlich müssten das 01,22 heissen und nicht 1,22

dann sollte er das auch wieder berechnen
 
Zuletzt bearbeitet:
Momnt redest du jetzt davon das du immer eine feste Anzahl Stellen haben willst oder davon das die Berechnung falsch ist?
 

Neue Beiträge

Zurück