Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage funktioniert nicht (https://www.delphipraxis.net/9162-sql-abfrage-funktioniert-nicht.html)

FBrust 19. Sep 2003 13:38


SQL-Abfrage funktioniert nicht
 
Hallo,

ich habe (via Access 2000) die folgende SQL-Abfrage erstellt:

Code:
SELECT OP_MAIN.strRgMon, OP_MAIN.strWaste,
Count(OP_MAIN.strTrans) AS AnzTrans,
OP_MAIN.strTrans,
Sum(OP_MAIN.dblWeight) AS Gewicht,
OP_MAIN.dblPrDisp,
Sum(OP_MAIN.dblDispSum) AS Entsorgung,
Sum(OP_MAIN.dblTransSum) AS Transport,
Sum(OP_MAIN.dblSpecSum) AS Sonderposten,
Sum(OP_MAIN.dblFeeSum) AS Gebühren,
Sum(OP_MAIN.dblSurChargeSum) AS Zuschlag,
SD_ADRESS.strName,
SD_EN_VE.strVE3_1_2,
SD_EN_VE.strVE3_1_4,
SD_EN_AE.strAE1_1_1,
SD_EN_AE.strAE1_3_2
FROM (OP_MAIN
INNER JOIN (((SD_EN
INNER JOIN SD_EN_AE ON SD_EN.ID = SD_EN_AE.ID_Link)
INNER JOIN SD_EN_VE ON SD_EN.ID = SD_EN_VE.ID_Link)
INNER JOIN SD_EN_PR ON SD_EN.ID = SD_EN_PR.ID_Link) ON OP_MAIN.intENID = SD_EN.ID)
INNER JOIN SD_ADRESS ON OP_MAIN.strTrans = SD_ADRESS.strShortName
GROUP BY OP_MAIN.strRgMon, OP_MAIN.strWaste, OP_MAIN.strTrans,
OP_MAIN.dblPrDisp, SD_ADRESS.strName, SD_EN_VE.strVE3_1_2,
SD_EN_VE.strVE3_1_4, SD_EN_AE.strAE1_1_1, SD_EN_AE.strAE1_3_2
ORDER BY OP_MAIN.strWaste;
Diese Abfrage funktioniert in Access einwandfrei, aber wenn ich versuche, sie in D5 zu aktivieren, erhalte ich die Fehlermeldung "Ungültiger Parameter" ohne Hinweis auf Zeilennummer etc.

Weiss jemand warum?

BTW: Kennt jemand ein Tool, mit dem man SQL-Abfragen erstellen kann, die auch Delphi-konform sind?

Grüße
Frank

r_kerber 19. Sep 2003 16:12

Re: SQL-Abfrage funktioniert nicht
 
Hallo Frank,

ist diese Abfrage auch für ACCESS gedacht?

Bei Delphi gibt's den Datenbank-Desktop. Mit QBE kannst Du da auch Abfragen erzeugen und Dir anschließend den SQL-Befhl anschauen. ob aber so etwas geht? Diese vielen Inner-Joines. Typisch ACCESS.

Alfons_G 19. Sep 2003 16:40

Re: SQL-Abfrage funktioniert nicht
 
FBrust hat ja geschrieben, dass die Abfrage in Access einwandrei geht. Über QBE kann man LocalSQL für die BDE generieren - die Feinheiten von Access oder anderen Systemen kann man so nicht ausnutzen.
Ich konnte jetzt keine Fehler entdecken, welche Delphi irrtümlicherweise dazu veranlassen würden, in dieser Query einen Parameter zu suchen. :roll:

Sind in der Query-Komponente auch keine Parameter-Daten eingetragen? Wie wird die Abfrage zugewiesen? Einfach MeineQuery.SQL.Add ?

Ich kann jedenfalls so nichts sehen, was nicht stimmen würde. Eine Zeilennummer wird übrigens in diesem Fall nie ausgegeben, da Access aus Abfragen bei Fehlern keine Zeilen zurückgibt im Gegensatz z.B. zu Oracle.

:coder:

FBrust 19. Sep 2003 17:10

Re: SQL-Abfrage funktioniert nicht
 
Hallo,

danke für Eure Antworten.

In der Abfrage sind keine Parameterdaten eingetragen (Params) und die Abfrage stand als Text in der SQL-Eigenschaft.

Also, die Abfrage war für Delphi gedacht. Das Entwickeln von SQL-Abfragen geht mit Access wesentlich einfacher als mit Delphi, aber ich werde wohl zukünfigt auch die QBE-Abfrage vom Database Desktop verwenden.

Ich habe jetzt den halben Nachmittag damit verbracht, den Fehler nicht zu finden :) . Zum Schluß habe ich die Abfrage so umgebaut, dass sie funktioniert. Das Problem lag wohl bei den Inner Join-Anweisungen (vielleicht zuviele?).

Interessanterweise lässt sich auch die vereinfachte Abfrage nicht mittels HAVING-Klausel weiter filtern. Das musste ich im Programm über das
Setzen der Filter-Eigenschaft tun.

Hauptsache, es funktioniert jetzt!


Trotzdem: Danke für Eure Hilfe.

Grüße

Frank

r_kerber 20. Sep 2003 12:53

Re: SQL-Abfrage funktioniert nicht
 
Hallo,

@Alfons_G: Frank hat geschrieben, dass er die Abfrage mit ACCESS erstellt hat. Man kann so auch Abfragen auch auf Informix oder Oracle-DBs erstellen. Nur verwendet ACCESS eine "Special"-SQL, so das dies generierten SQL-Statements auf anderen DBs nicht funktionieren (Inner-Joins!).
QBE erstellt zwar Abfragen für die LocalSQL. Da diese aber eine Teilmenge von SQL92 ist, sollten diese SQL-Statements auch für alle anderen DBs funktionieren.

@Frank: Welches war nun eigentlich die Zieldatenbank?

FBrust 20. Sep 2003 12:57

Re: SQL-Abfrage funktioniert nicht
 
Hallo Rainer,

die Zieldatenbank war die BDE. Aber, wie gesagt, ich werde in Zukunft die SQL-Statements mit dem Database-Desktop erzeugen, um mehr Kompatibilität zu erreichen, denn es waren gerade die Inner Joins, die hier die Probleme verursacht haben.

Gruß
Frank

r_kerber 20. Sep 2003 13:08

Re: SQL-Abfrage funktioniert nicht
 
Zitat:

Zitat von FBrust
die Zieldatenbank war die BDE.

BDE ist keine Datenbank sondern nur eine Zugriffschicht. Ich Du mußt noch irgendeine Datenbank dahinter stehen haben (Paradox, dBase, ORACLE, Informix, ...). Ach noch ein Hinweis, bei den Enterprise-Versionen von Delphi kannst Du den SQL-Builder der TQuery nutzen! Ob der auch bei allen Prof-Versionen bei ist, weiß ich nicht. Bei D7 Prof habe ich ihn gerade nachinstalliert!

FBrust 20. Sep 2003 16:22

Re: SQL-Abfrage funktioniert nicht
 
Hallo Rainer,

die Datenbank war/ist Paradox.

Ist der SQLBuilder denn bei D7 Prof dabei? Ich arbeite momentan mit Delphi 5 Professional und "damals" war der Builder nur bei der Enterprise-Version
dabei.

Gruß
Frank

r_kerber 20. Sep 2003 16:29

Re: SQL-Abfrage funktioniert nicht
 
Zitat:

Zitat von FBrust
Ist der SQLBuilder denn bei D7 Prof dabei?

Ja, muß allerdings von der CD nachinstalliert werden (erfolgt automatisch bei erstem Nutzungsversuch). Ist auch kein selbständiges Programm sondern ist integriert in TQuery (recht Maustaste und dann im Popup-Menü auswählen).

Captnemo 20. Sep 2003 16:48

Re: SQL-Abfrage funktioniert nicht
 
Hallo BFrust,

ich habe auch gerade ne Access-DB am Start (wobei ich jetzt nicht ganz weiß, ob sich dein Prob auf eine Access-DB oder eine Paradox-DB bezieht), bei der ich auch einige Probleme dieser Art hatte.

In diesen beiden SQL-Beispielen, die denen ich mit Delphi über ADO eine Access-DB erfolgreich abfrage, hatte ich zuerst auch den gleichen Fehler. Unter Access funzt es, aber der gleiche Syntax in einem ADOQuery - Geht nicht.

Nach dem ich dann etwas rumexperimentiert hatte, funktionierten diese beiden Abfragen.

SQL-Code:
Select
Artikel.ID as ArtID,
Artikel.Artikelnr as ArtNr,
Artikel.Artikelname as Name,
Adressenliste.Name as Lieferant,
Std_Art_Gruppen.Wert as Kategorie,
Std_VPE.Wert as VPE,
Artikel.Einzelpreis as preis,
Artikel.Lagerbestand as bestand,
Artikel.BestellteEinheiten as bestellt
from
(
  (
    Artikel Left JOIN Adressenliste ON Artikel.Adr_ID=Adressenliste.ID
  )
  Left JOIN Std_VPE ON Artikel.VPE_ID=Std_VPE.ID
)
Left JOIN Std_Art_Gruppen ON Artikel.Kat_ID=Std_Art_Gruppen.ID
Order by Artikel.Artikelname
SQL-Code:
Select * from
(
  Select Kasse.ID as KID,
  Kasse.Belegdatum as KDatum,
  Kasse.Betrag as KBetrag,
  Kasse.Einnahme as KEinnahme,
  Std_Kasse_Konto.Kontoname as SKontoname,
  Std_Kasse_Konto.Kontonummer as SKontonummer,
  Kasse.Beschreibung as KBeschreibung
  from Kasse
  left join Std_Kasse_Konto ON Kasse.Konto_ID=Std_Kasse_Konto.ID
)
Where
Month(KDatum)=6 and
Year(KDatum)=2003 
Order by KDatum, KID
Ich hab jetzt zwar nicht wirklich einen grundlegenden Unterschied zu deiner Abfrage erkannt, aber vielleicht findest du ja den Unterschied oder den Anstoß, warum es nicht gleich funktioniert.

Ich hätte ja jetzt deine Abfrage mal ausprobiert, aber ohne die Datenbank ist das bei der Komplexität schwer möglich. Wäre eine Herausforderung :mrgreen:

FBrust 20. Sep 2003 18:14

Re: SQL-Abfrage funktioniert nicht
 
Hallo Captnemo,

ich habe später die obige Abfrage stark vereinfacht (der INNER JOIN von OP_MAIN auf SD_EN war unnötig), danach gings. Manchmal denkt man eben zuerst um 3 Ecken und dann geradeaus... :wall:

Aber nachdem sich hier herausgestellt hat, dass das SQL von Access nicht unbedingt kompatibel zu dem von LocalSQL ist, werde ich wie gesagt, zukünftig darauf verzichten.

Ausserdem steige ich demnächst auf D7 Prof. um und kann dann den SQLBuilder benutzen.

Grüsse
Frank

r_kerber 20. Sep 2003 18:50

Re: SQL-Abfrage funktioniert nicht
 
@Captnemo: Befehle wie Inner join, left join, ... gibt es nun mal nicht in jeder DB. Ich bin mir jetzt auch nicht ganz sicher, ob das überhaupt SQL-Standard ist. ACCESS ist sowieso ein wenig special. Ich denke da nur an das Wildcard-Zeichen in LIKE-Abfragen. Bei ACCESS ist das * in SQL %. Ein SQL-Statement, das LIKE enthält und mit ACCESS generiert wurde läuft somit mit keiner anderen SQL-Datenbank!

Captnemo 20. Sep 2003 19:15

Re: SQL-Abfrage funktioniert nicht
 
Och, dieses Sonderverhalten trifft bei Access auch auf Datumswerte zu.

Aber die JOINS gehören glaube ich zum SQL-97-Standard, glaube ich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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