gelöst - Makro für Filteroperation in Base

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

gelöst - Makro für Filteroperation in Base

Beitrag 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.
Zuletzt geändert von geimist am Do, 13.11.2008 19:53, insgesamt 3-mal geändert.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Re: Suche Makro für Filteroperation in Base

Beitrag 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
hawe
****
Beiträge: 151
Registriert: Di, 05.08.2008 19:47

Re: Suche Makro für Filteroperation in Base

Beitrag 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...
Gruss HW
Win7/SuSe 11.2 - LO 3.3
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Suche Makro für Filteroperation in Base

Beitrag 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?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Suche Makro für Filteroperation in Base

Beitrag 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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
hawe
****
Beiträge: 151
Registriert: Di, 05.08.2008 19:47

Re: Suche Makro für Filteroperation in Base

Beitrag 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...
Gruss HW
Win7/SuSe 11.2 - LO 3.3
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Re: Suche Makro für Filteroperation in Base

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

Code: Alles auswählen

`Feldname` LIKE 'Suchstring' 
oder bei Zahlen z.B.

Code: Alles auswählen

`Feldname` = cInt(Suchstring)
. 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:

Code: Alles auswählen

"`Feldname` LIKE ' " + Suchstring +"'"
Ich hoffe das hilft Dir weiter


Gruss
sarotti
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Suche Makro für Filteroperation in Base

Beitrag 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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Re: Suche Makro für Filteroperation in Base

Beitrag von sarotti »

Hallo gemeist,

also Dein Code ist fast i.O. :D 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

Code: Alles auswählen

oDoc2 = ThisComponent
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
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Suche Makro für Filteroperation in Base

Beitrag 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
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Re: Suche Makro für Filteroperation in Base

Beitrag 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
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Suche Makro für Filteroperation in Base

Beitrag von geimist »

Hallo sarotti,

:D 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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Antworten