[gelöst] Ereignis canceln

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

[gelöst] Ereignis canceln

Beitrag von Christiana »

Hallo,

nach längerer Pause arbeite ich nun wieder mit OOo-Basic.
In einem Calc-Dokument habe ich ein Hauptformular und 2 Unterformulare mit je einem Tabellen-Kontrollfeld und einer Navigationsleiste. Es funktioniert alles tadellos.
Wird ein Datensatz des Hauptformulars gelöscht, werden auch die dazugehörigen Datensätze der Subformulare gelöscht. Das soll auch so sein. Nach dem Betätigen des Lösch-Buttons auf der Navigationsleiste des Hauptformulars, kommt nur die Nachricht, dass ein Datensatz gelöscht wird und die Nachfrage, ob man fortfahren möchte. An dieser Stelle möchte ich nun den Benutzer darauf hinweisen, dass auch die Datensätze der Unterformulare gelöscht werden. Mein Makro habe ich dem Ereignis ”Löschen bestätigen“ (Hauptformular) zugeordnet. Wenn der Benutzer auf den Nein-Button klickt, soll das Löschen natürlich nicht stattfinden. Und genau an dieser Stelle liegt mein Problem. Wie verhindere ich das Löschen, d.h. wie cancle ich das anstehende Ereignis Löschen?

Mein bisheriger Code:

Code: Alles auswählen

Sub bestaetigeLoeschen (oEvent as Object)
	'XRayLaden
	'xray oEvent
	Dim i as Integer
	Dim sText as String
	Dim iTyp as Integer
	Dim sTitel as String
	sText 	=	"Es werden auch die dazugehörigen Datensätze " & chr(13) & _
				"von den Unterformularen gelöscht!" & chr(13) & _
				"Wollen Sie trotzdem fortfahren?"	
	iTyp    = 52					'48 + 4 = Erklärungs-Symbol + Ja-/Nein-Button
	sTitel  = "Sicherheitsabfrage"
	i = MsgBox (sText, iTyp, sTitel)		
	If i = 7 Then 
			'MsgBox "Nein"
			'Löschen des Datensatzes soll nicht durchgeführt werden
			'Cancel = True		(funktioniert nicht)
	End If
End Sub
Vielen Dank im Voraus

Christiana
Zuletzt geändert von Christiana am Fr, 15.05.2009 16:22, insgesamt 1-mal geändert.
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Ereignis canceln

Beitrag von Charly »

Hallo Christiana!

Am besten brichst du den Sub ab, wenn nein gedrückt wird.

Code: Alles auswählen

If i = 7 Then
    exit sub        
End If
Gruß
Charly
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo Charly,

vielen Dank für Deine rasche Antwort. Aber leider ist Exit Sub an dieser Stelle keine Lösung, da mein Makro dem Ereignis
”Löschen bestätigen“ (Hauptformular) zugewiesen ist, d.h. auch mit Exit Sub wird mein Datensatz gelöscht.
Durch xray habe ich herausbekommen, dass dabei das RowChangeEvent ausgelöst wird.
oEvent.Action steht auf 3 (Löschen). Ich weiß nicht wie ich das Ereignis abbrechen kann. Mein Wissen über Ereignisse ist einfach noch zu gering und ich habe dazu auch noch keine geeignete Literatur gefunden.
Hoffentlich kann mir jemand helfen.

Viele Grüße
Christiana
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Ereignis canceln

Beitrag von Charly »

Hallo Christina!

Ohne zu wissen an welcher Stelle die Löschroutine ist, kann ich dir schwer antworten. Kannst du vielleicht eine Beispieldatei ohne schützenswerte Daten hier hochladen.

Gruß
Charly
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo Charly,

danke, dass du mir weiterhin helfen willst.
Dann lade ich jetzt mal mein Formular hoch, in der Hoffnung, dass du etwas damit anfangen kannst, da ja die Verbindung zu unserer PostgreSQL-DB fehlt.
Das Ereignis "Löschen bestätigen" erreichst du, indem du das erste Tabellen-Kontrollfeld mit der rechten Maustaste anklickst und Formular auswählst.

Gruß
Christiana
Formular_Forum.ods
(14.13 KiB) 161-mal heruntergeladen
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Ereignis canceln

Beitrag von Charly »

Hallo Christina!

Ich hatte gehofft, dass heute Nacht jemand antwortet, der sich besser mit Formularen und Datenbankanbindung auskennt, als ich.
Ich habe aber zumindest dein Problem verstanden. Unter dem jeweiligen Formular gibt es die Leiste Formular-Navigation mit dem Button "Datensatz löschen". Der Benutzer drückt auf diesen Button und der Datensatz wird gelöscht. Du willst dies in einem Makro mit einer zusätzlichen Sicherheitsabfrage steuern.

Jetzt erhebt sich die Frage, was ist das Ereignis "Löschen bestätigen". Für mich klingt das so. Es drückt jemand den Button "Datensatz löschen", es kommt eine Abfrage z.B "Wollen Sie den Datensatz wirklich löschen". Das wird bestätigt und dann startet dein Makro. Ich glaube zu diesem Zeitpunkt ist es nicht mehr möglich, die Löschung zu stoppen. Man kann dem Benutzer nur einen Hinweis mitteilen, dass die Unterformulare mit gelöscht werden.

Wenn du das Löschen wirklich kontrollieren willst, musst du meiner Ansicht nach, eine eigene Löschroutine schreiben, also den offiziellen Button durch einen eigenen ersetzen. Aber wie oben bereits gesagt, da stoße ich auch an meine Grenzen.

Gruß
Charly
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo Charly,

ich habe mich heute morgen gefreut, wieder eine Antwort von dir zu haben.
Allerdings dachte ich nicht, dass mein Problem so schwierig zu lösen sein soll.
Das Ereignis ”Löschen bestätigen“ scheint etwas anders zu funktionieren als von dir beschrieben.
Wenn kein Makro mit diesem Ereignis verknüpft wird, erscheint folgende Meldung.
Datensatz_ loeschen.gif
Datensatz_ loeschen.gif (3.6 KiB) 3944 mal betrachtet
Drücke ich auf den Nein-Button wird das Löschen auch nicht ausgeführt. Also so wie es sein soll.

Weise ich dem Ereignis ”Löschen bestätigen“ mein Makro zu, erscheint die oben erwähnte Meldung nicht mehr und ich bin offensichtlich für alles selbst verantwortlich, d.h. ich habe hier die Möglichkeit den Standard-Dialog zu ersetzen und deshalb dachte ich, dass man hier auch noch das Löschen verhindern könnte. Vielleicht liest hier jemand ja auch noch diese Zeilen, der sich da etwas mehr auskennt.

Interessieren würde ich mich auch noch, wie ich die einzelnen Elemente der Navileiste (z.B. den Lösch-Button) ansprechen kann? Oder anders ausgedrückt, woher weiß die Navileiste, dass ich den Lösch-Button gedrückt habe?

Gruß
Christiana
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Ereignis canceln

Beitrag von Charly »

Hallo Chrisitiana!

Du hast mit deiner Ansicht recht, dass mit einem Makro der Löschvorgang gestoppt werden kann. Das schreibt auch die OpenOffice-Hile
OpenOffice.org Hilfe hat geschrieben: Löschen bestätigen
Das Ereignis Löschen bestätigen tritt ein, sobald Daten aus dem Formular gelöscht werden. Dabei kann beispielsweise das zugewiesene Makro einen Bestätigungsdialog öffnen.
Daraufhin habe ich noch etwas gestöbert und bin auf zwei Methoden gestoßen, die vielleicht helfen können und zwar auf "updateRow" und "cancelRowUpdates". Laut der Beschreibung wird die erste Methode verwendet um die Daten zur Datenbank zu übertragen und die zweite, um die Übertragung, bei einem Irrtum, zu stoppen. Mit Xray habe ich die Methode bei deinem Hauptformular= Variable oForm entdeckt. Leider kann ich das nicht testen, weil ich keine Datenbankanbindung habe.

Code: Alles auswählen

oForm.CancelRowUpdates()
Vielleicht hilft das.

Gruß
Charly
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo Charly,

Code: Alles auswählen

oForm.CancelRowUpdates()
Ich dachte auch, das ist genau das was ich brauche. Aber leider zeigt sich dieser Befehl ohne Wirkung.
Der Datensatz wird trotzdem gelöscht. Ich verstehe es einfach nicht mehr.
Hab trotzdem vielen Dank für deine Mühen.

Gruß
Christiana
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Ereignis canceln

Beitrag von eBayer »

Eigenschaften.jpg
Hast Du es mal mit einem Makro versucht, welches Du den hier gezeigten Eigenschaften zuordnest?
- Löschen bestätigen
oder
- vor der Datensatzaktion
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo eBayer,

genau diesen beiden Ereignissen habe ich mein Makro mit dem Befehl:

Code: Alles auswählen

oEvent.Source.Model.cancelRowUpdates()
zugewiesen. Aber leider blieb dieser Code bei beiden Ereignissen wirkungslos.
Das Löschen wurde trotzdem durchgeführt.

Gruß
Christiana
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: Ereignis canceln

Beitrag von Charly »

Hallo Christiana!

Ich habe gerade gesehen, dass du bei deinen Makros die Variable oForm nicht nur für das Hauptformular verwendest, sondern später durch:

Code: Alles auswählen

oForm = oEvent.Source
veränderst. Da oForm global deklariert ist, wirkt sich das auf alle anderen Makros aus.
Aber ich gehe davon aus, dass du den Befehl "CancelRowUpdates()" nicht nur mit

Code: Alles auswählen

oEvent.Source.Model.cancelRowUpdates()
getestet hast, sondern auch mit dem vollen Pfad zum Hauptformular ohne irgendwelche "oEvent"

Code: Alles auswählen

 oDoc   = thisComponent  
    oSheet = oDoc.sheets.getByName("Altbestand")
    oDraw  = oSheet.drawpage
   oForm  = oDraw.Forms.getByName("MainForm")
   oForm.CancelRowUpdates()
Gruß
Charly
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Ereignis canceln

Beitrag von Christiana »

Hallo Charly,

auch CancelRowUpdates() mit dem vollen Pfad zum Hauptformular ohne irgendwelche "oEvent"
führt nicht zum gewünschten Erfolg. Das Löschen des Datensatzes wird nicht verhindert.

Christiana
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

[gelöst] Ereignis canceln

Beitrag von Christiana »

Heureka!

Plötzlich hatte ich das Gefühl, dass dieses Problem mit einem Listener zu lösen wäre.
Es hat ein Weilchen gedauert, weil ich mich noch nie mit Listenern beschäftigt hatte.
Doch nun klappt es und die Freude ist umso größer.

Für alle, die irgendwann einmal vor einem ähnlichen Problem stehen, hier meine Lösung.

Code: Alles auswählen

Global  oDeleteListener

Sub AddConfirmDeleteListener
	oDeleteListener = CreateUnoListener("DeleteListener_", "com.sun.star.form.XConfirmDeleteListener")
        oDoc   = thisComponent 
        oSheet = oDoc.sheets.getByName("Altbestand")
        oDraw  = oSheet.drawpage
   	oForm  = oDraw.Forms.getByName("MainForm")
   	oDocCtl = oDoc.getCurrentController()
   	oFormCtl = oDocCtl.getFormController(oForm)   	
   	oFormCtl.addConfirmDeleteListener(oDeleteListener)
End Sub

Sub RemoveListener	
	oDoc   = thisComponent 
        oSheet = oDoc.sheets.getByName("Altbestand")
        oDraw  = oSheet.drawpage
   	oForm  = oDraw.Forms.getByName("MainForm")
   	oDocCtl = oDoc.getCurrentController()
	oFormCtl = oDocCtl.getFormController(oForm)
   	On Error Resume Next
   	oFormCtl.removeConfirmDeleteListener(oDeleteListener)
   	On Error GoTo 0
End Sub

Function DeleteListener_confirmDelete(oEvent)
	Dim i 	 as Integer
	Dim sText  as String
	Dim iTyp    as Integer
	Dim sTitel  as String	
	
	sText 	=	"Es werden auch die dazugehörigen Datensätze " & chr(13) & _
				"von den Unterformularen gelöscht!" & chr(13) & _
				"Wollen Sie trotzdem fortfahren?"	
	iTyp    = 	52					'48 + 4 = Erklärungs-Symbol + Ja-/Nein-Button
	sTitel  = 	"Sicherheitsabfrage"	
	i = MsgBox (sText, iTyp, sTitel)
	REM i = 7 --> Nein-Button:
	If i = 7 Then
		DeleteListener_confirmDelete = False
	Else
		DeleteListener_confirmDelete = True
	End If
End Function
[/co
Ein schönes Wochenende wünscht Euch allen
Christiana
mhonline
**
Beiträge: 24
Registriert: Di, 24.04.2007 15:31

Re: [gelöst] Ereignis canceln

Beitrag von mhonline »

hm, das kann nicht sein, Aktionen müssen sich doch auch anders - ohne diesen Sermon - abbrechen lassen,
Das LÖSCHEN ist doch eine Standard-Funktion, da muß es doch ein OO.O-Standard-Makro geben: "machdasnicht"
(früher zB gab es mal ESC-Tasten auf der Tastatur)

Martin
Antworten