von krueuw » Sa, 18.03.2017 08:45
Diese Frage wurde schon unter
https://ask.libreoffice.org/de/question ... -id-90413 gestellt und teilweise beantwortet. Weil ein Dialog dort nur eingeschränkt möglich ist, wollen wir die Diskussion hier fortsetzen. Der bisherige Verlauf:
Ursprungsfrage von krueuw:
Ich versuche seit Tagen das Modul
http://www.ntmb.de/hit/2461 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.
Antwort von RobertG:
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.
Ü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
Im Base-Handbuch habe ich dazu ein kleines Beispiel:
Code: Alles auswählen
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.
Reaktion von krueuw:
Vielen Dank für die Antwort

Ich werde das am WE einarbeiten. Dein letzter Satz passt auch zur Dokumentation der API-Änderung - irgendwie so nebenbei

obwohl es wahrscheinlich sehr viele Makros betrifft, die dann nicht mehr funktionieren, oder kennst du einen Link der das verständlich kommuniziert?
Antwort von Toxitom:
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:))
Reaktion von krueuw:
Nachdem ich hier die Chance habe mit dem Autor von RechVorTK his macroness direkt in Kontakt zu kommen

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:
Code: Alles auswählen
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
Code: Alles auswählen
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):
Code: Alles auswählen
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
Code: Alles auswählen
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
Kommentar von Toxitom:
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
Diese Frage wurde schon unter [url]https://ask.libreoffice.org/de/question/90284/dialog-steuerelement-datum-in-feldvariable-datum-kopieren-und-umgekehrt/?comment=90413#post-id-90413 [/url] gestellt und teilweise beantwortet. Weil ein Dialog dort nur eingeschränkt möglich ist, wollen wir die Diskussion hier fortsetzen. Der bisherige Verlauf:
[b]Ursprungsfrage von krueuw:[/b]
[quote]Ich versuche seit Tagen das Modul [url]http://www.ntmb.de/hit/2461 RechVorTK[/url] 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.[/quote]
[b]Antwort von RobertG:[/b]
[quote]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.
[code]unoDate = createUnoStruct("com.sun.star.util.Date")[/code]
Ü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
[code]
oFeld.CurrentValue.Year bzw. Month oder auch Day.[/code]
Im Base-Handbuch habe ich dazu ein kleines Beispiel:
[code]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)[/code]
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.[/quote]
[b]Reaktion von krueuw:[/b]
[quote]Vielen Dank für die Antwort :-) Ich werde das am WE einarbeiten. Dein letzter Satz passt auch zur Dokumentation der API-Änderung - irgendwie so nebenbei :-( obwohl es wahrscheinlich sehr viele Makros betrifft, die dann nicht mehr funktionieren, oder kennst du einen Link der das verständlich kommuniziert?[/quote]
[b]Antwort von Toxitom:[/b]
[quote]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:))[/quote]
[b]Reaktion von krueuw:[/b]
[quote]Nachdem ich hier die Chance habe mit dem Autor von RechVorTK his macroness direkt in Kontakt zu kommen :-) 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:
[code]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[/code]
[code]Sub Dok_erzeugen
..
case 2
'sFeldinhalt = CDateFromIso(odlg.getControl(aFeld(i)).date)
sFeldinhalt = CDateFromUnoDate(odlg.getControl(aFeld(i)).date)
..
end sub[/code]
Ein Problem, welches ich bisher nicht verstehe, gibt es z.B. hier (Unzulässiger Wert oder Datentyp. Datentypen unverträglich):
[code]sub Daten_einlesen
..
'oDlg.getControl("redat").date = CDateToIso(CDate(getVariable(oDoc, "feld2")))
oDlg.getControl("redat").date = CDateToUnoDate(CDate(getVariable(oDoc, "feld2")))
..
end sub[/code]
mit oDoc = thisComponent, feld2 als "Variable setzen" Datumsfeld im ISO-Format und
[code]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
[/code]
[/quote]
[b]Kommentar von Toxitom:[/b]
[quote]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[/quote]