Probleme nach Umstellung von VB 2008 zu VB 2010

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme nach Umstellung von VB 2008 zu VB 2010

    Hallo,

    habe vor etwa 3 Wochen von VB 2008 zu VB 2010 umgestellt. Das funktionierte auch alles fehlerfrei. Nun stelle ich fest, dass wenn ich Daten in Exceldokumente eintrage, die Zahlenformate nicht mehr eingehalten werden.

    Der erechnete Wert von

    (Statistik_Sternweg_Alt.Verbrauch_Strom_OG + Statistik_Sternweg_Alt.Verbrauch_Strom_Waschmaschine_OG) / 12)

    ist 247,985

    die Excelzelle ist als Zahlenformat mit Tausendertrennung sowie zwei Nachkommastellen formatiert.

    Unter VB 2008 erhalte ich den korrekten Wert von 247,99 wobei ich unter VB 2010 den falschen Wert 247.985,00 erhalten.

    Die o.a. Variable sind double Werte.






    Gruß Markus

    Westerwälder schrieb:

    Die o.a. Variable sind double Werte.
    Nö. Das sind als String formatierte Werte.
    Sieh Dir mal die Überladungen 3 und 4 von ToString an.

    VB.NET-Quellcode

    1. Dim d As Double = 12.345
    2. Dim txt As String = d.ToString(...)
    Kann es sein, dass irgendwelche sprachspezifische (Default-)Einstellungen am Rechner / am Studio geändert wurden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Werte lese ich aus einer Datenbank, welche nur auf Strings basiert

    VB.NET-Quellcode

    1. Property Verbrauch_Strom_OG() As Double
    2. Get Return CDbl(Feld(23))
    3. End Get
    4. Set(ByVal value As Double)
    5. Feld(23) = CStr(value)
    6. End Set

    Wo kann ich denn da nach schauen. Es passíert, wie ich bisher feststellen konnte, nur in Excelmappen. Obwohl sich dort die Formatierung der Zellen nicht geändert hat. Führe ich das Programm unter VB 2008 aus, ist wieder alles so wie es sein sollte.
    Gruß Markus

    Westerwälder schrieb:

    VB.NET-Quellcode

    1. Set(ByVal value As Double)
    2. Feld(23) = CStr(value)
    3. End Set

    Dann solltest Du das mal umschreiben in:

    VB.NET-Quellcode

    1. Set(ByVal value As Double)
    2. Feld(23) = value.ToString ' (...)
    3. End Set
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. ' (...)

    RodFromGermany schrieb:

    Sieh Dir mal die Überladungen 3 und 4 von ToString an.
    Das sollte Dein Problem lösen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    .tostring("N2")

    Ok, dass funktioniert, nur VB 2010 setzt ja auf eine bestehende Datenbank auf. Daten von über 3 Jahren zu ändern finde ich nun nicht so lustig, auch nicht ca. 20 eigene Klassen in denen nach dem alten Schema verfahren wird.

    Irgendein anderer Vorschlag vielleicht?
    Gruß Markus

    Westerwälder schrieb:


    Der erechnete Wert von

    (Statistik_Sternweg_Alt.Verbrauch_Strom_OG + Statistik_Sternweg_Alt.Verbrauch_Strom_Waschmaschine_OG) / 12)

    ist 247,985

    die Excelzelle ist als Zahlenformat mit Tausendertrennung sowie zwei Nachkommastellen formatiert.

    Unter VB 2008 erhalte ich den korrekten Wert von 247,99 wobei ich unter VB 2010 den falschen Wert 247.985,00 erhalten.

    Die o.a. Variable sind double Werte.







    Der wer denn du von VB 08 hast ist der selbe von VB 10 !
    247,99 ist aufgerundet!
    ab 5 rundet man auf, da das eine 3stellige Komma zahl ist rundet vb 08 auf 2 auf.
    Das kuriose an der Sache ist doch,

    überprüfe vor dem Eintrag in die gleiche Excelmappe die Werte in einer Messagebox.

    VB 2008 und VB 2010 liefern beide den gleichen Wert 247,985

    VB 2008 trägt den richtigen Wert 247,99 und VB 2010 den Wert 247.985,00 ein.

    Sorry, verstehen tue ich dies nicht. Mit .tostring("N2") bekomme ich auch unter VB 2010 den richtigen Wert eingetragen.

    Next Problem:

    Schreibe ich die Daten mit .tostring("N2") in die Excelmappe kann Excel mit den Zellwerten nicht mehr rechnen.
    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Habe für die Standardsachen eigene Klassen anglegt.

    Hier zu nächst ein Beispiel zur Aufbereitung der Zahlen

    VB.NET-Quellcode

    1. Pack00 = (Pack05 + Me.ZI) ' Stromverbrauch KG
    2. With Formular
    3. .Zeile = Pack00.ToString
    4. .Excelfelder_Clearen(("C" & Formular.Zeile), ("H" & (Pack00.ToString)))
    5. .C = Statistik_Sternweg.Stand_Strom_KG.ToString("N2")
    6. .D = Statistik_Sternweg.Verbrauch_Strom_KG.ToString("N2")
    7. .E = "=SUMME(D74:D" & Pack00.ToString & ")"
    8. .F = "=D" & Pack00.ToString & "*12"
    9. .G = "=(E" & Pack00.ToString & "*12)/" & Me.ZI.ToString
    10. .H = "=G" & Pack00.ToString & "-E73"
    11. .Excel_Eintragen(False, False, False)
    12. End With


    und hier der Teil wo geschrieben wird

    VB.NET-Quellcode

    1. Sub Excel_Eintragen(ByVal Fett As Boolean, ByVal Kursiv As Boolean, ByVal Unterstrichen As Boolean)
    2. Dim Pos As String = ""
    3. InterneTabelle = Mappe.Worksheets(Tabelle)
    4. InterneTabelle.Select()
    5.  
    6. If A <> "" Then Pos = "A" & Zeile.ToString
    7. If Basis.Left(A, 1) = "=" Then
    8. InterneTabelle.Range(Pos).Font.Bold = Fett
    9. InterneTabelle.Range(Pos).Font.Italic = Kursiv
    10. InterneTabelle.Range(Pos).Font.Underline = Unterstrichen
    11. InterneTabelle.Range(Pos).FormulaLocal = A
    12. End If
    13. If Basis.Left(A, 1) <> "=" Then
    14. InterneTabelle.Range(Pos).Font.Bold = Fett
    15. InterneTabelle.Range(Pos).Font.Italic = Kursiv
    16. InterneTabelle.Range(Pos).Font.Underline = Unterstrichen
    17. Zelle = InterneTabelle.Range(Pos)
    18. Zelle.Value = A
    19. End If
    20. End If
    21.  
    22. If B <> "" Then Pos = "B" & Zeile.ToString
    23. If Basis.Left(B, 1) = "=" Then
    24. InterneTabelle.Range(Pos).Font.Bold = Fett
    25. InterneTabelle.Range(Pos).Font.Italic = Kursiv
    26. InterneTabelle.Range(Pos).Font.Underline = Unterstrichen
    27. InterneTabelle.Range(Pos).FormulaLocal = B
    28. End If
    29. If Basis.Left(B, 1) <> "=" Then
    30. InterneTabelle.Range(Pos).Font.Bold = Fett
    31. InterneTabelle.Range(Pos).Font.Italic = Kursiv
    32. InterneTabelle.Range(Pos).Font.Underline = Unterstrichen
    33. Zelle = InterneTabelle.Range(Pos)
    34. Zelle.Value = B
    35. End If
    36. End If


    usw.
    Gruß Markus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    überprüfe vor dem Eintrag in die gleiche Excelmappe die Werte in einer Messagebox.

    VB 2008 und VB 2010 liefern beide den gleichen Wert 247,985

    VB 2008 trägt den richtigen Wert 247,99 und VB 2010 den Wert 247.985,00 ein.
    Das sieht nach dem Unterschied zw. deutscher und englischer Version aus.

    Ich vermute mal, die msgbox zeigt einen String an, nämlich eigentlich "247,985", und nicht einen Double: 247,985.

    Eine deutsche Version versteht nun das Komma als Dezimal-Trenner, eine englische hingegen als tausender-Trennzeichen.
    Hmm. Eigentlich sollte die installierte Kultur deines Rechners ausschlaggebend sein, also deutsch.

    Annererseits - so DB-Provider interpretieren grundsätzlich mit Kultur.Invariant (also englisch).

    Vlt. bist du auch auf einen Bug des ACE-DB-Providers gestoßen.

    Weil wenn Excel die Werte als String formatiert hat, dann sollte der DB-Provider auch Strings anliefern, und nicht eigenmächtig unter Zugrundelegung von Culture.Invariant nach Double konvertieren.
    Design-Fehler in der Datenbank.
    Ich würde Dir empfehlen, in der Datenbank Zahlen abzulegen und nicht Strings. Die werden dann sogar in China richtig ausgelesen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe nun einige Tests durchgeführt. Dazu habe ich meinen Zweitrechner mit einbezogen.

    Wie es ausschaut, tritt der Fehler nur mit VB 2010 bei der Übergabe an Excel auf. Schreibe ich (auch hier auf beiden Rechner) mit VB 2008 ist alles in Ordnung. Somit schliesse ich die Einstellung der Rechner und Excel als direkte Fehlerquelle aus. VB 2010 liefert die Werte in Controls (Listview) korrekt.

    Dies bringt mich auf den Gedanken, dass mein MS Office 2000 Premium sich nicht mit VB 2010 verträgt. Benutze immer noch diese Version von Office, da sie zu seiner Zeit so richtig teuer war.
    Gruß Markus

    Westerwälder schrieb:

    Benutze immer noch diese Version von Office, da sie zu seiner Zeit so richtig teuer war.
    Wenn's danach geht, müsste ich immer noch meinen Mac LC2 verwenden, den ich Anfang der 90er kaufte.
    Ich habe seither nie wieder so viel Geld für einen Rechner ausgegeben. :D

    SCNR
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --