Formularfeldinhalt ungleich Rowset-Inhalt?

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Formularfeldinhalt ungleich Rowset-Inhalt?

von Mihilist » Fr, 07.07.2006 15:28

Toxitom hat geschrieben:Die Text-Eigenschaft trägt nur den gerade angezeigten Text - und der kann sehr verwirrend sein!
Ja eben das nicht... Angezeigt wurde der 5.7., Text lieferte den 23.6. ... O.o

Und ein Value kennt das Datumsfeld leider auch nicht.

von Toxitom » Mi, 05.07.2006 19:35

Hey Mihilist,
Wie bekomme ich den Wert des Datumsfeldes?
Na, ganz normal. Einen "Date" Eintrag wirst du vergeblich suchen, aber einen Value Eintrag solltest du finden :-) .
Datumswerte werden im ISQ-Format als Long-Variabel gespeichert also der 05.07.2006 als 20060705. Dafür gibt es dann die Methoden CDateToIso() bzw. CDatetoIso() welche die Umwandlungen vornehmen.
Die Text-Eigenschaft trägt nur den gerade angezeigten Text - und der kann sehr verwirrend sein!

Bis denn
Thomas

von Mihilist » Mi, 05.07.2006 14:54

Erst denken, dann posten...

Möglichkeit 1 hab ich mit DateValue(date) realisiert.

Wäre aber trotzdem zu Tips zur zweiten Möglichkeit dankbar...

von Mihilist » Mi, 05.07.2006 14:37

Aus aktuellem Anlass... *nerv*

Nun habe ich also ein Datumsfeld, das aber bei der InsertRow das aktuelle Datum anzeigt, obwohl das Feld in der Zeile leer ist (null). Vorläufige Lösung war ein fester Wert für update, aber das ist natürlich völliger Blödsinn... Soll ja nicht immer der 15.4. drin stehen :D

Nun gäbe es denke ich zwei Möglichkeiten - ich kann leider beide nicht umsetzen :D

Möglichkeit 1:
Immer, wenn das Feld leer ist, das aktuelle Datum reinschreiben.
Problem: "date" liefert mir nach wie vor einen String, kein Datum... Wie kann ich das umwandeln?

Möglichkeit 2 (eleganter):
Es wird das, was im Datumsfeld (fälschlich) gezeigt wird, eingetragen. Die Lösung wäre mir lieber, weil der Nutzer ja offenbar diesen Wert nicht geändert haben wollte (zwar sollte der mit "date" übereinstimmen... aber man weiß ja nie *g*).
Problem: Wie bekomme ich den Wert des Datumsfeldes? Ich habe die Properties überflogen und keinen date-Eintrag gefunden. Nur "min/max Date" als long und "Text" als String. Allerdings liefert mir Text seltsamerweise immer den 23.6. - also ein völlig abstruser, nicht nachvollziehbarer Wert... vor allem Dingen ist das nicht das, was im Feld steht...

Freundliche Grüße
Thomas

von Mihilist » Fr, 23.06.2006 12:59

Toxitom hat geschrieben:Im übrigen würde ich nach wie vor das Formular bearbeiten und das Datumsfeld "zum Aufklappen" einstellen - dann kann der Benutzer bequem ein neues Datum aussuchen.
Das ist inzwischen ein aufklappbares Datumsfeld, ich war nur zu doof, den "Heute"-Button dort zu entdecken (ich bilde mir ein, der war das letzte Mal noch nicht da... :roll:)

Die anderen Felder (Strings) klappen mit der update-Methode.

Danke dir!

Gruss
Auch Thomas :D

von Toxitom » Do, 22.06.2006 08:23

Hey mihilist,
Das Feld ist wie gesagt ein Datumswert, allerdings ergibt...
die Fehlermeldung: "Laufzeitfehler: Objektvariable nicht belegt" in der Zeile "oForm.update..."
Das wundert mich gar nicht. die Methode updateDate() erwartet neben der Spaltennummer auch noch ein Objekt des Typs com.sun.star.util.DATE - und das lieferst du nicht. Der folgende Code setzt das Datum auf den 15.4.2006:

Code: Alles auswählen

Sub datum
   Dim oForm      As Object
   dim dd as new com.sun.star.util.Date
   with dd 
   	.day = 15
   	.month = 4
   	.year = 2006
   end with
   oForm      = ThisComponent.Drawpage.Forms.getByName("MainForm")
   oForm.updateDate(4, dd)
End Sub 
Also: da ist noch viel zu tun...
Übrigens findest du solche Daten auch in der API-Dokumentation, bestandteil des SDKs. unter dem Interface XRowUpdate.
Im übrigen würde ich nach wie vor das Formular bearbeiten und das Datumsfeld "zum Aufklappen" einstellen - dann kann der Benutzer bequem ein neues Datum aussuchen.

Gruss
Thomas

von Mihilist » Mi, 21.06.2006 13:48

Toxitom hat geschrieben:Ein "refresh" beispielsweise, ein Update des altuellen Feldwertes direkt (mit updatestring() ) oder was für ein Feld du eben gerade hast
Das klappt nicht.
Das Feld ist wie gesagt ein Datumswert, allerdings ergibt

Code: Alles auswählen

Sub datum
	Dim oForm		As Object
	oForm		= ThisComponent.Drawpage.Forms.getByName("MainForm")
	oForm.updateDate(4, date)
End Sub
die Fehlermeldung: "Laufzeitfehler: Objektvariable nicht belegt" in der Zeile "oForm.update..."

Laut meinem Referenzbüchlein gibt date außerdem einen string zurück, wogegen der Datentyp date intern als Kommazahl gespeichert wird. Das verwirrt mich... :(

Wie kann ich dem nun überhaupt klar machen, dass er das aktuelle Datum verwenden soll?
Toxitom hat geschrieben:oder - das habe ich allerdings noch nicht ausprobiert - du setzt das Änderungsflag. Auch das sollte gehen.
Zu dem Thema finde ich keine Infos :cry:

von Toxitom » Di, 20.06.2006 15:23

Hey Mihilist,
Anscheinend klappt das wirklich nicht, per Makro etwas in die Felder einzutragen (zumindest nicht so *g*)
Klar klappt das :wink:
Allerdings: mach dir das Prinzip klar: Das Formular dient als Rowset, abgeleitet aus dem ResultSet. Die Kontrollelemente dienen lediglich zum anzeigen der Daten des Rowsets. Änderst du jetzt per Makro die Anzeige, weiss das Rowset ja gar nicht, dass etwas verändert wurde! Das ist anders, als wenn du per Hand (Tastatur) etwas eingibst. Jetzt wird ein Änderungsflag gesetzt (gibt es als Eigenschaft im formular), d.h., jetzt "weiss" der interne Controller, dass er die "neuen" Ergebnisse abspeichern muss.
Arbeitest du mit Makros, bist du selbst dafür verantwortlich, dass der Rowset angepasst wird. Da gibt es die unterschiedlichsten Möglichkeiten. Ein "refresh" beispielsweise, ein Update des altuellen Feldwertes direkt (mit updatestring() ) oder was für ein Feld du eben gerade hast, oder - das habe ich allerdings noch nicht ausprobiert - du setzt das Änderungsflag. Auch das sollte gehen.

Viele Grüße
Thomas

von Mihilist » Di, 20.06.2006 13:55

Der Code ist recht simpel. Man klickt auf den Button "Heute" und erhält das aktuelle Datum als Eintrag :)

Code: Alles auswählen

Sub datum
	Dim oForm		As Object
	Dim txtDatum	As Object
	
	oForm		= ThisComponent.Drawpage.Forms.getByName("MainForm")
	txtDatum	= oForm.getByName("txtDatum")

	txtDatum.Text = date
End Sub
Ich hab eben nochmal als Datumsfeld versucht, aber das klappt auch nicht (kein Unterschied). Ich hatte es glaub ich zum Textfeld geändert, eben weil Datum nicht geklappt hat (und hab dann wohl vergessen es zurück zu ändern :))

PS: Ich merk grad, dass das Problem auch in anderen Feldern auftritt. Anscheinend klappt das wirklich nicht, per Makro etwas in die Felder einzutragen (zumindest nicht so *g*)

von Toxitom » Mo, 19.06.2006 12:58

Hey Mihilist,
Aber irgendwie will das per Makro nicht klappen...
na, dann poste mal den Code. Ohne weitere Erläuterung bleibt es ein "Stochern im Nebel".

Datum und Textfeld? Das passt auf jeden Fall nicht. Wenn du ein Datumsfeld in der Datenbank drin hast, solltest du auch ein Datumsfeld im Formular nehmen (zusätzlicher Vorteil: Aufklappbar! da kannst du das aktuelle Datum recht einfach auswählen - und jedes andere auch :-) )
txtDatum.Text = date
Wie gesagt: das passt nicht. Ein Textfeld stellt dir zwar hier das aktuelle Datum dar (der interen Datumswert wird zur Anzeige umgewandelt), aber die Datenbank kann mit dem String jetzt nix anfangen - so geht es nicht.
Nutze ein Datumsfeld, wähle den "Date" Wert (also myDatumsfeld.date = date) zum Zuweisen des aktuellen Datums, dann sollte es auch klappen.

Gruss
Thomas

Formularfeldinhalt ungleich Rowset-Inhalt?

von Mihilist » Mo, 19.06.2006 12:22

Hi,

ich habe gerade ein Problem mit einem Dataform. Und zwar gibt es in der Tabelle ein Feld "Datum", dass nicht NULL sein darf.
Soweit, so gut.

Ich habe ein Formular zum Anlegen neuer Datensätze, dort ist das Feld erstmal leer (soll dann das aktuelle Datum rein, wenn der Datensatz erfasst wird). Aber irgendwie will das per Makro nicht klappen...
Ich hab einen Button, der in das Textfeld das aktuelle Datum schreibt (txtDatum.Text = date) - klappt auch rein optisch wunderbar, allerdings meckert er dann beim Speichern, dass das Feld Datum nicht leer sein darf.

:?

Kann es sein, dass das Rowset und das Textfeld voneinander abweichen? Und wie kann ich das verhindern?

Nach oben