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