Dialog-Steuerelement-Datum in Feldvariable-Datum kopieren und umgekehrt

Ich versuche seit Tagen das Modul RechVorTK von Thomas Krummbein für oOO2 unter LO5 zum Laufen zu bringen bzw. für meine Zwecke zu recyclen. Leider gelingt es mir dabei nicht, die Datumsbehandlung so anzupassen, dass man das Datum aus einem Datumsfeld des Dokuments (Einfügen - Feldbefehl - weitere - Variable setzen - feld2 - Datum) in ein Datumsfeld eines Dialog zu übertragen bzw. umgekehrt. Ich weiß inzwischen, dass das Dialogelement seit LO4 den Typ Struct für die Darstellung des Datums einsetzt. Mir wird aber nicht klar, wie ich dies mit dem Feld in Einklang bringen kann. Ich suche also nach einer helfenden Hand mit einem Codebeispiel, welches das Problem lösen kann oder nach einer nachvollziehbaren Erklärung.

Ich versuche einmal ein bisschen Licht da rein zu bringen, wenn ich auch mit Writer nicht viel zu tun habe. Mein Spezialgebiet ist eher Base.

unoDate = createUnoStruct("com.sun.star.util.Date")

Über unoDate.Year, unoDate.Month und unoDate.Day kannst Du das Strukt befüllen.

Willst Du z.B. aus einem Formularfeld den Datumswert lesen, so geht das über

oFeld.CurrentValue.Year bzw. Month oder auch Day.

Im Base-Handbuch habe ich dazu ein kleines Beispiel:

stMonat = Right(Str(0) & Str(oFeld.CurrentValue.Month),2)

stTag = Right(Str(0) & Str(oFeld.CurrentValue.Day),2)

Datumswert = CDateFromIso(oFeld.CurrentValue.Year & stMonat & stTag)

Die Änderung wurde übrigens merkwürdigerweise mit der Version 4.1.2 eingeführt, obwohl diese Version ja eigentlich nur Bugfixes zur 4.1.0 enthalten sollte.

Vielen Dank für die Antwort :slight_smile: Ich werde das am WE einarbeiten. Dein letzter Satz passt auch zur Dokumentation der API-Änderung - irgendwie so nebenbei :frowning: obwohl es wahrscheinlich sehr viele Makros betrifft, die dann nicht mehr funktionieren, oder kennst du einen Link der das verständlich kommuniziert?

Hey zusammen,

mit der API Änderung wurden auch neue Basic-Methoden eingeführt, die die Sache deutlich vereinfachen.

so wie “CDateFromISO” gibt es halt nun auch “CDateFromUnoDate” bzw. “CDateToUnoDate” welche die Umwandlung des Datums intern automatisch vornimmt. Damit ist es nicht nötig, die einzelnen Elemente gesondert zu extrahieren oder zu setzen.
Einfach mal in der LibreOffice Hilfe (Basic) nach den beiden Begriffen schauen - ist dort gut erklärt.

Viele Grüße
Tom

PS: Wo haste denn die alte Unterlage von mir her? Klasse:))

Nachdem ich hier die Chance habe mit dem Autor von RechVorTK his macroness direkt in Kontakt zu kommen :slight_smile: könnte ja das Ziel sein, das alte originale oOO20-Makro in die neue Zeit zu retten. Der Downloadlink befindet sich in meinem ersten Beitrag. Es enthält ja einige der raren Beispiele was mit Writer möglich ist.

Mein persönliches Ziel ist es, einen Briefassistenten für die Behandlung von Fehlzeiten von Schülern zu schreiben. Dabei soll mit steigender Eskalationsstufe jeweils einer neuer Brief geschrieben werden, der auf die Daten des vorhergehenden zugreift, ohne der Schülerdatenbank neue Felder oder Tabellen hinzuzufügen zu müssen (externe Wartung). Dazu beabsichtige ich, die im Originalmakro implementierten Mechanismen zu benutzen. Vorher muss aber die Verarbeitung von Datumswerten klappen, von denen es dann einige geben wird. Bisherige Substitutionen:

sub DialogVorbereiten
..
'oDlg.getControl("redat").date = cDateToISO(date()) Originalzeile
oDlg.getControl("redat").date = cDateToUnoDate(date()) 'Ersatz für diesen und ähnliche Fälle
..
end sub

Sub Dok_erzeugen
..
       case 2
			'sFeldinhalt = CDateFromIso(odlg.getControl(aFeld(i)).date)
			sFeldinhalt = CDateFromUnoDate(odlg.getControl(aFeld(i)).date)
..
end sub

Ein Problem, welches ich bisher nicht verstehe, gibt es z.B. hier (Unzulässiger Wert oder Datentyp. Datentypen unverträglich):

sub Daten_einlesen
..
        'oDlg.getControl("redat").date = CDateToIso(CDate(getVariable(oDoc, "feld2")))
        oDlg.getControl("redat").date = CDateToUnoDate(CDate(getVariable(oDoc, "feld2")))
..
end sub

mit oDoc = thisComponent, feld2 als “Variable setzen” Datumsfeld im ISO-Format und

function GetVariable(oDoc as Object, sVarName as string) as String
	sVar = "com.sun.star.text.FieldMaster.SetExpression." & sVarName
	oTxtFieldMasters = oDoc.getTextFieldMasters()
	oPropSet = oTxtFieldMasters.getByName(sVar)
	oDepTxtFields = oPropSet.DependentTextFields
	oDepTxtFeld = oDepTxtFields(0)
	GetVariable = oDepTxtFeld.content
end function

Hey. Das Ask-Forum ist leider ungeeignet für einen echten Dialog. Empfehle auf de.openoffice.info auszuweichen und die Frage neu zu stellen. Mehr Möglichkeiten dort. Tom

Antwort auf Deine Frage als Ergänzung zu meinem ursprünglichen Post… geht leider nicht anders…
Hmm… selbst das geht nicht mehr…

Die Lösung ist: der LibreOffice Basic Interpreter wurde überarbeitet und muss nun “exakter” bedient werden.
Aus “getVariable(odoc, sVarName)” wird ein String zurückgegeben - so etwas wie ‘42811’ (heutige Datum, interne Schreibweise). CDate kann das nicht mehr umwandeln - als Zahl aber schon. Also muss der komplette Ausdruck lauten:
oDlg.getControl(“redat”).date = CDateToUnoDate(CDate(Clng(getVariable(oDoc, “feld2”))))
…also erst den String in eine Longvariable ändern (CLng) , dann ein Datum …

…daraus machen und schließlich das Datum als UNO-Date Objekt umwandeln. Dann sollte auch diese Zeile funktionieren:)
Viele Grüße Tom

danke :slight_smile: ja, wir sollten den Dialog auf de.openoffice.info nochmals aufsetzen. Ich vermute, das interessiert noch mehr Leute. Ich beginne morgen früh. Uwe

Das Thema ist unter gleichem Namen nun unter [gelöst]Dialog-Steuerelement-Datum in Feldvariable-Datum kopieren und umgekehrt - OpenOffice.info zu finden.