Tabellen Abfragen Geschätzte Lektüre: 9 Minuten Über Abfragen lassen sich Tabelleninhalte komfortabler als in der tatsächlichen Tabellenstruktur darstellen. Abfragen vereinfachen den Datenbank-Zugriff bei komplexen Abhängigkeiten verschiedener Tabellen. Abfragen sind als Datenbank-View realisiert, benötigen dort also keinen zusätzlichen Speicherplatz. Das Hinzufügen, Ändern und Löschen von Tabelleninhalten in einer Abfrage ist nicht möglich. Abfrage-Wizard Der Abfrage-Wizard besteht aus den folgenden fünf Reitern: SQL Das hier angegebene SQL-Statement wird beim Aufruf (Darstellung der Tabelleninhalte) dieser Abfrage verwendet. Speichern: Das SQL-Statement wird in Limbas gespeichert, die Daten für die grafische Darstellung im Abfrage-Editor werden NICHT abgeglichen. Prüfen: Das SQL-Statement wird ausgeführt um mögliche Fehler zu erkennen. Ist das Statement fehlerfrei, wird der Button anschließend grün angezeigt. Ansonsten erscheint die Fehlermeldung der Datenbank. Abfrage erstellen/ersetzen/löschen: Ist das Statement fehlerfrei, kann über diese Buttons das Datenbank-View erstellt/ersetzt/gelöscht werden. Veröffentlichen: Wurde das Datenbank-View erstellt, kann die Abfrage über diesen Button in Limbas veröffentlicht werden. Dadurch kann sie wie eine normale Limbas-Tabelle dargestellt (Formulare, Berichte) und berechtigt werden, hat jedoch einen begrenzten Funktionsumfang (Kein Hinzufügen/Ändern/Löschen von Datensätzen, keine Wiedervorlage). Wurde die Abfrage veröffentlicht, erscheint der Button grün. Soll die Abfrage nicht veröffentlicht werden, kann sie trotzdem als Basis für weitere Abfragen genutzt werden. Abfrage-Editor Der Abfrage-Editor ermöglicht über eine grafische Darstellung die vereinfachte Eingabe der SQL-Anweisung für die Abfrage. Der Arbeitsbereich des Abfrage-Editors unterteilt sich in einen oberen Bereich für die Darstellung der für die Abfrage verwendeten Tabellen bzw. Abfragen und deren Verknüpfungen einen unteren Bereich mit einer Tabelle, in der die Felder der zu generierenden Abfrage einzutragen sind. Dabei lässt sich die Reihenfolge der Felder per Drag&Drop verändern. Für jedes Feld der Abfrage werden, falls vorhanden, folgende Eigenschaften angezeigt: Feldname: Feldname in der referenzierten Tabelle bzw. Abfrage, bei manuellem Setzen des Abfrage-Feldes (siehe unten) ggf. auch Name der referenzierten Tabelle bzw. Abfrage und darauf auszuführende SQL-FunktionWird im Abfrage-Editor ein Feld mit dem gleichen Namen mehrmals verwendet, so muss jedes weitere Feld einen Alias erhalten. Tabellenname: Name der referenzierten Tabelle bzw. Abfrage, wenn das Abfrage-Feld per Drag&Drop gesetzt wurde (siehe unten) Mit einem Rechtsklick auf den Feldnamen öffnet sich ein erweiterter SQL-Editor mit Syntax-Highlighting. Alias: Spaltenüberschrift, die für dieses Abfrage-Feld verwendet Funktion: Ist eine der möglichen Funktionen (Gruppiert/Summe/Min/Max) ausgewählt, so wird diese auf das Abfrage-Feld ausgeführt. Dabei ist zu beachten, dass sich dies auch auf die anderen Abfrage-Felder auswirken kann. Sortierung: Die hier vorgenommene Einstellung ist eine Default-Sortierung. Sie wird in der LIMBAS-Benutzer-Ansicht nur verwendet, wenn dort beim Aufruf keine Sortierung angegeben ist. Werden hier mehrere Felder für die Sortierung eingestellt, so wird das Feld, das in dieser Tabelle am weitesten links eingetragen ist, priorisiert. Anzeigen: Bei gesetzter Option wird der Inhalt dieses Feldes beim Aufruf der Abfrage angezeigt (Feld wird in der SQL-Query im SELECT berücksichtigt). Bei nicht gesetzter Option kann der Inhalt nur für Funktionen, die Sortierung oder für Anzeige-Kriterien herangezogen werden. Kriterien: Die hier angegebenen Bedingungen werden in die WHERE-Klausel des SQL-Aufrufs eingefügt. Ein Datensatz wird beim Aufruf der Abfrage nur berücksichtigt, wenn der Inhalt dieses Feldes den Bedingungen entspricht. Wird hier ein Wert ohne expliziten Vergleichsoperator angegeben, wird der Feldinhalt automatisch auf Gleichheit (=) mit dem angegebenen Wert überprüft. Ansonsten muss ein Vergleichsoperator mit nachfolgenden Wert eingetragen werden. Bei Tastatur-Eingaben in den Feldern „Feldname“ und „Kriterien“ wird die entsprechende Zeile kurzfristig größer eingeblendet zu Lasten des oberen Arbeitsbereiches. Sobald die Eingabe in dem Feld beendet ist, erfolgt wieder die Darstellung mit ursprünglichen Größenverhältnissen. Folgende Aktionen können im Abfrage-Editor ausgeführt werden: Hinzufügen einer für die Abfrage zu verwendenden Tabelle bzw. Abfrage:Bei Klick mit der rechten Maustaste in den oberen Arbeitsbereich wird eine Liste mit allen momentan durch LIMBAS verwalteten Tabellen und Abfragen eingeblendet. Am Ende dieser Liste lässt sich einstellen, ob Systemtabellen in dieser Liste enthalten sein sollen oder nicht. Bei Klick mit der linken Maustaste auf eine der aufgelisteten Tabellen bzw. Abfragen, wird diese mit den zugehörigen Tabellen- bzw. Abfrage-Feldern als Block, der verschoben werden kann, in den oberen Arbeitsbereich eingefügt. Entfernen einer Tabelle bzw. Abfrage aus dem oberen Arbeitsbereich:Wird eine Tabelle bzw. Abfrage doch nicht für die zu erstellende Abfrage benötigt, kann diese per Mausklick auf das x-Symbol in der oberen rechten Ecke des entsprechenden Blocks entfernt werden. Felder aus zwei Tabellen bzw. Abfragen des oberen Arbeitsbereichs miteinander verknüpfen:Wird ein Tabellen- bzw. Abfrage-Feld per Drag&Drop auf ein Feld einer anderen Tabelle bzw. Abfrage geschoben, so wird eine Verknüpfung dieser beiden Felder erstellt. Dargestellt wird dies durch einen in beide Richtungen zeigenden Pfeil zwischen diesen Feldern. Entfernen / Einstellen der Art einer Verknüpfung:Bei Mausklick auf eine Pfeilspitze einer Verknüpfung wird ein Fenster zum Entfernen bzw. Einstellen der Art dieser Verknüpfung eingeblendet. Als Default-Einstellung wird ein INNER JOIN für die Verknüpfung angenommen. Speichern der Darstellung des oberen Arbeitsbereichs:Bei ENTER wird die Darstellung mit allen Positionen für die Tabellen und Verknüpfungen gespeichert Hinzufügen eines Abfrage-Feldes, das beim Aufruf angezeigt werden soll: Ein Tabellen- bzw. Abfrage-Feld, das aus dem oberen Arbeitsbereich per Drag&Drop auf die rechte freie Spalte der Tabelle des unteren Arbeitsbereiches gezogen wird, wird den Abfrage-Feldern hinzugefügt. Dabei werden die Default-Einstellungen dieses Feldes in der bisher freien Tabellenspalte eingetragen. Für weitere Abfrage-Felder wird eine neue leere Spalte hinzugefügt. Um Berechnungen, String-Manipulationen oder SQL-Funktionen auf Abfrage-Felder ausführen zu können, ist die Eingabe von Hand in die rechte, leere Spalte möglich. Dabei ist in der Zeile für den Feldnamen ggf. die auszuführende Funktion einzutragen und es muss die referenzierte Tabelle bzw. Abfrage mit angegeben werden. Die Zeile für den Tabellennamen bleibt in diesem Fall leer. Entfernen eines Abfrage-Feldes:Soll der Inhalt eines in der Tabelle des unteren Arbeitsbereiches eingetragenes Feldes doch nicht beim Aufruf der Abfrage angezeigt werden, kann dieses per Mausklick auf das entsprechende x-Symbol am rechten Rand der obersten Zeile entfernt werden. speichern: Aus den entsprechenden Einstellungen wird eine SQL-Anweisung generiert, die die des SQL-Reiters überschreibt. Restliche Buttons: Identisch wie im SQL-Reiter Vorschau Das Statement aus dem SQL-Reiter wird ausgeführt und dessen Ergebnis wird angezeigt. Optionen Zusatzoptionen ermöglichen spezielle Einstellungen für die Abfrage. Event Hier eingegebenes Javascript wird ausgeführt, wenn der Nutzer in der Listendarstellung der veröffentlichten Abfrage auf einen Datensatz doppelklickt. Es können auch PHP-Variablen (also auch das Ergebnis des Views) verwendet werden. Beispiele: Ausgabe eines Alerts alert('hello world'); Öffnen der Detailansicht eines Datensatzes einer anderen Tabelle. Für das Beispiel habe die Tabelle die ID 2 (>abid=2) und die Datensatz-ID (&ID=) sei im Ergebnis des Views im Feld mit ID 4 ($gresult[$gtabid][4][$bzm]) gespeichert. Siehe auch URL-Syntax document.location.href = 'main.php?action=gtab_change>abid=2&ID={$gresult[$gtabid][4][$bzm]}'; Öffnen des selben Datensatzes in einem neuen Fenster open('main.php?action=gtab_change>abid=2&ID={$gresult[$gtabid][4][$bzm]}', 'test', 'location=0'); Parameter In diesem Feld können PHP-Variablen für die parametrisierten Abfragen gesetzt werden. Sonderfall: Parametrisierte Abfragen Parametrisierte Abfragen erlauben es, das zugrundeliegende SQL-Statement vor der Ausführung dynamisch mit Werten zu füllen. Diese Werte werden durch PHP-Variablen in das Statement eingesetzt. Beispiel: SELECT kunden.id, kunden.name, kontakte.id, kontakte.name FROM kunden JOIN VERK_17e64eb8914c6 verk ON kunden.id = verk.id JOIN kontakte ON ( verk.verkn_id = kontakte.id AND kontakte.sprache = '" . $extension["params"]["language"] . "' ) Damit die Abfrage auf Korrektheit geprüft werden kann, müssen im Optionen-Tab für alle verwendeten PHP-Variablen Beispiel-Werte eingetragen werden: $extension["params"]["language"] = "deutsch"; Der Variablenname kann frei gewählt werden, jedoch sollten keine anderen PHP-Variablen überschrieben werden. Die Verwendung der $extension-Variable bietet sich an, da diese auch der achte Parameter der get_gresult Funktion ist. In einer Skript-Erweiterung kann somit leicht der Wert gesetzt werden: $extension = array(); $extension["params"]["language"] = $session["language"]; $gresult = get_gresult(42 /* view-id */, 1, null, null, null, null, null, $extension); Falls nicht die API genutzt wird sondern die Parameter in der GUI gesetzt werden sollen kann eine Global Variable benutzt werden. Diese kann Beispielsweise in der ext_gtab.inc definiert werden da diese Erweiterung vor der Abfrageausführung geladen wird. In unserem Beispiel müssen wir die Variable dann wie folgt in der Abfrage sowie der Definition anpassen: $GLOBALS["myExtension"]["params"]["language"]; Eine weitere Möglichkeit besteht darin in den Abfrageparametern die Variablen direkt z.B über eine eigene Funktion zu setzen. Die notwendige Funktion muss dazu in einer der Listen gtab* Erweiterungen vorhanden sein. (ext_gtab.inc, ext_gtab_erg.inc) $extension["params"] = myExt_getParams(); Ebenso können die Parameter direkt als Funktionsaufruf in die Abfrage integriert werden: SELECT... JOIN kontakte ON ( verk.verkn_id = kontakte.id AND kontakte.sprache = '" . myExt_getLanguage() . "' ) function myExt_getLanguage(){ return 'DE'; } Limbas behandelt die Abfrage erst als parametrisierte Abfrage, wenn das Parameter-Feld im Optionen-Tab nicht leer ist. Möchte man in einer Abfrage ohne Erweiterung die Parametrisierung benutzen, reicht es, $extension = 1; in das Parameter-Feld einzutragen. Primäres Schlüsselfeld Da Abfragen in der Regel eine Ergebnis-Schnittmenge aus verschiedenen Tabellen liefert existiert kein primärer Schlüssel wie in einer physischen Tabelle. Um mit Abfragen wie mit einer Tabelle arbeiten zu können wird aber ein Feld benötigt mit dem eine eindeutige Zuweisung zu den Ergebnisreihen möglich ist. Ist eine Abfrage veröffentlicht und kein primäres Schlüsselfeld definiert, wird versucht über einen Tabellen Pointer den richtigen Datensatz zu finden. Diese Zuweisung ist langsam und nur auf eine begrenzte Ergebnismenge anwendbar. Über die Tabellen/View Einstellungen kann der Feldname eines beliebigen Schlüsselfeldes eingetragen werden. Dieses Feld muß vom Typ Ganzzahl (z.B. INTEGER, LONGINT, BIGINT) sein. Besitzt die Abfrage kein eindeutiges Feld vom Typ Zahl kann man sich mit Hilfe mehrere Felder ein neues Feld zusammensetzen. Limbas unterstützt KEINE Text Schlüssel. Beispiele: select (extract( epoch from MYDATE ) || to_char(MYNUMBER, 'fm000000')) :: BIGINT as NEWID from MYVIEW select ( to_char(MYNUMBER1, 'fm100000') || MYNUMBER2 ) :: BIGINT as NEWID from MYVIEW