Formularfilter auch für Bericht verwenden

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
RobertG
Beiträge: 1969
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: (erledigt) Formularfilter auch für Bericht verwenden

Beitrag von RobertG » Di 15. Mär 2016, 21:20

Hallo Freischreiber,

das Ganze liegt doch an dieser Beziehung:

Code: Alles auswählen

...
LEFT JOIN "t-kontakte" ON "t-kontakte"."AdressID" = "t-adressen"."ID"
LEFT JOIN "t-kontaktarten" ON "t-kontaktarten"."ID" = "t-kontakte"."KontaktartID"
...
In t-kontakte hast Du mehrere gleiche AdressID.
Jetzt machst Du folgendes:

Code: Alles auswählen

SELECT "a".*, "t-kontaktarten".*, ( SELECT COUNT( "ID" ) FROM "t-kontakte" WHERE "ID" <= "a"."ID" AND "AdressID" = "a"."AdressID" ) AS "GruppenNr" FROM "t-kontakte" AS "a", "t-kontaktarten" WHERE "t-kontaktarten"."ID" = "a"."KontaktartID"
Das speicherst Du am besten als Ansicht ab (t-kontakte-nr). Damit erhältst Du eine durchgehende Nummerierung Deiner Kontakte zu der jeweiligen Adresse.

Code: Alles auswählen

SELECT "a".*, (SELECT "Kontaktart" FROM "t-kontakte-nr" WHERE "ID" = "a"."ID" AND "GruppenNr" = 2) AS "Kontaktart2",  , (SELECT "Nummer" FROM "t-kontakte-nr" WHERE "ID" = "a"."ID" AND "GruppenNr" = 2) AS "Nummer2" FROM "t-kontakte-nr" AS "a" WHERE "GruppenNr" <= 1
Das listet Dir schon einmal (hoffentlich) die Nummern der ersten und der zweiten Kontaktart in einer Zeile. Kann jetzt lediglich daran scheitern, dass das Feld "ID" in der Ansicht doppelt vertreten ist - dann muss "t-kontaktarten".* so geändert werden, dass das Feld "ID" aus dieser Tabelle nicht mit in die Ansicht kommt.
Auch aus dieser Abfrage würde ich, sofern es funktioniert, eine Ansicht erstellen: t-kontakte-kontaktarten.
Jetzt ersetzt Du den obigen Auszug aus der Abfrage mit dem entsprechenden Bezug zu dieser letzten Ansicht. Aus

Code: Alles auswählen

...
LEFT JOIN "t-kontakte" ON "t-kontakte"."AdressID" = "t-adressen"."ID"
LEFT JOIN "t-kontaktarten" ON "t-kontaktarten"."ID" = "t-kontakte"."KontaktartID"
...
Wird

Code: Alles auswählen

...
LEFT JOIN "t-kontakte-kontaktarten" ON "t-kontakte-kontaktarten"."AdressID" = "t-adressen"."ID"
...
Vielleicht hakelt es am Anfang irgendwo etwas. Habe das jetzt nicht im Detail getestet.

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

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

Re: (erledigt) Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Sa 19. Mär 2016, 16:07

Hallo Robert,

jetzt mache ich es tatsächlich mit zwei Berichten, einen für die Kontakte und einen für die Aufträge.

Da ich pro Adresse generell 4-6 Rufnummern/Mail/Fax/Web-Angaben habe, wäre es vermutlich sehr kompliziert.

Vielen Dank für deine Mühe!

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

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

Re: (erledigt) Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Mo 17. Jun 2019, 18:14

Hallo Robert,

dieses Problem ist bei mir immer noch ungelöst.

Gerade habe ich in deinem Handbuch unter "Berichte – Präsentationen der Datenauswertung" diesen Mahnbrief entdeckt:
bericht.gif
bericht.gif (92.81 KiB) 325 mal betrachtet

Wie wurden hier Daten verschiedener Tabellen auf eine Seite gebracht? Offenbar nicht mit Makros, aber doch bestimmt auch nicht mit so ellenlangen Abfragen mit Unterabfragen oder Ansichten, oder?

Ich kann immer noch nicht glauben, daß so perfekt strukturierte Daten nur mit größten Klimmzügen aufs Papier gebracht werden können...

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

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

Re: Formularfilter auch für Bericht verwenden

Beitrag von RobertG » Mo 17. Jun 2019, 21:13

Hallo Freischreiber,

lade Dir doch einfach die Datenbank "Medien ohne Makros" herunter. Da müsste dieser Bericht drin sein. Ist der Inhalt einer einzigen Abfrage - eventuell auf als Ansicht umgesetzt, habe ich jetzt gerade nicht im Kopf. Alle Elemente, die zu verändern sind, basieren auf Feldern der Abfrage. Der Bericht funktioniert allerdings in der aktuellen Datenbank nicht, da ich da eine Version drin hab, bei der ich die Ansichten als Abfragen gespeichert habe - separat für HSQLDB und Firebird.

Hier nur der Inhalt der Abfrage. Ist natürlich recht lang:
SELECT "Ansicht_MedienID_Titel_Verfasser"."ID_Titel_Verfasser" "Medium", "a"."Leser_ID", "Leser"."Vorname" || ' ' || "Leser"."Nachname" "Leser_Name", "a"."Leih_Datum", "a"."Verlaengerung", IFNULL( "a"."Verlaengerung", 0 ) * ( SELECT "Verlaengerungszeit" FROM "Einstellungen" ) "verlaengert_um", DATEDIFF( 'dd', "a"."Leih_Datum", CURDATE( ) ) "Leihzeit", ABS( ( SELECT "Medienart"."Ausleihzeit" FROM "Medienart", "Medien" WHERE "Medien"."Medienart_ID" = "Medienart"."ID" AND ( "a"."Medien_ID" = "Medien"."ID" OR "Medien"."ID" = TRUNCATE( "a"."Medien_ID_BC", - 1 ) / 10 ) ) + IFNULL( "a"."Verlaengerung", 0 ) * ( SELECT "Verlaengerungszeit" FROM "Einstellungen" ) - DATEDIFF( 'dd', "a"."Leih_Datum", CURDATE( ) ) ) "Restzeit", FLOOR( ABS( ( SELECT "Medienart"."Ausleihzeit" FROM "Medienart", "Medien" WHERE "Medien"."Medienart_ID" = "Medienart"."ID" AND ( "a"."Medien_ID" = "Medien"."ID" OR "Medien"."ID" = TRUNCATE( "a"."Medien_ID_BC", - 1 ) / 10 ) ) + IFNULL( "a"."Verlaengerung", 0 ) * ( SELECT "Verlaengerungszeit" FROM "Einstellungen" ) - DATEDIFF( 'dd', "a"."Leih_Datum", CURDATE( ) ) ) / ( SELECT ( "Ueberziehung_Tage" ) FROM "Einstellungen" ) ) * ( SELECT ( "Ueberziehungsgebuehr" ) FROM "Einstellungen" ) "Gebuehr", "Ansicht_Mahnung_aktuell"."Mahn_Zahl", "Ansicht_Mahnung_aktuell"."Mahn_Dat", "Leser_Anschrift"."Adresse", "Leser_Anschrift"."Briefanrede" FROM "Ansicht_MedienID_Titel_Verfasser", "Ausleihe" AS "a", "Ansicht_Mahnung_aktuell", "Leser", ( SELECT "Leser"."ID", IFNULL( "Geschlecht"."Adressanrede", '' ) || CHAR( 13 ) || "Leser"."Vorname" || ' ' || "Leser"."Nachname" || CHAR( 13 ) || IFNULL( "Strasse"."Strasse" || ' ' || "Adresse"."Nr", '' ) || CHAR( 13 ) || IFNULL( "Adresse"."Land" || ' ', '' ) || IFNULL( "Postleitzahl"."Postleitzahl" || ' ', '' ) || IFNULL( "Ort"."Ort", '' ) "Adresse", IFNULL( "Geschlecht"."Anrede" || ' ', '' ) || "Leser"."Nachname" || ',' "Briefanrede" FROM "Leser" LEFT JOIN "Geschlecht" ON "Geschlecht"."ID" = "Leser"."Geschlecht_ID" LEFT JOIN "Adresse" ON "Adresse"."ID" = "Leser"."ID" LEFT JOIN "Strasse" ON "Strasse"."ID" = "Adresse"."Strasse_ID" LEFT JOIN "Postleitzahl" ON "Postleitzahl"."ID" = "Adresse"."Postleitzahl_ID" LEFT JOIN "Ort" ON "Ort"."ID" = "Postleitzahl"."Ort_ID" ) AS "Leser_Anschrift" WHERE "Ansicht_MedienID_Titel_Verfasser"."ID" = IFNULL( "a"."Medien_ID", TRUNCATE( "a"."Medien_ID_BC", - 1 ) / 10 ) AND "a"."Rueck_Datum" IS NULL AND "a"."ID" = "Ansicht_Mahnung_aktuell"."Ausleihe_ID" AND "a"."Leser_ID" = "Leser"."ID" AND "a"."Leser_ID" = "Leser_Anschrift"."ID" AND ( SELECT "Medienart"."Ausleihzeit" FROM "Medienart", "Medien" WHERE "Medien"."Medienart_ID" = "Medienart"."ID" AND ( "a"."Medien_ID" = "Medien"."ID" OR "Medien"."ID" = TRUNCATE( "a"."Medien_ID_BC", - 1 ) / 10 ) ) + IFNULL( "a"."Verlaengerung", 0 ) * ( SELECT "Verlaengerungszeit" FROM "Einstellungen" ) - DATEDIFF( 'dd', "a"."Leih_Datum", CURDATE( ) ) < 0
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

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

Re: Formularfilter auch für Bericht verwenden

Beitrag von gogo » Di 18. Jun 2019, 15:16

:lol: ... das "S" in SQL steht nicht für "short" ;)
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: 538
Registriert: Fr 28. Mär 2014, 10:41

Re: Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Di 18. Jun 2019, 16:27

@Robert
Um Himmels Willen, das ist noch komplizierter als ich befürchtet hatte.

@gogo
Ja, ich merke es. Und das "Libre" in Libreoffice heißt nicht, daß ich die Daten frei anordnen kann, wie ich lustig bin...
Freischreiber nutzt seit 8/2017 LibreOffice Version: 5.2.7.2 (x64) unter Windows 7 und SplitDB mit HSQL 2.4.0.

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

Re: Formularfilter auch für Bericht verwenden

Beitrag von RobertG » Di 18. Jun 2019, 16:36

Ich kann Euch das gerne einmal etwas strukturierter aufzeigen, damit wenigstens klar wird, welche Tabellen da alle drin stecken. Wobei natürlich hinzukommt, dass das Ganze zuerst mit Hilfe einer Abfrage konstruiert wurde. Wenn ich eine Abfrage erstelle und die als Datenbasis für eine weitere Abfrage nehme, so steht in der 2. Abfrage nur der Abfragename der ersten Abfrage (als wenn das eine Tabelle wäre). Erstelle ich aus der 2. Abfrage eine Ansicht, dann wird der Code der 1. Abfrage in die Ansicht übernommen. Schließlich kennt die interne Datenbank nicht die Abfragen und kann damit nichts anfangen.

So etwas steckt z.B. in der Definition

Code: Alles auswählen

( SELECT "Leser"."ID", 
IFNULL( "Geschlecht"."Adressanrede", '' ) || CHAR( 13 ) || "Leser"."Vorname" || ' ' || "Leser"."Nachname" || CHAR( 13 ) || 
IFNULL( "Strasse"."Strasse" || ' ' || "Adresse"."Nr", '' ) || CHAR( 13 ) || 
IFNULL( "Adresse"."Land" || ' ', '' ) || IFNULL( "Postleitzahl"."Postleitzahl" || ' ', '' ) || IFNULL( "Ort"."Ort", '' ) "Adresse", 
IFNULL( "Geschlecht"."Anrede" || ' ', '' ) || "Leser"."Nachname" || ',' "Briefanrede" 
FROM "Leser" 
LEFT JOIN "Geschlecht" ON "Geschlecht"."ID" = "Leser"."Geschlecht_ID" 
LEFT JOIN "Adresse" ON "Adresse"."ID" = "Leser"."ID" 
LEFT JOIN "Strasse" ON "Strasse"."ID" = "Adresse"."Strasse_ID" 
LEFT JOIN "Postleitzahl" ON "Postleitzahl"."ID" = "Adresse"."Postleitzahl_ID" 
LEFT JOIN "Ort" ON "Ort"."ID" = "Postleitzahl"."Ort_ID" ) AS "Leser_Anschrift" 
Die Abfrage hieß hier "Leser_Anschrift" und taucht in der Ansicht komplett als Datenquelle wieder auf.

Grundsatz weiter für Berichte: Alle Inhalte, die dort dargestellt werden, kommen aus einer Datenquelle. Die ist am besten eine Ansicht oder bei einfachen Berichten eine Tabelle. Mit Abfragen hat der Report-Builder manchmal Probleme. Inhalte aus einer anderen Datenquelle kennt der Report-Builder nur in der Form, dass Diagramme (sofern sie in der aktuellen Version funktionieren) mit der Datenquelle des Berichts verknüpft werden. Das ist dann so wie die Verbindung von Hauptformular zu Unterformular.

Aber natürlich darfst Du die Daten frei anordnen, wie Du gerne willst - nur ist dann das Ergebnis nicht unbedingt das, das Du gerne hättest.
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

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

Re: Formularfilter auch für Bericht verwenden

Beitrag von Freischreiber » Fr 21. Jun 2019, 16:50

Hallo Robert,

danke für deine Mühe, aber ich brauche einen Texteditor mit Suchfunktion, um überhaupt den unteren Code im oberen wiederzufinden. Vom inhaltlichen Verstehen ganz zu schweigen.

Was mir fehlt, ist ein Report Designer, der aus verschiedenen Tabellen ohne Tricks oder Umwege einen Bericht erstellen kann. Mit Drag & Drop. Und ohne daß ich diesen Code überhaupt anschauen muß. Sowas wird es wohl, wie ich die Innovationsgeschwindigkeit bei Libreoffice Base kenne, in den nächsten 20 Jahren nicht geben.

Viele Grüße
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: 888
Registriert: Sa 5. Feb 2011, 19:07

Re: Formularfilter auch für Bericht verwenden

Beitrag von gogo » Fr 21. Jun 2019, 18:54

RobertG hat geschrieben:
Di 18. Jun 2019, 16:36
...Wobei natürlich hinzukommt, dass das Ganze zuerst mit Hilfe einer Abfrage konstruiert wurde...
... und diese Abfrage könntest Du als Datenquelle für den Bericht verwenden.
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

Antworten