Seite 1 von 1

Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Mi 3. Aug 2016, 17:04
von stst
Hallo,

ich habe einen Dialog mit einem Steuerelement vom Typ "Datumsfeld". Nun möchte ich diese Feld eine einer Basic Funktion setzten bzw. später auch wieder auslesen und den Wert in eine Tabelle schreiben.

So funktioniert es zwar, aber was in dem Steuerelement und später in der Tabelle steht, ist vom Typ "String" und nicht "Date"

oControl = oInput_Dialog.GetControl("Date")
oControl.text = Date()

Wenn ich folgendes versuche, bekomme ich einen Fehler:

oControl = oInput_Dialog.GetControl("Date")
oControl.Model.Date = Date()

Auch das Auslesen und Schreiben in die Tabelle habe ich nur über den Umweg "text" geschafft.

oControl = oInput_Dialog.GetControl("Date")
oCellVal = ThisComponent.Sheets(JournalSheetNo).getCellByPosition(4,iRow)
oCellVal.string = oControl.Text

Das geht doch bestimmt auch besser. Für jede Hilfe, auch nur Ideen, wäre ich sehr dankbar.

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Do 4. Aug 2016, 00:54
von mikele
Hallo,
das Datumsfeld hat neben der Eigenschaft .text (welche den Anzeigetext liefert) hat auch die Eigenschaft .date (ein struct, der Tag, Monat und Jahr liefert).
Diese könntest du nutzen:
oControl.date.day=day(date())
oControl.date.month=month(date())
oControl.date.year=year(date())
Das Ergebnis ist allerdings dasselbe wie
oControl.text=date()
Beim Auslesen musst du einfach den Text vor dem Schreiben in ein Datum umwandeln:

Code: Alles auswählen

oCellVal.value = cdate(oControl.Text)

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Do 4. Aug 2016, 19:27
von balu
Hallo stst,
Nun möchte ich diese Feld eine einer Basic Funktion setzten
Sorry, aber ich bin mir nicht ganz sicher was Du da sagst, deshalb frage ich nach.
Du willst das Datefield vorbelegen mit einem bestimmten Datum, oder einem bestimmten Monat und Jahr?

Wenn das abgeklärt ist, kann ich dir vielleicht weiter helfen.

Auch das Auslesen und Schreiben in die Tabelle habe ich nur über den Umweg "text" geschafft.
So!
Und nun wirds gar luschdich! ;-)

Umwech "text" is nich so jut.

Code: Alles auswählen

oControl = oInput_Dialog.GetControl("Date")
oCellVal = ThisComponent.Sheets(JournalSheetNo).getCellByPosition(4,iRow)
oCellVal.string = oControl.Text
Dadurch wird ja die dementsprechende Zelle fest auf Text eingestellt, was aber falsch ist.
Es gibt eigentlich nur 2 Varianten (falls ich mich jetzt nicht verzählt habe oder etwas vergessen hatte) die das Datum in der Zelle als Datum eintragen.
Und zwar wäre das:
.Value
.FormulaLocal


Damit ist es aber alleine noch nicht getan. Denn das betrifft ja nur die Zelle im Tabellenblatt. Es muss ja schließlich noch das Datum aus dem Datefield ausgelesen werden. Und da gibt es mehrere Variationen in kombination mit der Zelle. Mikele hat ja schon cdate als Beispiel genannt, und ich nenne noch 2 weitere.
- CDateToIso
- CDateFromIso

Und um die Verwirrung komplet zu machen, kann man nach dem man das "Datum" in die Zelle eingetragen hat, anschließend sofort dahergehen und die Zelle per Makro noch passend Formatieren, oder aber auch nicht. Das würde z.B. mit

Code: Alles auswählen

.Numberformat = 36
geschehen.


Mal ein recht einfaches Beispiel ohne nachträgliche Formatierung.

Code: Alles auswählen

oSheet0.getCellRangeByName("A9").FormulaLocal =  CDateFromIso(oDate.Date)
 
Und wenn man beispielsweise im Datefield den 01.03.2011 ausgewählt hat, dann würde in der dementsprechenden Zelle folgendes Datum drin stehen.
01.03.11

Und wenn man nun noch das ganze mit Numberformat erweitert, also so z.B.

Code: Alles auswählen

oSheet0.getCellRangeByName("A13").FormulaLocal =  CDateFromIso(oDate.Date)
oSheet0.getCellRangeByName("A13").Numberformat = 36
dann steht in der Zelle.
01.03.2011


Wie zu sehen, kann man mit der richtigen Kombination schon so einiges anstellen.

Ich habe da mal ne kleine simple Beispieldatei angehängt, wo das eben angesprochene zu finden ist. Du kannst damit selber noch ein wenig rumexperimentieren welche kombinationen was für ein Ergebnis liefern.

Wünsche dir schon mal so weit viel Vergnügen. :)



Gruß
balu

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Do 4. Aug 2016, 21:50
von mikele
Hallo balu,

ich habe deine Datei mal gestestet und musste leider feststellen, dass sie bei mir (LO4.4.7.2) nicht funktioniert.

Code: Alles auswählen

CDateFromIso(oDate.Date)
Erzeugt eine Fehlermeldung, weil CDateFromIso() einen String erwartet, oDate.Date aber ein struct ist.
Bei der Gelegenheit habe ich gelernt, dass es eine Funktion CDateFromUnoDate() gibt, die das Gewünschte leistet, nämlich einen Datumswert liefert.

CDateToIso() in Verbindung mit Numberformat = 36 macht bei mir aus 20110308 (dem ISO-Datum) das Datum 24.02.-8576. Die Zahl 20110308 wird halt als Datumswert interpretiert.

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Do 4. Aug 2016, 22:11
von balu
Hallo mikele,

ich Danke dir sehr für deine Rückmeldung :) , auch wenn sie für mich leider negativ ist. :(

Okay, das wusste ich nicht das sich LO da anders verhält. Ich hatte hier mit OOo 3.2.1 und AOO 4.1.2 getestet, aber leider nicht mit LO. Und grad eben mal auf die schnelle mit LO 4.2.1.1 getestet, und siehe da, leider taucht meine Beispieldatei nicht, bekomme Fehlermeldungen.

Die erste Fehlermeldung kommt beim oLabeling2, welche ich einfach auskommentiert habe. Und die zweite kommt bei.

Code: Alles auswählen

oSheet0.getCellRangeByName("A7").Value =  CDateFromIso(oDate.Date)
Okay, das muss ich mir merken, und der Sache mal aufm Grund gehen. Ist nur Schade das sich LO in dieser Hinsicht von AOO unterscheidet.

Bei der Gelegenheit habe ich gelernt, dass es eine Funktion CDateFromUnoDate() gibt, die das Gewünschte leistet, nämlich einen Datumswert liefert.
Na ist doch Prima. Wenigsten ein Erfolg. :-)


Deine Antwort kam aber auch zur rechten Zeit, denn ich wollte bezüglich Datefield noch etwas testen, und so weiß ich das ich nicht mit OOo oder AOO arbeiten darf, sondern dem Forum recht kommend nur mit LO.



Gruß
balu

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Do 4. Aug 2016, 23:52
von balu
Hallo mikele,

ich bins noch mal, weil ich eben was getestet habe unter LO 4.2.1.1.
dass es eine Funktion CDateFromUnoDate() gibt, die das Gewünschte leistet, nämlich einen Datumswert liefert.
Interessant!
Denn wenn ich meine Beispieldatei nehme und dort die folgende Zeile

Code: Alles auswählen

oSheet0.getCellRangeByName("A7").Value =  CDateFromIso(oDate.Date)
 
wie folgt ändere

Code: Alles auswählen

oSheet0.getCellRangeByName("A7").Value =  CDateFromUnoDate(oDate.Date)
 
kommt als Ergebnis eine 5 stellige Zahl dabei raus, z.B. 40607 für den 05.03.11.

Ergänze ich aber die letzt genannte Zeile mit Numberformat, so das sie wie folgt aussieht,

Code: Alles auswählen

oSheet0.getCellRangeByName("A7").Value =  CDateFromUnoDate(oDate.Date)
oSheet0.getCellRangeByName("A7").Numberformat = 36
dann habe ich in der Zelle das Datum wie folgt stehen, 05.03.2011.

Ohne Numberformat kann man natürlich auch das Datum eintragen lassen, dann muss aber auch die Zelle nicht mit Value beschrieben werden, sondern mit FormulaLocal. Also so.

Code: Alles auswählen

oSheet0.getCellRangeByName("A7").FormulaLocal =  CDateFromUnoDate(oDate.Date)
 
Und das Ergebnis wäre dann beispielsweise, 05.03.11.


CDateToIso() in Verbindung mit Numberformat = 36 macht bei mir aus 20110308 (dem ISO-Datum) das Datum 24.02.-8576.
Ist ja auch so weit korrekt. Nur solltest Du auch schon genau erwähnen welche kombination mit CDateToIso Du meinst, denn schließlich habe ich in meiner Beispieldatei CDateToIso nicht nur einmal mit Numberformat angewendet.

Value = CDateToIso(oDatumFeld.text)
FormulaLocal = CDateToIso(oDatumFeld.text)

Okay, ich hätte es genauer erwähnen sollen das nicht nur eindeutige Datumswerte in der Datei angezeigt werden, sondern auch "Sonderwerte" die eigentlich Falsche Werte sind. Aber die Datei ist ja zum selber experimentieren um auch andere Datumsfunktionen auszutesten.



Gruß
balu

Re: Dialog Steuerelement von Typ Datum setzen und auslesen

Verfasst: Fr 5. Aug 2016, 01:39
von balu
Ich bin mal ausnahmsweise der Alleinunterhalter. :lol:

Also was ich momentan nicht so wirklich verstehe ist folgendes:
Meine Beispieldatei in LO geöffnet, und die im letzten Beitrag genannten Änderungen vorgenommen und ich bekomme ein Datum.
Ändere ich aber dort die Sub Main wie folgt, zum Datefield befüllen

Code: Alles auswählen

Public AktDatum

Sub Main
    DialogLibraries.loadLibrary("Standard")
    oDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
        oSheet0 = ThisComponent.Sheets.GetByName("Settings")        
       AktDatum = oSheet0.getCellRangeByName("G1").value
        
        oDate = oDialog1.getControl("DateField1")
        oLabeling2 = oDialog1.getControl("Label2")
        
'REM ---------------------------------- Datefield befüllen anfang            
    stamp = AktDatum
     
    tx = createUnoStruct("com.sun.star.util.Date")
    tx.Day = Day(stamp)
    tx.Month = Month(stamp)
    tx.Year = Year(stamp) 
    
    oDate.setDate( tx )
REM ---------------------------------- Datefield befüllen ende'
        
    oDialog1.execute    

end sub
dann wird das Datefield auch befüllt, aber so bald ein Datum ausgewählt wird, hagelt es Fehlermeldung bei den Zeilen die vorher ohne Befüllen funktioniert haben. Und das verstehe ich momentan überhaupt nicht. :roll:

Mag aber auch sein das ich vor lauter Müdigkeit den Wald vor lauter Bäumen nicht mehr sehe. Und deshalb gehe ich jetzt in die Heia.



Gruß
balu