Nach der Eingabe in einem Datumsfeld (an eine Tabelle gebunden) möchte ich prüfen, ob die Eingabe zulässig ist. Im Zweifelsfall wird der Anwender über einen Dialog gefragt: "Wollen Sie wirklich diese Änderung vornehmen?" Wenn ja, wird die Eingabe übernommen, andernfalls soll sie verworfen werden und der bisherige Feldinhalt unverändert bleiben.
Ich habe die Prüfung an das Ereignis "Vor dem Aktualisieren" gebunden, weil ich dort beide Werte (vorher und nachher) abfragen kann - siehe
"ist modifiziert" prüfen. Das Makro sieht (verkürzt) so aus:
Code: Alles auswählen
dim bchange as Boolean
oForm = oEvent.Source.Parent
bchange = ... ' einfache Prüfung liefert hier true oder false
oldDate = CDate(oEvent.Source.BoundField.String) ' die beiden Vergleichswerte
newDate = CDate(oEvent.Source.Text)
rem bei manchen Situationen Rückfrage über Dialog
if not bchange then
oDlgDesc = globalscope.DialogLibraries.Standard.dlgConfirm
dlg = CreateUnoDialog( oDlgDesc )
bchange = dlg.execute ' OK = ja, andernfalls = Nein
end if
if bchange then ' Änderung tatsächlich ausführen
oForm.updateInt(3, newDate.Year)
...
else
rem Änderung rückgängig machen
' xray oEvent.Source.BoundField
' xray oldDate
' oEvent.Source.BoundField.updateDate(oldDate)
oForm.updateDate(6, oldDate)
end if
Alles, was ich im else-Zweig versuche, führt zum Basic-Laufzeitfehler "Objektvariable nicht belegt". Einzelprüfungen über xray oder den Basic-Debugger zeigen, dass alle diese Variablen zur Verfügung stehen; vermutlich die Fehlermeldung falsch. Ich könnte verstehen, dass updateXXX im Ereignis "Vor dem Aktualisieren" nicht möglich ist. Ich finde aber keine Methode, die eine Änderung nur für diese einzelne Spalte (im aktuellen Datensatz) verhindert.
Was tun? Jürgen
Nachtrag: Auch im if-Zweig wird oForm.updateXXX benötigt. Ich habe jetzt festgestellt, dass diese Änderungen am gleichen Fehler scheitern. Als ich den Dialog noch nicht eingebaut hatte, hatte es funktioniert. Offensichtlich bringt der Dialog den Zugriff auf oForm durcheinander.
Nachtrag 2: Wenn es doch so einfach wäre. Es sieht so aus, als ob doch nicht der Dialog schuld wäre, sondern das Ereignis. Ich werde wohl doch auf "Fokusverlust" zurückgehen müssen und auf die genaue Anzeige (Zustand alt und neu) verzichten.
Nachtrag 3: Ich verzweifle noch. Jetzt bin ich bei "Fokusverlust" ohne Dialog - und oForm ist auch im if-Zweig nicht mehr belegt.
Das war für heute mein letzter Versuch.
Aber vielleicht gibt es eine andere, saubere Lösung.
Nach der Eingabe in einem Datumsfeld (an eine Tabelle gebunden) möchte ich prüfen, ob die Eingabe zulässig ist. Im Zweifelsfall wird der Anwender über einen Dialog gefragt: "Wollen Sie wirklich diese Änderung vornehmen?" Wenn ja, wird die Eingabe übernommen, andernfalls soll sie verworfen werden und der bisherige Feldinhalt unverändert bleiben.
Ich habe die Prüfung an das Ereignis "Vor dem Aktualisieren" gebunden, weil ich dort beide Werte (vorher und nachher) abfragen kann - siehe [url=http://de.openoffice.info/viewtopic.php?f=18&t=55392]"ist modifiziert" prüfen[/url]. Das Makro sieht (verkürzt) so aus:
[code]dim bchange as Boolean
oForm = oEvent.Source.Parent
bchange = ... ' einfache Prüfung liefert hier true oder false
oldDate = CDate(oEvent.Source.BoundField.String) ' die beiden Vergleichswerte
newDate = CDate(oEvent.Source.Text)
rem bei manchen Situationen Rückfrage über Dialog
if not bchange then
oDlgDesc = globalscope.DialogLibraries.Standard.dlgConfirm
dlg = CreateUnoDialog( oDlgDesc )
bchange = dlg.execute ' OK = ja, andernfalls = Nein
end if
if bchange then ' Änderung tatsächlich ausführen
oForm.updateInt(3, newDate.Year)
...
else
rem Änderung rückgängig machen
' xray oEvent.Source.BoundField
' xray oldDate
' oEvent.Source.BoundField.updateDate(oldDate)
oForm.updateDate(6, oldDate)
end if[/code]
Alles, was ich im else-Zweig versuche, führt zum Basic-Laufzeitfehler "Objektvariable nicht belegt". Einzelprüfungen über xray oder den Basic-Debugger zeigen, dass alle diese Variablen zur Verfügung stehen; vermutlich die Fehlermeldung falsch. Ich könnte verstehen, dass updateXXX im Ereignis "Vor dem Aktualisieren" nicht möglich ist. Ich finde aber keine Methode, die eine Änderung nur für diese einzelne Spalte (im aktuellen Datensatz) verhindert.
Was tun? Jürgen
[u]Nachtrag:[/u] Auch im if-Zweig wird oForm.updateXXX benötigt. Ich habe jetzt festgestellt, dass diese Änderungen am gleichen Fehler scheitern. Als ich den Dialog noch nicht eingebaut hatte, hatte es funktioniert. Offensichtlich bringt der Dialog den Zugriff auf oForm durcheinander.
[u]Nachtrag 2:[/u] Wenn es doch so einfach wäre. Es sieht so aus, als ob doch nicht der Dialog schuld wäre, sondern das Ereignis. Ich werde wohl doch auf "Fokusverlust" zurückgehen müssen und auf die genaue Anzeige (Zustand alt und neu) verzichten.
[u]Nachtrag 3:[/u] Ich verzweifle noch. Jetzt bin ich bei "Fokusverlust" ohne Dialog - und oForm ist auch im if-Zweig nicht mehr belegt. [i]Das war für heute mein letzter Versuch. [/i] :cry:
Aber vielleicht gibt es eine andere, saubere Lösung.