🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datums-Berechnung mitten im Text ausgeben / Monatsende

WRITER hat alles, was Sie von einer modernen, voll ausgestatteten Textverarbeitung erwarten.
Antworten
librouterev
Beiträge: 4
Registriert: Do 27. Feb 2020, 08:50

Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von librouterev » Do 27. Feb 2020, 19:30

Hallo LibreOffice-Gemeinschaft,

ich versuche möglichst einfach ein paar Datums-Berechnungen durchzuführen und das Ergebnis dann mitten im Text auszugeben, komme aber einfach auf keine Lösung.

Beispiel für ein (fiktives) Angebot:

Benutzer gibt in ein Benutzerfeld ein Datum ein: 16.03.2020

Auf der nächsten Seite kommt ein Paragraph:
Dieses Angebot ist bis zum 30.04.2020 gültig.

Die obige Zeile wäre trivial in Calc mit =MONATSENDE(A1; 1) bzw =MONATSENDE("16.03.2020"; 1) zu lösen.

Aber wie um Himmels willen bekomme ich diese Berechnung in Writer hin? Wenn ich eine Tabelle einfüge, dann scheint DATUM/MONATSENDE nicht verfügbar zu sein, bzw es kommt Fehlerhafter Ausdruck.
Muss das mit einem Makro gemacht werden? Das klingt irgendwie nach overkill.

Hoffe jemand hat da eine Idee.

Wanderer
* LO-Experte *
Beiträge: 909
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von Wanderer » Fr 28. Feb 2020, 08:23

Hallo,

bei derartigen Texten brauchst Du ja auch den größeren Teil von Writer nicht. Ich erstelle solche Kalkulationen direkt in Calc.

Für den Text kann man Zellen verbinden, den automatischen Umbruch in Zellen aktivieren und auch mit Formaten arbeiten.

Und die typischen Adressfelder im Kopf sind auch kein Problem, da die Zellen millimetergenau angelegt werden können.

Meine Empfehlung wäre also, wenn Du Calc brauchst, dann nutze es auch und versuche nicht das innerhalb von Writer zu lösen.

Mfg, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

librouterev
Beiträge: 4
Registriert: Do 27. Feb 2020, 08:50

Re: Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von librouterev » Fr 28. Feb 2020, 08:57

Hallo,

das wäre jetzt eine krasse Umstellung in meiner Firma. Wir haben dutzende Writer-Vorlagen für Geschäftskorrespondenz (Rechnungen, Angebote, Anfragen, Pflichtenhefte, Dokumentation, etc). Und die Vorlagen sind teils sehr ausgefeilt inklusive individuellen Formatvorlagen sowie Kopf- und Fußzeilen, Benutzerfeldern, usw.

Einige Vorlagen möchten wir nun um kleine Passagen mit Datumsberechnungen erweitern. Ich kann mir nicht vorstellen, dass die einzige Antwort darauf ist, alles in Calc zu erstellen.
Wanderer hat geschrieben:
Fr 28. Feb 2020, 08:23
Hallo,

bei derartigen Texten brauchst Du ja auch den größeren Teil von Writer nicht. Ich erstelle solche Kalkulationen direkt in Calc.

Für den Text kann man Zellen verbinden, den automatischen Umbruch in Zellen aktivieren und auch mit Formaten arbeiten.

Und die typischen Adressfelder im Kopf sind auch kein Problem, da die Zellen millimetergenau angelegt werden können.

Meine Empfehlung wäre also, wenn Du Calc brauchst, dann nutze es auch und versuche nicht das innerhalb von Writer zu lösen.

Mfg, Jörn

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von craig » Fr 28. Feb 2020, 13:42

Hallo,
Wenn ich eine Tabelle einfüge, dann scheint DATUM/MONATSENDE nicht verfügbar zu sein, bzw es kommt Fehlerhafter Ausdruck.
Das ist korrekt. Writer ist halt keine Tabellenkalkulation und bietet nur rudimentäre Berechnungsmöglichkeiten.
Muss das mit einem Makro gemacht werden? Das klingt irgendwie nach overkill.
Das ist kein Overkill, sondern es ist eine Möglichkeit Writer mit Calc-Funktionen auszustatten.
Dazu wird ein UnoService geladen, welcher die Calc-Funktionen bereit stellt. Nach der Berechnung im Makro
erfolgt die Ausgabe in Writer (Tabellenzelle, Feld, an definerter Position im Text.)

Nun hört sich dies sehr einfach an, aber die Calc-Funktion "Monatsende",
bzw. "EOMonth" ist eigentlich keine Funktion, sondern ein AddIn.
Ich habe dies gerade mal bei mir getestet, erhalte aber beim Aufruf per FunctionAccess eine Fehlermeldung.
Ggf. ist hier noch ein spezieller "AddIn Service" erforderlich. Habe diesen in der API noch nicht gefunden.
Heißt also, versprechen kann ich nichts :oops:
Beispiel für ein (fiktives) Angebot:

Benutzer gibt in ein Benutzerfeld ein Datum ein: 16.03.2020
  1. Ist es wirklich ein Feld, vom Typ "Benutzerfeld"?
    Menü Einfügen --> Feldbefehl --> Weitere Feldbefehle...
    • Wenn ja, welcher Name wurde für das Benutzerfeld vergeben?
  2. Wo soll die Ausgabe (Monatsende) erfolgen?
    In ein anderes Feld, in eine Tabelle, etc...
  3. Was ist wenn Benutzerfeld Datum= Monatsende ist?
Edit: 28.02.2020 14:28Uhr
Nachtrag:

Habe ein Beispielmakro geschrieben.
Das Startdatum (Variable= sDat) kann im Makro geändert werden.
Es handelt sich hierbei wie zuvor erwähnt um ein Calc-AddIn,
welches per Makro geladen wird und das Ergebnis in einer Messagebox ausgibt.

Code: Alles auswählen

REM  *****  BASIC  *****

Sub MonEnde
Dim sDat as String

' Startdatum einlesen
sDat="10.03.2020"

' Calc-Funktionen laden
fca = createunoservice("com.sun.star.sheet.FunctionAccess")
' Zugriff auf Calc-AddIn "Datumsfunktionen"
' Mittels "getDaysInMonth" und der Variablen "sDat" Gesamttage des Monats ermitteln
' Schaltjahre werden berücksichtigt.
MonEnd = fca.callFunction("com.sun.star.sheet.addin.DateFunctions.getDaysInMonth", array(sDat))

' Datum Monatsletzter zusammensetzen
sDatEnd=DateSerial(Year(sDat), Month(sDat), MonEnd)


' Wert in Messagebox ausgeben
msgbox "Anzahl Tage für den Monat " & Month(sDat) & " = " &  MonEnd & Chr(10) & Chr(10) &_
		"Monatsende = " & sDatEnd, 64, "Ergebnis des AddIns 'DateFunctions.getDaysInMonth'"
End Sub
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

librouterev
Beiträge: 4
Registriert: Do 27. Feb 2020, 08:50

Re: Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von librouterev » Mo 2. Mär 2020, 14:40

Hallo Craig,

um Himmels Willen, vielen Dank für deinen Input! Durch dein Makro konnte ich nachvollziehen, wie ich an diese AddIn-Funktionen rankomme. Du bekommst noch eine PN von mir :)
Habe ein Beispielmakro geschrieben.
Das Startdatum (Variable= sDat) kann im Makro geändert werden.
Es handelt sich hierbei wie zuvor erwähnt um ein Calc-AddIn,
welches per Makro geladen wird und das Ergebnis in einer Messagebox ausgibt.
Nach ein bisschen experimentieren konnte ich auch direkt die Funktion EOMonth aufrufen.

Für alle Interessierten ein Beispiel-Makro:

Siehe auch
date_example.odt
Rechnen mit Datum in Writer mit Makros. Erstellt mit LO 6.4
(11.22 KiB) 159-mal heruntergeladen
:

Im Dokument wurden zwei Benutzerfelder definiert: QuoteDate und QuoteEndDate
Gibt der User für QuoteDate einen Datum ein (z.B. 16.01.2020) und speichert das Dokument, so wird (rein fiktiv) das letzte Datum des nächsten Monats (29.02.2020 - Schaltjahre wurden erkannt) berechnet und im Text aktualisiert.

Code: Alles auswählen

REM  *****  BASIC  *****

Function CalculateEndOfMonth(ByVal date As String, ByVal months as Integer) As Long
	mArgs = Array(date, months)
	fca = createunoservice("com.sun.star.sheet.FunctionAccess")
	lResult = fca.callFunction("com.sun.star.sheet.addin.Analysis.getEomonth", mArgs())
	CalculateEndOfMonth = lResult
End Function


Sub UpdateFields
	oDoc = thisComponent

	sFieldDateName = "com.sun.star.text.FieldMaster.User.QuoteDate"
	sFieldDate = oDoc.TextFieldMasters.getByName(sFieldDateName).content

	lEndDate = CalculateEndOfMonth(sFieldDate, 1)
	
	sFieldEndDateName = "com.sun.star.text.FieldMaster.User.QuoteEndDate"
	oDoc.TextFieldMasters.getByName(sFieldEndDateName).content = lEndDate
End Sub

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

Re: Datums-Berechnung mitten im Text ausgeben / Monatsende

Beitrag von mikele » Mo 2. Mär 2020, 17:25

Hallo,
es gäbe da auch noch die Variante mit Formularelementen zu arbeiten. Anbei mal eine Variante mit einem Datumsfeld und einem Beschriftungsfeld.
Sobald das Datumsfeld verlassen wird, wird das Beschriftungsfeld aktualisiert.

Code: Alles auswählen

Sub updatedatum
	Dim sdatum as string
	oDoc = ThisComponent
	oform=odoc.getDrawPage().Forms().getByIndex(0)
	octrl=oform.getByName("Datumsfeld 1")
	sdatum=cdate(dateadd("m",1,dateserial(octrl.Date.year,octrl.Date.month,1))-1)
	oform.getByName("Beschriftungsfeld 1").label=sdatum
End sub
Dateianhänge
date_example2.odt
(14.34 KiB) 150-mal heruntergeladen
Gruß,
mikele


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten