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
7815
Akzeptiert: 66%

bearbeitet 04 Jun '15, 09:52

esdd's gravatar image

esdd
15.5k53753


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
15.5k53753

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.5k13

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

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:

×14
×10
×3

Frage gestellt: 02 Jun '15, 07:21

Frage wurde angeschaut: 3,594 Mal

Zuletzt aktualisiert: 16 Aug '15, 12:56