Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank Rückgabewert(e) (https://www.delphipraxis.net/140615-datenbank-rueckgabewert-e.html)

stho 22. Sep 2009 08:32

Datenbank: Sybase Anywhere 10 • Version: ??? • Zugriff über: ODBC-Treiber?!

Datenbank Rückgabewert(e)
 
Hallo Leute

Ich möchte ein kleines Tool schreiben mit dem ich meine Monatlichen Ausgaben verwalten kann.
Mein Problem ist nur, das ich gerne jetzt die Summe der gesammten Spalte (Betrag) aus der Tabelle (Finanzen) auslesen möchte.
Ich sende den Befehl an die Datenbank mithilfe von:

Delphi-Quellcode:
ADODataSet.ConnectionString := 'SELECT SUM(Betrag) FROM Finanzen';
ADODataSet_Statistik.Open;
Nun 2 ganz banale Fragen:
Wie kann ich den zurückgelieferten Wert der DB (wird er überhaupt zurück geliefert?) verarbeiten/abfangen?
Gibt es eine Möglichkeit die Summe aus einem DBGrid zu berechnen ohne einen DB-Befehl zu versenden? Oder gäbe es einen ganz anderen weg?



P.S.
Zu meinem Wissensstand: Ich bin unerfahren was Delphi angeht und habe bisher nur maximal 3 Stunden mit Datenbanken gearbeitet (Versucht mir etwas bei zu bringen). (DB-Kentniss: Blutiger Anfänger, Keine Ahnung von der Materie)

Achja, noch etwas: Ich bin nicht zu doof Google/SuFu zu benutzen. Habe nur leider auf den gefundenen Seiten keine passende (Anfängergerechte) beschreibung / Anleitung gefunden.

Vielen Dank schonmal

DeddyH 22. Sep 2009 08:38

Re: Datenbank Rückgabewert(e)
 
Ich bin kein ADO-Experte, aber das Ergebnis müsste anschließend in ADODataset.Fields[0].Value stehen. Sollte ich da falsch liegen, bitte ich einen Wissenden um Korrektur.

stho 22. Sep 2009 08:46

Re: Datenbank Rückgabewert(e)
 
Also normalerweise müsste doch der Wert 0 die Spalte an sich beschreiben, oder?
Nun, hat leider nicht geklappt :-( aber danke für den Versuch...

Delphi-Quellcode:
...Fields.FieldByName('output').AsString
hab ich jetzt auch schon ausprobiert doch das liefert auch nichts gescheites :-(
Habe auch schon beispielsweise DIESEN Post durchgewühlt... aber das liefert nur einzelne Werte einer Spalte zurück... :-(

DeddyH 22. Sep 2009 08:56

Re: Datenbank Rückgabewert(e)
 
Wenn Du FieldByName verwenden willst, musst Du einen Alias vergeben.
SQL-Code:
SELECT SUM(Betrag) AS Summe FROM Finanzen
Darauf kannst Du dann mit FieldByName('Summe') zugreifen. Übrigens: sind das wirklich 2 verschiedene Datasets? Dann wäre das ja auch kein Wunder, dass da nichts kommt.

stho 22. Sep 2009 09:09

Re: Datenbank Rückgabewert(e)
 
ja SO klappt es :-)
das ist aber schöööööön ^^

aber eine Frage habe ich mal... warum kann ich meinem Dataset keinen ConnectionString zuweisen?

Beispiel:
Delphi-Quellcode:
ADODataSet_Statistik.ConnectionString := 'SELECT SUM(Preis) AS Summe FROM Finanzen';
da kommt immer die Fehlermeldung "Der Dateiquellname ist zu lang!"...
Wenn ich das jedoch manuell in diese Eigenschaft eintrage kommt kein fehler -.-

Hier mein Code:

Delphi-Quellcode:
  //Verbindung schließen wenn geöffnet
  if ADODataSet_Statistik.Active then
  begin
    ADODataSet_Statistik.Close;
  end;

  //ADODataSet_Statistik.ConnectionString := 'SELECT SUM(Preis) AS Summe FROM Finanzen'; //WIESO wirft das einen Fehler raus?!?!?!

  //Verbindung öffnen
  ADODataSet_Statistik.Open;
  label_Gesammtausgaben.caption := ADODataSet_Statistik.FieldByName('Summe').asSTring + ' €';

mkinzler 22. Sep 2009 09:10

Re: Datenbank Rückgabewert(e)
 
Das ist auch kein ConnectionString sondern eine Abfrage :zwinker:

stho 22. Sep 2009 09:29

Re: Datenbank Rückgabewert(e)
 
Ups ist das peinlich :oops:

Ja, habs gemerkt das es die falsche Property ist :-( Ich schääääääme mich!

Aber nochmal zurück zur anderen Frage, kann man die Summe oder ähnliche Dinge nicht einfacher abfragen als über das ADODataSet?

p80286 22. Sep 2009 10:15

Re: Datenbank Rückgabewert(e)
 
Hallo stho,

ich frag mich immer wofür dieses ominöse DataSet überhaupt gut sein sollte. Wenn ich irgendwelche Zugriffe auf Datenbankdaten habe, löse ich das mit der Query. Also ungefähr so:

Delphi-Quellcode:
ADOQuery1.SQL.Text:='SELECT SUM(Preis) AS Summe FROM Finanzen';
Unter D2006 mußt Du da allerdings ein paar Niggeligkeiten beachten.
Ich empfehle Dir Deine Abfragen, bzw. alles was mit der DB zu tun hat, in ein DM (TDataModule) auszulagern.
Wenn Du ohne Passwortabfrage (PW wird im Programm gespeichert!) arbeiten willst, dann reicht eine ADOQuery. Ansonsten arbeitest Du mit einer ADOConnection und einer ADOQuery und Du must dblogdlg für den Login-Dialog einbinden. (uses dblogdlg; reicht!)

Delphi-Quellcode:
const
  sqltext='select tabelle.feld1 from tabelle where tabelle.feld2=:_feld9_';
...
begin
  AL_DM.Query1.Close;
  AL_DM.Query1.Sql.Text:=sqltext;
  AL_DM.Query1.Parameters.ParamByName('_feld9_').value:='1234';
  AL_DM.Query1.open;
  if not AL_DM.Query1.eof then repeat
    // Daten einlesen
    AL_DM.Query1.Next;
  until AL_DM.Query1.eof;
  AL_DM.Query1.Close;
end;

Gruß
K-H

P.S. DB-Änderungen über Query.execSQL und natürlich ohne Rückgabewerte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz