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