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
    DBGrid

    In 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


Anmelden zum Antworten