Hallo, ich habe in einem Formular ein GridControl mit 4 Spalten und möchte beim
Verlassen der Spalten 3 und 4 alle Werte dieser beiden Spalten (Summen über alle Zeilen) prüfen. Je nach Prüfergebnis soll ein Wert in der letzten Zeile geändert oder eine neue Zeile eingefügt werden. Dazu habe ich das Ereignis "Fokusverlust" an die Spalten 3 (fsoll) und 4 (fhaben) gebunden, bekomme aber nicht die gewünschten Werte:
Code: Alles auswählen
Sub details_checkValues(oEvent as Object)
Dim dSoll as Currency
Dim dHaben as Currency
dim oField as Object
oForm = thisComponent.drawpage.forms.frmDetails
rem bestimme das aktuelle Feld und die derzeitigen Werte
oField = oEvent.Source.Model ' Name = "fsoll" oder "fhaben"
icur = oForm.getRow
dcurSoll = oForm.getDouble(4)
dcurHaben = oForm.getDouble(5)
msgBox( "Feld " + icur + " " + oField.Name + chr(13) + "S " + dcurSoll + " - H " + dcurHaben)
End Sub
Beim Verlassen der Spalte 3 (fsoll) werden die Werte richtig angezeigt. Beim Verlassen der Spalte 4 (fhaben) wird offensichtlich zuerst der Datensatzzeiger geändert und erst dann das Ereignis "Fokusverlust" verarbeitet; deshalb erhalte ich zur Anzeige die geänderte Zeile und deren Werte; ich brauche aber die Zeilennummer und die beiden Werte der soeben verlassenen Zeile. Was kann ich tun?
Folgende Verfahren halte ich für ungeeignet: "Text modifiziert" wegen der ständigen Prüfung bei jedem einzelnen Wert; Drücken oder Loslassen von Maus/Taste wegen der vielen Varianten, wie eine Eingabe in einer Zelle abgeschlossen wird; "Vor Datensatzwechsel" wegen der sofortigen Prüfung von Spalte 3 (fsoll). Ich habe auch versucht, bei Spalte 3 "Fokusverlust" und außerdem "Vor Datensatzwechsel" zu verbinden; aber dann muss ich wegen oEvent.Source beide Routinen trennen und diverse Nebenwirkungen beachten (zumindest wird beim Datensatzwechsel die Prüfung oft auch vorgenommen, wenn nichts geändert wurde).
Hintergrund: Es handelt sich um eine Mini-Buchhaltung. Die Summen von Soll und Haben müssen übereinstimmen; in jeder Zeile gibt es nur entweder Soll oder Haben. Nach Eingabe eines Wertes werden diese Prüfungen vorgenommen. Je nach Prüfungsergebnis wird ein Wert in der aktuellen Zeile auf 0 gesetzt, dazu die Werte in der letzten Zeile geändert oder eine weitere Zeile hinzugefügt.
Danke für Tipps! Jürgen
Nachtrag: Kann und sollte ich ein eigenes Ereignis (Zelle modifiziert oder so) erzeugen? Damit habe ich mich nicht befasst. Ich habe auch nicht verstanden, ob mir die Diskussion
Listener für ein Tabellen Kontrollfeld (GridControl) helfen könnte.
Hallo, ich habe in einem Formular ein GridControl mit 4 Spalten und möchte beim [b]Verlassen der Spalten[/b] 3 und 4 alle Werte dieser beiden Spalten (Summen über alle Zeilen) prüfen. Je nach Prüfergebnis soll ein Wert in der letzten Zeile geändert oder eine neue Zeile eingefügt werden. Dazu habe ich das Ereignis "Fokusverlust" an die Spalten 3 (fsoll) und 4 (fhaben) gebunden, bekomme aber nicht die gewünschten Werte:
[code]Sub details_checkValues(oEvent as Object)
Dim dSoll as Currency
Dim dHaben as Currency
dim oField as Object
oForm = thisComponent.drawpage.forms.frmDetails
rem bestimme das aktuelle Feld und die derzeitigen Werte
oField = oEvent.Source.Model ' Name = "fsoll" oder "fhaben"
icur = oForm.getRow
dcurSoll = oForm.getDouble(4)
dcurHaben = oForm.getDouble(5)
msgBox( "Feld " + icur + " " + oField.Name + chr(13) + "S " + dcurSoll + " - H " + dcurHaben)
End Sub[/code]
Beim Verlassen der Spalte 3 (fsoll) werden die Werte richtig angezeigt. Beim Verlassen der Spalte 4 (fhaben) wird offensichtlich zuerst der Datensatzzeiger geändert und erst dann das Ereignis "Fokusverlust" verarbeitet; deshalb erhalte ich zur Anzeige die geänderte Zeile und deren Werte; ich brauche aber die Zeilennummer und die beiden Werte der soeben verlassenen Zeile. Was kann ich tun?
Folgende Verfahren halte ich für ungeeignet: "Text modifiziert" wegen der ständigen Prüfung bei jedem einzelnen Wert; Drücken oder Loslassen von Maus/Taste wegen der vielen Varianten, wie eine Eingabe in einer Zelle abgeschlossen wird; "Vor Datensatzwechsel" wegen der sofortigen Prüfung von Spalte 3 (fsoll). Ich habe auch versucht, bei Spalte 3 "Fokusverlust" und außerdem "Vor Datensatzwechsel" zu verbinden; aber dann muss ich wegen oEvent.Source beide Routinen trennen und diverse Nebenwirkungen beachten (zumindest wird beim Datensatzwechsel die Prüfung oft auch vorgenommen, wenn nichts geändert wurde).
[u]Hintergrund:[/u] Es handelt sich um eine Mini-Buchhaltung. Die Summen von Soll und Haben müssen übereinstimmen; in jeder Zeile gibt es nur entweder Soll oder Haben. Nach Eingabe eines Wertes werden diese Prüfungen vorgenommen. Je nach Prüfungsergebnis wird ein Wert in der aktuellen Zeile auf 0 gesetzt, dazu die Werte in der letzten Zeile geändert oder eine weitere Zeile hinzugefügt.
Danke für Tipps! Jürgen
[u]Nachtrag:[/u] Kann und sollte ich ein eigenes Ereignis (Zelle modifiziert oder so) erzeugen? Damit habe ich mich nicht befasst. Ich habe auch nicht verstanden, ob mir die Diskussion [url=http://de.openoffice.info/viewtopic.php?f=18&t=50224]Listener für ein Tabellen Kontrollfeld (GridControl)[/url] helfen könnte.