Verwendung von Bedingungen in Abfragen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

rso
*
Beiträge: 12
Registriert: Di, 07.02.2006 00:25
Wohnort: Zürich, Schweiz

Verwendung von Bedingungen in Abfragen

Beitrag von rso »

Hallo zusammen

Ich verwende OOo 2.0.1 Base und versuche verzweifelt in einer Abfrage, Bedingungen in der Form von sog. Ausdrücken (Sprachgebrauch von MS Access) in der Zeile 'Feld' einzugeben.

Inzwischen ist mir klar geworden, wie ich einfache Operationen eingebe, bspw. Multiplikationen mit folgenden Datenfeldern: "Menge" * "Preis".
So weit ist alles klar, da es nahezu gleich wie in MS Access funktioniert.

Möchte ich aber eine Bedingung eingeben, z.B. in der Form von

• Wenn("Menge">10;"Menge"*"Preis1";"Menge"*"Preis2")

kommt immer eine Fehlermeldung: Warnung! Die Spalte '...' ist unbekannt!

In MS Access funktioniert diese Bedingung in der folgenden Form problemlos:

• Ausdr1: Wenn([Menge]>10;[Menge]*[Preis1];[Menge]*[Preis2])

Kann mir hierbei jemand weiterhelfen und aufzeigen, wie solche Ausdrücke in OOo Base einzugeben sind, damit sie funktionieren?

Vielen Dank für die Unterstützung.
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Beitrag von pmoegenb »

Hallo rso,

im SQL-Dialekt gibt es kein Wenn sondern nur ein Where.

Es kann sein, dass MS, wie so oft, vom Standard-SQL abweicht.


Gruß

Peter
rso
*
Beiträge: 12
Registriert: Di, 07.02.2006 00:25
Wohnort: Zürich, Schweiz

Beitrag von rso »

Hallo Peter

Von welchem SQL-Dialekt sprichst Du? Gemäss der Documentation auf der Web-Site von hsqldb sind unter Chapter 9. SQL Syntax die folgenden Built-in Functions and Stored Procedures aufgelistet:

• CASE v1 WHEN v2 THEN v3 [ELSE v4] END

• CASE WHEN expr1 THEN v1[WHEN expr2 THEN v2] [ELSE v4] END

Da hsqldb die in OOo Base eingebettete Datenbank ist, nehme ich an, dass diese Funktion auch innerhalb von OOo Base zur Verfügung steht und nicht nur 'Where' gemäss dem SQL-Standard.

Aber abgesehen davon, meine Frage bezieht sich nicht auf die zulässigen Definitionen einer Abfrage in der SQL-Ansicht, sondern vielmehr auf die Eingabemöglichkeiten in der Entwurfsansicht einer Abfrage. Und dort kann man eben wie gesagt in MS Access - ähnlich wie in Excel - sog. Ausdrücke in der Form von 'Ausdr1: Wenn([Menge]>10;[Menge]*[Preis1];[Menge]*[Preis2])' eingeben. Diese Ausdrücke werden dann zwar auch in eine SQL-Syntax umgewandelt, aber ich finde, die Definition von Funktionen in der Entwurfsansicht ist für Excel- bzw. auch OOo Calc-geübte sehr viel einfacher und damit schneller anwendbar.

Wie siehst Du das?

Gruss
rso
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Beitrag von pmoegenb »

Hallo rso,
Von welchem SQL-Dialekt sprichst Du?
Nach dem bekannt ist von welcher DB zu schreibst, meine ich ANSI-92 SQL dieser Standard wird von HSQLDB unterstützt.
Da hsqldb die in OOo Base eingebettete Datenbank ist, nehme ich an, dass diese Funktion auch innerhalb von OOo Base zur Verfügung steht und nicht nur 'Where' gemäss dem SQL-Standard.
Falsch, Base reicht die SQL-Befehle nur an HSQLDB weiter. Versteht HSQLDB den Ausdruck Wenn nicht, erhält Base eine Fehlermeldung, die von Base an den Benutzer weitergegeben wird.

Gruß

Peter
rso
*
Beiträge: 12
Registriert: Di, 07.02.2006 00:25
Wohnort: Zürich, Schweiz

Beitrag von rso »

Hallo Peter

Besten Dank, nun ist mir das klar geworden mit dem Dialekt.

Aber zurück zu meiner anderen Frage: Wie kann ich in einer Abfrage ein neues berechnetes Datenfeld erzeugen und als 'Umsatz' bezeichnen, wenn sich dieses gemäss folgender Funktion aus anderen bestehenden Datenfeldern der zugrundeliegenden Tabelle ergibt?

=Wenn([Menge]>10;[Menge]*[Preis1];[Menge]*[Preis2])

Das ist mir nach wie vor nicht klar.

Kannst Du mir dabei weiterhelfen?

Vielen Dank.
Gruss
rso
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Beitrag von pmoegenb »

Hallo rso,

ich musste zunächst eine Test-DB aufbauen. Eigentlich müsste folgender Code funktionieren:

Code: Alles auswählen

select "Vorname","Nachname", "Gruppe", "Reader", "Betrag1","Betrag2","Betrag1" + "Betrag2"  as Summe
from "Test"
Where "Betrag1" >= 11
Tut er aber nicht. D.h., die Abfrage läuft fehlerfrei durch, liefert aber über für das berechnende Feld Summe kein Ergebnis. Ob hier noch ein Bug von Base vorliegt, kann ich nicht beurteilen.

Die Berechnung wird also bei der Select-Klausel und nicht in der Where-Klausel durchgeführt.

Wenn Du SQL-Befehle direkt eingibst musst Du Dich auf den SQL-Syntax beschränken, der z. B. keine deutschen Wörter kennt. Deutsche Wörter können lediglich an den sogenannten Frontends (MS-Access, Base) angegeben werden, die dann in SQL übersetzen.

Welche Angaben an den Frontends möglich sind, ist recht unterschiedlich. So werden z. B. Feldnamen bei MS-Acces als [Feldname] und bei Base als '"Feldname" angegeben.

Die Direkteingabe von SQL-Befehlen ist also, sofern man mit unterschiedlichen Datenbanken arbeitet, wesentlich einfacher, da man sich mit der Ausnahme der Spalten- und Tabellenname an den SQL-Standard halten kann.

Gruß

Peter
rso
*
Beiträge: 12
Registriert: Di, 07.02.2006 00:25
Wohnort: Zürich, Schweiz

Beitrag von rso »

Hallo Peter

Dein Code funktioniert bei mir bestens, aber es ist dennoch nicht die Lösung. Die Where-Bedingung filtert ja ganze Datensätze nach einem Kriterium, welches auf ein Datenfeld angewandt wird. Somit erscheinen nur noch die Datensätze, bei denen der Wert im gefilterten Datenfeld mit dem Filterkriterium übereinstimmt.

Meine Anforderung ist jedoch die, dass jeder Datensatz angezeigt werden soll und dass die Berechnung im berechneten Datenfed (s. unten) aufgrund einer Wenn-Bedingung erfolgen soll.

Beispiel:

Tabelle: Betrag1, Betrag2
Abfrage: Betrag1, Betrag2, Summe

wobei Summe: if(Betrag1>=10;Betrag1+Betrag2;0)

Beispiel für eine Auswertung:

ID_____Betrag1______Betrag2___Summe
1________10__________20________30
2________20__________30________50
3________ 9__________11________ 0

Meines Erachtens kann das nicht mit einer Where-Bedingung funktionieren, da in dem Fall der dritte Record nicht mehr erscheinen würde.

Sehe ich da was falsch?
Gruss
rso
rso
*
Beiträge: 12
Registriert: Di, 07.02.2006 00:25
Wohnort: Zürich, Schweiz

Beitrag von rso »

Heureka, ich hab's gefunden!

Die Lösung lautet: SELECT "ID", "Betrag1", "Betrag2", CASE WHEN "Betrag1">=10 THEN "Betrag1"+"Betrag2" ELSE 0 END AS "Summe" FROM "Tabelle"

Da aber Base dieses SQL-Statement nicht interpretieren kann, ist es nötig, die Funktion 'SQL-Kommando direkt ausführen' in der SQL-Symbolleiste zu aktivieren, damit das SQL-Statement direkt an die Datenquelle übergeben wird. Andernfalls erhält man folgende Fehlermeldung:

Syntax error in SQL expression
parse error, expecting `BETWEEN' or `IN' or `SQL_TOKEN_LIKE'

Ich wünsche viel Erfolg beim selber probieren.

Viele Grüsse und bis zum nächsten Mal.
Antworten