Werte im DataSet berechnen?



  • Wahrscheinlich steh ich mir gerade wieder bloß selbst im Weg.

    if (ADOQuery5->Modified) {
     //???}
    

    Wenn ich meinen aktuellen DS verändert habe (Eingabe), dann möchte ich vor Query->Post(); ein anderes Feld neu berechnen, welches vom eingegebenen Wert abhängt. Das Feld selbst ist Teil des DS und damit des DataSets.

    Wie schreib ich das in den aktuellen DS vor dem Post.

    Mit nem nachgelagerten Update (AfterPost) ist das kein Problem, doch das wollte ich mir nicht unbedingt antun.

    Oder will ich wieder einmal mit der Kirche ums Dorf? 🤡



  • Ich arbeite aus Prinzip nicht mit gebundenen Steuerelementen, deswegen kann meine Anwort auch falsch sein.
    Mein Ansatz wäre im OnChange-Ereigniss des Eingabefeldes anzusetzen, oder bei OnClick des Speichern-Buttons die Berechnung durchführen.



  • Ich arbeite im OnExit-Ereignis, weil im OnChange der Wert noch nicht komplett ist.
    Und natürlich stand ich mir gestern abend bloß selbst im Weg.
    Es war viel zu einfach. Das ist mir dann schon auf dem Nachhauseweg eingefallen. Ich führe meine Berechnung im aktuellen DS gaaanz normal aus. 😃

    Bsp.

    void __fastcall TForm::Wert2Exit(TObject *Sender)
    {
       if (Query->Modified) {
          if (ADOQuery5->FieldByName("WERT1")->AsFloat > 0) > 0) {
             Query->FieldByName("WERT3")->AsFloat = RoundTo(FieldByName("WERT2")->AsFloat /FieldByName("WERT1")->AsFloat,-2);
          }
          Query->FieldByName("WERT3")->AsFloat = 0; 
    }
    

    Das ganze habe ich auch mit

    Query->FieldValues["WERT3"]=RoundTo(((Query->FieldValues["WERT2"])/(Query->FieldValues["WERT1"])),-2);
    

    ausprobiert.
    Aber da kommt 0 raus, obwohl die angezeigten Ausdrücke für Query->FieldValues["WERT2"] und Query->FieldValues["WERT1"] während des Debuggens korrekt ausgegeben werden. Und ich weiß nicht warum?😕



  • Weil RoundTo kein Variant versteht?!

    Query->FieldValues["WERT3"]=RoundTo(((Query->FieldValues["WERT2"])/(Query->FieldValues["WERT1"])),-2);
    

    und was soll das sein?!

    if (ADOQuery5->FieldByName("WERT1")->AsFloat > 0) > 0) {
    


  • @Sunday
    Blödsinn natürlich! 😃 Das kommt von Strg+C->Strg+V + Veränderung des Codes für's Bsp.

    Korrekt wäre so

    (ADOQuery->FieldByName("WERT1")->AsFloat > 0) {//...}
    

    Und die Abfrage narürlich auch nur, weil Division durch Null ja nicht definiert ist, was nicht passieren darf.

    Wenn's an RoundTo vs. Variant läge, sollte

    ADOQuery->FieldValues["Wert3"] = ADOQuery->FieldValues["Wert2" ] /ADOQuery->FieldValues["Wert1"];
    

    ja funktionieren.
    Aber das ergibt ebenfalls 0.



  • weil FieldValues Variant zurückgibt und keinen Gleitkommawert!



  • @Sunday
    Auch auf die Gefahr zu nerven. Ich weiß, daß der Rückgabewert Variant (Zeiger auf OLE-Variante) ist.
    Ich weiß nicht wo welche impiziten Umwandlungen gehen. Denn

    float Zahl = RoundTo(Query->FieldValues["Feld"],-2);
    

    bringt z.B. ein Ergebniss.
    Klar kann ich das ganze Problem auch umgehen (mit FieldByName).
    Da ich aber immer alles wissen will 😉 , interessiert mich schon, ob es ggf. irgendwo eine Matrix gibt, wo die Typen der Rückgabewerte drin stehen und vielleicht auch welche von wem in was implizit umgewandelt werden können und welche nicht.



  • Warum wandelst du nicht explizit um, z.Bsp. mit AsType(varDouble) oder einfach mit static_cast? Den Typen bekommst du ja mit der Funktion Type(). Das sind alles Memberfunktionen von Variant.


Anmelden zum Antworten