Formularfilter auch für Bericht verwenden

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Freischreiber
Beiträge: 534
Registriert: Fr 28. Mär 2014, 10:41

Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Fr 12. Feb 2016, 17:45

Hallo,

meiner Datenbank fehlt noch eine Funktion, nämlich die Übergabe des gerade angezeigten Kunden mit seinen Daten an ein Tabellenblatt.

Der Kunde wird per Formularfilter aus der Kundentabelle geholt mit dem Makro von hier: http://www.libreoffice-forum.de/viewtop ... 10&t=14694

Auf dem Formular hätte ich gern einen Button, der einen Bericht startet und dafür die gleiche Filterung verwendet, also eine Tabelle mit den Feldern des gerade angezeigten Kunden erstellt. Gibt es dafür einen Weg?

Und wenn ja:
Auf dem Formularblatt ist neben Name und Adresse des Kunden auch ein Tabellenkontrollfeld mit einem Unterformular für die Kontakte zu dem Kunden (Telefon, Fax, Mail usw.). (Wie) kann man diese Felder in die gleiche Berichtstabelle bringen?

Gruß
Freischreiber
Zuletzt geändert von Freischreiber am Mo 17. Jun 2019, 18:15, insgesamt 2-mal geändert.
Freischreiber nutzt seit 8/2017 LibreOffice Version: 5.2.7.2 (x64) unter Windows 7 und SplitDB mit HSQL 2.4.0.

F3K Total
Beiträge: 1856
Registriert: So 10. Apr 2011, 10:10

Re: Formularfilter auch für Bericht verwenden

Beitrag von F3K Total » Fr 12. Feb 2016, 19:25

Moin,
schön ist anders.
  • Wenn du unbedingt den Filter setzen möchtest, geht das Beispielsweise so, die 177 muss natürlich per Code gesetzt werden:

    Code: Alles auswählen

    Sub Set_Report_Filter
        oRep = thisdatabasedocument.ReportDocuments.getbyname("Adressen")
        oRep.opendesign
        oRep.component.Filter = "( ""Adressen"".""ID"" = 177 )"
        oRep.store
        oRep.close (-1)
        oRep.open
    End Sub
    Da wird der Bericht erst im Bearbeitungsmodus geöffnet, der Filter gesetzt, geschlossen und im Export-Modus geöffnet.
  • Eine zweite Möglichkeit ist es, eine vorhandene Abfrage als Berichstgrundlage zu verwenden. Hier "qAdressen", diese kann per Makro modifiziert werden, so dass sie genau den Datensatz des aktuellen Kunden filtert. Auch hier muss die 177 wieder per Code gesetzt werden.

    Code: Alles auswählen

    Sub open_Report_modify_Query
        aQueries = thisdatabasedocument.datasource.QueryDefinitions
        oQuery = aQueries.getbyname("qAdressen")
        oQuery.Command = "SELECT ""ID"", ""Nachname"", ""Vorname"", ""Strasse"", ""PLZ"", ""Ort"" FROM ""Adressen"" WHERE ""ID"" = 177"
        thisdatabasedocument.ReportDocuments.getbyname("Adressen").open
    end sub
  • Am einfachsten ist es wiedermal mit Filtertabelle. Wenn der Filterwert im Formular gesetzt ist, kann er überall (jedes Formular, jede Abfrage, jede Ansicht und darüber auch im Bericht) genutzt werden. In diesem Fall kannst du eine Abfrage oder Ansicht als Berichtsgrundlage verwenden die sich auf den Filterwert bezieht, ala:

    Code: Alles auswählen

    Select * from "Adressen" where "ID" = (Select "F_ID" from "Filter")
    Aber davon möchtest du ja nix wissen ...
Gruß R

Freischreiber
Beiträge: 534
Registriert: Fr 28. Mär 2014, 10:41

Re: Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Sa 13. Feb 2016, 09:47

Hallo R,

für meinen subjektiven Blick sehen die ersten beiden Lösungen sehr schön aus... ich versuche nur gerade, sie ganz zu verstehen:

"Per Code" heißt: Bei der ersten (bzw. bei beiden) muß ich die ID aus dem Formular holen? Das Feld heißt fmtID und enthält den Primärschlüssel der gerade angezeigten Adresse.
Vermutlich mit

Code: Alles auswählen

oForm = thisComponent.Drawpage.Forms.getByName("MainForm")
	oFeld = thisComponent.Drawpage.Forms.getByName("MainForm").getByName("fmtID")
	stFilterwert = LCASE(oFeld.text)
Dann hätte ich die 177 aus deinem Code?
Und die Unterabfrage für Telefonnummern würde ich im Berichtsdokument machen?

Bei der zweiten gibt es zwei Abfragen?
Die qAdressen muß als Abfrage in Base gespeichert sein und liefert alle Adressen?

Und aus diesen allen Adressen wird mit

Code: Alles auswählen

oQuery.Command = "SELECT ""ID"", ""Nachname"", ""Vorname"", ""Strasse"", ""PLZ"", ""Ort"" FROM ""Adressen"" WHERE ""ID"" = 177"
dann die gewünschte gefiltert?
Und vermutlich könnte ich so auch gleich im Makrotext die Telefonnummern dazu holen, per Unterabfrage?

Gruß
Freischreiber
Freischreiber nutzt seit 8/2017 LibreOffice Version: 5.2.7.2 (x64) unter Windows 7 und SplitDB mit HSQL 2.4.0.

F3K Total
Beiträge: 1856
Registriert: So 10. Apr 2011, 10:10

Re: Formularfilter auch für Bericht verwenden

Beitrag von F3K Total » Sa 13. Feb 2016, 10:07

Also,
wenn schon ohne Filtertabelle, dann empfehle ich Variante 2.
Freischreiber hat geschrieben:Bei der zweiten gibt es zwei Abfragen?
Die qAdressen muß als Abfrage in Base gespeichert sein und liefert alle Adressen?
Nein, es gibt nur eine einzige Abfrage, auf der der Bericht basiert. Mit dem Makro änderst du tatsächlich die Abfrage, öffne sie einmal im Bearbeitungsmodus, nachdem du das Makro ausgeführt hast.
Wenn es sich, wie die Kennzeichnung fmtID vermuten läßt, bei diesem Feld um ein formatiertes Feld handelt, dann liest du die aktuelle ID nicht mit LCASE aus, das ist ein Befehl für Text. Dann nimm CurrentValue.

Code: Alles auswählen

Sub open_Report_modify_Query
    oFeld = thisComponent.Drawpage.Forms.getByName("MainForm").getByName("fmtID")
    nFilterwert = oFeld.CurrentValue
    aQueries = thisdatabasedocument.datasource.QueryDefinitions
    oQuery = aQueries.getbyname("qAdressen")
    oQuery.Command = "SELECT ""ID"", ""Nachname"", ""Vorname"", ""Strasse"", ""PLZ"", ""Ort"" FROM ""Adressen"" WHERE ""ID"" = " + nFilterwert
    thisdatabasedocument.ReportDocuments.getbyname("Bericht").open
end sub
Beispiel anbei.
Freischreiber hat geschrieben:Und die Unterabfrage für Telefonnummern würde ich im Berichtsdokument machen?
Denke, dass ist nicht nötig, du kannst die Abfrage per Makro genau so aufbauen, wie du sie für den Bericht benötigst.
Viel Erfolg
Gruß R
Dateianhänge
Adressen_one_row_report_query.zip
nur entpacken
(129.53 KiB) 49-mal heruntergeladen
Zuletzt geändert von F3K Total am Sa 13. Feb 2016, 11:43, insgesamt 1-mal geändert.

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

Re: Formularfilter auch für Bericht verwenden

Beitrag von RobertG » Sa 13. Feb 2016, 10:35

Hallo Freischreiber,

was spricht für Dich denn eigentlich gegen eine Filtertabelle? Das ist das, was mich an diesem Thread am meisten interessiert. Da habe ich wohl vorher irgendetwas nicht mit bekommen.

Gruß

Robert

gogo
Beiträge: 875
Registriert: Sa 5. Feb 2011, 19:07

Re: Formularfilter auch für Bericht verwenden

Beitrag von gogo » Sa 13. Feb 2016, 13:59

Hallo Freischreiber,

wenn Du noch ein paar Tage warten kannst, gibt's auf LO-Extensions was Neues. Ich bin gerade dabei, das zu finishen, aber eine Alpha-Version mit einer chaotischen Dokumentation hab' ich Dir hier angehängt. Du wärest also ein Tester ;)

Das Prinzip:
Der Report ist ein externes Writer-Dokument.
In dieser Berichtsvorlage gibt es Tabellen, diese werden mit Daten aus Abfragen/SQLs gefüllt.
Pro Tabelle im Writer-Dokument also eine Abfrage (oder ein SQL-String)
Wie kommt das Writer-Dokument an die Abfragen? - per Benutzerdefinierter Eigenschaft.
Pro Tabelle die zu füllen ist eine solche anlegen. Syntax:
  • Name der Eigenschaft: "brx.table.Tabellenname.query"
  • Wert der Eigenschaft: "Datenquelle.Abfrage1" oder "Datenquelle.Select X from y" etc...
Parameter: Leider ist es mir zu kompliziert Parameterabfragen aus Base-SQLs auszulesen, daher gibt's etwas dass das umgeht. Reservierte Strings. z.B.: '###INPUTBOX(Bitte geben sie eine Zahl ein)###' öffnet eine Basic-Inputbox mit der Frage "Bitte geben sie eine Zahl ein", der Input landet dann im SQL-String. Oder '###FORMFIELD<MainForm><Subform><KontrollelementName>###' sucht im aktuellen Formular nach dem Kontrollelement namens "KontrollelementName" und holt mit .currentvalue dessen Wert in die Abfrage. Etc.
Und dann?
Nachdem die Tabellen alle gefüllt wurden kann der "Bericht" automatisch als odt oder pdf abgepeichert werden, oder auch (wenn ein Programm definiert wurde) das pdf geöffnet werden, oder es wird der "Bericht" als Basic-Objekt an das aufrufende Makro zurückgegeben oder das pdf/odt wird als Anhang per Mail versandt ... oder der fertige "Bericht" wird einfach nur geöffnet.
Aufruf der Funktion - sehr felxibel:
  • Icon in einer Symbolleiste
  • Button in einem Writerdokument
  • Button in einem Base-Formular
  • per Code
Entstanden ist die Extension um Rechnungen und Bestellungen auszudrucken/zu versenden, da hat man immer dieselbe Fragestellung - eine Rechnung + ein paar korrespondierende Datensätze aus der Liste mit den bestellten Artikeln sowie eine Kunden-Adresse, eine Anmerkung zur Kostenstelle etc. etc. Also viele Miniabfragen auf 1-2 Seiten Papier übersichtlich unterzubringen. Der Vorteil ist, dass man die Möglichkeiten eines Writer-Doks voll nutzen kann. Eine Teilsummenberechnung der Spalte x und der Spalte y ist möglich, darunter kann dann auch noch eine Gesamtsumme, MwSt-Auszug etc. gemacht werden, ohne komplexe Berechnungen in einem Base-Report durchzuführen. Oder: Du möchtest, dass rechts oben in der Kopfzeile der Firmenname um 90° gedreht steht (weil Ihr dann den Zettel besser findet) - kein Problem, die Writer-Tabelle mach das möglich. Oder Du möchtest dass die Dokumente individuelle Wasserzeichen oder Unterschriften haben? Writer kann das alles...
Dateianhänge
BRX.zip
(139.72 KiB) 49-mal heruntergeladen
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Freischreiber
Beiträge: 534
Registriert: Fr 28. Mär 2014, 10:41

Re: Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Sa 13. Feb 2016, 16:23

Hallo!

@ R:
Es klappt sehr gut mit der zweiten Methode! Im Moment bekomme ich nur die Adresse mehrfach, für jeden Kontakt (Mail, Telefon, Fax) einmal, was vermutlich an meiner fehlerhaften Abfrage liegt. Die heißt im Moment:

Code: Alles auswählen

    oQuery.Command = " SELECT ""t-adressen"".""Nachname"", ""t-adressen"".""Vorname"", ""t-adressen"".""Straße"", ""t-adressen"".""PLZ"", ""t-adressen"".""Ort"", ""t-kontakte"".""Nummer"", ""t-kontaktarten"".""Kontaktart"" FROM ""t-kontakte"", ""t-adressen"", ""t-kontaktarten"" WHERE ""t-kontakte"".""AdressID"" = ""t-adressen"".""ID"" AND ""t-kontakte"".""KontaktartID"" = ""t-kontaktarten"".""ID"" AND ""t-adressen"".""ID"" = " + nFilterwert
weil eben eine 1:n-Verbindung zu den Rufnummern usw. besteht.

Daß die Abfrage sich ändert, merkt man auch an der Base-Datei: Die will gespeichert werden vor dem Schließen.

:?: Ich steh nur schon wieder auf dem Schlauch mit diesem SQL: wie hängt man weitere Kontakte einfach an, ohne die Adresse zu wiederholen? Group by oder so?

@ RobertG:
Ursprünglich baute mein Adressformular auf einer Parameterabfrage auf, ohne eigene Filterung. Dann kamen Makros dazu. Und dann erst kam der Wunsch, im Formular zu filtern.
- Mit der Filtertabelle stimmte an den Makros nichts mehr... mit Formularfilter konnten die Makros so bleiben, wie sie waren.
- Die Konstruktion, daß mein "Hauptdatensatz" nur ein Unterformular eines Suchfeldes sein soll, läuft irgendwie meiner bildlichen Vorstellung zuwider.
- Schließlich: Wenn man mit der Maus einmal auf das Suchfeld klickt, verschwinden ohne Vorwarnung alle Änderungen... das könnte man bestimmt per Makro in den Griff kriegen, aber dieser Ansatz ist mir eben nicht geheuer.

@ gogo:
Vielen Dank für das Angebot, aber "Alpha", "chaotisch" und "Tester" ist mir auch nicht geheuer. Das braucht andere Kaliber als mich. :|

Gruß
Freischreiber
Freischreiber nutzt seit 8/2017 LibreOffice Version: 5.2.7.2 (x64) unter Windows 7 und SplitDB mit HSQL 2.4.0.

gogo
Beiträge: 875
Registriert: Sa 5. Feb 2011, 19:07

Re: Formularfilter auch für Bericht verwenden

Beitrag von gogo » Sa 13. Feb 2016, 16:32

nur Mut ;)

... allerdings ist nur mehr die Dokumentation/Anleitung chaotisch, der Code ist im Großen und Ganzen fertig. Mehr als ein paar Fehlermeldungen handelt man sich da nicht ein.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

F3K Total
Beiträge: 1856
Registriert: So 10. Apr 2011, 10:10

Re: Formularfilter auch für Bericht verwenden

Beitrag von F3K Total » Sa 13. Feb 2016, 16:34

Freischreiber hat geschrieben: :?: Ich steh nur schon wieder auf dem Schlauch mit diesem SQL: wie hängt man weitere Kontakte einfach an, ohne die Adresse zu wiederholen? Group by oder so?
Na, wenn du mehrere Kontakte zu einer Adresse im Bericht zeigen willst, musst du im Bericht nach den Adressfeldern gruppieren. Die Kontakte sind dann im Detailbereich, die Adresse im dazugehörigen Kopf. Du verwendest den OracleReportBuilder?
Gruß R

Freischreiber
Beiträge: 534
Registriert: Fr 28. Mär 2014, 10:41

Re: Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Sa 13. Feb 2016, 16:54

Du verwendest den OracleReportBuilder?
Vermute ich... das, was bei LO mitinstalliert wurde. Ich versuche es mit dem Assistenten und produziere aber nur Chaos:
Berichts-Assistent.png
Berichts-Assistent.png (22.95 KiB) 1568 mal betrachtet
Da wird etwas eingefügt zwischen Kopf- und Detailbereich...
Freischreiber nutzt seit 8/2017 LibreOffice Version: 5.2.7.2 (x64) unter Windows 7 und SplitDB mit HSQL 2.4.0.

Antworten