Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Di 02.11.10 08:19 
Hallo,

danke für den Tipp, aber das funktioniert leider auch nicht.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 02.11.10 11:36 
Also ... folgender SQL, ähnlich Deinem
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 39
Erhaltene Danke: 2



BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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