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

Kann Macro aus Beispieldatenbank nicht starten

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
frodoo
Beiträge: 12
Registriert: Fr 31. Jul 2020, 11:57

Kann Macro aus Beispieldatenbank nicht starten

Beitrag von frodoo » Fr 25. Sep 2020, 03:30

an Forum.zip
(1.14 MiB) 100-mal heruntergeladen
Hallo liebe ExpertInnen,

jetzt habe ich es nach einigen Stunden geschafft, Daten aus meiner selbstgebastelten Anfänger-Datenbank Terminalbefehle.odb in die schöne Beispiel_Suchen_und_Filtern.odb-Datenbank zu importieren, da ich superscharf auf das Formular "Suchabfrage" darin bin, um endlich vernünftig suchen zu können.
Die Daten sind jetzt importiert, aber die Suchfunktion, auf die ich es abgesehen habe, klappt nicht. Ich nehme an, daß im Macro Standard Module 1 ...

Code: Alles auswählen

REM  *****  BASIC  *****

REM Zugriffsvariablen für Datenbank
DIM oDatenquelle AS OBJECT
DIM oVerbindung AS OBJECT
DIM oSQL_Anweisung AS OBJECT
DIM stSql AS STRING
DIM oAbfrageergebnis AS OBJECT

REM Zugriffsvariablen für Formulare
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oForm2 AS OBJECT
DIM oFeld AS OBJECT


DIM stInhalt AS STRING
DIM inID AS INTEGER
DIM arInhalt() AS STRING
DIM inI AS INTEGER
DIM inK AS INTEGER

SUB Suche(stTabelle AS STRING)
	REM Abspeicherung des Wertes aus den Nebenformularen
	REM Die Tabelle "Suchtmp" besteht aus einem Primärschlüssel (Autowert) und einer Spalte "Nr.", 
	REM in der die gefundenen Primärschlüssel der zu durchsuchenden Tabelle (Variable stTabelle) eingetragen werden.
	REM Formular ansteuern, Textfeld auslesen
	oDoc=thisComponent
	oDrawpage=oDoc.drawpage
	oForm=oDrawpage.forms.getByName("Suchform")
	oFeld=oForm.getByName("Suchtext")
	stInhalt=oFeld.getCurrentValue()
	stInhalt=LCase(stInhalt)	
	REM Datenbankverbindung erzeugen
	oDatenquelle = ThisComponent.Parent.DataSource
	oVerbindung = oDatenquelle.GetConnection("","")
	oSQL_Anweisung = oVerbindung.createStatement()
	IF stInhalt <> "" THEN	
		REM Alle Spaltenbezeichnungen auslesen
		stSql = "SELECT ""COLUMN_NAME"" FROM ""INFORMATION_SCHEMA"".""SYSTEM_COLUMNS"" WHERE ""TABLE_NAME"" = '" + stTabelle + "' ORDER BY ""ORDINAL_POSITION"""
		oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
		inI=0	'Zaehler fuer das Array, in das die Werte der Nebentabelle geschrieben werden
		IF NOT ISNULL(oAbfrageergebnis) THEN
		  	WHILE oAbfrageergebnis.next
				ReDim Preserve arInhalt(inI)	'Dimensionierung des Arrays mit Sicherung (Preserve) des vorherigen Inhaltes
				arInhalt(inI)=oAbfrageergebnis.getString(1)	'Auslesen des ersten Feldes
			 	inI=inI+1	'Erweiterung des Zaehlers zur Neudimensionierung
		  	WEND
		END IF
		stSql = "DROP TABLE ""Suchtmp"" IF EXISTS"
		oSQL_Anweisung.executeUpdate (stSql)
		stSql = "SELECT """+arInhalt(0)+"""INTO ""Suchtmp"" FROM """+stTabelle+""" WHERE "
		FOR inK = 0 TO (inI-1)
			stSql = stSql+"LCase("""+arInhalt(inK)+""") LIKE '%"+stInhalt+"%'" 'Alle Schreibweisen werden untersucht, da grundsätzlich in Kleinbuchstaben umgewandelt wird.
			IF inK < (inI-1) THEN
				stSql = stSql+" OR "
			END IF
		NEXT
		oSQL_Anweisung.executeUpdate(stSql)
	ELSE
		stSql = "DELETE FROM ""Suchtmp"""
		oSQL_Anweisung.executeUpdate (stSql)
	END IF
	REM Das Anzeigeformular muss neu geladen werden. Es hat als Datenquelle eine Abfrage, in diesem Beispiel "Suchabfrage"
	oForm2=oDrawpage.forms.getByName("Anzeige")
	oForm2.reload()
End Sub

SUB Suchstart
	REM Name der Tabelle, die durchsucht werden soll, ist in deiesem Beispiel "Suchtabelle".
	REM Gegebenenfalls ist bei verknüpften Tabellen hieraus mittels "LEFT JOIN" eine Ansicht(View) zu erstellen.
	Suche("Suchtabelle")
END SUB

SUB Filter
	REM Dieses Makro ersetzt den Abspeicherungsbutton in dem einen und den Aktualisierungsbutton in dem anderen Formular
	REM Genutzt in Formular "Filterung_mit_Makros_1"
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm1 AS OBJECT
	DIM oForm2 AS OBJECT
	DIM oFeldList1 AS OBJECT
	DIM oFeldList2 AS OBJECT
	oDoc=thisComponent
	oDrawpage=oDoc.drawpage
	oForm1=oDrawpage.forms.getByName("Filter")
	oForm2=oDrawpage.forms.getByName("Anzeige")
	oFeldList1=oForm1.getByName("Liste_1")
	oFeldList2=oForm1.getByName("Liste_2")
	oFeldList1.commit()
	oFeldList2.commit()
	oForm1.updateRow()
	oFeldList1.refresh()
	oFeldList2.refresh()
	oForm2.reload()
END SUB

SUB Filter_Zusatzinfo(oEvent AS OBJECT)
	REM Die Variablen für das Array werden in den Eigenschaften der Listbox unter Zusatzinformationen abgelegt
	REM Die erste Variable enthält dort immer den Namen der Listbox selbst, die weiteren Variablen die Namen aller anderen Listboxen
	REM Dieses Makro ersetzt den Abspeicherungsbutton in dem einen und den Aktualisierungsbutton in dem anderen Formular
	REM Genutzt in Formular "Filterung_mit_Makros_2"
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm1 AS OBJECT
	DIM oForm2 AS OBJECT
	DIM sTag AS String
	sTag = oEvent.Source.Model.Tag
	aList() = Split(sTag, ",")	'Array wird gegründet und mit Listfeldnamen gefüllt'
	oDoc=thisComponent
	oDrawpage=oDoc.drawpage
	oForm1=oDrawpage.forms.getByName("Filter")
	oForm2=oDrawpage.forms.getByName("Anzeige")
	FOR i = LBound(aList()) TO UBound(aList())
		IF i = 0 THEN
			oForm1.getByName(aList(i)).commit()
			oForm1.updateRow()
		ELSE
			oForm1.getByName(aList(i)).refresh()
		END IF
	NEXT
	oForm2.reload()
END SUB

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
	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.
	aFilter() = Split(stTag, ",")
	stFilter = ""
	IF Trim(aFilter(1)) = "" THEN
		IF oFeld.getCurrentValue <>"" THEN
			stFilter = """"+Trim(aFilter(0))+"""='"+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
		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 = """"+Trim(aFilter(0))+"""='"+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
		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.
			stSql = "SELECT DISTINCT """+Trim(aFilter1(0))+""" FROM """+oForm.Command+""" WHERE "+stFilter+" ORDER BY """+Trim(aFilter1(0))+""""
			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
		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

SUB Filter_direct(oEvent AS OBJECT)
	REM Dieses Makro setzt direkt den Wert des Filters im Hauptformular
	REM Dadurch kann der Filter in der Navigationsleiste ein- und ausgeschaltet werden.
	DIM oForm AS OBJECT
	DIM oField AS OBJECT
	oField = oEvent.Source.Model
	oForm = oField.Parent
	stListValue = oField.getCurrentValue()
	IF stListValue = "" THEN
		oForm.Filter = ""
	ELSE
		oForm.Filter = "Autor = '" + stListValue + "'"
	END IF
	oForm.reload()
END SUB
...irgendwas umgestellt werden muß.

anbei die zwei oben erwähnten Originale und meine Bastelei daraus, die heißt Suchen_und_Filtern (Kopie).odb

Komme nicht weiter und freue mich über Hilfe.

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

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von RobertG » Fr 25. Sep 2020, 17:05

Hallo frodoo,

zuerst einmal musst Du im Makro diese Änderung machen:

Code: Alles auswählen

Suche("Tabelle1_Terminalbefehle")
Das ist die Tabelle, die Du durchsuchen willst.

Dann darf der Inhalt des Formulars "Anzeige" keine Tabelle sein. Schließlich soll diese Anzeige auf die Filterung reagieren. Da muss eine Abfrage sein, die die Datenanzeige beeinflussen kann. Die steht in "Suchabfrage". Die Abfrage muss bei Dir angepasst werden:

Code: Alles auswählen

SELECT * FROM "Tabelle1_Terminalbefehle" WHERE 
( "ID" IN ( SELECT "ID" FROM "Suchtmp" ) 
OR "ID" = CASE WHEN ( SELECT COUNT( "ID" ) FROM "Suchtmp" ) > 0 THEN '-1' ELSE "ID" END )
Dann funktioniert das Ganze auch.

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

frodoo
Beiträge: 12
Registriert: Fr 31. Jul 2020, 11:57

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von frodoo » Fr 25. Sep 2020, 21:48

herzlichen Dank!

Die Änderungen habe ich gemacht, aber irgendwo muß ein kleines Würmchen noch drin sein...
Dateianhänge
Suchen_und_Filtern (Kopie).odb.zip
(82.97 KiB) 124-mal heruntergeladen

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

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von RobertG » Sa 26. Sep 2020, 08:43

Hallo frodoo,

Du musst jetzt noch beim Formular die Datenquelle ändern.

Gehe in das entsprechende Formular zum Bearbeiten und klicke auf das Tabellenkontrollfeld. Rechte Maustaste → Formulareigenschaften → Daten. Setze dort "Art des Inhaltes → Abfrage" und "Inhalt → Suchabfrage".

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

frodoo
Beiträge: 12
Registriert: Fr 31. Jul 2020, 11:57

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von frodoo » Sa 26. Sep 2020, 20:54

Ach wie schön - ich freu mich, es klappt!
:P :P :P
Jetzt ist gleich noch eine Frage aufgetaucht:
Nachdem ich ein der Tabelle1_Terminalbefehle ein neues Memo-Feld "Ordner" angelegt habe, taucht es aber im Formular Suchabfrage nicht auf.
Was tun?

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

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von RobertG » So 27. Sep 2020, 09:21

Hast Du das Feld denn auch in dem Tabellenkontrollfeld eingebunden? Das Tabellenkontrollfeld weist ja in dem Formular auch Felder auf, die gar nicht mit einem Datenbankfeld verknüpft sind. Hier müsstest Du das erste der Felder nehmen, mit der rechten Maustaste im Kontextmenü über "Spalte > Daten" das entsprechende Feld in der Datenquelle suchen und damit verknüpfen.
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

frodoo
Beiträge: 12
Registriert: Fr 31. Jul 2020, 11:57

Re: Kann Macro aus Beispieldatenbank nicht starten

Beitrag von frodoo » Di 29. Sep 2020, 01:24

Herzlichen Dank für die freundliche Hilfe!

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