🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Mo 21. Dez 2015, 16:44

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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von gogo » Mo 21. Dez 2015, 21:43

Du musst "IsModified" abfragen:

Code: Alles auswählen

...
if oForm.IsModified then
    msgbox "Datensatz wurde verändert!"
end if
...
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Fr 11. Mär 2016, 17:44

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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von gogo » Fr 11. Mär 2016, 19:49

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
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Sa 25. Jun 2016, 10:45

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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Mo 27. Jun 2016, 16:27

Es ist seltsam:

Das Makro funktioniert im Prinzip. Aber erst ab zwei Änderungen im Auftragsformular!

Ich habe um

Code: Alles auswählen

msgbox oformAuftrag.ismodified
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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Mi 6. Jul 2016, 08:39

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
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von gogo » Mi 6. Jul 2016, 15:35

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.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von Freischreiber » Mi 6. Jul 2016, 16:30

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

Code: Alles auswählen

oFormAuftrag.updaterow
?

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: Base-"Datensatz speichern"-Button (Diskettenknopf) per Makro abfragen?

Beitrag von gogo » Mi 6. Jul 2016, 19:34

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

Code: Alles auswählen

oFormAuftrag.updaterow
?
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
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten