Seite 1 von 1

Datensatzänderung überprüfen

Verfasst: Mi 23. Mai 2018, 19:25
von Alletkla
Hallo liebes Forum:

Eine sehr kurze Frage, zu der ich leider mit Stichwortsuche nichts gefunden habe.
Bin noch relativ neu in Libre.

Gibt es ein Event oder ja etwas in der Art, mit dem man überprüfen könnte, ob ein Dokument (vorzugsweise ein Datensatz in Base) geändert wurde?

Ich möchte eine Abfrage mit anschließender Speicherung des Datensatzes realisieren, wenn dieser geändert wurde. Da Libre dies ja dokumentiert (man bekommt ja eine solche Meldung auch angezeigt, wenn man das Formular schließt), sollte man ja irgendwie darauf zugreifen können.

Momentan ist das Problem, dass immer nur der Datensatz gespeichert wird, der beim schließen ausgewählt wurde. Ich möchte aber auch nicht einfach stumpf jeden Datensatz speichern beim Datensatzwechsel.
Ich hoffe ihr könnt mir helfen : )

Beziehungsweise: Wie kann ich die vorprogrammierten Button-Aktionen (Datensatz löschen/einfügen/speichern) mit meinem Makro mit dem Event "Aktion bestätigen" abbrechen?

Vielen Dank im Voraus

Re: Datensatzänderung überprüfen

Verfasst: Mi 23. Mai 2018, 20:26
von RobertG
Hallo Alletkla,

hast Du Dir schon im Handbuch, ca. S. 480, das Kapitel "Abspeichern mit Nachfrage" angesehen?

Gruß

Robert

Re: Datensatzänderung überprüfen

Verfasst: Mi 23. Mai 2018, 21:55
von Alletkla
Habe ich, da wird aber vorausgesetzt, dass die Speicherroutine von Libre bereits ausgelöst wurde.

Mein Problem besteht aber darin zu entscheiden OB diese ausgelöst werden soll.

Code: Alles auswählen

Sub checkkaenderung(Doc as Object) as Boolean
'	Dim oForm2 as OBject 
'	oForm2 = ThisDatabaseDocument.formdocuments.getByName("Eingabe Bilddaten Ortsarchiv")
	
  If oForm2.isModified = True then
  	Msgbox("ja")
  Else
  Msgbox("nein")
  End If
End Sub

Sub Datensatzaktion_erzeugen(oEvent as Object)
	oForm2.isModified = True
End Sub
Mit

Code: Alles auswählen

oForm2 = ThisComponent.drawpage.forms.getByName("Eingabe Bilddaten Ortsarchiv")
liefert nun das gewünschte "ja". Mit dem ich die Infos aus dem Handbuch benutzen kann.

Gibt es eine Möglichkeit, wie man allen steuerlementen das gleiche Marko zuweisen kann?
Ich habe über 30 Steuerelemente auf der Form, denen ich jetzt einzeln "Datensatzaktion_erzeugen" zuweisen müsste :///

Re: Datensatzänderung überprüfen

Verfasst: Do 24. Mai 2018, 02:12
von Alletkla
Desweiteren besteht das Problem, dass das Formular anders reagiert, wenn das Makro in "Echtzeit" läuft, als wenn ich ich es im EinzelschirttModus durchlaufen lasse

Ein Feld, dass bearbeitet wurde, füllt sich automatisch wieder mit dem Ausgangswert, wenn sichg eine Msgbox öffnet. Im Einzelschirtt-Modus pasiert dies nicht :? :? :?

Re: Datensatzänderung überprüfen

Verfasst: Do 24. Mai 2018, 08:10
von RobertG
Hallo Alletkla,

ja, das Makro ist an das Formular gebunden, nicht an einzelne Buttons. Es bricht dann gegebenenfalls die Speicherung ab. Was möchtest Du denn erreichen?

Gruß

Robert

Re: Datensatzänderung überprüfen

Verfasst: Do 24. Mai 2018, 10:42
von Alletkla
Bild

Ich habe dieses Forumlar. Wenn ich hier in irgendeinem Feld etwas ändere wird folgendes ausgelöst:

Code: Alles auswählen

Sub Datensatzaktion_erzeugen(oEvent as Object)
	oForm2.isModified = True
	'oevent.source.model.commit(true)
End Sub
Da die Datensatzaktion 2 mal ausgelöst wird folgt dieser Code im Bereich "Vor der Datensatzaktion"

Code: Alles auswählen

  Dim Mskboxres as Integer
  Select Case oEvent.Source.ImplementationName
	Case "com.sun.star.comp.forms.ODatabaseForm"
	'MsgBox oEvent.Source.ImplementationName	
  	  If oForm2.isModified = True Then
  	  Dim oFormFeature as Object
  	
  	  msgboxres = Msgbox("Wirklich speichern?",3)	
  	  Select Case Msgboxres
  	    Case 6
  	      oForm2.updateRow()
  	      MSgbox("Datensatz " & oform2.getbyname("txtArchivnummer").text &  " Gespeichert")
  	    Case Else
  	      oFormFeature = com.sun.star.form.runtime.FormFeature
  	  	  oFormView= oDoc2.currentcontroller.getFormController(oform2)
  	      oFormView.FormOperations.execute(oFormFeature.UndoRecordChanges)
  	  End Select  
  	  Else
  	  End If
  	Case "org.openoffice.comp.svx.FormController"
  End Select
Wenn ich nun aber in einem Feld etwas ändere, springt es wie gewollt auf "ismodified = true"
ABER:
Sobald sich die Msgbox mit "Wirklich speichern" öffnet, ist die Änderung zurückgesetzt. und ich verstehe nicht wieso.

Habe es bereits mit "commit" versucht, dies brachte mir in einem anderen Projekt den Erfolg, als es ums speichern ging.
Funktioniert allerdings auch nicht

Merkwürdig ist allerdings, wenn ich in Basic einen Haltepunkt an den Anfang der Prozedur mache und mit Einzelschritt weiter mache, bleiben die Änderungen erhalten, allerdings speichert "updateRow()" nichts in den Datensatz und sobald der Datensatz verlassen wird, sieht man den Ausgansgzustand wieder.

Das Problem scheint also irgendwie an der Übergabe zu irgendeinem Controller zu liegen.

EDIT: Okay das Problem tritt auf, wenn die Msgbox aufgerufen wird. Kommatiert man diese aus, wird richtig gespeichert und die Änderungen bleiben auch erhalten, allerdings würde ich diese Abfrage schon gerne realisieren.

Re: Datensatzänderung überprüfen

Verfasst: Do 24. Mai 2018, 16:30
von RobertG
Hallo Alletkla,

wenn Du bei jedem Feld die Datensatzaktion erst einmal dem Formular mitteilen musst, dann stimmt doch irgendetwas an dem Formular nicht. So etwas mache ich nur, wenn ich die Felder, in denen sich etwas abspielt, nicht mit der Datenquelle verbunden habe (im Handbuch z.B. bei der Nutzung von Kombinationsfeldern als "editierbaren Listenfeldern").

Gruß

Robert

Re: Datensatzänderung überprüfen

Verfasst: So 27. Mai 2018, 20:30
von Alletkla
Aus mir nicht erklärlichen Gründen funktioniert es nicht, dass er erkennt, wenn etwas geändert wurde.

Vielleicht liegt es am Import aus Access? Habe es aber auf Jeden Fall nun so gelöst.

Das Problem beim Fall oben war, dass das "Undo" im Else Case stand, aus irgendeinem Grund überspringt er die Msgbox einfach und arbeitet das MAkro ab, obwohl noch keine Rückmeldung durch die MSgbox erfolgt ist.... dadruch werden die Änderungen Rückgangig gemacht, habe das nun einfach in ein spezielles Case geschoben.