Differenz zweier Felder

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Differenz zweier Felder

Beitrag 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
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Differenz zweier Felder

Beitrag 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
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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?
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Differenz zweier Felder

Beitrag 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
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Differenz zweier Felder

Beitrag 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
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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.
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Differenz zweier Felder

Beitrag 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
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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.
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Differenz zweier Felder

Beitrag 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
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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...
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Re: Differenz zweier Felder

Beitrag 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
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Differenz zweier Felder

Beitrag von Barlee »

Hallo zummy,

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

Gruß Barlee
zummy
*
Beiträge: 18
Registriert: So, 18.02.2007 19:58

Re: Differenz zweier Felder

Beitrag 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.
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Differenz zweier Felder

Beitrag 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
Antworten