Seite 1 von 4
Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mo 21. Dez 2015, 16:44
von Freischreiber
Hallo,
zur Vermeidung von Datenverlust würde ich gerne den Zustand des "Datensatz-speichern"-Knopfes in Base abfragen.
In meinem Formular gibt es ein Textfeld als Suchfeld für andere Datensätze als den gerade angezeigten. Von dort wird per Makro ("oForm.Filter" ...) der Formularfilter gesetzt für eine Datensatzsuche.
Problem: Sobald der Filter neu eingestellt wird, sind Änderungen im gerade gezeigten Datensatz weg.
Im Moment fragt das Filtermakro, das bei Fokusverlust des Suchfelds ausgelöst wird, vor dem Filtern mit einer Messagebox immer: Sind alle Änderungen hier gespeichert?
Also kurz gesagt, im Moment sieht es so aus:
Code: Alles auswählen
Sub Formularfilter_Adressblatt(oEvent AS OBJECT)
DIM intFrage As Integer
intFrage = MsgBox("Sind alle Änderungen in der aktuellen Adresse gespeichert?", MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2, "Makro Formularfilter_Adressblatt")
'MB_DEFBUTTON2 macht das Nein zur vorgegebenen Antwort, sicherheitshalber.
If intFrage = IDNO Then
Goto Ausstieg 'hier in neuer Zeile, macht Endif erforderlich.
Endif
oForm = thisComponent.Drawpage.Forms.getByName("MainForm")
oFeld = thisComponent.Drawpage.Forms.getByName("MainForm").getByName("txtSuchfeld")
stSuchtext = LCASE(oFeld.text) 'ermöglicht Großbuchstaben in Suchfeld
oForm.Filter = "LCASE(Nachname) LIKE '%"+stSuchtext+"%' OR LCASE(Firma) LIKE '%"+stSuchtext+"%' OR LCASE(Abteilung) LIKE '%"+stSuchtext+"%'"
oForm.reload
Ausstieg:
End Sub
Schöner wäre es, wenn ich nur gefragt werden würde, wenn es wirklich etwas zu speichern gibt (der Diskettenknopf also aktiv ist): Änderungen speichern? Ja/Nein/Abbrechen. Und das Makro macht es dann auch gleich (bei Ja), und filtert dann, oder verwirft Änderungen und filtert (bei Nein), oder läßt das Filtern bleiben (bei Abbrechen).
Geht das?
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mo 21. Dez 2015, 21:43
von gogo
Du musst "IsModified" abfragen:
Code: Alles auswählen
...
if oForm.IsModified then
msgbox "Datensatz wurde verändert!"
end if
...
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Fr 11. Mär 2016, 17:44
von Freischreiber
Hallo gogo,
so habe ich das vor:
Code: Alles auswählen
oForm = thisComponent.Drawpage.Forms.getByName("MainForm")
DIM intFrage As Integer
if oForm.IsModified then
intFrage = MsgBox("Der aktuelle Datensatz wurde geändert. Änderungen speichern?", MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1, "Makro Formularfilter_Adressblatt")
If intFrage = IDYES Then (speichern?)
end if
... (weiter mit Filtermakro)
Bei NO sollen Änderungen ignoriert und der Filter für die nächste Suche aktiviert werden.
Jetzt weiß ich aber nicht, wie man das Formular per Makro speichert - also was nach dem Then in der vorletzten Zeile kommt?
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Fr 11. Mär 2016, 19:49
von gogo
siehe hier:
http://www.libreoffice-forum.de/viewtop ... 12&t=15840
Code: Alles auswählen
if oForm.isnew then
oForm.insertrow
else
oForm.updaterow
endif
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Sa 25. Jun 2016, 10:45
von Freischreiber
Hallo gogo!
Sorry, daß ich mich jetzt erst melde.
Ich habe jetzt als erstes mal versucht, dieses .ismodified ins Makro zu bringen (bin jetzt allerdings in dem Makro, das die Aufträge filtern soll, nicht die Adressen).
Das sieht jetzt so aus:
Code: Alles auswählen
Sub BuchungAuftragsformular(oEvent)
oformAuftraege = oEvent.Source.Model.Parent
stAuftragID = oformAuftraege.getString(oformAuftraege.findcolumn("Auftragnr"))
oformAuftrag = ThisDatabaseDocument.getformdocuments.GetByName("f-Auftrag")
oformAuftrag.open
oformAuftrag = oformAuftrag.Component.drawpage.forms(0)
'Ergänzung um Sicherheitsfragen
DIM intFrage As Integer
If oformAuftrag.ismodified then
intFrage = MsgBox("Der angezeigte Datensatz wurde geändert. Änderungen speichern?", MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON1, "Makro BuchungAuftragsformular")
'MB_DEFBUTTON1 macht das Ja zur vorgeschlagenen Antwort.
If intFrage = IDYES Then
oFormAuftrag.updaterow
endif
endif
'Ergänzung Ende.
oformAuftrag.Filter = "Auftragnr = '"+stAuftragID+"'"
' oFormAuftrag.ApplyFilter = TRUE (geht hier ohne)
oFormAuftrag.reload
End Sub
Irgendwas scheint aber nicht zu passen, da bei Änderungen im angezeigten Formular die Abfrage nicht kommt. Stattdessen wird ungefragt der Filter angewendet und die Änderungen verworfen.
Dann habe ich noch eine Frage: Ist "isnew" auch ein Fall von "ismodified"? Oder muß ich beides behandeln?
Also das angezeigte Formular mit Unterformularen könnte einen neuen Datensatz anzeigen oder nur einen geänderten (geändert im Haupt- oder Unterformular).
Der Nutzer soll einfach immer, wenn im offenen Fenster das Diskettensymbol aufleuchtet, gefragt werden, ob gespeichert werden soll, bevor der Filter kommt und auf einen anderen Datensatz umschaltet...
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mo 27. Jun 2016, 16:27
von Freischreiber
Es ist seltsam:
Das Makro funktioniert im Prinzip. Aber erst ab zwei Änderungen im Auftragsformular!
Ich habe um
ergänzt. Das liefert bei
einer Änderung "false" und man wird nicht nach Speichern gefragt. Ändert man
zwei Felder des Auftragsformulars, wird erst "true" geliefert und nach Speichern der Änderungen gefragt.
Dann wird allerdings, wenn man "ja" wählt, auch nur die erste Änderung gespeichert vor dem Neufiltern! Die zweite Änderung wird vergessen.
Liegt das an meinem Makro oder ist das ein Bug?
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mi 6. Jul 2016, 08:39
von Freischreiber
Hallo alle!
Natürlich würde ich mich über Hilfe auch von anderen Usern freuen! Diesen Effekt, daß von zwei Änderungen nur die erste gespeichert wird, kann ich mir nicht erklären...
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mi 6. Jul 2016, 15:35
von gogo
Kannst Du mal ein Beispiel hochladen - am konkreten Problem lassen sich Lösungen am schnellsten erarbeiten.
...Aber erst ab zwei Änderungen im Auftragsformular!...
bedeutet, dass irgendwo ein Status falsch abgefragt wird.
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mi 6. Jul 2016, 16:30
von Freischreiber
Hallo gogo,
sehr schlecht: große Datenbank mit lauter privaten Daten drin: ich müßte dazu alle Beziehungen löschen und dann die Tabellen entkernen...
Könnte es mit deinem Tipp von oben zu tun haben?
http://www.libreoffice-forum.de/viewtop ... 730#p41357
... den ich noch nicht umgesetzt habe - weil ich nicht genau weiß, was ich einfügen muß:
Das hier:
Code: Alles auswählen
if oForm.isnew then
oForm.insertrow
else
oForm.updaterow
endif
oder das hier aus dem verlinkten Post:
Code: Alles auswählen
if oSubForm.isnew then
if oSubForm.ismodified then oSubForm.insertrow
else
oSubForm.updaterow
endif
Und wo genau, ist mir auch nicht klar: Einfach anstelle meiner Zeile
?
Gruß
Freischreiber
Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?
Verfasst: Mi 6. Jul 2016, 19:34
von gogo
es hat damit zu tun
oForm.isnew = true bedeutet, dass der Datensatz neu ist, und zwar neu im Sinne von "noch gar nicht existent". Wenn Du in einem Formular zum "neuen Datensatz" gehst, gibt es diesen Datensatz noch gar nicht. Erkennen kannst Du das z.B. an einem Autoincrement-Feld. Dort steht dann keine Zahl, sondern <Autowert>. So lange das da steht, existiert der Satz noch nicht und "oForm.isnew = true". Erst wenn er gespeichert wird (Base führt dann ein "Insert into TabelleX..." aus) steht eine Zahl in dem Autowert Feld und ab dann gilt: "oForm.isnew = false". Ab da muss eine Datensatzänderung mit "Update TabelleX ..." gemacht werden, weil ja der Satz verändert wird.
...Und wo genau, ist mir auch nicht klar: Einfach anstelle meiner Zeile
?
Ja, ich würde diese Zeile ersetzen und das modified nach Vorne ziehen:
Code: Alles auswählen
with oFormAuftrag
if .ismodified then
if msgbox("Speichern?",4) = 6 then
if .isnew then
.insertrow
else
.updaterow
end if
end if
end if
end with