BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> 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] Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

[gelöst] Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Mo 5. Nov 2018, 21:48

Hallo,

ich suche eine Möglichkeit, möglichst ohne Makro, in einem Formular den angezeigten Inhalt eines Listenfeldes "Teilnehmer" in Abhängigkeit eines vorher auszuwählenden Listeneintrags des Feldes "Berater" zur Auswahl einzuschränken und das, ohne das Formular nach der Auswahl des Beraters zwischen zu speichern. Das Listenfeld "Teilnehmer" greift auf die Tabelle "Teilnehmer" zu, in der auch die ID der Berater bei jedem Teilnehmer-DS gespeichert ist. Das alles funktioniert soweit ganz gut, aber da zum Zeitpunkt der Dateneingabe in das Formular der Wert der Berater-ID noch nicht gespeichert/hinterlegt ist, steht die Selektion im Feld "Teilnehmer" über die vorher ausgewählte Berater-ID nicht zur Verfügung. Man muss also derzeit, nach Auswahl des Beraters das Formular speichern und dann kann man auch einen der Teilnehmer des Beraters auswählen.
Ich weiß, dass dieses Problem in der Vergangenheit schon mehrfach genannt/beschrieben/gelöst wurde, aber ich finde weder die Stelle im Handbuch, noch helfen mir diverse Suchmaschinenergebnisse hier weiter. Wer also weiß, wo die Lösung steht, den bitte ich um einen Link, ansonsten auch gern noch mal ausführlich hier.
Wenn es ohne Makro nicht geht, dann bitte keine Lösung, in der der angefangene Datensatz nach der Eingabe des ersten Listenfeldes "Berater" zwischengespeichert wird. Es muss die Option offen bleiben, den angefangenen Datensatz auch wieder zu verwerfen. Es müsste also ein "Speicher-Update" erfolgen, ohne auf den Datenträger zu schreiben.

Vielen Dank.
Peter
Zuletzt geändert von pschulze59 am Fr 23. Nov 2018, 22:22, insgesamt 1-mal geändert.

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

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von RobertG » Di 6. Nov 2018, 07:42

Hallo Peter,

wo soll ein Listenfeld ohne Zwischenspeicherung und ohne Makro die Information her bekommen, dass sich ein Wert an anderer Stelle geändert hat? Geht nicht ohne Makro.

Ein entsprechendes Makro dazu gibt es im Handbuch. Vermutlich suchst Du so etwas wie hierarchische Listenfelder. Das Makro im Handbuch ist darauf ausgelegt, dass gleich mehrere Listenfelder in einer Hierarchie zusammenstehen. So etwas kann natürlich auf lediglich eine Stufe heruntergesetzt und entsprechend kürzer gestaltet werden.

Gruß

Robert
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

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Di 6. Nov 2018, 13:04

Danke,

ich lese heute Abend noch mal im Handbuch nach - gestern hab ich da nichts gefunden. Aber mir war in Erinnerung, dass es da was gab.
wo soll ein Listenfeld ohne Zwischenspeicherung und ohne Makro die Information her bekommen, dass sich ein Wert an anderer Stelle geändert hat? Geht nicht ohne Makro.
Ja das ist ein Problem, was mal die Entwickler angehen könnten. Da der ausgewählte Listen-Wert nur im Speicher und noch nicht in der eigentlichen Tabelle steht, müsste eine Variable im Speicher an das nächste Listenfeld zur Auswertung übergeben werden. Es müsste also eine Eigenschaft eines Listenfeldes geben "Weitergabe an Feld ..."

Wie auch immer - ich werd's mal mit 'nem Makro probieren.

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

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von RobertG » Di 6. Nov 2018, 16:55

Hallo Peter,

dass da "Entwickler" etwas "angehen" halte ich für einen Traum. Ich wäre froh, wenn wenigstens die Bugs mal langsam wieder abnehmen ...

Falls das mit dem doch recht umfangreichen Makro so nicht klappt, dann kann ich noch einmal nach einer einfachen Version schauen.

Gruß

Robert
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

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Di 6. Nov 2018, 22:09

Hallo Robert,

ich habe die Beschreibung im Handbuch gefunden. Auf den Seiten 481 bis 484 beschreibst Du einen entsprechenden Fall und erläuterst step by step das Makro. Die Methode finde ich gut.
Um es vorweg zu nehmen: Noch läuft es bei mir nicht!
Ich habe das Makro umgesetzt und beim Durchsehen und Testen mehrere Fehler bemerkt bzw. angezeigt bekommen.
1.
Du schreibst das in das erste der hierarchischen Listenfelder Zusatzinformationen zu speichern sind:
Hier der beispielhafte Inhalt der Zusatzinformationen:
MainForm,Jahrgang,verstecktes Kontrollfeld,Listenfeld 2

Allerdings wird er erste Parameter "MainForm" in Deinem Makro nirgends ausgewertet. Vielmehr beinhaltet Dein Makro Kommentarzeilen, die (ausgehend vom Parameter 0) nur die darauffolgenden Parameter beinhalten:
oForm = oFeld.Parent
REM Tag wird unter den Zusatzinformationen eingegeben
REM Hier steht:
REM 0. Feldname des zu filterndes Feldes in der Tabelle,
REM 1. Feldname des versteckten Konrollfeldes, das den Filterwert speichern soll,
REM 2. eventuell weiteres Listfeld
REM Der Tag wird von dem auslösenden Element ausgelesen. Die Variable wird an die
Prozedur weitergegeben, die gegebenenfalls alle weiteren Listenfelder
einstellt.
Ich habe daraufhin "MainForm" als Parameter aus den Zusatzinfos entfernt.

2. Der Makrointerpreter meckert immer folgende Zeilen an

Code: Alles auswählen

IF oFeldHidden.HiddenValue <> "" AND InStr(oFeldHidden.HiddenValue, """"+Trim(aFilter(0))+"""='") = 0 THEN
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: HiddenValue.
Die Ursache scheint zu sein, dass oForm nicht gebildet wird und das erfolgt an der Stelle etwas weiter oben

Code: Alles auswählen

oForm = oFeld.Parent
Das Array wird aber gebildet und daher funktioniert

Code: Alles auswählen

oFeld = oEvent.Source.Model 
und

Code: Alles auswählen

stTag = oFeld.Tag
Weiter bin ich noch nicht. 2. Hemmt mich derzeit, weiter zu machen. Hast Du eine Idee?

Peter

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

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von RobertG » Mi 7. Nov 2018, 20:01

Hallo Peter,

gut, dass Du Dir das anschaust. "MainForm" gehört in die Version des Makros nicht mehr rein. Das muss ich sofort entfernen. Schließlich wird das Formular direkt über das Ereignis bestimmt. Dann kommt das Makro auch zum Zuge mit dem versteckten Kontrollfeld.

Wenn "HiddenValue" nicht bekannt ist: Hast Du wirklich das versteckte Steuerelement eingefügt?

Gruß

Robert
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

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Do 8. Nov 2018, 17:34

Ja habe ich, aber muss es einem bestimmten Datentyp entsprechen?

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

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von RobertG » Fr 9. Nov 2018, 11:27

Hallo Peter,

wieso soll ein verstecktes Steuerelement einem Datentyp entsprechen? Die Fehlermeldung, die Du bekommst, bezieht sich doch darauf, dass die Eigenschaft HiddenValue gar nicht vorhanden ist. Die gibt es eben nur beim versteckten Steuerelement. Die Werte, die letztlich da gespeichert werden, sind egal.
Mach einmal einen Screenshot von Deinem geöffneten Formularnavigator.

Gruß

Robert
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

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Fr 9. Nov 2018, 15:26

Hallo Robert,

das Stichwort "Navigator" öffnete mir die Augen - es war kein Verstecktes Kontrollfeld - Sorry für die Irritation. Ich habe es jetzt als ein solches auch wirklich drin und nun kommt der Fehler nicht mehr.
Das Makro hängt jetzt zwar an einer nächsten Stelle, aber da muss ich erst mal mich wieder eindenken und weitere Anpassungen an mein Formular machen.
Wenn ich nicht mehr weiter komme, melde ich mich. Du merkst schon, dass mir so einige Grundlagen fehlen, aber mich hat der Ehrgeiz gepackt.

Danke!
Peter

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: Formular: Werte eines Listenfeldes abhängig von anderer Listenfeld-Auswahl einschränken?

Beitrag von pschulze59 » Fr 23. Nov 2018, 22:22

Hallo,
ich wollte diesen thread abschließen.

Also Roberts Makro aus dem Handbuch habe ich nicht zum Laufen gebracht. Es hing an verschiedenen Stellen und es erschien mir ohnehin zu aufwändig, weil ich doch nur ein einziges abhängiges Listenfeld benötigte.

Daher griff ich die Idee von R. (von F3K Total) auf, die er mir mit der, von ihm eigens für mich erstellten, Beispieldatenbank de facto mitlieferte.

In jedem Fall braucht man ja irgendwie eine Zwischenspeicherung des Wertes aus dem ausgewählten Listenfeld1, um damit eine Einschränkung in Listenfeld2 zu machen.
Robert geht den Weg des SQL-Statements, welches er für das Listenfeld2 generiert und dort einsetzt. Und R. (von F3K Total) zeigte mir ein Lösung, ohne SQL-Statement in eine Behelfstabelle per verstecktem SubForm und Filter per GUI-Form-Befehle auch in die Hilfstabelle schreiben zu können.
Auch wenn ich anfangs diesen Weg nicht gehen wollte, weil Hilfstabelle und so, hab ich ihn nun doch eingeschlagen. Und ich muss sagen - es funktioniert gut.

Die Hilfstabelle "idueb" nimmt im Feld "uebid" den Übergabewert in dem einzigen Datensatz auf. Im Form "Kont" (um das hier geht) wird ein Subform "F_idueb" angelegt, welches mit der Hilfstabelle verbunden ist. Felder von der Hilfstabelle werden nicht dargestellt - wir brauchen das Form lediglich als Container für das subform und die damit verbundene Connection zur Hilfstabelle. Das Makro ermittelt die Übergabewert und schreibt in in das SubForm und so also in die damit verbundene Hilfstabelle. Von dort ist der Wert per Felddefinition für das Listenfeld2 (dessen angezeigten Werte darüber ja eingeschränkt werden sollen) wieder verwertbar. Ein refresh aktualisiert die angezeigten Listeneinträge. Das Makro habe ich an das Mouse-Over-Event gebunden, wenn die Maus über das Listenfeld1 fährt. Somit wird es auch ausgeführt, wenn man mit der Maus über einen vorhandenen Eintrag in Listenfeld1 fährt, um die Auswahl in Listenfeld2 zu aktualisieren, ohne das Listenfeld1 explizit anklicken zu müssen.
Hier das Listing:

Code: Alles auswählen

    
Sub uebid
	DIM oDoc, oDrawpage, oForm, oForms, oFeld as Object
	DIM iuid as integer
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	oForms = ThisComponent.drawpage.forms
	oForm = oDrawpage.forms.getByName("MainForm")	
	oFeld = oForm.getbyname("fmtTN")
	iuid = oForm.getint(10)
	'msgbox(iuid)
	oForm_idueb = oForms.F_idueb
    	oForm_idueb.Columns.uebid.updateint(iuid)
    	oForm_idueb.updateRow
    	oForm_idueb.reload()
    	oFeld.refresh()
end sub
Vielen Dank an Alle!
Peter

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