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

Hierachische Abfrage

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
chemnitzer
Beiträge: 43
Registriert: Di 20. Jan 2015, 18:56
Wohnort: Hungen

Hierachische Abfrage

Beitrag von chemnitzer » Di 9. Nov 2021, 19:29

Hallo
ich habe als Grundlage die Base-Datei "Beispiel_Suchen_und_Filtern.odb" verwendet um diese Art der Lösung für meine Bilder-DB zuverwenden. Meine Datenbank läuft unter MariaDB (MySql) und ist eigentlich nur eine Tabelle mit den nötigen Spalten, wie z.B.: Jahr, Anlass , Ort, Land , komplPfad.
Die hierachische Abfrage beginnt bei Jahr (Listenfeld 1), danach Anlässe(Listenfeld 2 für das Jahr , Orte (Listenfeld 3)für Jahr und Anlass.
Die Auswahlliste für die Anlässe z.B. für das Jahr = 2016 liefert die Werte Reise und Urlaub. Beide Werte werden auch im "Listenfeld 2" zu Auswahl angezeigt, wobei der 2. Werte "Urlaub" beim Anklicken nicht zum aktuellen Wert wird. Wird "Reise" (1. Listenwert) angeklickt wird diese erst nach Verlassen bzw. nach neuer Auswahl auf "Urlaub" angezeigt. Wo könnte die Ursache sein ? Die Übernahme als aktueller Wert erfolgt doch automatisch ?
MfG
Roland

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

Re: Hierachische Abfrage

Beitrag von RobertG » Di 9. Nov 2021, 20:38

Hallo Roland,

welche Version der Datenbank hast Du denn genommen? Und mit dem Inhalt aus welchem Formular hast Du dort Probleme?

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

chemnitzer
Beiträge: 43
Registriert: Di 20. Jan 2015, 18:56
Wohnort: Hungen

Re: Hierachische Abfrage

Beitrag von chemnitzer » Di 9. Nov 2021, 22:38

Hallo
ich habe die Datenbank über xampp installiert und mysql.exe hat die version 10.4.17.0 64-Bit.
LO hat die Version 7.1.6.2 64-Bit.
Datei: Beispiel_Suchen_und_Filtern.odb war die Grundlage einschl. des Makro:
SUB Hierarchisches_Kontrollfeld(oEvent AS OBJECT)
Dies habe ich angepasst. Hier der Quelltext :

Code: Alles auswählen

SUB Hierarchisches_Kontrollfeld(oEvent AS OBJECT)
	REM Die Kontrollfelder funktionieren hierarchisch, wenn sich die Kontrollfelder auf die gleiche Datengrundlage beziehen.
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeldHidden AS OBJECT
	DIM oFeld AS OBJECT	
	DIM oFeld1 AS OBJECT
	DIM oFeld2 AS OBJECT	
	DIM stSql AS STRING
	DIM aInhalt()
	DIM stTag AS String
	
	[b]Dim atmpCmd() As string [/b]  ' hier kommt der gesplittete command rein es wird nur der erste Teil in den stSql eingesetzt
	
	oFeld = oEvent.Source.Model
	stTag = oFeld.Tag
	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.
'	msgbox ASC("""")
	aFilter() = Split(stTag, ",")
	stFilter = ""
	IF Trim(aFilter(1)) = "" THEN
		IF oFeld.getCurrentValue <>"" THEN
			stFilter = chr(34) & Trim(aFilter(0)) & chr(34) & "='" & oFeld.getCurrentValue() & "'"
			REM Der Filter wird in das Formular eingetragen. Er kann dort anschließend aus- und auch wieder eingeschaltet werden (Filterbuttons)
			REM Existiert ein Filter von einem vorhergehenden Feld, so wird der Filter angehängt.
			IF oForm.Filter <> "" AND InStr(oForm.Filter, """"+Trim(aFilter(0))+"""='") = 0 THEN
				stFilter = oForm.Filter + " AND " + stFilter
				REM Existiert bereits ein Filter von einem vorhergehenden Filterversuch des gleichen Feldes, so wird der Filter nicht angehängt sondern ab dem Filterversuch neu geschrieben.	
			ELSEIF oForm.Filter <> "" THEN
				stFilter = Left(oForm.Filter, InStr(oForm.Filter, """"+Trim(aFilter(0))+"""='")-1) + stFilter
			END IF
		END If
'		msgbox ("160:" & stFilter)
		oForm.Filter = stFilter
		oForm.reload()
	Else
		oFeldHidden = oForm.getByName(Trim(aFilter(1)))
		REM Der Feldname des zu filterndes Feldes in der Tabelle wird mit dem aus dem Listenfeld ausgelesene Filterwert kombiniert
		IF oFeld.getCurrentValue <>"" THEN
			stFilter = chr(34) & Trim(aFilter(0)) & Chr(34) & "='" & oFeld.getCurrentValue() & "'"
			REM Existiert ein Filter von einem vorhergehenden Feld, so wird der Filter angehängt.
			IF oFeldHidden.HiddenValue <> "" AND InStr(oFeldHidden.HiddenValue, """"+Trim(aFilter(0))+"""='") = 0 THEN
				stFilter = oFeldHidden.HiddenValue + " AND " + stFilter
				REM Existiert bereits ein Filter von einem vorhergehenden Filterversuch des gleichen Feldes, so wird der Filter nicht angehängt sondern ab dem Filterversuch neu geschrieben.	
			ELSEIF oFeldHidden.HiddenValue <> "" THEN
				stFilter = Left(oFeldHidden.HiddenValue, InStr(oFeldHidden.HiddenValue, """"+Trim(aFilter(0))+"""='")-1) + stFilter
			END IF
		END If
'		msgbox ("176:" & stFilter)
		oFeldHidden.HiddenValue = stFilter
	END If
	REM Wenn in dem Tag 2 Einträge sind, so muss ein weiteres Listenfeld neu mit gefilterten Inhalten versehen werden.
	IF UBound(aFilter()) > 1 THEN		
		oFeld1 = oForm.getByName(Trim(aFilter(2)))
		aFilter1() = Split(oFeld1.Tag,",")
		IF oFeld.getCurrentValue <>"" THEN
			REM Die nachfolgende Listbox wird mit dem gleichen Filter gefiltert, mit der auch das gesamte Formular bereits gefiltert wurde.
			REM Der SQL-Befehl kann nicht direkt an die Listbox übergeben werden. Hier werden die Felder ausgelesen und die Listbox damit gefüllt.
			
			atmpCmd = Split(oForm.Command, ".")
'			stSql = "SELECT DISTINCT """+Trim(aFilter1(0))+""" FROM """+oForm.Command+""" WHERE "+stFilter+" ORDER BY """+Trim(aFilter1(0))+""""
			[b]stSql = "SELECT DISTINCT """+Trim(aFilter1(0)) & """ FROM """ & atmpCmd(1) & """ WHERE "+stFilter & " ORDER BY """ & Trim(aFilter1(0))+""""[/b]
'			msgbox ("187:" & stSql)

			oDatenquelle = ThisComponent.Parent.CurrentController
			If NOT (oDatenquelle.isConnected()) THEN
				oDatenquelle.connect()
			END IF
			oVerbindung = oDatenquelle.ActiveConnection()
			oSQL_Anweisung = oVerbindung.createStatement()
			oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
			inZaehler = 0	'Zähler für das Array, in das die Werte der Nebentabelle geschrieben werden
			WHILE oAbfrageergebnis.next
				ReDim Preserve aInhalt(inZaehler)	'Dimensionierung des Arrays mit Sicherung (Preserve) des vorherigen Inhaltes
				aInhalt(inZaehler) = oAbfrageergebnis.getString(1)	'Auslesen des ersten Feldes
				inZaehler = inZaehler+1	'Erweiterung des Zählers zur Neudimensionierung
			Wend
		ELSE
			aInhalt(0) = ""
		END If

		oFeld1.StringItemList = aInhalt()	'Der Inhalt wird in die Listbox geschrieben
'		XRAY(oFeld1)
		oFeld1.refresh()	'Die Listbox wird neu eingelesen
		REM Alle folgenden Listboxen werden geleert
		WHILE UBound(aFilter1()) > 1
			DIM aLeer()
			oFeld2 = oForm.getByName(Trim(aFilter1(2)))
			DIM aFilter1()
			aFilter1() = Split(oFeld2.Tag,",")
			oFeld2.StringItemList = aLeer()	'Die Listbox wird geleert
			oFeld2.refresh()	'Die Listbox wird neu eingelesen
		WEND
	END IF
END Sub
Alle Objekte liegen im Formular
Listenfeld 1 : Daten -> SQL : SELECT DISTINCT "jahr" FROM "dbbilder"."bilder1" "bilder1"
Zusatzinfo : Jahr,,Listenfeld 2
Listenfeld 2: Zusatzinfo: Anlass,,Listenfeld 3
Listenfeld 3: Zusatzinfo: Ort,,Listenfeld 4
Listenfeld 4: Zusatzinfo: Land,

Tabelle: Daten : dbbilder.bilder1
Ich hoffe die Infos können Dir helfen.
MfG
Roland

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

Re: Hierachische Abfrage

Beitrag von RobertG » Mi 10. Nov 2021, 15:53

Hallo Roland,

zuerst einmal nur kurz die Nachricht: Ich habe die Datenbank im Original hier überprüft. Achtung! In LO 7.2.2.2 ist ein Bug drin, so dass die Listenfelder nicht automatisch aktualisieren! Du hast aber die Version LO 7.1.6.2, so dass ich da noch weiter schauen muss.

Stimmt denn die Groß- und Kleinschreibung? Im Code für das erste Listenfehl steht "jahr", in dem, was in den Zusatzinformationen steht, "Jahr".

Sind denn auch die folgenden Listenfelder jeweils mit dem Makro verknüpft?

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

chemnitzer
Beiträge: 43
Registriert: Di 20. Jan 2015, 18:56
Wohnort: Hungen

Re: Hierachische Abfrage

Beitrag von chemnitzer » Do 11. Nov 2021, 00:05

Hallo Robert,
ich habe jetzt nur noch die Kleinschreibung wo Feldname der Tabelle auftreten drinn. Die Namen der Listenfelder habe ich nochmals in den Zusatzbereich über kopieren eingetragen, alle sind mit dem Makro beim Event "Modifizieren" verbunden.
Datenbank und LO laufen auf dem gleichen PC.
Es tritt z.B. folgendes auf : Jahr = 2016 ausgewählt -> Liste für Anlass akrualisiert (Autokauf,Besuch,Blumen,Kochen) werden beim Aufklappen von Listenfeld 2 angezeigt, das ist OK.
Wird z.B. Eintrag "Besuch" angeklickt bleibt der akt. Wert leer (in der Anzeige) und mein zusätzlicher Labeltext bleibt auf Anzeige "Listenfeld 1" stehen.
Klicke ich dann z.B. den 2. Listenfeld "Blumen" an wird der vorher ausgewhlte "Besuch" zum aktuellen und auch mein Labeltext zeigt dann "Listenfeld 2" an.
Ich hab das Gefühl entweder Zeitproblem oder ein Event wurde nicht fertig abgearbeitet.

Gruß Roland

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

Re: Hierachische Abfrage

Beitrag von RobertG » Do 11. Nov 2021, 09:57

Hallo Roland,

wo liegt denn Deine MariaDB? Auf Deinem eigenen Rechner? Dann würde ich das hier einmal versuchen nachzustellen.

Für Deine Zwecke kann das Makro ja auch etwas entrümpelt werden. Da ist noch etwas von einem versteckten Kontrollfeld drin, das Du ja gar nicht benötigst.

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

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