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, 07:21

TeX-Newb's gravatar image

TeX-Newb
434
Akzeptiert: 50%

bearbeitet 04 Jun '15, 09:52

esdd's gravatar image

esdd
14.2k53251


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, 10:11

esdd's gravatar image

esdd
14.2k53251

bearbeitet 04 Jun '15, 09: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?

(03 Jun '15, 20: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, 09: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, 14: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, 15: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, 12:56

Ulrike%20Fischer's gravatar image

Ulrike Fischer
2.2k13

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×11
×9
×3

Frage gestellt: 02 Jun '15, 07:21

Frage wurde angeschaut: 2,208 Mal

Zuletzt aktualisiert: 16 Aug '15, 12:56