| Autor |
Beitrag |
colaka
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: Mo 01.11.10 23:02
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 02.11.10 00:36
Lass rechnung.rechnr, teile.rechnr aus dem Select und der Gruppierung raus...
Für diesen Beitrag haben gedankt: colaka
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: 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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 3
Windows 7
Delphi 7 Pro.
|
Verfasst: 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
_________________ Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
|
|
Tintenblut
      
Beiträge: 39
Erhaltene Danke: 2
|
Verfasst: 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 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: 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
|
|