💚 BITTE helfen Sie uns das LibreOffice Forum zu erhalten! 💚
Helfen Sie uns bitte noch HEUTE!

❤️ DANKE >><< DANKE ❤️

Vielen Dank für Ihre SPENDE.

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[GELÖST]BASE Formularanzeige wechseln per Schaltfläche

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Goebele
Beiträge: 5
Registriert: Mo 1. Jul 2024, 14:14

[GELÖST]BASE Formularanzeige wechseln per Schaltfläche

Beitrag von Goebele » Do 4. Jul 2024, 12:19

Liebe LO-Kenner,

ich bin hier Anfänger und finde keine Lösung zu einer, wie ich meine, einfachen Aufgabe. Diese kleine Anwendung habe ich vor Jahren in LOTUS-Approach erstellt und möchte sie nach LibreOffice_BASE (Windows11 / LO 7.6.7.2) übertragen:

Zwei Tabellen ‘Eigner‘ und ‘Mieter‘ werden durch zwei Formulare ‘EIGNER‘ und ‘MIETER‘ dargestellt. Jedes Formular hat eine Schaltfläche, die bewirken soll, dass zum jeweils anderen Formular gewechselt wird.
Maßgabe dabei ist, dass derjenige Datensatz im gerufenen Formular angezeigt wird, der die gleiche ‘Wohnungs_Nr‘ hat, wie der im rufenden Formular gerade dargestellte.
Sichtbar ist dann das jeweils zuletzt gerufene Formular.

Bisher beiße ich mir die Zähne aus und es scheint mir, dass die Aufgabe nicht mit Bordmitteln von LO-BASE und Basic-Makros zu lösen ist.
Wer weiß Rat?

Gruß
Goebele
Zuletzt geändert von Goebele am Mi 10. Jul 2024, 15:39, insgesamt 1-mal geändert.

RobertG
Beiträge: 2769
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von RobertG » Fr 5. Jul 2024, 08:27

Zuerst: Du brauchst einen Ort, an dem Du die "Wohnungs_Nr" speichern kannst. Ich mache so etwas in einer "tbl_Filter", die grundsätzlich für den aktuellen Benutzer nur einen Datensatz anzeigt. Bei eingebauten Datenbanken reicht deswegen für so eine Tabelle in Primärschlüssel im Ja/Nein-Format aus, der als ersten und einzigen Datensatz den Primärschlüssel auf "Ja" gestellt bekommt.
Du setzt in beiden Formularen den Filter. Das geht in den Eigenschaften der Formulare. Da steht dann drin ("Wohnungs_NR" = (SELECT "Wohnungs_Nr" FROM "tbl_Filter")).
Schließlich die Buttons und der passende Code dazu als Basic-Prozedur:

Code: Alles auswählen

SUB Wohnung(oEvent AS OBJECT)
	oField = oEvent.Source.Model
	stZiel = oField.Tag
	oForm = oEvent.Source.Model.Parent
	IF hasUnoInterfaces(oForm, "com.sun.star.form.XForm" ) THEN
		stID = oForm.getString(oForm.FindColumn("Wohnungs_Nr"))			
		oConnection = oForm.activeConnection()
		oSQL_Statement = oConnection.createStatement()
		stSql = "UPDATE ""tbl_Filter"" SET ""Wohnungs_Nr"" = '"+stID+"' WHERE ""ID"" = TRUE"
		oSQL_Statement.executeUpdate(stSql)
		ThisDatabaseDocument.FormDocuments.getByName(stZiel).open
	END IF	
END SUB
Du musst in die Zusatzinformationen des Buttons den Namen des Formulars schreiben, wie er im Base-Fenster erscheint. Dann wird so das andere Formular geöffnet, nachdem der Filterwert geschrieben wurde.
Wenn Du auch das Formular, in dem der Button liegt, schließen willst, dann musst Du den Namen des Formulars ermitteln:

Code: Alles auswählen

		DIM arStart()
		arStart = split(ThisComponent.Title, ThisComponent.UntitledPrefix)
		stStart = arStart(1)
Der Name steht immer in der Titelzeile des Fensters des Formulars, und zwar nach dem Doppelpunkt. Ich trenne die Titelzeile mit Hilfe des Doppelpunktes in 2 Teile und ermittle den Namen. Wie im ersten Code baue ich den dann ein und nutze statt 'open' jetzt 'close'.

Makro nachträglich korrigiert. Passte nicht bei dem anzusprechenden Formular (Parent, "stZiel")
Zuletzt geändert von RobertG am Di 9. Jul 2024, 09:35, insgesamt 1-mal geändert.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Goebele
Beiträge: 5
Registriert: Mo 1. Jul 2024, 14:14

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von Goebele » Fr 5. Jul 2024, 11:59

Danke, RobertG.
Das scheint mir vielversprechend. Die Umsetzung wird mir nicht ganz schnell gelingen.
Aber ich melde mich auf jeden Fall.
Dir wünsche ich ein ruhiges Wochenende.

Goebele
Beiträge: 5
Registriert: Mo 1. Jul 2024, 14:14

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von Goebele » Sa 6. Jul 2024, 18:35

Hallo RobertG,
inzwischen konnte ich Deinen Ratschlag in meine Testumgebung einbauen. Diese habe ich in der Anlage beschrieben. Erfolg hatte ich noch nicht. Ich stoße auf Probleme:
A Die Schaltfächebewirkt nichts Erkennbares. Ist die Schaltfläche falsch konfiguriert?

B Der Makro-Code ergibt bei der ersten Anweisung (im Einzelschritt):
oField = oEvent.Source.Model 'BASIC-Laufzeitfehler. Argument ist nicht optional.
Vielleicht wird er falsch aufgerufen oder gibt es noch unerfüllte Voraussetzungen?

C Der SQL-Code "WOHNUNG_NR" = (SELECT "WOHNUNG_NR" FROM "Filter") in der Formulareigenschaft ‘‘FILTER‘‘ ist wirksam, aber in unerwünschter Weise:
Schon beim ersten Aufruf aus der GUI (z.B. Formular EIGNER) wird die Filtertabelle abgefragt. Die ist aber leer (oder “0“) mit der Folge, dass mir ein leeres Formular angezeigt wird (Datensatz 1 von 1), worin ich neue Datensätze eingeben könnte – sonst nichts.
Kann es sein, dass ich den SQL-Filter an der falschen Stelle eingetragen habe?
Wenn ich vorab eine Wohnungsnummer in die Filtertabelle einsetze, dann wird genau dieser eine Datensatz angezeigt (1 von 1); ich kann den bearbeiten und neue DS eingeben.
Gewünscht ist eine zunächst normale Anzeige mit der Möglichkeit zu blättern, zu ändern, zu filtern und zu suchen. Dann, nach Klick auf die Schaltfläche Sprung zum anderen Formular zu dem Datensatz mit der aktuellen Wohnungsnummer. Dort wäre es dann ebenso wünschenswert, ebenfalls die erwähnten Freiheiten zu haben (und nicht auf den gefundenen DS fixiert zu sein).

Weißt Du Rat?
Gruß Goebele
Dateianhänge
Noch Fragen an RobertG.pdf
(316.31 KiB) 23-mal heruntergeladen

RobertG
Beiträge: 2769
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von RobertG » Sa 6. Jul 2024, 19:32

Standardereignis bei einer Schaltfläche ist "Aktion ausführen". Wenn Du dazu nur die Maus nimmst, dann kannst Du natürlich auch über Maustastenevents nachdenken. Nur löst dann die Tastatur das Ereignis nicht mehr aus.

Der Filter ist schon an der richtigen Stelle. Du kannst diesen internen Filter aber über die Navigationsleiste an- und ausschalten. Schau einmal dort: Das Filtericon ist gedrückt.

Du kannst alternativ auch

Code: Alles auswählen

"Wohnungs_Nr" = COLAESCE((SELECT "Wohnungs_Nr" FROM "Filter"), "Wohnungs_Nr")
als Filter setzen. Dann werden alle Datensätze angezeigt, wenn in der Filtertabelle die "Wohnungs_Nr" leer ist.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Goebele
Beiträge: 5
Registriert: Mo 1. Jul 2024, 14:14

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von Goebele » So 7. Jul 2024, 14:20

Hallo RobertG,
danke für die schnelle Reaktion.
Dein Hinweis „Filter über die Navigationsleiste an- und ausschalten“ ist hilfreich und funktioniert.
Dein Vorschlag mit
"WOHNUNG_NR" = COLAESCE((SELECT "WOHNUNG_NR" FROM "Filter"), "WOHNUNG_NR")
würde mir sehr gefallen, bringt aber „ACCSESS denied“ - siehe die Anlage.
Einen Grund dafür kann ich nicht erkennen.

Den Makroaufruf in der Schaltfläche habe ich auf „Aktion ausführen“ geändert.
Die Schaltfläche kann ich zuerst nur mit der Maus aktivieren (danach auch mit der ENTER-Taste, was dann aber keinen Sinn mehr macht). ???
Um die weiterhin nicht erkennbare Reaktion zu testen, habe ich das Makro geändert:
sub wohnung(oEvent AS OBJECT)
Print "Hallo!"
MsgBox "Dieses Makro wurde angesprochen"
end sub
Im Einzelschrittmodus funktioniert es wie erwartet; „live“ aber wie vorher schon berichtet keine erkennbare Reaktion.
Das sieht für mich so aus, als ob das Makro nicht wirklich aufgerufen wird, um den gewünschten Formularwechsel herbei zuführen.
Woran liegts?
Gruß Goebele
Dateianhänge
COLAESCE - Accsess denied.jpg
COLAESCE - Accsess denied.jpg (70.57 KiB) 698 mal betrachtet

RobertG
Beiträge: 2769
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: BASE Formularanzeige wechseln per Schaltfläche

Beitrag von RobertG » So 7. Jul 2024, 14:49

Access denied → eine Standardmeldung, wenn ein Befehl unbekannt ist. Liegt hier daran, dass ich nicht korrekt COALESCE geschrieben habe. Das Hat nichts mit COLA zu tun. Coalesce heißt aus dem Englischen zusammenfügen. In diesem Fall: Wenn der eine Eintrag leer ist, dann nimm den anderen.

Zur Funktion des Makros: Ich habe hier eine DB laufen, bei der das Ganze genau so läuft. Du kannst mir natürlich Deine DB einmal per Mail zusenden. Dann schaue ich mir das an.
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Goebele
Beiträge: 5
Registriert: Mo 1. Jul 2024, 14:14

Re: GELÖST BASE Formularanzeige wechseln per Schaltfläche

Beitrag von Goebele » Mi 10. Jul 2024, 15:32

Hallo interessierte Leser,

mit RobertG’s Hilfe ist die Lösung gefunden:

Der korrekte SQL-Filter in den Formulareigenschaften muß lauten:
"WOHNUNG_NR" = COALESCE((SELECT "WOHNUNG_NR" FROM "Filter"), "WOHNUNG_NR")

In den Button-Eigenschaften fehlten noch die NAMEN des jeweils anderen Formulars unter ‘Allgemein / Zusatzinformationen‘, so dass das Zielformular gefunden wird.

Entscheidend der Makro-Code, der durch die Schaltflächen ausgelöst wird:

REM Basic ****

SUB wohnung(oEvent AS OBJECT)

oField = oEvent.Source.Model
stZiel = oField.Tag
oForm = oEvent.Source.Model.Parent

IF hasUnoInterfaces(oForm, "com.sun.star.form.XForm" ) THEN
stID = oForm.getString(oForm.FindColumn("WOHNUNG_NR"))
oConnection = oForm.activeConnection()
oSQL_Statement = oConnection.createStatement()
stSql = "UPDATE ""Filter"" SET ""WOHNUNG_NR"" = '"+stID+"' WHERE ""ID"" = TRUE"
oSQL_Statement.executeUpdate(stSql)
ThisDatabaseDocument.FormDocuments.getByName(stZiel).open
END IF

REM das rufende Formular schließen!
DIM arStart()
arStart = split(ThisComponent.Title, ThisComponent.UntitledPrefix)
stStart = arStart(1)
ThisDatabaseDocument.FormDocuments.getByName(stStart).close

END SUB


Wie gesagt, zu verdanken ist die Lösung RobertG

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten