Announcement

Collapse
No announcement yet.

Feld eines Datensatzes mit dem Inhalt eines Edit vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Feld eines Datensatzes mit dem Inhalt eines Edit vergleichen

    Hallo.<BR>
    <BR>
    Ich möchte die Zahl aus einem Feld eines Datensatzes mit dem Inhalt eines Edit vergleichen.<BR>
    Prinzip ist klar:<BR>
    <BR>
    IF ...Feld... = Edit1.Text Then ...;<BR>
    <BR>
    Das Feld hat den Typ "Währung" (Paradox-Datenbank).<BR>
    <BR>
    <BR>
    Nun zu meinem Problem.<BR>
    Programm arbeitet, aber das Ergebnis des Vergleiches ist falsch.<BR>
    <BR>
    Ganze Zahlen werden richtig verglichen.<BR>
    Bei einer Zahl mit ..,5 geht es auch.<BR>
    Steht nach dem Komma etwas anderes als 5, geht es nicht!<BR>
    <BR>
    Das heißt. 10,23 ist nicht gleich 10,23<BR>

    <BR>
    Ich mir kann jemand helfen.

  • #2
    Hallo hgjank,

    sieht nach einem Rundungsproblem aus. Der Paradoxtyp "Währung" wird wahrscheinlich als Double in Delphi umgesetzt. Wird das Feld jetzt über eine Rechenoperation gefüllt, dann kann da auch schon mal 10,230000000000001 drin stehen, auch wenn durch die Formatierung nur 10,23 angezeigt wird. Am besten beim Vergleich die Zahlen mit round() auf die Signifikanten Stellen kürzen oder schon beim Abspeichern in das DB-Feld dafür sorgen, daß nur 10,23 (und nicht 10,230000000000001) gespeichert wird.

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Realzahlen immer mit IsZero, beindet sich bei Delphi 7 in der unit math, auf Gleichheit abfragen. Z.B. if IsZero(Feld.AsFloat-StrToFloat(Edit1.Text)) then ..

      Comment


      • #4
        Danke für die schnelle Hilfe!<BR>
        <BR>
        Mit round geht es (Delphi 5).<BR>
        <BR>
        Darauf wäre ich nun nicht gekommen.<BR>
        Die Zahl in diesem Feld wird nicht errechnet (Rundungsproblem),<BR>
        sondern sie wird über ein Eingabefeld mit begrenzten Kommastellen eingegeben.<BR>
        <BR>
        Das heißt also:<BR>
        Ich gebe 10,23 ein.<BR>
        Schreibe es in die Datenbank.<BR>
        Wenn ich es dann wieder lesen will, wird daraus 10,2300 .. 001 oder so.<BR>
        <BR>
        Also 4 durch 2 ist ungefähr 2. <BR>
        <BR>
        <BR>
        Aber Danke für die Hilfe.<BR>
        Jetzt geht es.<BR>
        <BR>
        Mit freundlichen Grüßen<BR>
        Marko Jank<BR&gt

        Comment


        • #5
          Hallo,

          Vorsicht mit der Delphi-Rundungsroutine. Lies mal nach, ob bei der 5 auch so gerundet wird, wie du es brauchst...
          Bei mir (Delphi 7) wird standardmäßig auf die nächste gerade Zahl gerundet, d.h.

          round(2.225, 2) = 2.22

          round(2.235, 2) = 2.24

          Am besten selber machen.

          Grüße

          Juli

          Comment


          • #6
            Hallo Julia.<BR>
            <BR>
            Danke für den Hinweis. Ist bei Delphi 5 auch so.<BR>
            Gibt es einen anderen Befehl zum Runden, oder wie würdest du es "selber machen".<BR>
            (arbeite mit 2 Nachkommastellen)<BR>
            <BR>
            Habe auch nochmal alles geprüft. Es ist wirklich so, daß wenn ich eine Zahl mit 2 Nachkommastellen speichere,<BR>
            dann hat diese Zahl beim Lesen viele Stellen nach dem Komma.<BR>
            <BR>
            <BR>
            Erstmal Danke für die Hilfe.<BR>
            Für einen Tip zum "runden selber machen" wäre ich dankbar.<BR>
            <BR>
            MFG<BR>
            Marko Jan

            Comment


            • #7
              Hallo,

              ich runde folgendermassen:

              <PRE>
              function PrivateRound(Wert: extended): extended;
              begin
              Result := (Wert * 100) + 0.5 * Sign(Wert);
              if SameValue(Round(result), result, 1e-10) then
              result := Round(result);
              result := Trunc(result);
              Result := Result / 100;
              end;
              </PRE>

              wobei ich das mit dem SameValue irgendwann einmal nachträglich eingebaut habe, da das Trunc sonst auch nicht immer richtig funktioniert.

              Mit dieser Funktion arbeite ich jetzt schon ein paar Jahre zufriedenstellend.

              Grüße

              Juli

              Comment


              • #8
                Hallo.<BR>
                <BR>
                Danke für den Code.<BR>
                Werde ich mal versuchen.<BR>
                <BR>
                MFG<BR>
                Marko Jan

                Comment


                • #9
                  Hallo Marko,

                  für deinen Fall ist Round wahrscheinlich wirklich ungeeignet, besser wäre trunc(<i>DeineZahl</i>*100)/100. Damit werden alle Nachkommastellen (ausser die ersten beiden) einfach abgeschnitten.
                  Ich hoffe ich breche jetzt keine philosophische Diskussion über Rundungsregeln und die Genauigkeit von Fließkommadivision vom Zaun

                  Gruß Fal
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    Hallo,

                    Trunc funktioniert leider nicht zuverlässig.
                    Wenn die Zahl 12 im Speicher als 11,9999999999999 dargestellt ist, liefert trunc 11 zurück. Deswegen die SameValue-Rundung mittendrin.
                    Ausserdem - versuche mal 12,455 mit Deiner Routine ordnungsgemäß zu runden. Abschneiden allein tuts eben nicht.

                    Grüße

                    Juli

                    Comment


                    • #11
                      Hallo,

                      in diesem Fall ließe sich das Problem 'umgehen', indem man double statt float verwendet...

                      Grundsätzlich löst das aber nicht das Problem, es verlagert nur die nicht darstellbaren Zahlen in andere Bereiche.

                      Der Vorschlag mit trunc führt zu gar nichts, da 10,23 bei float zu den nicht darstellbaren Zahlen gehört.

                      Wie hat 'Meister' Kosch hier mal irgendwo geschrieben: Fließkommazahlen nimmt man zum Schätzen, Ganzzahlen zum Messen...

                      Grüße Joche

                      Comment


                      • #12
                        Ach so, zum Vergleich der Werte: Was genau vergeleichst Du? Ist es möglich den Vergleich von der Datenbank durchführen zu lassen?

                        Eine SQL-Select Anweisung zur Laufzeit erstellen und den Wert mittels FloatToStrF gerundet in die SQL-Anweisung schreiben, sollte deutlich bessere Ergebnisse liefern

                        Comment


                        • #13
                          Hallo an alle.<BR>
                          <BR>
                          Ersteinmal Danke für die vielen Hinweise.<BR>
                          <BR>
                          <BR>
                          Vielleicht sollte ich mein Ziel beschreiben, und nicht meinen "versuchten" Weg! <BR>
                          <BR>
                          - Delphi 5<BR>
                          - Paradox-Datenbank<BR>
                          - DBGrid<BR>
                          - viele Edit´s (keine DBEdit´s)<BR>
                          <BR>
                          - bei Wechsel des Datensatzes werden die Edit´s aus der Datenbank gefüllt<BR>
                          - jetzt kann der Anwender ändern<BR>
                          - nach den Änderungen frage ich "Speichern" oder "Verwerfen"<BR>
                          aber nur wenn er was geändert hat<BR>
                          <BR>
                          Deshalb Edit´s und Datensatz vergleichen.<BR>
                          <BR>
                          <BR>
                          Noch ein Frage:<BR>
                          Wofür steht "Sign(Wert)"?<BR>
                          Delphi 5 mag es nicht, und ich kenne es nicht.<BR>
                          <BR>
                          MFG<BR>
                          Marko Jan

                          Comment


                          • #14
                            Hallo,

                            Sign gibt -1 bei negativen Werten, 0 bei 0-Werten und 1 bei positiven Werten zurück.
                            Ist normalerweise in der Math-unit.
                            Damit bei negativen Werten auch nach unten gerundet wird bei der 5.

                            Grüße

                            Juli

                            Comment


                            • #15
                              Hallo.<BR>
                              <BR>
                              Also "Sign" und "SameValue" kann ich unter math nicht finden.<BR>
                              <BR>
                              Ist vielleicht bei Delphi 5 noch nicht dabei?<BR>
                              Kann man ja notfalls "mit IF .. then =0, <0, >0" umgehen.<BR>
                              Wozu ist aber SameValue gut?<BR>
                              <BR>
                              MFG<BR>
                              Marko Jan

                              Comment

                              Working...
                              X