Seite 1 von 1
gelöst - Makro für Filteroperation in Base
Verfasst: So, 05.10.2008 13:47
von geimist
Hallo,
für meine Datenbank würde ich ein Makro benötigen - mir fehlen jedoch die Fähigkeiten, dieses selbst zu schreiben

. Aus diesem Grund wäre ich ober glücklich, wenn mir jemand bei der Umsetzung behilflich sein könnte.
DIE KONSTELLATION:
Es geht um ein BASE-Formular (Container), welches 2 Hauptformulare aufnimmt (sind also nicht von einander abhängig). Das 1. Formular ist ein Tabellen-Kontrollfeld und nimmt die Bestellnummern und weiteres für die Bestellungen auf.
Das 2. Formular ist ebenfalls ein Tabellen-Kontrollfeld und zeigt mir die Bestellnummern (Artikel) an und soll so einen Überblick über das Angebot verschaffen. Es handelt sich um ca. 180 Artikel von teilweise unterschiedlichen Herstellern, so dass ungefähr 1000 Bestellnummern vorhanden sind.
DAS PROBLEM:
Es geht hier eigentlich nur um das 2. Tabellen-Kontrollfeld (oder 2.Formular). Es soll ja eigentlich einen Überblick über das Angebot verschaffen, ist aber so mit den 1000 Artikeln nicht möglich.
MEINE VORSTELLUNG: Ich möchte über diesen Tabellen-Kontrollfeld eine Textfeld anbringen. In dieses schreibe ich den Namen des Artikels. Das gewünschte Makro soll, durch einen Button ausgelöst, den Inhalt dieses Textfeldes auslesen und das Tabellen-Kontrollfeld danach filtern, so dass nur noch dieser Artikel von den unterschiedlichen Herstellern angezeigt wird (so werden nur noch ca. 10 Datensätze angezeigt - die Übersicht ist wieder gewährt). Die Funktionsweise entspricht ziemlich genau dem, was man mit den Filter-Schaltflächen in der Navigationsleite erreichen kann, nur dass man das Filterkriterium oder "Wert" gleich aus dem Textfeld ausliest, bzw. im Makro voreinstellt (Feldname: Artikelname / Bedingung: = ).
Wenn mir jemand behilflich sein könnte, wäre ich wirklich sehr dankbar.
Re: Suche Makro für Filteroperation in Base
Verfasst: Mo, 06.10.2008 20:01
von sarotti
Hallo geimist,
naja, vermutlich wird Dir hier im Formum kein Makro schreiben, dass Maßgeschneidert für Dich ist. Aber im Prinzip kannst Du das auch selber. Schau mal hier:
viewtopic.php?f=8&t=16573&hilit=filter . Ist im Prinzip das selbe. Du mußt ein Feld aus Deinem Formular auslesen und dieses dann in diesem Formular als Filter setzen.
...wenn Du nicht klar kommst, melde Dich noch einmal

....
Gruß
sarotti
Re: Suche Makro für Filteroperation in Base
Verfasst: Di, 07.10.2008 15:11
von hawe
Wieso Makro?
Reichen Dir die Funktionalitäten über die Formularnavigation nicht?
Da kannst Du doch Filter setzen, das wird mit einem speziellen Makro nicht viel Komfortabler zu machen sein...
Re: Suche Makro für Filteroperation in Base
Verfasst: Di, 07.10.2008 15:59
von geimist
Erst einmal vielen Dank für eure Antwort.
@ Sarotti: Der von dir zitierte Beitrag hat mich auch schon angelacht - sicherlich werde ich dadurch weiterkommen. Ich bin gerade dabei den Code für mich etwas zu modifizieren, aber für jemanden der von Basic praktisch keine Ahnung hat ist das natürlich nicht so einfach. Wenn ich ein Stückchen weiter gekommen bin, werde sicherlich noch auf das Angebot deiner Hilfe zurückkommen.
@ hawe: ist sicherlich richtig. Man benötigt nicht zwingend ein Makro. Aber die DB ist für jemanden gedacht, der völliger PC-Einsteiger ist. Daher möchte ich die DB so einfach wie nur möglich gestalten. Eine Funktion, die er regelmäßig benötigt, ausschließlich per Dialog erreichen zu können ist zeitraubend und wenig komfortabel. Einen Namen in ein Textfeld zu schreiben, bzw. aus einem Listenfeld zu wählen und dann auf eine Schaltfläche zu drücken wäre da doch optimal, oder?
Re: Suche Makro für Filteroperation in Base
Verfasst: Di, 07.10.2008 17:02
von geimist
Hier mein erster Versuch:
Code: Alles auswählen
sub Filter_setzen( oEvent as variant )
Dim oFeld as variant
Dim sID as variant
Dim oDoc as variant
Dim oForm as variant
Dim oDoc2 as variant
Dim oForm2 as variant
oDoc = StarDesktop.CurrentComponent
oForm = oDoc.DrawPage.Forms.GetByIndex(0)
REM die ID des ersten Formulars wird ausgelesen (ist z.B. wie hier ein Formularfeld)
oFeld = oForm.getByName("WertTextBox")
sID = oFeld.text
OpenForm( OEvent.Source.Model.Parent.ActiveConnection.Parent.DatabaseDocument.FormDocuments, _
OEvent.Source.Model.Parent.ActiveConnection, _
"Bestellungsformular")
REM => dann Filter setzen
oDoc2= ThisComponent
oForm2 = oDoc2.DrawPage.Forms(0)
oForm2.filter = "Bestellungsformular" + sID
REM =>setzen des Filters für das neue Formulardokument
oForm2.ApplyFilter=true
oForm2.reload
end sub
1. - Muss ich an den Variablen auch etwas ändern?
2. - Da ich ja mehrere Formulare in dem Dokument habe: Muss ich die direkt ansprechen? Es wird ja nicht genügen, mein Textfeld mit "WertTextBox" im Makro anzusprechen, wenn es im 'Nachbarformular' auch ein gleichnamiges Textfeld gibt (ist zwar nicht der Fall, aber muss doch sicherlich explizit angesprochen werden?)
Hier noch alle Namen für alles:
- die DB ist mit dem Namen "
BestellDB" registriert
- das Formulardokument (Writerdokument) hat den Namen "
Bestellungsformular"
- das in der Einführung beschriebene 2.Formular in diesem Dokument hat den Namen "
Artikelliste". Hier soll der zu filternde Wert aus der "
WertTextBox" ausgelesen und im Feld "
NumericField2" des "
TableControl1" ausgegeben werden. Und wie gesagt: All diese Felder befinden sich in dem Fomular "
Artikelliste"
Ich denke, dass all diese Namen wichtig und notwendig sind, weiß aber ich nicht wo und wie ich sie im Code unterbringen muss.
Hoffentlich strapaziere ich eure Nerven nicht gar zu sehr - aber ich bin für eure Hilfe unendlich dankbar.
Re: Suche Makro für Filteroperation in Base
Verfasst: Di, 07.10.2008 20:28
von hawe
Hm, also wenn eine Auswahl getroffen werden soll, dann würde ich ein Listenfeld damit beauftragen.
Sagen wir die Auswahl erfolgt über das Listenfeld 'lbxProdukt' und der Listeninhalt ist definiert als
SELECT "Bezeichnung", "ArtNr" FROM "Artikel"
d.h. ich wähle eine "Bezeichnung" aus und erhalte die Datensatznummer "ArtNr"
Daneben lege ich ein Textfeld ' txtProduktFilter' an. Dann kann ich dort ein Filter vorgeben (z.B *pilze*)
und mit
Code: Alles auswählen
Sub lostFocus_txtProduktfilter( oEvt as objekt )
oControl = oEvt.Source.Model
oMainForm = oControl.Parent
oProdukt = oMainForm.getByName("lbxProdukt")
oFilter = oMainForm.getByName("txtProduktFilter")
sql = "SELECT ""Bezeichnung"", ""ArtNr"" FROM ""Artikel"""
if oFilter.Text > "" then
oProdukt.ListSource=Array(sql & " WHERE ""Bezeichnung"" LIKE '" & oFilter.Text &"'")
else
oProdukt.ListSource=Array(sql)
End IF
oProdukt.refresh()
'msgbox oProdukt.DBG_Methods
End Sub
Über das Ereignis 'Bei Focus verlust' den Makro ausführen. Damit wird die Anzeige des Listenfeldes auf den Filter beschränkt...
Re: Suche Makro für Filteroperation in Base
Verfasst: Mi, 08.10.2008 18:30
von sarotti
Hallo geimist,
Grundsätzlich kein schlechter Anfang. Habe Deinen Code ein wenig modifiziert, da er meiner Meinung nach nicht funktioniert:
Code: Alles auswählen
….
oDoc2 = ThisComponent
oForm2 = oDoc2.DrawPage.Forms.GetByName("Artikelliste") 'oder getByIndex()
REM das Feld des Formulars wird ausgelesen (ist z.B. wie hier ein Formularfeld)
oFeld = oForm2.getByName("WertTextBox")
sSuchwort = oFeld.text
REM => dann Filter setzen
oForm2.filter = "`NumericField2` LIKE '"+sSuchwort+"'" REM als Textstring
REM oder: "`NumericField2` ="+sSuchwort REM wenn nach einem Wert gesucht wird. Ggf. noch mit
REM cInt( sSuchwort) von string in integer umwandeln
REM =>setzen des Filters für das neue Formulardokument
oForm2.ApplyFilter=true
oForm2.reload()
end sub
zusätzliche Info für die Formularfilter: der Filter funktioniert nach der SQL Abfragelogik...
„SELECT * FROM `DeineTabelle` WHERE „ (dies wird nicht direkt ALS Filter angezeigt). D.h. Du musst für den Filter nur den Such-Operator und Suchkriterium ergänzen.
Bei Strings z.B.
oder bei Zahlen z.B.
. Das "cInt" konvertiert Deinen ausgelesenen „Text“ in eine Zahl (kann sein, dass es ansonsten aufgrund der anderen Felddefinition zu einer Exception Fehlermeldung beim setzen des Filters kommt).
Durch das Zusammensetzen mit den Variablen musst Du noch die einfachen Hochkommas setzen. Dadurch kommt dann so etwas zustande:
Ich hoffe das hilft Dir weiter
Gruss
sarotti
Re: Suche Makro für Filteroperation in Base
Verfasst: Mi, 08.10.2008 19:18
von geimist
Vielen Dank.
Code habe ich jetzt in nachstehender Weise probiert:
Code: Alles auswählen
sub Filter_setzen ( oEvent as variant )
Dim oFeld as variant
Dim sID as variant
Dim oDoc as variant
Dim oForm as variant
Dim oDoc2 as variant
Dim oForm2 as variant
oDoc2 = ThisComponent
oForm2 = oDoc2.DrawPage.Forms.GetByName("Artikelliste") 'oder getByIndex()
REM das Feld des Formulars wird ausgelesen (ist z.B. wie hier ein Formularfeld)
oFeld = oForm2.getByName("WertTextBox")
sSuchwort = oFeld.text
REM => dann Filter setzen
oForm2.filter = "`NumericField2` = cInt(Suchstring)" REM als Textstring
REM oder: "`NumericField2` ="+sSuchwort REM wenn nach einem Wert gesucht wird. Ggf. noch mit
REM cInt( sSuchwort) von string in integer umwandeln
REM =>setzen des Filters für das neue Formulardokument
oForm2.ApplyFilter=true
oForm2.reload()
end sub
Allerdings kommt in der Zeile:
oDoc2 = ThisComponent Basic Syntaxfehler. ????
Außerdem habe ich den Code wie beschrieben zu
`Feldname` = cInt(Suchstring) ausgestauscht - es handelt sich lediglich um Zahlenwerte.
Re: Suche Makro für Filteroperation in Base
Verfasst: Do, 09.10.2008 18:33
von sarotti
Hallo gemeist,
also Dein Code ist
fast i.O.

allerdings ist der Filter nicht ganz richtig gesetzt ....
Die Syntax muss so lauten:
oForm2.filter = "`NumericField2` = "+ cInt(sSuchwort)
Code: Alles auswählen
sub Test_Filter_setzen
Dim oFeld as variant
Dim sID as variant
Dim oDoc as variant
Dim oForm as variant
Dim oDoc2 as variant
Dim oForm2 as variant
oDoc2 = ThisComponent
oForm2 = oDoc2.DrawPage.Forms.GetByName("Artikelliste") 'oder getByIndex()
REM das Feld des Formulars wird ausgelesen (ist z.B. wie hier ein Formularfeld)
oFeld = oForm2.getByName("WertTextBox")
sSuchwort = oFeld.text
REM => dann Filter setzen
oForm2.filter = "`NumericField2` = "+ cInt(sSuchwort)
REM =>setzen des Filters für das neue Formulardokument
oForm2.ApplyFilter=true
oForm2.reload()
end sub
Was aber den Syntaxfehler bei
angeht kann ich zur Zeit nichts sagen....
Die Syntax stimmt. Einzig die Frage aus welchem Dokument Du gestartet hast ist mir nicht ganz klar. Das Makro greift auf das aktuell offene Dokument (ThisComponent) zu. Hast Du ein anderes Dokument aktiv, gibts einen Fehler, da das Formular und die Felder nicht gefunden werden....
Denke, dass Du da ein wenig rumknobeln musst...
Gruss
sarotti
Re: Suche Makro für Filteroperation in Base
Verfasst: Do, 09.10.2008 19:53
von geimist
Dank deiner Hilfe bin ich nun schon einen riesen Schritt weiter.
Das Makro wird gesamt durchlaufen.

ALLERDINGS: Jetzt habe ich noch irgendein Problem mit der SQL-Abfrage. Nach dem durchlaufen des Makros erscheint folgender Error:
Die Dateninhalte konnten nicht aktualisiert werden.
Column not found: NumericField2 in statement [SELECT ...-SQL-Abfrage- ...AND ("NumericField2"=1) ORDER BY "Bestellnummern"."Artikelnummer"]
und das Tabellenkontrollfeld bleibt leer
Re: Suche Makro für Filteroperation in Base
Verfasst: Do, 09.10.2008 21:27
von sarotti
Hallo gemeist,
die Meldung besagt, dass das Feld "NumericField2" in Deiner Datenbanktabelle nicht vorhanden ist. Hatte mir schon so etwas gedacht, denn das ist eher ein Name für ein Formularfeld ist. Also, schau doch mal nach wie in Deiner Datenbank die Spalte heißt, aus der Du die Werte abfragen willst. Dann ersetzt Du einfach in dem Makro "NumericField2" durch den richtigen Spaltennamen... dann sollte es klappen.
P.S. den Filter schaltest Du per "Ausschalt"-Makro prinzipiell genauso aus indem Du "oForm2.ApplyFilter=FALSE" setzt. Um für den nächsten Aufruf das Abfragefeld leer zu haben, solltest Du oFeld.text="" setzen. Ein- und ausschalten kann nun per Schaltfläche erfolgen...
Viel Erfolg
Gruss
sarotti
Re: Suche Makro für Filteroperation in Base
Verfasst: Fr, 10.10.2008 00:43
von geimist
Hallo sarotti,

Vielen Dank für deine Zeit und Mühe.
Ich hatte das "NumericField2" verwendet, da ich dachte das Ziel im Formular dort angeben zu müssen und nicht die Quelle aus der DB. Jetzt funktioniert es perfekt - genauso wie ich es mir gewünscht habe.