Formularfeldinhalt ungleich Rowset-Inhalt?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Formularfeldinhalt ungleich Rowset-Inhalt?

Beitrag von Mihilist »

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?
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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*)
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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:
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

Erst denken, dann posten...

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

Wäre aber trotzdem zu Tips zur zweiten Möglichkeit dankbar...
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mihilist
****
Beiträge: 120
Registriert: Di, 25.04.2006 15:27
Wohnort: Nürnberg
Kontaktdaten:

Beitrag von Mihilist »

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