![]() |
Datenbank: Paradox • Zugriff über: aus BC++ heraus
Paradox DB: YEAR-Funktion geht nicht
Hallo,
ich hab mir in Access ein SQL-Statement gebastelt und würde das gerne auf eine Paradox-Datenbank anwenden. Leider kalppt es nicht, gibt es eine ähnliche Funktion wie in Access für die YEAR-Funktion: Das ist mein SQL-Statement: SELECT DISTINCT Max(Konto_Stand.Stichtag) AS MaxvonStichtag, Sum(Konto_Stand.Umsatz) AS [Summe von Umsatz] FROM Konten LEFT JOIN Konto_Stand ON Konten.LftNr=Konto_Stand.LftNr_Konto WHERE (((Konten.Kunden_Nr)=1) AND ((Konto_Stand.Stichtag)<#6/30/2005#)) GROUP BY Year(Konto_Stand.Stichtag) ORDER BY Max(Konto_Stand.Stichtag); Wäre um jede Hilfe dankbar...greife aus einer BC++ - Anwendung darauf zu. Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Herzlich willkommen in der Delphi-PRAXiS, chullain.
Halte mal Ausschau nach der eingebauten Funktion EXTRACT:
SQL-Code:
Freundliche Grüße vom marabu
EXTRACT(YEAR FROM datum)
|
Re: Paradox DB: YEAR-Funktion geht nicht
Hallo,
vielen Dank auf jeden Fall schon mal. Habe das SQL-Statement ausgeführt und kriege die Fehlermeldung: Project .... raised exception class EDBEngineError with message 'Capability not supported' weiss irgendwie nix mit anzufangen, das Statement sieht jetzt so aus: SELECT DISTINCT Max(Konto_Stand.Stichtag) AS MaxvonStichtag, Sum(Konto_Stand.Umsatz) AS [Summe von Umsatz] FROM Konten LEFT JOIN Konto_Stand ON Konten.LftNr=Konto_Stand.LftNr_Konto WHERE (((Konten.Kunden_Nr)=1) AND ((Konto_Stand.Stichtag)<#6/30/2005#)) GROUP BY EXTRACT(YEAR FROM Konto_Stand.Stichtag) ORDER BY Max(Konto_Stand.Stichtag); Gruss, art1978 |
Re: Paradox DB: YEAR-Funktion geht nicht
In Access werden unorthodoxe Bezeichner in eckige Klammern verpackt, die BDE verlangt Quotes erlaubt keine Leerstellen in Korrelationsnamen. Die Datumsangaben machst du sicherer per Parameter und auf jeden Fall nicht so wie in Access. Habe es nicht getestet, aber vielleicht sind so weniger Syntaxfehler im Statement:
SQL-Code:
Überprüfen müsste man noch, ob die Bedingung "kleiner" in der WHERE-Klausel nicht "kleiner oder gleich" sein müsste, welchen Effekt DISTINCT bei deiner Abfrage hat und ob du wirklich einen OUTER JOIN brauchst.
SELECT DISTINCT MAX(ks.Stichtag) AS MaxvonStichtag, SUM(ks.Umsatz) AS UmsatzSumme
FROM Konten k LEFT JOIN Konto_Stand ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.Stichtag < :stichtag GROUP BY EXTRACT(YEAR FROM ks.Stichtag) ORDER BY MAX(ks.Stichtag) Nachtrag: Wenn du nach Jahren gruppieren möchtest, dann sollte das Jahr auch in der Spaltenauswahl auftauchen. Noch ein Nachtrag: Die BDE lässt in der GROUP BY-Klausel nur "echte", keine "berechneten" Spalten zu. Du wirst da mit einer BDE-View arbeiten müssen:
SQL-Code:
Danach sollte das hier funktionieren:
/* ksview.sql */
SELECT LftNr_Konto, Stichtag, Umsatz, EXTRACT(YEAR FROM Stichtag) as Jahr FROM Konto_Stand
SQL-Code:
Übrigens würde sich dein Thema unter der Rubrik Datenbanken wohler fühlen. Wenn LftNr als Abkürzung für Lauf-Ente Nr steht, dann hoffe ich für dich, dass kein Tierschützer mitliest.
SELECT ks.Jahr, MAX(ks.Stichtag) AS Stichtag, SUM(ks.Umsatz) AS Umsatz
FROM Konten k LEFT JOIN "ksview.sql" ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.stichtag < :stichtag GROUP BY jahr ORDER BY jahr marabu |
Re: Paradox DB: YEAR-Funktion geht nicht
Hi,
vielen Dank für die erstklassige Hilfe, nur v. stell ich mich zu doof an, aber wie kann ich die SQL-Datei am Besten einbinden. So wie in Deinem Beispiel funktioniert das auf jeden Fall nicht (sorry, kann noch nicht viel in BDE) Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Zitat:
Zitat:
|
Re: Paradox DB: YEAR-Funktion geht nicht
Hallo, das Problem ist, das ich einen Datenmodul eingebunden hab, und dort ein TQuery eben, dieses TQuery, fülle ich dann mit SQl aus der Source heraus auf, etwa so:
DataModule1->Q2_SQL->SQL->Add("Select..."ksquery.sql"...GROUP BY Jahr") Dann meckert er mir natürlich diese SQL-Datei an... Zu Deiner Frage, ob ich mir das nochmal antun sollte mit dem BDE, ist halt ein älteres Projekt, und das soll jetzt aufgefrischt werden, und das ist halt mit BDE entwickelt worden. Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Zitat:
Code:
oder ihn da zur Laufzeit reinladen.
DataModule1->Q2_SQL->SQL->Text := "Select...");
Code:
DataModule1->Q2_SQL->SQL->LoadFromFile("ksquery.sql");
|
Re: Paradox DB: YEAR-Funktion geht nicht
d.h. nach dem Befüllen der Eigenschaft, wie rufe ich dann mein "richtiges" SQL-Statement auf?
Also einmal;
Code:
und dann
DataModule1->Q2_SQL->SQL->Text("
SELECT LftNr_Konto, Stichtag, Umsatz, EXTRACT(YEAR FROM Stichtag) as Jahr FROM Konto_Stand ");
Code:
Danke Dir
DataModule1->Q2_SQL->SQL->Add("
SELECT ks.Jahr, MAX(ks.Stichtag) AS Stichtag, SUM(ks.Umsatz) AS Umsatz FROM Konten k LEFT JOIN ????? ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.stichtag < :stichtag GROUP BY jahr ORDER BY jahr") |
Re: Paradox DB: YEAR-Funktion geht nicht
Code:
Was meinst du mit "richtigem" Statement?
d.h. nach dem Befüllen der Eigenschaft, wie rufe ich dann mein "richtiges" SQL-Statement auf?
Code:
Willst du die beiden Abfragen zusammenjoinen?
DataModule1->Q2_SQL->SQL->Text := "
SELECT LftNr_Konto, Stichtag, Umsatz, EXTRACT(YEAR FROM Stichtag) as Jahr FROM Konto_Stand "; |
Re: Paradox DB: YEAR-Funktion geht nicht
ja, ich mein, wenn ich die Text-Variable mit meinem "SubSelect" befüllt habe, dann muss ich ja die Add-Funktion aufrufen, und dort mein Hautp-Sql-Statement mit dem Outer Join aufrufen, oder?
Also den hier:
Code:
...nur was kommt an die Stelle mit den Fragezeichen (????) ?
DataModule1->Q2_SQL->SQL->Add("
SELECT ks.Jahr, MAX(ks.Stichtag) AS Stichtag, SUM(ks.Umsatz) AS Umsatz FROM Konten k LEFT JOIN ????? ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.stichtag < :stichtag GROUP BY jahr ORDER BY jahr") Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Wie stehen diese beiden Abfragen im Verhältnis?
|
Re: Paradox DB: YEAR-Funktion geht nicht
Hallo ihr zwei beiden,
ihr entfernt euch immer weiter von der Lösung des Problems, welche ich in Beitrag #4 beschrieben habe - das Schlüsselwort ist BDE-View. Local-SQL kennt keine Views wie Standard-SQL, aber durch den Trick mit dem Speichern eines SELECT-Statements in einer SQL-Datei und die Einbindung dieser SQL-Datei als Tabellenreferenz werden Views "möglich". Mich würde interessieren, welcher Fehler genau gemeldet wird. Es muss sich auf jeden Fall um einen Laufzeitfehler handeln und ich vermute, dass die SQL-Datei KSVIEW.SQL nicht an der erwarteten Stelle steht. Freundliche Grüße vom marabu |
Re: Paradox DB: YEAR-Funktion geht nicht
Hallo,
also wenn ich diesen SQL-Statement absetzte:
SQL-Code:
Dann in der Form:
SELECT ks.Jahr, MAX(ks.Stichtag) AS Stichtag, SUM(ks.Umsatz) AS Umsatz
FROM Konten k LEFT JOIN "ksview.sql" ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.stichtag < :stichtag GROUP BY jahr ORDER BY jahr
Code:
dann bekomme ich schon mal die Fehlermeldung: ...Function call missing ) , klar, weil ich mit den Hochkommata das Select-Statement zumache und dann erwartet der Compiler, das Schliessen der Funktion Add mit der Klammer )
DataModule1->Q2_SQL->SQL->Add("Select..."ksview.sql"...");
Meine Frage, ist wie kann ich diess Datei einbinden, so wahrscheinlich ist es total verkehrt... Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Hi Chullain. :hi:
Zitat:
So geht's hoffentlich:
Code:
(man beachte den dezenten Backslash ;-) )
DataModule1->Q2_SQL->SQL->Add("Select...\"ksview.sql\"...");
Gruß, Waldteufel |
Re: Paradox DB: YEAR-Funktion geht nicht
ok, vielen Dank erstmal, die Lösung kann manchmal so einfach sein, jetzt kriege ich aber die Fehlermeldung dass ...Expressions in group by are not supported...
Obwohl ich wie beschrieben, die SQL Statements aufgebaut habe:
SQL-Code:
/* ksview.sql */
SELECT LftNr_Konto, Stichtag, Umsatz, EXTRACT(YEAR FROM Stichtag) as Jahr FROM Konto_Stand SQL-Code: markieren
SQL-Code:
Die Datei ist auf jeden Fall im richtigen Ordner
SELECT ks.Jahr, MAX(ks.Stichtag) AS Stichtag, SUM(ks.Umsatz) AS Umsatz
FROM Konten k LEFT JOIN "ksview.sql" ks ON k.LftNr = ks.LftNr_Konto WHERE k.Kunden_Nr = :kunden_nr AND ks.stichtag < :stichtag GROUP BY Jahr Gruss, chullain |
Re: Paradox DB: YEAR-Funktion geht nicht
Bitte prüfe die Korrektheit des SQL-Codes zuerst außerhalb deines Programms. Du kannst dazu den Database-Desktop von Borland verwenden oder jedes andere BDE-kompatible Werkzeug. Wenn ich mich recht erinnere, so hatte ich den SQL-Code bei mir getestet. Bei Fehlern innerhalb deines eigenen Programms kann ich dir nicht so gut helfen.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz