TDBGrid Problem
-
Hallo C++ Gemeinde,
habe folgendes Problem :
Von einer Datenbank wird über die Komponenten Database, Query und Datasource ein TDBGrid befüllt. Das klappt alles prima.
Nun möchte ich eine weitere Spalte hinzufügen. In diese Spalte möchte Berechnungen, die sich aus Feldinhalten der jeweiligen Zeile ergeben, hineinschreiben.
Irgenwie gelingt mir das nicht. Kann jemand helfen ?
Vielen Dank
Christian
-
Hallo
Wenn du ein TQuery benutzt, dann hast du doch auch eine SQL-Abfrage. Dort kannst du solche Rechnungsfelder einfügen :
SELECT a, b, a + b AS c FROM table
bis bald
akari
-
Es gibt da auch noch die Möglichkeit, ein 'Calculated Field' in der TQuery zu verwenden.
-
Hallo Akari, Joe_M
@akari
ja das stimmt, hab ich auch schon probiert. Leider scheint das alte Sybase System keine Gleitkommaberechnungen zu unterstützen. Jedenfalls hat die Bildung entsprechender Felder über die Notierung im SQL String des Query Elementes nicht funktioniert.Hinzukommt, dass ich noch weitere Parameter mit verrechnen muss, die nicht aus der Datenbank stammen. Habe mir zunächst mit einer Anbindung an Excel geholfen, das ist aber ganz schön langsam. Die Daten sollen auch nur angezeigt werden, die berechneten Daten dürfen nicht in die Datenbank zurückgeschrieben werden.
@Joe_M
Ja, stimmt, ich weis aber nicht wie das geht. Kann man eine Formel hinterlegen (wie bei Excel)oder addressiere ich den Inhalt der übertragenen Felder und schreibe dann meine Ergebnisse Zeile für Zeile in das jeweilige Calclated Field ?
Bitte gebt mir doch mal etwas Starthilfe.
Danke für Eure Mühe
Gruss
Christian
-
chvdsschule schrieb:
Kann man eine Formel hinterlegen (wie bei Excel)oder addressiere ich den Inhalt der übertragenen Felder und schreibe dann meine Ergebnisse Zeile für Zeile in das jeweilige Calclated Field ?
Du kannst das OnCalcFields-Event Deines DataSets hierfür verwenden. Dort dann einfach:
ds->FieldByName("summe")->AssignValue(ds->FieldByName("a")->AsFloat + ds->FieldByName("b")->AsFloat);
-
Hallo Witte,
hört sich gut an. Komme erst morgen dazu es auszuprobieren.
Dank für die Hilfe.
Gruss
Christian
-
Hallo Witte,
hab das mal ausprobiert.
Mein Formular enthält :
Database
Query
Datasource
DBGridIn Query AutoCalcFields auf true
In DataSource->DataSet unter Ereignisse bei OnCalcFields Funktionnamen "Berech" eingefügt und folgende Zeile in dieser Funktion notiert:DataSet->FieldByName("Berechnet")->AssignValue(DataSet->FieldByName("Netto")->AsFloat + DataSet->FieldByName("Brutto")->AsFloat );
Die SQL Anweisung in Query generiert das Feld "Berechnet" :
Select ...,SUM(Brutto) AS Berechnet,.... from ... usw.
Leider wird der gewünschte Wert nicht im Grid angezeigt, ich sehe nur den durch die SQL Anweisung generierten Wert im Feld "Berechnet".
Irgenwie feuert das Ereigniss auch nicht, ein Breakpoint in der Funktion "Berech" wird nicht erreicht.
Hier meine Fragen:
Wie wird das zusätzliche berechnete Feld im DataSet erzeugt ?
Muss ein AutoCalcField schon in der SQL Anweisung - quasi als Dummyfeld - miterzeugt werden und wird später mit der xxx.xxxx.AssignValue() Funktion überschrieben ?
Oder muss nach Ausführung von Query und vor dem Anzeigen der Daten im Grid das zusätzliche Feld erst ausdrücklich im DataSet erzeugt werden um dann mit der OnCalcField Funktion gefüllt zu werden ?
Bitte noch mal um Hilfe.
Vielen Dank und Gruss
Christian
(C++ Builder 2009)
-
Es gibt zwei verschiedene Wege (wie hier schon beschrieben) die nichts miteinander zu tun haben:
1. Du berechnest das in der SQL-Anweisung, das Feld wird dann wie alle anderen automatisch angelegt.
2. Du berechnest die Summe selber in der Anwendung.bei 2. (Ich habe BCB6 und TSQLClientDataSet)
- erzeuge das Query-SQL ohne die Summenspalte und trage es in Dein Dataset ein
- Doppelklick auf das Dataset und die Fieldliste öffnet sich
- Kontextmenü::neues Feld, Name eingeben, Datentyp Float, Typ Berechnet
- dann im DataSet OnCalcFields abbonieren
- OnCalcFiels ausfüllen
-
Hallo witte,
so, das funktioniert gut. Danke für Deine Hilfe.
Sorry, konnte leider erst heute antworten.Gruss
Christian