Entwickler-Ecke
Datenbanken - SQL-Abfrage über 2 Tabellen
colaka - Mo 01.11.10 23:02
Titel: SQL-Abfrage über 2 Tabellen
Hallo,
ich möchte den Tagesumsatz eines beliebigen Tages abfragen. Dazu habe ich einen DateTimePicker auf mein Formular platziert und will dann mit einem Klick auf einen Tag eine SQL-Abfrage starten, die mir den Tagesumsatz anzeigt. Das Problem für mich ist, daß die benötigten Werte in zwei verschiedenen Tabellen abgelegt sind. Das Rechnungsdatum ist in der Tabelle Rechnung, die über das Feld Rechnr mit der Tabelle Teile verknüpft ist.
Die Abfrage, die ich dazu geschrieben habe, sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| TagSumme.Close; TagSumme.SQL.Clear; TagSumme.SQL.Add('SELECT SUM(teile.artikelpreis*teile.menge) AS TagGesamt, rechnung.rechnr, teile.rechnr'); TagSumme.SQL.Add('FROM rechnung, teile'); TagSumme.SQL.Add('WHERE (datum = '''+DateToStr(DateTimePickerTag.Date)+''')'); TagSumme.SQL.Add('AND (rechnung.rechnr = teile.rechnr)'); TagSumme.SQL.Add('GROUP BY rechnung.rechnr, teile.rechnr'); TagSumme.Open; |
Doch das Ergebnis ist kein einzelner Wert (wie ich gehofft hatte), sondern die Menge aller Rechnungsbeträge von diesem Tag. Ich bräuchte sozusagen die Summe der obigen Abfrage.
Es wäre echt schön, wenn mir jemand auf die Sprünge helfen könnte.
Danke Ebi
bummi - Di 02.11.10 00:36
Lass rechnung.rechnr, teile.rechnr aus dem Select und der Gruppierung raus...
colaka - Di 02.11.10 08:19
Hallo,
danke für den Tipp, aber das funktioniert leider auch nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| TagSumme.Close; TagSumme.SQL.Clear; TagSumme.SQL.Add('SELECT SUM(teile.artikelpreis*teile.menge) AS TagGesamt'); TagSumme.SQL.Add('FROM teile, rechnung'); TagSumme.SQL.Add('WHERE (teile.rechnr = rechnung.rechnr)'); TagSumme.SQL.Add('AND (datum = '''+DateToStr(DateTimePickerTag.Date)+''')'); TagSumme.Open; |
Beim Starten des Formulars und beim Klick auf den DateTimePicker kommt die Fehlermeldung:
Ungültiges Schlüsselwort
Symbolstring: ,
Zeilennummer 3.
Irgendetwas mache ich da wohl noch falsch.
Danke Ebi
bummi - Di 02.11.10 09:16
Ich habe "leider" seit Jahren keine BDE mehr im Einsatz.
Nachdem der 1 SQL schon mal was geliefert hat, kann es der Join per Semikolon eigentlich nicht sein.
Die Meldung passt irgendwie gar nicht, hast Du versuchsweise das Datum + GRoup by Datum mal mit aufgenommen.
Ansonsten den SQL im DBexplorer mal durchspielen....
colaka - Di 02.11.10 09:37
Hallo,
das mit dem GROUP BY datum habe ich probiert, doch da kommt die gleiche Fehlermeldung.
Was ist denn der DBExplorer. Der scheint bei meinem Delphi nicht dabei zu sein oder wo ist der versteckt?
bummi - Di 02.11.10 09:42
Bin in einer Stunde in der Firma, such dann mal in einer VM, wie gesagt alles sehr lang her mit der BDE, sorry.
Tranx - Di 02.11.10 10:17
Vielleicht versuchst Du mal diese SQL-Abfrage:
SELECT Rechnung.datum, Sum([Teile].[Artikelpreis]*[Teile].[Menge]) AS TagGesamt
FROM Rechnung INNER JOIN Teile ON Rechnung.RechnNR = Teile.RechnNR
GROUP BY Rechnung.Datum
Wenn die einzelnen Bezeichner nicht genau stimmen, dann korrigiere sie bitte. Ich habe es in Access an einer meiner Tabellen ausprobiert, dort klappte es.
Überhaupt ist so eine Datenbank wie Access ganz hilfreich, wenn man die Abfragen dort erstellt. Dann kann man diese Abfrage in Delphi als Tabelle ansprechen. Der Vorteil ist auch, dass Access die Abfrage macht, und nicht die BDE.
bummi - Di 02.11.10 11:36
Also ... folgender SQL, ähnlich Deinem
Quelltext
1: 2: 3:
| select Sum(ItemsTotal) as Price from orders,parts where orders.CustNo=parts.VendorNo and SaleDate='17.12.1993' |
läuft im DBExplorer unter C:\Program Files\Borland\Delphi7\Bin
bei mir problemlos durch.
Critter - Di 02.11.10 12:07
Hallo,
ich weiß nicht ob es mit dem Problem zu tun hat, aber erfahrungsgemäß sollte man nie Datumswerte direkt in das Query einbauen, da die benötigte Formatierung teilweise von den DB-Einstellungen und den Windows-Spracheinstellungen abhängig sind. So kann es dazu kommen, dass ein Query auf Rechner A funktioniert und auf Rechner B nicht. Deshalb empfiehlt es sich diese Verantwortung an deine DB Komponenten ab zu geben, was am einfachsten per Parameter geht.
Also z. B. so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| TagSumme.Close; TagSumme.SQL.Clear; TagSumme.SQL.Add('SELECT SUM(teile.artikelpreis*teile.menge) AS TagGesamt'); TagSumme.SQL.Add('FROM teile, rechnung'); TagSumme.SQL.Add('WHERE (teile.rechnr = rechnung.rechnr)'); TagSumme.SQL.Add('AND (datum = '':MYDATE'')'); TagSumme.ParamByName('MYDATE').AsDateTime := DateTimePickerTag.Date; TagSumme.Open; |
Das sorgt dafür, dass Delphi das Datum richtig Formatiert. Wie gesagt, ich weiß nicht ob es hier zur Lösung beiträgt (könnte bei der Fehlermeldung aber sein), ansonsten hilft es hoffentlich zukünftige Probleme zu vermeiden.
critter
Tintenblut - Di 02.11.10 12:17
Moin!
Ich weiß zwar nicht, ob dies in deinem Fall der Fehler ist, weil der Fehler dann anders lauten müsste, aber ein Versuch ist es Wert:
Delphi-Quelltext
1: 2: 3: 4:
| TagSumme.SQL.Add('SELECT SUM(teile.artikelpreis*teile.menge) AS TagGesamt '); TagSumme.SQL.Add('FROM teile, rechnung '); TagSumme.SQL.Add('WHERE teile.rechnr = rechnung.rechnr '); TagSumme.SQL.Add('AND datum = ' + QuotedStr(DateToStr(DateTimePickerTag.Date))); |
Bei den orangenen Stellen lässt du jeweils ein Leerzeichen. Ansonsten wird die SQL-Anweisung folgendermaßen gelesen (das war bei mir jedenfalls immer das Problem verursachte, dass die Schlüsselwörter nicht an der richtigen Stelle gefunden werden können):
SELECT SUM(teile.artikelpreis*teile.menge) as
taggesamtfrom teile,
rechnungwhere ....
QuotedStr macht eigentlich nichts anderes als deinen String in einen mit Anführungszeichen umzuwandeln.
Ansonsten würde mir auch nurnoch Critters Vorschlag einfallen.
colaka - Mi 03.11.10 08:55
Hallo,
so kanns manchmal gehen. Bummis erster Tip war die Lösung. Die Fehlermeldung, die daraufhin erschien bezog sich auf einen anderen SQL-Befehl, der auch im Programm enthalten und schon längst abgehakt war, weil er schon mal funktioniert hat.
Immerhin habe ich jetzt viel dazugelernt und auch den DB-Explorer gefunden.
Vielen Dank an alle.
Gruß Ebi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!