Nicht mehr per Mausklick

Deutlich komplizierter wird es bei der Abfrage, die alle Datensätze aus Bild zurückgibt, die zum in Filter gespeicherten Suchbegriff passen: Dazu müssen Sie per Hand SQL-Code schreiben. Wählen Sie dafür im Base-Hauptfenster in der Rubrik Abfragen die Option Abfrage in der SQL Ansicht erstellen.

Das Base-Handbuch [2] nennt unter der Überschrift Allgemeines zu Datenbankaufgaben / Datenfilterung als ersten Ausgangspunkt einen passenden SQL-Code. In Listing 1 sehen Sie eine bereits an die Feld- und Tabellennamen aus unserem Beispiel angepasste Fassung.

Listing 1

SELECT * FROM "Bilder" WHERE "Titel" = IFNULL( ( SELECT "Titel" FROM "Filter" ), "Titel" )

Der Kopf SELECT * FROM wählt alle Felder der Tabelle Bilder aus. Die hinter der Klausel WHERE genannte Bedingung wählt bestimmte Datensätze aus. "Titel" = weist die Datenbank an, das Feld Titel in der SELECT genannten Tabelle (also Bilder) mit dem Wert nach dem Gleichheitszeichen zu vergleichen und Datensätze auszuschließen, bei denen der Vergleich nicht zutrifft.

Eine weitere SELECT-Klausel, die diesmal aber die Tabelle Filter referenziert, liefert den Vergleichswert. Die Abfrage filtert also alle Datensätze heraus, bei der das Feld Titel in der Tabelle Bilder dem gleichnamigen Feld in Filter entspricht. Die den zweiten SELECT kapselnde Funktion IFNULL setzt diese Einschränkung allerdings außer Kraft, wenn das Titel-Feld in Filter leer ist.

IFNULL gibt den im ersten Parameter genannten Wert zurück, sofern er ungleich null ist, sonst den zweiten Parameter "Titel". Diese Zeichenkette in Anführungszeichen wertet die Datenbank als einen Feldnamen aus dem primären SELECT. Sie vergleicht also, sofern Titel in Filter leer bleibt, das Feld Titel mit sich selbst, was immer wahr ergeben sollte. So kommt das für eine Filterfunktion passende Verhalten zustande, dass bei leerem Filterwert alle Datensätze erscheinen – zumindest in der Theorie.

Allerdings hintertreiben Eigenarten von SQL und der IFNULL-Funktion die scheinbar selbstverständliche Annahme, dass der Vergleich eines Feldes mit sich selbst immer wahr ergibt: Ist das Feld nämlich leer, so liefert SELECT den Wert NULL, die Funktion IFNULL aber eine leere Zeichenkette – für die Datenbank ist das nicht dasselbe. Es fehlen also bei leerem Filterfeld alle Datensätze, in denen Sie das Beschreibungsfeld nicht ausgefüllt haben.

Erste Hilfe

Wenn Ihnen der Workaround nicht ausreicht, im Entwurf der Tabelle für Bild leere Titel-Felder mithilfe der Einstellung Eingabe erforderlich = ja für das Feld Titel auszuschließen, bleibt nur die Lösung, den Rückgabewert des SELECT ebenfalls mit einer IFNULL-Funktion zu kapseln (Listing 2).

Listing 2

SELECT "Bilder".* , IFNULL( "Titel", '' ) AS "T" FROM "Bilder" WHERE "T" = IFNULL( ( SELECT "Titel" FROM "Filter" ), "T" )

Anders als im Handbuch verwendet das Beispiel außerdem vor dem Asterisk (*), der alle Felder der Tabelle Bilder auswählt, noch den Tabellennamen "Bilder", obwohl er schon eindeutig aus der FROM-Klausel hervorgeht. Doch ohne diese Ergänzung meldet Base 4.2.3 einen Syntaxfehler. Vermutlich handelt es sich dabei um einen Bug im SQL-Parser, denn die doppelte Angabe des Tabellennamens ergibt keinen Sinn. Sie wäre in anderen Datenbanken nicht nötig, auch nicht in früheren Base-Versionen.

Dann vergleicht die WHERE-Klausel die Rückgabe der IFNULL-Funktion mit der mittels des Schlüsselworts AS dem Alias T zugewiesenen Rückgabe der neu hinzugekommenen IFNULL-Funktion. Diese liefert ebenfalls niemals NULL, sondern bei leeren Feldern '', also einen leeren String. Jetzt funktioniert die Filterabfrage wie gewünscht.

Nun darf MainForm seine Daten nicht mehr direkt aus der Tabelle Bilder beziehen, sondern über die zwischengeschaltete Filter-Abfrage. Ändern Sie daher die Datenbindung von MainForm zu Abfrage: FilterAbfrage

Damit sich die Filterfunktion aus dem Formular heraus bedienen lässt, fehlt noch eine Kleinigkeit: Fügen Sie dem MainForm eine Schaltfläche (Button auf der linken Symbolleiste im Formularentwurf) hinzu und wählen Sie in dessen Eigenschaften unten im Reiter Allgemein als Aktion Formular aktualisieren. Erst nach einem Klick auf diesen Button zeigt MainForm den zum Begriff im Filter-Feld passenden Datensatz an.

Abbildung 2 zeigt im Vergleich zu früheren Versionen des Eingabeformulars außerdem noch das Feld Dateipfad: So erscheint nicht nur eine Vorschau des Bilds, sondern auch dessen Ort im Dateisystem. Dabei handelt es sich um ein Textfeld mit dem Inhalt Dateipfad.

Die Suchfunktion lässt sich auch auf weitere Datenfelder ausweiten: Jedes weitere Feld setzt einen weiteren IFNULL-Aufruf in der SELECT-Klausel am Anfang der Abfrage voraus sowie ein IFNULL in der WHERE-Klausel, das die Unterabfrage kapselt. Listing 3 verdeutlicht das Strickmuster.

Listing 3

SELECT "Bilder".* ,
  IFNULL( "Titel", '' ) AS "T" ,
  IFNULL( "Autor", '' ) AS "A"
FROM "Bilder"
WHERE
  "T" = IFNULL( ( SELECT "Titel" FROM "Filter" ), "T" )
AND
  "A" = IFNULL( ( SELECT "Autor" FROM "Filter" ), "A" )

Allerdings braucht auch die Tabelle Filter für jedes neue Suchfeld eine weitere Spalte vom gleichen Datentyp wie seine Entsprechung in Bilder, im Beispiel also ein Feld Autor vom Typ VARCHAR. Auch das Unterformular zur Suche benötigt ein weiteres Textfeld, mit dem sich der Autorenname in Filter verändern lässt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Workshop StarOffice Base, Teil 2
    In Ausgabe 09/2001 haben wir durch das Anlegen einer neuen Datenbank bereits den Grundstein für diesen zweiten Workshop-Teil gelegt. Auf diesen Daten aufbauend wollen wir nun etwas tiefer in StarOffice Base einsteigen und anschließend unsere CD-Datenbank um die Tabelle der verliehenen CDs erweitern.
  • Einstieg in LibreOffice Base
    Datenbankanwendungen über Assistenten und grafische Editoren per Mausklick erstellen – ganz ohne SQL und Programmierung: Das verspricht das LibreOffice-Programm Base nach dem Vorbild von Microsoft Access.
  • Geld verdienen im Fluge
    Erst in der Zusammenarbeit der einzelnen Programme zeigt OpenOffice seine wahre Stärke. Wir zeigen Ihnen am Beispiel einer Rechnungsdatenbank, wie diese Kooperation gewinnbringend funktioniert: Künftig verdienen Sie Ihr Geld dann wie im Fluge.
  • Tipps und Tricks zu OpenOffice
    In dieser Ausgabe erfahren Sie, wie Sie mit OpenOffice Calc auf Datenbanken zugreifen. Außerdem geht es um Pivot-Tabellen, die in OpenOffice Datenpilot-Tabellen heißen. Und am Ende spielen wir – mit Hilfe einer Wenn-Funktion – ein Nullsummenspiel mit Ihnen.
  • Datenbanken mit Rekall
    Wer schielt da neidisch auf MS Access? Mit Rekall lassen sich PostgreSQL- und MySQL-Datenbanken einfach verwalten.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...