[gelöst]Dialog-Steuerelement-Datum in Feldvariable-Datum kopieren und umgekehrt

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

Moderator: Moderatoren

krueuw
*
Beiträge: 17
Registriert: Sa, 18.03.2017 08:10

[gelöst]Dialog-Steuerelement-Datum in Feldvariable-Datum kopieren und umgekehrt

Beitrag von krueuw »

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.

Code: Alles auswählen

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

Code: Alles auswählen

oFeld.CurrentValue.Year bzw. Month oder auch Day.
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
Zuletzt geändert von krueuw am Fr, 14.04.2017 08:55, insgesamt 1-mal geändert.
Ubuntu 16.04 Libreoffice Version: 5.1.6.2
krueuw
*
Beiträge: 17
Registriert: Sa, 18.03.2017 08:10

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

Beitrag von krueuw »

ok :-) Die Fehlermeldung ist weg. Es gibt aber noch ein kleines Restproblem:

Für das Feld2 kommt es nach zunächst richtiger Ansicht zu Darstellungsfehlern wie 24.12.-14267 für die klassische Formatierung oder auch ähnlich beim ISO-Format.

Code: Alles auswählen

sFeldinhalt = CDateFromUnoDate(odlg.getControl(aFeld(i)).date)
liefert an sich das richtige Ergebnis 18.03.2017. Am liebsten würde ich durchgängig das ISO-Format benutzen. Was könnte das noch sein? Uwe
Zuletzt geändert von krueuw am Sa, 18.03.2017 10:36, insgesamt 1-mal geändert.
Ubuntu 16.04 Libreoffice Version: 5.1.6.2
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

Gibt es eine einfachere Möglichkeit?
Und wie definiert sich "einfach"? So wie oben im Thread, das es nicht mehr läuft wenn es Update-Änderungen gibt?

WENN https://forum.openoffice.org/en/forum/v ... 74&t=82181 für Dich funktioniert dann ist es doch gut, was soll eine Vereinfachung um des Vereinfachens Willen?

Schon weil Du das Problem ja vor Augen hast (Makro läuft wegen Programmupdates nicht mehr richtig) solltest Du doch eher auf eine robuste Implementierung Wert legen als auf "einfach" (wenn ich hier einmal vermuten darf das "einfach" die Umschreibung für 'gut aussehenden' Code wäre).


Gruß
Stephan
krueuw
*
Beiträge: 17
Registriert: Sa, 18.03.2017 08:10

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

Beitrag von krueuw »

Oh :shock: da hat sich meine Änderung des etwas zu hastig geschriebenen Beitrags mit deiner Antwort überschnitten. Aber vielen Dank für den Hinweis.
Ubuntu 16.04 Libreoffice Version: 5.1.6.2
krueuw
*
Beiträge: 17
Registriert: Sa, 18.03.2017 08:10

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

Beitrag von krueuw »

Nachdem ich jetzt tatsächlich ConvertDateTime von Villeroy https://forum.openoffice.org/en/forum/v ... 74&t=82181 eingebaut habe, funktioniert in Sub Dok_erzeugen folgende Konstruktion:

Code: Alles auswählen

		
		
'sFeldinhalt = CDateFromIso(odlg.getControl(aFeld(i)).date) 		'originale Variante	
sFeldinhalt = CDateFromUnoDate(odlg.getControl(aFeld(i)).date)		'Ersatz	
sFeldinhalt = ConvertDateTime(sFeldinhalt,  "DOUBLE") 			'Ersatz
Ubuntu 16.04 Libreoffice Version: 5.1.6.2
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

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

Beitrag von Stephan »

Nachdem ich jetzt tatsächlich ConvertDateTime von Villeroy https://forum.openoffice.org/en/forum/v ... 74&t=82181 eingebaut habe
naja, so war meine Aussage ja garnicht unbedingt gemeint, sondern es spricht natürlich nichts dagegen von ConvertDateTime nur die für Dich relevanten Teile zu übernehmen, wenn das aus Deiner Sicht eine Vereinfachung wäre habe ich Deine ursprüngliche Aussage missdeutet.


Gruß
Stephan
krueuw
*
Beiträge: 17
Registriert: Sa, 18.03.2017 08:10

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

Beitrag von krueuw »

Der ursprüngliche Code läuft nach den beschriebenen Änderungen jetzt im Writer 5.1. Ich habe jetzt mit den Änderungen für meinen Anwendungsfall begonnen. Dabei ergeben sich für mich folgende Fragen für die ich bisher keine Lösungen finden konnte:
  • Wenn ich den originalen Code in einer Bibliothek RechVorTK_original und meinen neuen in einer Bibliothek RechVorTK direkt im Dokument speichere, gelingt mir die Trennung nicht. D.h. trotz Neuzuweisung der Makros zu Schaltflächen wird in den verkehrten Quelltext verzweigt. Wie zwinge ich den Ablauf nur die neue Bibliothek zu benutzen?
  • Die Beispiele für die Berechnungen mit Datumswerten z.B. die Feststellung der Volljährigkeit des Delinquenten zum aktuellen Datum stammen alle aus dem Zusammenhang Tabellenkalkulation. Muss ich selber was basteln oder gibt es da auch fertige Funktionen für die Umgebung Writer?
Ubuntu 16.04 Libreoffice Version: 5.1.6.2
Antworten