Probleme mit Parameterabfrage

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Neujuenger2010
**
Beiträge: 20
Registriert: Mo, 25.10.2010 18:31

Probleme mit Parameterabfrage

Beitrag von Neujuenger2010 »

Hallo!

Ich habe eine Abfrage über "Abfrage in SQL-Ansicht erstellen" erstellt. Darin frage ich mit ":geschlecht" ein Parameter ab. Diese Parameterabfrage funktioniert jedoch nicht bei eingeschaltetem Modus "SQL-Kommando direkt ausführen". Abschalten kann ich diesen Modus jedoch nicht. Dann weigert sich Base, diese Abfrage zu speichern und bricht mit "Syntax Error in SQL-Expression" ab.

Wie führe ich jetzt diese Abfrage im "Normal/Base"-Modus aus, so dass auch das/der(?) Parameter abgefragt wird?
Gruss Neujuenger2010

OOo 3.2.1 auf Vista
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Probleme mit Parameterabfrage

Beitrag von DPunch »

Aloha

Um was für eine Abfrage handelt es sich denn?
Die Parameterabfrage funktioniert nicht mit eingeschaltetem "SQL-Kommando direkt ausführen", da sie von Base interpretiert und nur deshalb abgefragt wird, mit aktivierter Option umgehst Du aber genau das.
Du hast nun folgende Optionen:
a) Du ersetzt alle Sachen, die das direkte Ausführen des SQL-Kommandos benötigen, durch solche, die dies nicht tun (JOINS durch Unterabfragen z.B.)
b) Du erstellst eine Ansicht (View) aus Deiner Abrage (mit direkt ausgeführtem SQL) und machst auf diese wiederum Deine Parameterabfrage
Neujuenger2010
**
Beiträge: 20
Registriert: Mo, 25.10.2010 18:31

Re: Probleme mit Parameterabfrage

Beitrag von Neujuenger2010 »

Hallo!

Es ist die Abfrage aus dem "Einkaufsthread".

Halt mit dem Versuch, diese benutzerfreundlich zu modifizieren:

Code: Alles auswählen

Select
	"Einkauf"."Name",
	"Einkauf"."Einkaufsdatum",
	"Einkauf"."Einkauf"
From
	"Einkauf"
join
(SELECT "Einkauf"."Name", Max("Einkauf"."Einkaufsdatum") as LetzterEinkauf
	FROM "Einkauf" 
	GROUP BY "Einkauf"."Name" )
on "Einkauf"."Einkaufsdatum" = LetzterEinkauf

join "Kundendaten" on "Kundendaten"."Name" = "Einkauf"."Name"

where "Kundendaten"."Aktiv" = true and "Kundendaten"."Geschlecht" = 'männlich'
Mein Versuch war, 'männlich' in der letzten Zeile durch :Geschlecht zu ersetzen.

Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).

Hast Du einen Tipp wo/wie genau ich an meiner (und/oder Deiner) Lösung schrauben muss?

Danke im voraus!
Gruss Neujuenger2010

OOo 3.2.1 auf Vista
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Probleme mit Parameterabfrage

Beitrag von DPunch »

Aloha
Neujuenger2010 hat geschrieben:Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).
Das Problem in meinem Lösungsvorschlag ist lediglich der Kommentar - Base kann Kommentare nicht als solche interpretieren und spuckt deshalb die Fehlermeldung aus (sigh).
In Deinem Lösungsvorschlag wiederum ist das JOIN im Weg - Base versteht keine JOINS (sigh), diese funktionieren nur, wenn Base das parsen direkt der HSQLDB überlässt.

Die folgende Abfrage sollte das tun, was Dir vorschwebt (als Parametereingabe reicht ein "m" für "männlich" bzw "w" für "weiblich")

Code: Alles auswählen

    SELECT
       "a"."Name",
       "a"."Einkaufsdatum",
       "a"."Einkauf"
    FROM
       "Einkauf" "a", "Kundendaten"
    WHERE
       "a"."Name" = "Kundendaten"."Name"
       AND "Kundendaten"."Aktiv" = TRUE
       AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
       AND LOWER("Kundendaten"."Geschlecht") LIKE LOWER(:Geschlecht || '%')
    ORDER BY
       "Einkaufsdatum" DESC
Neujuenger2010
**
Beiträge: 20
Registriert: Mo, 25.10.2010 18:31

Re: Probleme mit Parameterabfrage

Beitrag von Neujuenger2010 »

Hallo!

O.K., das funktioniert perfekt!

Jetzt möchte ich nur noch verstehen, warum... :wink:

1. Frage
Was genau bewirkt

Code: Alles auswählen

"Einkauf" "a", 
und warum tust Du das? Wird hier die Tabelle "Einkauf" quasi dupliziert und die Dublette als "a" bezeichnet?


2. Frage

Warum greifst Du dann in

Code: Alles auswählen

"a"."Name",
       "a"."Einkaufsdatum",
       "a"."Einkauf"
       [....]
       "a"."Name" = "Kundendaten"."Name"
       [....]
       AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")

auf die Dublette zu?


3. Frage

Was bewirkt

Code: Alles auswählen

AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
?
Offenbar das gleiche, wie bei mir der JOIN - eine Ermittlung des Max-Datums bei gleichzeitiger Aggregation nach Kundenname.
Aber wieso steht das letzte "Name" in der Zeile "alleine" - ohne eine vorangehende "xyz". -Tabellenbezeichnung?

Ich bin grad etwas verwirrt.

Für etwas Nachhilfe wäre ich dankbar!
Gruss Neujuenger2010

OOo 3.2.1 auf Vista
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Probleme mit Parameterabfrage

Beitrag von DPunch »

Aloha

1.)
Was genau bewirkt

Code: Alles auswählen

"Einkauf" "a", 
und warum tust Du das? Wird hier die Tabelle "Einkauf" quasi dupliziert und die Dublette als "a" bezeichnet?
Das ist die abgekürzte Syntax für

Code: Alles auswählen

"Einkauf" AS "a"
Ich vergebe also lediglich einen Alias für die Tabelle "Einkauf", so wie man es auch bei Spalten machen kann

Code: Alles auswählen

SELECT "Einkaufsdatum" AS "Datum"
Für Zugriffe auf die Tabelle kann ich von da an das vergebene Alias verwenden. Bei "Einkauf" vielleicht erstmal nicht so wirklich beeindruckend, aber wenn man desöfteren mit Datenbanken arbeitet (vor allem solchen, die man nicht selber entworfen hat), kann es vorkommen, dass eine Tabellenname 20 oder mehr Zeichen hat - das ist nervig zu schreiben und auch nicht sonderlich übersichtlich für spätere Wartungs- / Anpassungsarbeiten an Abfragen.
Zudem hat das noch eine Bedeutung bei Deiner 3. Frage.

2.)
Warum greifst Du dann in (...) auf die Dublette zu?
S.o., es handelt sich nicht um eine Dublette, sondern um die Tabelle "Einkauf", die mit dem Alias "a" versehen ist.
Das "a"."Einkaufsdatum" wird simpel ausgedrückt bei der Auswertung des SQL-Statements wieder in "Einkauf"."Einkaufsdatum" zurückübersetzt

3.)
Was bewirkt

Code: Alles auswählen

 AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
Das Stichwort dazu ist "Korrelierte Unterabfragen" - im Internet wirst Du haufenweise Erklärungen dazu finden (z.B. MySQL Referenzhandbuch).
Antworten