Frage stellen
0

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

gefragt 2017-03-15 17:40:29 +0200

krueuw Gravatar-Bild

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.

edit retag flag offensive close merge delete
0

geantwortet 2017-03-17 16:42:07 +0200

krueuw Gravatar-Bild

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:

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
edit flag offensive delete link mehr

Comments

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

Toxitom Gravatar-BildToxitom ( 2017-03-17 17:17:09 +0200 )edit

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

Toxitom Gravatar-BildToxitom ( 2017-03-17 17:17:44 +0200 )edit

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

Toxitom Gravatar-BildToxitom ( 2017-03-17 17:23:30 +0200 )edit

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

Toxitom Gravatar-BildToxitom ( 2017-03-17 17:24:35 +0200 )edit

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

krueuw Gravatar-Bildkrueuw ( 2017-03-17 17:40:21 +0200 )edit

Das Thema ist unter gleichem Namen nun unter http://de.openoffice.info/viewtopic.p... zu finden.

krueuw Gravatar-Bildkrueuw ( 2017-03-18 10:12:05 +0200 )edit
0

geantwortet 2017-03-16 21:43:21 +0200

RobertG Gravatar-Bild

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.

edit flag offensive delete link mehr

Comments

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?

krueuw Gravatar-Bildkrueuw ( 2017-03-17 07:59:01 +0200 )edit
0

geantwortet 2017-03-17 09:35:14 +0200

Toxitom Gravatar-Bild

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:))

edit flag offensive delete link mehr
Registrieren oder einloggen, um zu antworten

Antwortwerkzeuge

1 follower

Stats

Asked: 2017-03-15 17:40:29 +0200

Seen: 50 times

Last updated: Mar 17