Writer: Auf 2 Nachkommastellen runden

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

Hi,

ich erstelle im Moment Makros für den OO WRITER (!!!), nicht Calc.

Ich hänge jetzt schon ein paar Stunden an dem Problem, dass ich es nicht schaffe Zahlen mit genau 2 Nachkommastellen zu erzeugen.
Die brauche ich eben um einen Geldbetrag anzuzeigen, der in meinem Makro berechnet wird in Verbindung mit einer Benutzereingabe.

Wenn ich schreibe:

Code: Alles auswählen

geldbetrag = math.round(geldbetrag,2)
Kommt immer ein Laufzeitfehler (Objektvariable nicht belegt).

Habe die Variable auch mitlerweile mal als Datentyp Currency definiert, aber der Datentyp zeigt leider 4 Nachkommastellen an.

Finde im Internet leider keine Lösung, die funktioniert, wäre sehr nett wenn mir hier jemand helfen könnte.


Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst; CODE tags gesetzt
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von komma4 »

Willkommen im Forum!

Du wirst schon erstmal selbst etwas debuggen müssen, was hier falsch ist: Dein Fehler sollte schon nachvollziehbar sein (-> lauffähiges Beispiel posten!).

Ich gehe davon aus, dass geldbetrag nicht besetzt ist
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von balu »

Hallo Björn89,
Kommt immer ein Laufzeitfehler (Objektvariable nicht belegt).
Ich als Office würde das gleiche sagen, das die Objektvariable nicht belegt ist. Denn mit dieser einen Codezeile kann kein Mensch etwas anfangen. Also am besten hängst Du eine Beispieldatei (KEIN SCREENSHOT) hier an. Erst dann können wir weitersehen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

Dieser Code funktioniert, nur zeigt er eben 4 Nackommastellen an.

Code: Alles auswählen

sub Rechnung

dim document   as object
dim dispatcher as object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem Variableneingabe

Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")

rem Preisberechnungen

Dim nettopreis as currency
nettopreis = teilnahmen * 4.90

Dim bruttopreis as currency
bruttopreis = nettopreis * 1.19

Dim mwsteuer as currency
mwsteuer = bruttopreis - nettopreis

'[...hier folgt nur formatierter Text...]

dim args15(0) as new com.sun.star.beans.PropertyValue
args15(0).Name = "Text"
args15(0).Value = "-" + teilnahmen + " Teilnahmen am Programm" + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args15())

dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())

dim args17(0) as new com.sun.star.beans.PropertyValue
args17(0).Name = "Text"
args17(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "netto €" + nettopreis + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args17())

dim args18(0) as new com.sun.star.beans.PropertyValue
args18(0).Name = "Text"
args18(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "zuzügl. 19% MwSt. € " + mwsteuer + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args18())

dim args19(0) as new com.sun.star.beans.PropertyValue
args19(0).Name = "Text"
args19(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + CHR$(9) + "€ " + bruttopreis + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args19())
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

In diesem Code versuche ich die Rundung mit Math.Round:

Code: Alles auswählen

sub Rechnung

rem define variables
dim document   as object
dim dispatcher as object

rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")

Dim nettopreis as currency
nettopreis = teilnahmen * 4.90

nettopreis = Math.Round(nettopreis, 2)

dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())
Fehlermeldung: Objektvariable nicht belegt. (und markiert die Zeile: nettopreis = Math.Round(nettopreis, 2)
nettopreis ist aber ja direkt drüber deklariert und bekommt einen Wert zugewiesen.


Muss man vielleicht erst ein Paket importieren, damit Math.Round funktioniert?
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Stephan »

Fehlermeldung: Objektvariable nicht belegt. (und markiert die Zeile: nettopreis = Math.Round(nettopreis, 2)
nettopreis ist aber ja direkt drüber deklariert und bekommt einen Wert zugewiesen.
naja, gemeint mit Objektvariable ist hier "Math", "Nettopreis" ist doch überhaupt nicht als Objektvariable deklariert sondern als Currency
Muss man vielleicht erst ein Paket importieren, damit Math.Round funktioniert?
Wenn dann müsste dieses Paket das API von OO erweitern, was Du doch sicherlich nicht beabsichtigst.
Mir ist deshalb nicht ganz klar woher Du diesen Code hast - OpenOffice ist KEIN MS Office und auch KEIN Windows Scripting Host (nur um einmal zwei Mutmaßungen zur Code-Herkunft anzusprechen).

Viel einfacher wäre es doch das Runden in einer Function zu kapseln, meinethalben:

Code: Alles auswählen

Function runden(zahl, stellen)
	oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
	Dim args(1) As Variant
	args(0) = zahl
	args(1) = stellen
	runden = oFunctionAccess.callFunction( "Round", args() ) 
End Function
und dann normal aufzurufen mittels:

Code: Alles auswählen

nettopreis = runden(nettopreis, 2)
Gruß
Stephan
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

Hallo Stephan. Danke erstmal für deine Antwort.

Also ich programmiere den Code in den Makros von Open Office Writer (Basic).
Daher gehe ich mal davon aus, dass die Programmiersprache Visual Basic ist.

Den Code "Math.Round" habe ich ergoogelt.

Ich habe mal deinen Code ausprobiert, innerhalb des Programms (also zwischen Sub und End Sub) meckert er, dass eine Funktion nicht innerhalb einer Prozedur sein darf.
Wenn ich die Funktion vor das Sub setze, dann kommt der Fehler: "Objektvariable nicht belegt" (und markiert das "runden" in der vorletzten Zeile).
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Toxitom »

Hey Björn,
Also ich programmiere den Code in den Makros von Open Office Writer (Basic).
Daher gehe ich mal davon aus, dass die Programmiersprache Visual Basic ist.
Lustig:) Wie kommst Du darauf? OOo hat eine eigene Basic-Sprache, wobei natürlich das Grundgerüst zu Basic stimmt.

Eine "round" Funktion gibt es nicht im eingebauten Befehlssatz. Bleibt auch dei Frage, wozu Du die brauchst. Nur für die Darstellung? in dem Fall würde man eine interne Zahl entsprechend formatieren... also so etwas wie sZahl = Format(iZahl, "#.##0,00 €").
Möchtest Du intern rechnen, wäre die Variable als Currency korrekt deklariert (5 Nachkommastellen). Das ist üblich in der Finanzbranche.

Willst Du immer nur mit zwei Stellen rechnen, so kannst Du einen "Trick" anwenden: alle Werte mit 100 multiplizieren und dann ausschliesslich Integer oder Long-Variablen nutzen. Erst vor der Ausgabe wieder durch 100 dividieren.

Aber ehrlich gesagt: Dein gepostetet Code benutzt überwiegend Dispatcher Code - also wahrscheinlich mit Makro-Rekorder aufgenommen. Das wird nix "echtes";)

Da wirst Du wohl ein wenig tiefer einsteigen müssen - in das UNO-Modell und seine Möglichkeiten:)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Stephan »

Wenn ich die Funktion vor das Sub setze, dann kommt der Fehler: "Objektvariable nicht belegt" (und markiert das "runden" in der vorletzten Zeile).
in der Funktion muß (zumindest) der Parameter "zahl" explizit deklariert sein, also z.B.:

Code: Alles auswählen

Function runden(zahl As Double, stellen)
	oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
	Dim args(1) As Variant
	args(0) = zahl
	args(1) = stellen
	runden = oFunctionAccess.callFunction( "Round", args() ) 
End Function

Allerdings ist Das Runden ohnehin etwas sinnfrei, wenn man sich das Makro genau anschaut, denn wegen der Deklaration von "nettopreis" als currency, ist das Runden auf 2 Stellen wirkungslos denn es werden immer 4 Nachkommastellen beibehalten.
Zusätzlich liefert die Multiplikation einer Ganzzahl mit 4,90 immer ein Ergebnis mit nur einer Nachkommastelle, daraus werden auch durch Runden keine 2 Nachkommastellen, denn Nullen werden dort nicht ausgegeben. Wenn es also um die Anzeige geht gilt hier das von Thomas Gesagte.



Gruß
Stephan
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

Das funktioniert leider alles nicht richtig.

Mit einer Tabelle würde es wahrscheinlich funktionieren, da gibt es Zahlenformat: Währung.
Sieht aber optisch nicht gut aus.
Oder ich benutze Calc, aber da ist das Problem wahrscheinlich das selbe, das ist ja eine Rechnung.
Muss mal schauen ob ich das so formatiert kriege, dass das gut aussieht.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von komma4 »

Björn89 hat geschrieben: So, 04.06.2017 09:21Calc ... eine Rechnung ...formatiert
Du weisst schon, dass in CALC berechnet werden kann und die Werte dann nach WRITER (dynamisch) kopiert werden können (Stichwort: DDE; oder auch CALC als Datenquelle eines Serienbriefs=Rechnung).
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Stephan »

Das funktioniert leider alles nicht richtig.
Was genau funktioniert denn nicht?

Ich hatte auf die (möglichen(*)) Fehler im Code hingewiesen und auch auf die Überflüssigkeit des Rundens im Konkreten,mithin reicht es doch die Deklarierung als Currency und das Runden wegzulassen sowie die fehlende Null zu ergänzen.

(*)
"möglichen", weil es natürlich keine wirklichen Fehler sind, sondern eher unzweckmäßige Dinge wenn ich richtig liege mit meiner Vermutung was erreicht werden soll (z.B. ist die Deklarierung als Currency kein Fehler aber wahrscheinlich unerwünscht, weil dadurch immer 4 Nachkommastellen resultieren)


Tut man das, kommt man (beispielsweise) zu folgendem Code:

Code: Alles auswählen

sub Rechnung

rem define variables
dim document   as object
dim dispatcher as object

rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim teilnahmen as Integer
teilnahmen = InputBox("Wie viele Personen haben teilgenommen?")

'Dim nettopreis as Double
nettopreis = teilnahmen * 4.90

dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Text"
args16(0).Value = CHR$(9) + CHR$(9) + CHR$(9) + teilnahmen + " x " + "4,90 = € " + nettopreis & "0" + CHR(10)

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args16())

End Sub
Es läge an Dir zu erklären was damit nicht richtig funktioniert, denn ich kann nicht wissen wie die Ausgabe denn nun ganz genau aussehen soll.
Mit einer Tabelle würde es wahrscheinlich funktionieren, da gibt es Zahlenformat: Währung.
Genau das gleiche Zahlenformat kannst Du in Basic verwenden, Thomas hat bereits darauf hingewiesen.


Gruß
Stephan
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

komma4 hat geschrieben: So, 04.06.2017 10:10
Björn89 hat geschrieben: So, 04.06.2017 09:21Calc ... eine Rechnung ...formatiert
Du weisst schon, dass in CALC berechnet werden kann und die Werte dann nach WRITER (dynamisch) kopiert werden können (Stichwort: DDE; oder auch CALC als Datenquelle eines Serienbriefs=Rechnung).
Ich hab das mal kurz probiert, dann konnte ich die Datenbank aber nicht mehr öffnen um dort neue Datensätze einzutragen.


@Stephan
Dein Code würde für den Nettopreis zwar zwei Nachkommastellen anzeigen und das wäre auch korrekt, allerdings werden beim Bruttopreis und beim Mehrwertsteuerbetrag wieder 3 Nachkommastellen angezeigt, weil ja da mit 1.19 multipliziert wird, da kommt man um ein Runden ja nicht herum.


Wenn ich folgendes schreibe nach der bruttopreis-Berechnung

Code: Alles auswählen

bruttopreis2 = Format(bruttopreis, "#.##0,00 €")
Und dann bruttopreis2 ausgebe, dann schreibt er einfach zwei zusätzliche Nullen hintendran und gibt mir damit 5 Nachkommastellen.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Stephan »

allerdings werden beim Bruttopreis und beim Mehrwertsteuerbetrag wieder 3 Nachkommastellen angezeigt, weil ja da mit 1.19 multipliziert wird, da kommt man um ein Runden ja nicht herum.
Ja. Eine Funktion für das Runden hatte ich doch bereits angeben.

Meinethalben so zu verwenden:

Code: Alles auswählen

Sub Main
nettopreis = 1200.34
bruttopreis = nettopreis * 1.19
bruttopreis = runden(bruttopreis, 2)

Msgbox "Bruttopreis: " & format(bruttopreis, "##,##0.00 €")

End Sub


Function runden(zahl As Double, stellen)
	oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
	Dim args(1) As Variant
	args(0) = zahl
	args(1) = stellen
	runden = oFunctionAccess.callFunction( "Round", args() ) 
End Function
Und dann bruttopreis2 ausgebe, dann schreibt er einfach zwei zusätzliche Nullen hintendran und gibt mir damit 5 Nachkommastellen.
eigenlich muss es doch auch heissen:

bruttopreis2 = Format(bruttopreis, "#,##0.00 €")

denn auch auf einem deutschsprachigen SYstem bezieht sich format() auf die 'englische' Zahl, denn diese wird formatiert und nur ihre Ausgabe dann (automatisch) auf einem deutschen System in deutscher Schreibweise angezeigt.



Gruß
Stephan
Björn89
Beiträge: 7
Registriert: Fr, 02.06.2017 11:08

Re: Writer: Auf 2 Nachkommastellen runden

Beitrag von Björn89 »

Super! Es funktioniert jetzt genau so wie es soll!

Vielen Dank, Stephan.
Antworten