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

Formularbasierter Filter, Ergebnis als Bericht

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Rosenkrieger
Beiträge: 3
Registriert: Fr 15. Mai 2020, 11:23

Formularbasierter Filter, Ergebnis als Bericht

Beitrag von Rosenkrieger » Fr 15. Mai 2020, 14:16

Mal wieder ein neuer Dummy im Forum...

Ich, blutiger Anfänger, habe mir eine DB für Bücher zusammenbuchstabiert und -kopiert (hier erstmal vielen Dank ans Forum für die vielen Beispieldatenbanken).

Darin werden die Bücher in Themenbereiche eingeteilt und (nach Thema sortiert) nummeriert.
Datenbasis sind zwei Tabellen, eine für die Kategorien, die zweite für die Bücher.
In der Tabelle "Bücher" steht neben Titel und der Verknüpfung zur Kategorie ein ganzer Sack voll Schlagworte, die ich per Checkbox (Boolean) vergeben kann.

Befüllt und abgefragt wird das Ganze über zwei Formulare ("Neuaufnahme" und "Suche").
Beide beziehen sich direkt auf die Tabellen, ohne zwischengeschaltete Abfrage.
Funktioniert so weit auch alles einwandfrei.

Was mir noch zu meinem Glück fehlt, und woran ich gerade verzweifle:
Ich möchte das Ergebnis eines formularbasierten Filters im Formular "Suche" als Bericht ausgeben.
Heißt: Als Ergebnis soll der Bericht Den Titel und die Nummer der gefundenen Bücher als Liste enthalten.
Dabei ist die Formatierung des Berichts nicht mein Problem; nur eben enthält mein Bericht ALLE Bücher, egal was im Formular passiert.

In anderen Forenbeiträgen habe ich bereits mehrfach gelesen, dass es "über die Filtertabelle" ganz einfach geht. Aber was ist / wo finde ich diese "Filtertabelle"??

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

Re: Formularbasierter Filter, Ergebnis als Bericht

Beitrag von RobertG » Fr 15. Mai 2020, 15:14

Hallo Rosenkrieger,

den Bericht kannst Du nicht über eine Filterung im Formular vorbestimmen. Diese Filterung muss so erfolgen, dass sie über die Abfrage zur Verfügung steht, auf der ein Bericht aufgaben kann.

Vergiss dafür die eingebauten Filterfunktionen des Formulars. Erstelle Dir eine Tabelle, die nur einen Datensatz haben soll, dessen Inhalt sie immer wieder überschreiben kann. Das ist dann die Tabelle "Filter". Als Primärschlüssel hat die bei mir ein Ja/Nein-Feld - dann können sowieso höchstens 2 Datensätze rein kommen. Der erste Datensatz ist über den Primärschlüssel von vornherein erstellt: "ID" = TRUE. In dieser Tabelle sind alle die Felder enthalten, nach denen ich meine Daten gerne filtern möchte, z.B. das Feld "AutorenID" - weil Du gerade von Büchern schreibst.

Code: Alles auswählen

SELECT * FROM "Tabelle" 
WHERE "AutorenID" = (SELECT "AutorenID" FROM "Filter" WHERE "ID" = TRUE)
Damit hast Du eine Abfrage, in die Du auch noch weiter Daten einfügen kannst, die aber nach dem/der Autor/in gefiltert ist. Das reicht für den Bericht, weil Du da die gefilterten Daten haben willst. Das reicht aber nicht für das Formular, weil Du so nie alle Daten zu Gesicht bekommst.

Code: Alles auswählen

SELECT * FROM "Tabelle" 
WHERE "AutorenID" = COALESCE((SELECT "AutorenID" FROM "Filter" WHERE "ID" = TRUE), "AutorenID")
Das zeigt dann alle Datensätze an, wenn das Feld in der Filtertabelle leer ist - sofern sie eine "AutorenID" haben.

Details dazu kannst Du aus dem Handbuch auslesen.

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

Rosenkrieger
Beiträge: 3
Registriert: Fr 15. Mai 2020, 11:23

Re: Formularbasierter Filter, Ergebnis als Bericht

Beitrag von Rosenkrieger » Mo 25. Mai 2020, 13:34

Hallo Robert,
vielen Dank für Deinen Input; Du hast mich damit zumindest mal auf die richtige Spur gesetzt.
Zu Anfang hatte ich zwar erhebliche Probleme damit, alle 94 (!) BOOLEAN-Felder so auszuwerten, dass das gewünschte Ergebnis (Anzeige aller Datensätze mit Treffern, nicht nur solche, bei denen alle Suchbegriffe treffen)erscheint.
Mit folgender sql-Syntax (hier nur als Beispiel für ein BOOLEAN-Feld; das ganze dann 94x :? ) hatte ich letztlich Erfolg:

Code: Alles auswählen

 ... WHERE ( "Filter"."BOOL_1" = TRUE AND "Buecherliste"."BOOL_1" = ( SELECT "BOOL_1" FROM "Filter" ) ) OR 
    ( "Filter"."BOOL_2" = TRUE ... 
Nun bin ich auf folgendem Stand:
- ein (Such-)Formular mit 94 Checkboxen befüllt den (einzigen) Datensatz in der Tabelle "Filter". Ob der Primärschlüssel nun TRUE oder FALSE ist, ist bei meiner Abfrage egal.
- Die SQL-Abfrage starte ich per Makro (siehe unten) aus dem Formular heraus... und funzt.
- Ein Bericht auf Basis des Abfrageergebnisses zeigt mir sauber alles, was ich von der DB wissen will.

Eine Lücke im automatisierten Ablauf kann ich allerdings noch nicht schließen:
Es will mir einfach nicht gelingen, den Bericht mit in das Makro einzubauen, welches ich in mein Formular eingebaut habe.

Aus einem anderen Thread hatte ich eine Routine als Start meiner SQL-Abfrage abgekupfert, die gut funktioniert (siehe unten).
Meine etwas blauäugig modifizierte Version dieser Routine ("query" durch "report" ersetzt) verweigert allerdings den Dienst:
"BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: reports."

Bestimmt ist es ganz einfach für jemanden, der sich damit auskennt...
Also bitte ich nochmal um Hilfe.

Code: Alles auswählen

SUB Filtern_und_Drucken

dim s_NameOfQuery$
dim s_NameOfReport$
Dim URL as New com.sun.star.util.URL
Dim Args(5) as New com.sun.star.beans.PropertyValue
Dim Dispatch As Object
dim document   as object
dim dispatcher as object

rem ----------------------------------------------------------------------
rem    Formularinhalt in Tabelle "Filter" speichern
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())
rem funktioniert einwandfrei

rem ----------------------------------------------------------------------
rem "Abfrage_Bericht" auf Basis der Tabelle "Filter" ausführen

s_NameOfQuery="Abfrage_Bericht"

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = DatabaseContext.getByName(ThisDatabaseDocument.URL)
oConnection  = oDataSource.GetConnection("","")
sql=oConnection.queries.getbyname(s_NameOfQuery).command

    URL.Complete = ".component:DB/DataSourceBrowser"
    Dispatch = StarDesktop.queryDispatch(URL,"_Blank",8)

    Args(0).Name = "ActiveConnection" 
    Args(0).Value = oConnection
    Args(1).Name = "CommandType"
    Args(1).Value = 2
    Args(2).Name = "Command"
    Args(2).Value = sql
    Args(3).Name = "ShowMenu"
    Args(3).Value = True
    Args(4).Name = "ShowTreeView"
    Args(4).Value = False
    Args(5).Name = "ShowTreeViewButton"
    Args(5).Value = False
'und öffnen
    Dispatch.dispatch(URL, Args)
rem Funktioniert!

rem Ab hier funzt nix:
rem ----------------------------------------------------------------------
rem "Bericht"erstellen

s_NameOfReport="Trefferliste"

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = DatabaseContext.getByName(ThisDatabaseDocument.URL)
oConnection  = oDataSource.GetConnection("","")
rep=oConnection.reports.getbyname(s_NameOfReport).command

    URL.Complete = ".component:DB/DataSourceBrowser"
    Dispatch = StarDesktop.reportDispatch(URL,"_Blank",8)

    Args(0).Name = "ActiveConnection" 
    Args(0).Value = oConnection
    Args(1).Name = "CommandType"
    Args(1).Value = 2
    Args(2).Name = "Command"
    Args(2).Value = rep
    Args(3).Name = "ShowMenu"
    Args(3).Value = True
    Args(4).Name = "ShowTreeView"
    Args(4).Value = False
    Args(5).Name = "ShowTreeViewButton"
    Args(5).Value = False
'und öffnen
    Dispatch.dispatch(URL, Args)

END SUB

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

Re: Formularbasierter Filter, Ergebnis als Bericht

Beitrag von RobertG » Mo 25. Mai 2020, 14:38

Hallo Rosenkrieger,

die Berichte sind nicht so in Base verwurzelt wie Tabellen und Abfragen. Du kannst auf das Kommando der berichte nicht zugreifen. Die Berichte müssen also auf einer Abfrage, besser noch einer Ansicht beruhen, die Du durch eine Tabelle filterst.

Das Ganze geht dann über

Code: Alles auswählen

 ThisDatabaseDocument.ReportDocuments.getByName("Berichtsname").open
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

Rosenkrieger
Beiträge: 3
Registriert: Fr 15. Mai 2020, 11:23

Gelöst: Formularbasierter Filter, Ergebnis als Bericht

Beitrag von Rosenkrieger » Mo 25. Mai 2020, 19:49

So einfach geht das also, wenn man's kann!

Nun klappt es von der Definition der Filterkriterien bis zum ausdruckfähigen Bericht.

Danke!

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