Bei Positionsbeträgen ab 1.000,00 erhält man die im Titel genannte Fehlermeldung des fp-Pakets. Als deren Folge funktioniert die USt-Berechnung nicht mehr korrekt. Hat jemand eine Lösung?

Open in Online-Editor
\documentclass[parskip=full-,enlargefirstpage=true]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
\usepackage{booktabs}

\usepackage{numprint}
\nprounddigits{2}

\usepackage[right]{eurosym}

\usepackage{datatool}
\DTLnewdb{rechnung}

\newcommand\Posten[3]{%
  \DTLnewrow{rechnung}
  \DTLnewdbentry{rechnung}{Bezeichnung}{#1}
  \DTLnewdbentry{rechnung}{Anzahl}{#2}
  \DTLnewdbentry{rechnung}{EP}{#3}
  {\dtlexpandnewvalue
    \FPeval\fpresult{round(#2*#3)(2)}
    \DTLnewdbentry{rechnung}{GP}{\fpresult}
  }
}

\newcommand\mwst{}

\newenvironment{rechnung}[1]{%
  \renewcommand\mwst{#1}%
  \DTLcleardb{rechnung}%
}{%
  \DTLsumforkeys{rechnung}{GP}{\Zwischensumme}%
  \FPeval\MWSt{round(\mwst*\Zwischensumme/100)(2)}%
  \FPeval\Summe{round(\Zwischensumme+\MWSt)(2)}%
  \xdef\Summe{\Summe}%
  \par\centering
  \begin{tabularx}{\textwidth}{Xrrr}
    \toprule
    Bezeichnung&Anzahl&Einzelpreis&Gesamtpreis
    \DTLforeach*{rechnung}{\bez=Bezeichnung,\anz=Anzahl,\ep=EP,\gp=GP}{%
      \DTLiffirstrow{\\\midrule}{\\}
      \bez&\npnoround\numprint{\anz}\nprounddigits{2}&\numprint{\ep}&\numprint{\gp}
    }\\
    \midrule
    \if\mwst0\else
      Zwischensumme&&&\numprint{\Zwischensumme}\\
      Mehrwertsteuer (\mwst\,\%)&&&\numprint{\MWSt}\\
      \midrule
    \fi
    Summe&&&\numprint{\Summe}\\
    \bottomrule
  \end{tabularx}
  \par
}

\setkomavar{fromname}{Max Mustermann}
\setkomavar{fromaddress}{Musterstraße 1\\12345 Musterstadt}
\newkomavar{bank} 
\setkomavar{bank}{Meine Bank\\BLZ 123 456 78\\Kontonummer 123 456 789 00}

\renewcommand\raggedsignature{\raggedright}

\begin{document}

\begin{letter}{Firma Freundlich\\Rechnungstraße 12\\45678 Ortsname}
\setkomavar{invoice}{xxyyzz-2013}

\opening{Sehr geehrte Damen und Herren,}

hiermit berechnen wir

\begin{rechnung}{19}
  \Posten{Arbeitsstunden}{10}{100.00}
\end{rechnung}

Bitte überweisen Sie den Rechnungsbetrag von \EUR{\numprint{\Summe}} unter Angabe von Rechnungsnummer und -datum auf das folgende Konto:

\usekomavar{bank}

\closing{Mit freundlichen Grüßen}   
\end{letter}
\end{document}

gefragt 02 Jun '15, 13:21

TeX-Newb's gravatar image

TeX-Newb
88137
Akzeptiert-Rate: 0%

bearbeitet 04 Jun '15, 15:52

esdd's gravatar image

esdd
17.8k284257


Da scheint irgendetwas bei \DTLsumforkeys schief zu laufen. Ersetze die die Berechnung der Zwischensumme durch

Open in Online-Editor
\def\Zwischensumme{0}%
\DTLforeach*{rechnung}{\gp=GP}{\FPeval\Zwischensumme{\Zwischensumme+\gp}}%

alt text

Code:

Open in Online-Editor
\documentclass[parskip=full-,enlargefirstpage=true]{scrlttr2}
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
\usepackage{booktabs}

\usepackage{numprint}
\nprounddigits{2}

\usepackage[right]{eurosym}

\usepackage{datatool}
\DTLnewdb{rechnung}

\newcommand\Posten[3]{%
  \DTLnewrow{rechnung}
  \DTLnewdbentry{rechnung}{Bezeichnung}{#1}
  \DTLnewdbentry{rechnung}{Anzahl}{#2}
  \DTLnewdbentry{rechnung}{EP}{#3}
  {\dtlexpandnewvalue
    \FPeval\fpresult{round(#2*#3)(2)}
    \DTLnewdbentry{rechnung}{GP}{\fpresult}
  }
}

\newcommand\mwst{}

\newenvironment{rechnung}[1]{%
  \renewcommand\mwst{#1}%
  \DTLcleardb{rechnung}%
}{%
  %\DTLsumforkeys{rechnung}{GP}{\Zwischensumme}% liefert Fehler bei Zwischensummen ab 1000
  % Alternative
  \def\Zwischensumme{0}%
  \DTLforeach*{rechnung}{\gp=GP}{\FPeval\Zwischensumme{\Zwischensumme+\gp}}
  %
  \FPeval\MWSt{round(\mwst*\Zwischensumme/100)(2)}%
  \FPeval\Summe{round(\Zwischensumme+\MWSt)(2)}%
  \xdef\Summe{\Summe}%
  \par\centering
  \begin{tabularx}{\textwidth}{Xrrr}
    \toprule
    Bezeichnung&Anzahl&Einzelpreis&Gesamtpreis
    \DTLforeach*{rechnung}{\bez=Bezeichnung,\anz=Anzahl,\ep=EP,\gp=GP}{%
      \DTLiffirstrow{\\\midrule}{\\}%
      \bez&\npnoround\numprint{\anz}\nprounddigits{2}&\numprint{\ep}&\numprint{\gp}%
    }\\
    \midrule
    \if\mwst0\else
      Zwischensumme&&&\numprint{\Zwischensumme}\\
      Mehrwertsteuer (\mwst\,\%)&&&\numprint{\MWSt}\\
      \midrule
    \fi
    Summe&&&\numprint{\Summe}\\
    \bottomrule
  \end{tabularx}
  \par
}

\setkomavar{fromname}{Max Mustermann}
\setkomavar{fromaddress}{Musterstraße 1\\12345 Musterstadt}
\newkomavar{bank} 
\setkomavar{bank}{Meine Bank\\BLZ 123 456 78\\Kontonummer 123 456 789 00}

\renewcommand\raggedsignature{\raggedright}

\begin{document}

\begin{letter}{Firma Freundlich\\Rechnungstraße 12\\45678 Ortsname}
\setkomavar{invoice}{xxyyzz-2013}

\opening{Sehr geehrte Damen und Herren,}

hiermit berechnen wir

\begin{rechnung}{19}
  \Posten{Arbeitsstunden}{10}{100.00}
\end{rechnung}

Bitte überweisen Sie den Rechnungsbetrag von \EUR{\numprint{\Summe}} unter Angabe von Rechnungsnummer und -datum auf das folgende Konto:

\usekomavar{bank}

\closing{Mit freundlichen Grüßen}   
\end{letter}
\end{document}
Permanenter link

beantwortet 02 Jun '15, 16:11

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 04 Jun '15, 15:50

Da ich ungern einen neuen Thread wegen desselben Themas beginnen möchte, schließe ich nun noch eine Folgefrage an. Wie kommt es, dass im nachfolgenden Beispiel die Zahlenausrichtung nach der Zweiten Position nicht mehr mit den nachfolgenden Zahlen aus der Spalte GP funktioniert und dies scheinbar nur deshalb, weil zusätzlich noch das hyperref Paket geladen wurde?

(04 Jun '15, 02:01) TeX-Newb
1

@TeX-Newb Ich habe Deine "Antwort" in einen Kommentar umgewandelt. Das ist hier etwas anders als in Foren: als Antworten werden hier nur Beiträge betrachtet, die die eigentliche Frage beantworten. Alles andere sind Kommentare zu Fragen oder Antworten.

In dem Fall fehlte nur einfach ein % nach \numprint{\gp}. Ich habe das oben eingefügt.

(04 Jun '15, 15:57) esdd

@esdd ich bin nun im Laufe der Arbeit mit Deiner tollen Lösung noch auf folgendes/n Problem bzw. Erweiterungswunsch gestoßen: Könnte man den Posten Befehl noch um ein optionales viertes Argument ergänzen, um damit in gewissen Fällen manuell die Summe der jeweiligen Zeile setzen zu können, beispielsweise in Fällen, in denen keine Anzahl bzw. kein EP angegeben werden sollen? Ich habe schon etwas mit ifthenelse-Konstrukten herumexperimentiert, bin bislang leider erfolglos geblieben. Ich hoffe, dass meine Frage als Kommentar i.O. ist; wollte kein neues Tonic deswegen aufmachen. Vielen Dank!

(15 Aug '15, 20:26) TeX-Newb

@TeX-Newb: Das ist eigentlich eine neue Frage und sollte auch als solche gestellt werden, was ich hiermit getan habe.

(15 Aug '15, 21:03) saputello

datatool benutzt in Zahlen ein Komma, um tausender Gruppen abzutrennen. D.h. deine Zwischensumme ist 1,000.00. fp mag das verständlicherweise nicht. Du musst also entweder das Komma grundsätzlich unterdrücken:

Open in Online-Editor
\DTLsetnumberchars{}{.}

oder deine Zwischensumme erstmal in ein für fp verdauliches Format konvertieren:

Open in Online-Editor
  \DTLsumforkeys{rechnung}{GP}{\Zwischensumme}%
  \DTLconverttodecimal\Zwischensumme\fpZwischensumme
  \FPeval\MWSt{round(\mwst*\fpZwischensumme/100)(2)}%
  \FPeval\Summe{round(\fpZwischensumme+\MWSt)(2)}%

Grundsätzlich habe ich aber Zweifel, ob du die Sache richtig angehst. Drei Argumenten (oder vier wenn man das optionale bei der anderen Antwort hinzunimmt) finde ich schon viel. Und was machst du, wenn du Beträge mit anderem Mehrwertsteuersatz aufführen musst? Oder die Einheit bei der Anzahl?

Außerdem würde ich empfehlen, das fp-Modul von expl3 zu verwenden. Es ist besser dokumentiert und wird auch gewartet.

Permanenter link

beantwortet 16 Aug '15, 18:56

Ulrike%20Fischer's gravatar image

Ulrike Fischer
3.6k23
Akzeptiert-Rate: 52%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×17
×16
×3

gestellte Frage: 02 Jun '15, 13:21

Frage wurde gesehen: 10,774 Mal

zuletzt geändert: 16 Aug '15, 18:56