Seite 1 von 2

Differenz zweier Felder

Verfasst: Mo, 26.10.2009 17:01
von zummy
Hallo,

ich versuche, eine Access-Abfrage in Base zu portieren. In Access habe ich ein Felder, in welchem die Differenz der Felder "Ausdr1" und "Ausdr2" berechnet wird. Gibt es so eine Funktion auch in Base?

Hier der SQL-Code aus Access:

Code: Alles auswählen

SELECT Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, [Ausdr2]-[Ausdr3] AS Betrag, IIf([Einnahme] Is Not Null,[Einnahme],0) AS Ausdr2, IIf([Ausgabe] Is Not Null,[Ausgabe],0) AS Ausdr3
FROM Kassenbuch INNER JOIN Kontostand ON Kassenbuch.Kasse = Kontostand.Konto
GROUP BY Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, IIf([Einnahme] Is Not Null,[Einnahme],0), IIf([Ausgabe] Is Not Null,[Ausgabe],0)
HAVING (((Kassenbuch.Datum)>Max([kontostand].[datum])));
Im Feld "Betrag" zeigt mir Access also die Differenz an.

Base gibt mir folgende Fehlermeldung:
Syntax error in SQL expression
Oder liegt es an den Funktionen in den Felder "Ausdr1" und "Ausdr2"?

Weiß jemand, wo der Fehler liegt?

Danke schonmal
zummy

Re: Differenz zweier Felder

Verfasst: Di, 27.10.2009 00:05
von AndreasJBittner
Hallo,

ja, so siehts aus. Woher soll OOo den wissen, was [Ausdr1] oder [Ausdr2] ist? Du mußt mal nachsehen, was sich dahinter verbirgt und das direkt eintragen. Irgendwo in Deiner MDB steht "... AS AUSDR1" und das mußt Du an die Stelle setzen.

Grüße
Andreas

Re: Differenz zweier Felder

Verfasst: Di, 27.10.2009 00:14
von zummy
Danke für die Antwort!

Aber ergibt sich nicht aus dem SQL-Code, was "Ausdr1" und "Ausdr2" ist? Ich habe doch in der Abfrage Felder mit genau diesen Namen definiert. Wieso erkennt Base die nicht?

Re: Differenz zweier Felder

Verfasst: Di, 27.10.2009 01:39
von AndreasJBittner
Ei wo dann????

da steht ... Kassenbuch.Kasse, [Ausdr2]-[Ausdr3] AS Betrag, IIf([Einnahme]... und wo bitte sind Ausdr2 und ~1 *definiert*? sie sind aufgeführt, aber nicht definiert (Ausdr1 := max(Einnahme); ausdr2 := min(Einnahme)).

Grüße
Andreas

Re: Differenz zweier Felder

Verfasst: Di, 27.10.2009 14:58
von zummy
Ich dachte, da:

Code: Alles auswählen

IIf([Einnahme] Is Not Null,[Einnahme],0) AS Ausdr2, IIf([Ausgabe] Is Not Null,[Ausgabe],0) AS Ausdr3
Jedenfalls habe ich es jetzt wie folgt umgestellt:

Code: Alles auswählen

SELECT Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, Ausdr2 := IIf([Einnahme] Is Not Null,[Einnahme],0), Ausdr3 := IIf([Ausgabe] Is Not Null,[Ausgabe],0), [Ausdr2]-[Ausdr3] AS Betrag
FROM Kassenbuch INNER JOIN Kontostand ON Kassenbuch.Kasse = Kontostand.Konto
GROUP BY Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, IIf([Einnahme] Is Not Null,[Einnahme],0), IIf([Ausgabe] Is Not Null,[Ausgabe],0)
HAVING (((Kassenbuch.Datum)>Max([kontostand].[datum])));
Der Fehler bleibt leider der gleiche:
Syntax error in SQL expression

Re: Differenz zweier Felder

Verfasst: Di, 27.10.2009 19:21
von Barlee
Hey zummy,

"Iif" ist Access Syntax. Nimm stattdessen CASE ... WHEN ... THEN ... END.
Dazu gibt es hier im Forum schon eine Menge Beispiele.

Gruß Barlee

Re: Differenz zweier Felder

Verfasst: Sa, 31.10.2009 12:35
von zummy
Dies ist mein nächster Versuch. Der Fehler bleibt derselbe.

Code: Alles auswählen

SELECT Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, 
CASE WHEN "Einnahme" IS NOT Null THEN "Einnahme" ELSE 0 AS Ausdr2, 
CASE WHEN "Ausgabe" IS NOT Null THEN "Ausgabe" ELSE 0 AS Ausdr3, 
[Ausdr2]-[Ausdr3] AS Betrag
FROM Kassenbuch INNER JOIN Kontostand ON Kassenbuch.Kasse = Kontostand.Konto
GROUP BY Kassenbuch.Datum, Kassenbuch.Zweck, Kassenbuch.Kasse, IIf([Einnahme] Is Not Null,[Einnahme],0), IIf([Ausgabe] Is Not Null,[Ausgabe],0)
HAVING (((Kassenbuch.Datum)>Max([kontostand].[datum])));
Wann setze ich eckige Klammern um Felder und wann Anführungszeichen? Ist das äquivalent?

Ich kenne mich leider nicht gut mit SQL aus. Ich dachte immer, SQL-Syntax wäre überall gleich. Aber stattdessen lauten die Befehle in Access anders als in OOo Base? Finde ich irgendwo eine Übersicht? Meine Recherche war leider erfolglos.

Re: Differenz zweier Felder

Verfasst: Sa, 31.10.2009 14:53
von Barlee
eine Funktionsübersicht findest Du z.B. hier
http://wiki.services.openoffice.org/wik ... Procedures
Wann setze ich eckige Klammern um Felder und wann Anführungszeichen? Ist das äquivalent?
Du setzt immer Anführungszeichen. Und zwar um alle Tabellennamen, Spaltenbezeichner, Aliase. Bei Verwendung von z.B. CASE WHEN musst Du zusätzlich noch unter "Bearbeiten" >> "SQL Kommando direkt ausführen" aktivieren
---

Dein SQL kann also schon aus dem Grund nicht funktionieren. Auch musst Du CASE WHEN in die GROUP BY Klausel übernehmen. IIF gibt es nunmal nicht in OOBase. Und CASE WHEN schließt mit END ab. Auch das fehlt.
Zu welcher Tabelle gehören "Einnahme" und "Ausgabe"? Zu "Kontostand" oder zu "Kassenbuch"? Das geht aus Deinem SQL nicht hervor.
Daher kannst Du folgendes auch nur als Beispiel betrachten:

Code: Alles auswählen

SELECT 
"Kassenbuch"."Datum", "Kassenbuch"."Zweck", "Kassenbuch"."Kasse",
CASE WHEN "Einnahme" IS NOT NULL THEN "Einnahme" ELSE 0 END AS "Ausdr2",
CASE WHEN "Ausgabe" IS NOT NULL THEN "Ausgabe" ELSE 0 END AS "Ausdr3",
CASE WHEN "Einnahme" IS NOT NULL THEN "Einnahme" ELSE 0 END - CASE WHEN "Ausgabe" IS NOT NULL THEN "Ausgabe" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."Kasse" = "Kontostand"."Konto"
WHERE "Kassenbuch"."Datum" > (SELECT MAX("Kontostand"."Datum") FROM "Kontostand")
Gruß Barlee

Re: Differenz zweier Felder

Verfasst: So, 01.11.2009 16:08
von zummy
Hallo barlee,

vielen Dank für deine Hilfe!

Jetzt funktioniert es schon fast:

Code: Alles auswählen

SELECT
SELECT
"Kassenbuch"."DATUM", "Kassenbuch"."ZWECK", "Kassenbuch"."KASSE",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END AS "Ausdr2",
CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Ausdr3",
CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
FROM "Kassenbuch" INNER JOIN "Kontostand" ON "Kassenbuch"."KASSE" = "Kontostand"."KONTO"
WHERE "Kassenbuch"."DATUM" > (SELECT MAX("Kontostand"."DATUM") FROM "Kontostand")
Die Definitionen von "Ausdr2" und "Ausdr3" sind jetzt offenbar überflüssig, bzw. wird dieselbe CASE-Funktion bei "Betrag" nochmal ausgeführt. Ich bekomme es aber nicht hin, die Ergebnisse von "Ausdr2" und "Ausdr3" dort zu verwenden.

Code: Alles auswählen

"Ausdr2" - "Ausdr3" AS "Betrag"
funktioniert nicht. Ist aber nicht weiter schlimm, ich kann "Ausdr2" und "Ausdr3" ja einfach streichen.

Jetzt fehlt tatsächlich nur noch die Gruppierung. Im Moment taucht in der Abfrage jeder Datensatz so oft auf, wie der zugehörige Wert aus "Kassenbuch"."KASSE" in "Kontostand"."KONTO" auftaucht. Jedoch soll jeder Datensatz nur einmal in der Abfrage auftauchen. Wie formuliere ich diese Gruppierung und an welcher Stelle kommt sie in den Code? Diverse Versuche waren leider erfolglos.

Re: Differenz zweier Felder

Verfasst: So, 01.11.2009 17:36
von Barlee
Hallo zummy,

geht doch voran ...
Ich bekomme es aber nicht hin, die Ergebnisse von "Ausdr2" und "Ausdr3" dort zu verwenden.
Die Bezeichner "Ausdr2" und "Ausdr3" könntest Du erst in einem äußeren SELECT verwenden. Beispiel

Code: Alles auswählen

SELECT 
Spalte_A, 
Spalte_B, 
Spalte_A + Spalte_B AS Spalte_C
FROM Tab_1
Für das Ergebnis von Spalte_A + Spalte_B vergibst Du in voriger Abfrage den Alias "Spalte_C".
Führst Du die Abfrage aus, bekommst Du also eine Ergebnistabelle mit den Spalten "Spalte_A", "Spalte_B", "Spalte_C" zurück.
Fragst Du dieses Ergebnis erneut ab, kannst Du jetzt direkt den Alias angeben:

Code: Alles auswählen

SELECT a.Spalte_C FROM
(
SELECT 
Spalte_A, 
Spalte_B, 
Spalte_A + Spalte_B AS Spalte_C
FROM Tab_1
) a
In Deinem Fall musst Du somit statt

Code: Alles auswählen

"Ausdr2" - "Ausdr3" AS "Betrag"

folgendes verwenden:

Code: Alles auswählen

CASE WHEN "Kassenbuch"."EINNAHME" IS NOT NULL THEN "Kassenbuch"."EINNAHME" ELSE 0 END - CASE WHEN "Kassenbuch"."AUSGABE" IS NOT NULL THEN "Kassenbuch"."AUSGABE" ELSE 0 END AS "Betrag"
---
Wenn Du nur doppelte Einträge ausfiltern/vermeiden möchtest, dann sollte ein DISTINCT genügen.

Code: Alles auswählen

SELECT DISTINCT ...
Gruß Barlee

Re: Differenz zweier Felder

Verfasst: Do, 05.11.2009 00:27
von zummy
Vielen Dank, jetzt klappt alles :)

Ein kleines Problem stellt sich jetzt noch. Wo ist der Fehler in diesem Code?

Code: Alles auswählen

SELECT
"a_1_Ergebnis_unter"."KONTO",
"a_1_Ergebnis_unter"."KONTOSTAND" + CASE WHEN "a_1_Ergebnis_unter"."SUMME" IS NOT NULL THEN "a_1_Ergebnis_unter"."SUMME" ELSE 0 END AS "AKTUELL"
FROM "a_1_Ergebnis_unter" AS "a_1_Ergebnis_unter"
Die Fehlermeldung lautet:
Table not found in statement [...
Die Tabellen und Spalten exisitieren aber alle. Und das Häkchen bei "SQL-Kommando direkt ausführen" ist auch gesetzt...

Re: Differenz zweier Felder

Verfasst: Do, 05.11.2009 13:12
von pmoegenb
Hallo Zimmy,
auf die Schnelle ist die nachfolgende Syntax in jedem Fall fehlerhaft

IS NOT NULL

Stattdessen müsste es heißen

Code: Alles auswählen

NOT Feldname IS NULL

Re: Differenz zweier Felder

Verfasst: Do, 05.11.2009 17:56
von Barlee
Hallo zummy,

Groß-/ Kleinschreibung der Spalten und Tabellennamen ist korrekt?
Kontrolliere das nochmal.

Gruß Barlee

Re: Differenz zweier Felder

Verfasst: Do, 05.11.2009 18:38
von zummy
pmoegenb hat geschrieben:Hallo Zimmy,
auf die Schnelle ist die nachfolgende Syntax in jedem Fall fehlerhaft

IS NOT NULL

Stattdessen müsste es heißen

Code: Alles auswählen

NOT Feldname IS NULL
Das hat leider nichts geändert.

Die Tabellen- und Spaltennamen sind (incl. Groß-/Kleinschreibung) alle richtig.

Re: Differenz zweier Felder

Verfasst: Do, 05.11.2009 19:08
von Barlee
Hey zummy,

Syntax ist ok mit IS NOT NULL. Daran kann's nicht liegen.

Hast Du am Tabellennamen irgendwo ein Leerzeichen hinten oder vorne?
Schau nochmal nach unter Tabelle/umbenennen, ob sich ein solches dort versteckt.

Das sollte am Namen liegen. Irgendwo ist da eine Abweichung...

Gruß Barlee