Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Benutzung von Sum() in SQL (https://www.delphipraxis.net/45934-benutzung-von-sum-sql.html)

Smiley 14. Mai 2005 22:16

Datenbank: Access • Zugriff über: ADO

Benutzung von Sum() in SQL
 
Nachdem ich nun alle Beiträge zur Summenbildung in SQL hier durchgelesen habe und die SQL Syntax eigentlich auch richtig sein müsste, wende ich mich nun doch mal an Euch, da ich nicht mehr weiter weiß.

Ich habe eine Datenbank Belege mit den Feldern Nr,Datum,Betrag(Float) und möchte gerne wissen wie hoch die Summe aller Beträge in
meiner Datenbank ist.

Dazu habe ich folgendes programmiert:

Delphi-Quellcode:
    FBelege.ADOQBelege.active:=False;
    FBelege.ADOQBelege.SQL.Add('Select Sum(Betrag) As Summe From Belege');
    FBelege.ADOQBelege.active:=true;
    Gesamt:=FBelege.ADOQBelege.FieldByName('Summe').ASFloat;
    FBelege.ADOQBelege.active:=False;
sobald ich active auf True setze kommt die Fehlermeldung:

ADOQBelege: Das Feld Nr wurde nicht gefunden

Was mache ich falsch ?

Hansa 15. Mai 2005 00:29

Re: SQL Summe berechnen
 
Ist ja auch kein Wunder. Die Fehlermeldung besagt, daß das Feld Nr. nicht vorhanden ist ? Tja, so sieht es aus. Was erwartestt Du denn ? 8)

Christian Seehase 15. Mai 2005 01:00

Re: SQL Summe berechnen
 
Moin Hansa,

Zitat:

Zitat von Hansa
Die Fehlermeldung besagt, daß das Feld Nr. nicht vorhanden ist ? Tja, so sieht es aus. Was erwartestt Du denn ?

Vielleicht die Anwort darauf, warum sich die Fehlermeldung auf ein Feld bezieht, das überhaupt nicht angesprochen wird? :roll:

Union 15. Mai 2005 01:29

Re: SQL Summe berechnen
 
Zitat:

Zitat von Christian Seehase
Moin Hansa,

Zitat:

Zitat von Hansa
Die Fehlermeldung besagt, daß das Feld Nr. nicht vorhanden ist ? Tja, so sieht es aus. Was erwartestt Du denn ?

Vielleicht die Anwort darauf, warum sich die Fehlermeldung auf ein Feld bezieht, das überhaupt nicht angesprochen wird? :roll:

Ich schätze Du hast in der Query noch ein Überbleibsel von altem SQL zu stehen. Wie wär's damit:

Delphi-Quellcode:
with FBelege.ADOQBelege do
begin
   Active := False;
   SQL.Clear;      // <------
   SQL.Add('Select Sum(Betrag) As Summe From Belege');
   Active := True;
   Gesamt := FieldByName('Summe').AsFloat;
   Active := False;
end;

Sharky 15. Mai 2005 04:49

Re: SQL Summe berechnen
 
Zitat:

Zitat von Union
... Ich schätze Du hast in der Query noch ein Überbleibsel von altem SQL zu stehen. ....

Oder Du hast im Feldeditor (rechter Mausklick auf die Querykomponente - Feld-Editor) etwas eingetragen.
Wenn dort Felder angegeben wurden erwartet die Query-Komponente das diese auch bei jedem .Open vorhanden sind.

P.S.: Es wäre gut wenn Du den Titel der Frage ändern würdest. Der Fehler hat ja nichts mit dem SUM() zu tun.

Smiley 15. Mai 2005 11:45

Re: SQL Summe berechnen
 
@Union das mit dem SQL.clear hab ich natürlich vorher schon gemacht, habs nur nicht mit in das Listing reingenommen.

Sharky hat warscheinlich recht ich habe in meinem Grid den Feldeditor benutzt, habe die Felder dort zum testen aber schon mal rausgenommen, da ich das auch schon vermutet hatte. Möglicherweise habe ich aber in einem anderen Feld auch den Feldeditor benutzt und habe das übersehen. Danke für den Tip, werde gleich mal nachsehen.

Den Feldeditor habe ich benutzt um die Einstellungen der einzelnen Spalten im Grid anzupassen. Geht das auch ohne den Feldeditor ?

Wie kann ich den Titel ändern ?
Habe noch nie einen Artikel verändert und finde hier keinen Button dafür.
Oder Wo kann ich das nachlesen ?

Danke für Eure Mühe.

Sharky 15. Mai 2005 11:49

Re: SQL Summe berechnen
 
Zitat:

Zitat von Smiley
... Wie kann ich den Titel ändern ? ....

Hai,

einfach in deinem ersten Posting in diesem Thread auf Edit klicken (rechts in der Titelleiste).

Hansa 15. Mai 2005 11:54

Re: SQL Summe berechnen
 
Also gut, Du brauchst irgendwo noch die NR. Diese wird aber nicht so ohne weiteres geliefert. 8)

Delphi-Quellcode:
SQL.Add('Select NR,Sum(Betrag) As Summe From Belege');

Sharky 15. Mai 2005 12:05

Re: SQL Summe berechnen
 
Zitat:

Zitat von Smiley
... Den Feldeditor habe ich benutzt um die Einstellungen der einzelnen Spalten im Grid anzupassen. Geht das auch ohne den Feldeditor ?....

Was genau passst Du denn an?

Es gibt zwei Möglichkeiten. Entweder Du arbeitest für deine Summenberechnung mit einem zur Laufzeit erzeugten Query:
Delphi-Quellcode:
function GetSumFromTable (aConnection : TADOConnection;aFieldName , aTableName : String) : Real;
begin
  with TADOQuery.Create(nil) do
  begin
    Connection := aConnection;
    SQL.Text := 'SELECT SUM(' + aFieldName + ') AS summe FROM ' + aTableName;
    Open;
    Result := FieldByName('Summe').AsFloat;
    Close;
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Gesamt : Real;
begin
  Gesamt := GetSumFromTable(ADOConnection1,'betragt','belege');
end;
Oder Du arbeites nur mit einem Query. Dann musst Du zur Laufzeit die Formatierungseinstellunge von Hand vornehmen.
Schaue Dir mal dieses Posting an ;-)

Smiley 15. Mai 2005 12:09

Re: SQL Summe berechnen
 
Delphi-Quellcode:
SQL.Add('Select NR,Sum(Betrag) As Summe From Belege');
Diese Idee hatte ich auch schon Hansa, wollte sogar schon alle Felder angeben, leider kommt bei diesem SQL-Befehl die folgende Meldung:

Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Nr' nicht als Teil der Agregatfunktion einschließt.

Mit diese Meldung kann ich noch viel weniger anfangen.
Das Feld Nr ist übrigens mein Primärindex, falls das von Bedeutung ist.

Weitere Komponenten mit Feldeditor außer dem Grid habe ich nicht gefunden.
Habe sonst nur Editfelder einen Navigator und eine BrowserComponente im Formular.
Die Felder im Feldeditor habe ich rausgelöscht, es kommt aber immer noch die Frage nach dem Feld Nr.

Smiley 15. Mai 2005 12:11

Re: SQL Summe berechnen
 
Zitat:

... Den Feldeditor habe ich benutzt um die Einstellungen der einzelnen Spalten im Grid anzupassen. Geht das auch ohne den Feldeditor ?....


Was genau passst Du denn an?
Ich muss die Spaltenbreite des Grid für einige Felder etwas verkürzen, damit die Tabelle auf den Bildschirm passt ohne scrollen zu müssen.

Sharky 15. Mai 2005 12:37

Re: SQL Summe berechnen
 
Hai Smiley,

dann nehme auch alle Einträge aus dem "Spalten-Editor" des DBGrid und setzte die Spaltenbreite zur Laufzeit:
Delphi-Quellcode:
begin
  with FBelege.ADOQBelege do
  begin
    active:=False;
    SQL.Text ('Select * From Belege');
    active:=true;
  end;

  with DBGRid1 do
  begin
    Columns[0].Width := 40;
    Columns[1].Width := 100;
  end;
end;

Smiley 15. Mai 2005 13:22

Re: SQL Summe berechnen
 
Prima Sharky Du hast es geschafft alle meine Fragen zufriedenstellend zu beantworten.

Der Tip mit

preisfeld := fields.FieldByName('preis');
TFloatField (preisfeld).DisplayFormat := '##,###,##0.00';

finde ich auch sehr hilfreich.

Jetzt wäre nur noch das Problem, wenn ich die Summe auch in der Liste meines normalen Querys mit drin haben möchte, damit ich die Daten im Grid anzeigen kann und trotzdem noch die Summe separat anzeigen kann ohne die Summe immer neu berechnen zu müssen.

Smiley 15. Mai 2005 18:50

Re: Benutzung von Sum() in SQL
 
Ich habe nochmal etwas mit den SQL Befehlen gespielt um die Summenberechnung und die Anzeige der Daten in ein SQL-Statement zu bekommen.
Das scheint aber keinen Sinn zu machen das in einen SQL-String zu packen.
Das wird eine ziemlich aufwendige Anweisung mit Inner Join und Group by und allen Feldern die ausgegeben werden sollen.
Da ist es doch einfacher die Summe separat berechnen zu lassen und danach für die Anzeige einen neuen SQL-String aufzubauen.
Ich hoffe, dass es bei der Performance keine Probleme macht.
In dem jetzigen Fall ist es kein Problem, da die Datenmengen noch recht klein bleiben.

Vielen Dank nochmal an Sharky, der hier sehr kompetent und hilfreich mit Beispielen geholfen hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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-2025 by Thomas Breitkreuz