Nachkommstellen in DBGrid anzeigenlassen



  • oder Suchfunktion verwenden, z.B. dbgrid - spalte formatieren



  • Joe_M. schrieb:

    In der entsprechenden Datanquelle das Feld (im Feldeditor) auswählen und unter DisplayFormat 0.00 eintragen.

    wenn ich in den Feldeditor gehe, quasi ins feld doppelklicke, sind bei mir keine Felder eingetragen.

    Linnea schrieb:

    oder Suchfunktion verwenden, z.B. dbgrid - spalte formatieren

    ich habe folgendes probiert:

    ADOQuery1->FieldByName("Preis in €")->DisplayFormat = "#.00";
    

    und

    DBGridGerichte->Columns->Items[2]->Field->DisplayFormat = "#.00";
    

    aber bei beiden sagt er mir das DsplayFormat nicht kennt...



  • Ich bekomms einfach nicht hin weil er displayformat nicht kennt... kann mir wer sagen wo ich den falschen ansatz habe?



  • Das Feld heißt in der DB tatsächlich 'Preis in €'?!? Mit Leerzeichen und Sonderzeichen im Namen?!? So etwas sollte man tunlichst vermeiden.

    Die Felder kannst Du mit Rechtklick in den Feldeditor, 'Alle Felder hinzufügen...' hinzufügen.

    Alternativ im Souccecode:
    Das Problem ist, dass Du einen Zeiger auf ein generisches TField erhälst. DisplayFormat gibt es aber nur bei TFloatField.

    TFloatField* ft = dynamic_cast <TFloatField*> (ADOQuery1->FieldByName("FeldnameAufDBEbene"));
    ft->DisplayFormat = "0.00";
    


  • Nein, das Feld heißt "preis", aber auch damit funktioniert das ganze nicht... 😞

    Joe_M. schrieb:

    Die Felder kannst Du mit Rechtklick in den Feldeditor, 'Alle Felder hinzufügen...' hinzufügen.

    Ich kann den Befehl add all fields nicht anwählen... die query1 wird so reingeschrieben,

    ADOQuery1->Close();
    ADOQuery1->SQL->Add("SELECT Nr,GerichtGetraenk,Preis FROM speisekarte WHERE Typ =\"Getraenk\" ");
    ADOQuery1->Open();
    

    und wenn das programm nicht im lauf/test status ist habe ich dort keine tabelle drin... also die eigenschaft von query1 "aktiv" ist false.
    Wenn ich diese auf true macht sagt er mir: ADOQuery1: Missing SQL property.

    Aber wenn ich starte wird die tabelle in der DBGrid angezeigt, vielleicht sind deswegen keine Felder sichtbar...

    Vielleicht liegt dort mein Fehler. Dennoch weiß ich nicht wo ich dann ansetzen soll.

    Wenn ich das ganze mit der ADOTable mache kann ich diese auf aktive=true schalten und ich kann die add all fields auswählen.
    Aber selbst dann habe ich kein DisplayFormat...

    Wegen solch einen kleinen anzeigefehler sooo viel Zeitaufwand. 🙂

    Hoffe ihr könnt mir dennoch weiter helfen.

    MfG



  • Ja, dann kann das mit dem Feldeditor nicht funktionieren.

    Joe_M. schrieb:

    Alternativ im Souccecode:
    Das Problem ist, dass Du einen Zeiger auf ein generisches TField erhälst. DisplayFormat gibt es aber nur bei TFloatField.

    TFloatField* ft = dynamic_cast <TFloatField*> (ADOQuery1->FieldByName("preis"));
    ft->DisplayFormat = "0.00";
    

    Das sollte dennoch funktionieren. Aber erst, nachdem die SELECT-Anweisung bereits hinzugefügt hast. Den Code kannst Du also erst verwenden, wenn Du den SQL-Select ge'add'ed ahst. Bin mir aber nicht ganz sicher, ob dazu ParamCheck auf true stehen muß. Probiers es aus.

    ADOTable vergisst Du am besten ganz schnell wieder. Die Komponente ist nur dazu gedacht, bestehende BDE-Projekte, die TTable verwenden schneller umzustellen.

    Vielleicht solltest Du Dich auch mal mit Parametern auseinander setzen. Auch in Bezug auf SQL-Injection.



  • sobald dich im Konstruktor meiner TForm, wo das DBGrid drin ist, folgendes eingebe:

    TFloatField* ft = dynamic_cast <TFloatField*> (ADOQuery1->FieldByName("Preis"));
    ft->DisplayFormat = "0.00";
    

    bringt er mir beim versuch das Programm zu starten, keine Fehlermeldung im Quelltext, sondern:
    "Projekt Projekt.exe raised exception class EAccessViolation with message 'Access violation at address 0043337E in module 'Projekt.exe'. Read of address 000000E0'.
    Process stopped. Use Step or Run to continue."

    bei

    ft->DisplayFormat = "0.00";
    

    😞



  • Na dann schau doch mal mit deinem Debugger nach ob ft == 0



  • das kommt ja auch nicht in den Konstruktor sondern ins QueryAfterOpen so wie das auch in dem anderen von mir verlinkten Thread drin stand

    void __fastcall TForm1::IBQuery1AfterOpen(TDataSet *DataSet) 
    { 
    TNumericField *Field1 = dynamic_cast<TNumericField*>(DataSet->FieldByName("Preis")); 
    Field1->DisplayFormat = "###,###,##0.00"; 
    }
    

    d.h. du mußt bei deinem ADOQuery das Ereignis OnAfterOpen verwenden...

    aber auch das stand in dem Beitrag drin...



  • ja, schande über mich, es funktioniert. danke.


Anmelden zum Antworten