Convert | VB.net

Résolu
Bonjour,

J'essais de convertir la valeur d'une textbox en decimal afin d'effectuer ma requête correctement, j'ai vraiment mis en place des choses qui me paraissent bonnes, j'ai fouillé sur plusieurs forum, plusieurs technique mais rien n'y fait,

voici mon code avec l'une des tentatives :

            If maregex.IsMatch(TB_MtRecu.Text) Then
                resultat1 = Math.Round(CDec(TB_MtRecu.Text), 2)
                resultat2 = Math.Round(CDec(TB_Total_Global.Text), 2)
                If ((resultat1 < resultat2) And resultat1 >= 0) Then
                    updatefact.CommandText() = "UPDATE facture SET montantrecu = " & resultat1 & ", datereg = '" & Today.Year & "-" & Today.Month & "-" & Today.Day & "' WHERE datefact = '" & dateentiere(2) & "-" & dateentiere(1) & "-" & dateentiere(0) & "' AND codeparentf = " & moncode(0) & ""
                    updatefact.ExecuteNonQuery()
                Else
                    MsgBox("Veuillez saisir un montant comprit entre 0 et le montant total de la facture", MsgBoxStyle.OkOnly, "Avertissement")
                End If
            Else
                MsgBox("Saisissez une valeur correcte", MsgBoxStyle.OkOnly, "Avertissement")
            End If


j'ai donc tenté le Cdec(matextbox.text) mais j'ai l'erreur comme quoi on ne peut pas convertir en decimal du text...

j'ai tenté le Math.round, mêlé aussi avec du Cdec...

J'ai testé tout ce que j'ai trouvé mais rien n'y fait.

C'est pourquoi je vous sollicite :),

Merci d'avance. Cordialement,

Xineroks

8 réponses

  1. Je poste la solution...

    En fait il faut replace 2 fois et convertir, une fois pour la comparaison des deux valeurs, puis pour l'insérer, c'est tordu et ça fonctionne. J'ai pourtant tenté de rentrer une valeur avec virgule direct puis de convertir en Single, mais ça me mettait une erreur, bref... voici la solution :

     sqlCnx.Open()  
            If CB_DateFact.Text <> "" Then  
                If maregex.IsMatch(TB_MontantRecu.Text) Then  
    
                    resultat1 = CSng(Replace(TB_MontantRecu.Text, ".", ","))  
                    resultat2 = CSng(TB_Total_Global.Text)  
                    TB_Commentaire.Text = TB_MontantRecu.Text  
                    If (resultat1 < resultat2 And resultat1 >= 0) Then  
                        resultat1 = Replace(resultat1, ",", ".")  
                        updatefact.CommandText() = "UPDATE facture SET montantrecu = '" & resultat1 & "', datereg = '" & Today.Year & "-" & Today.Month & "-" & Today.Day & "' WHERE datefact = '" & dateentiere(2) & "-" & dateentiere(1) & "-" & dateentiere(0) & "' AND codeparentf = " & moncode(0) & ""  
                        updatefact.ExecuteNonQuery()  
                    Else  
                        MsgBox("Veuillez saisir un montant comprit entre 0 et le montant total de la facture", MsgBoxStyle.OkOnly, "Avertissement")  
                    End If  
                Else  
                    MsgBox("Saisissez une valeur correcte", MsgBoxStyle.OkOnly, "Avertissement")  
                End If  
    
            Else  
                MsgBox("Veuillez d'abord selectionner une date correspondant à une facture d'une famille", MsgBoxStyle.OkOnly, "Avertissement")  
            End If  
            sqlCnx.Close()


    j'ai passé aussi resultat1 en string

    Merci beaucoup de ta patience lermite ;).

    J'apprécie vraiment ton aide, mais perso j'aimerai ne plus avoir à demander de l'aide xD

    Sans doute que je posterais à nouveau d'ici quelque jours...
    0
    1. Contributeur
      Tout cà parce que tu n'a pas tester ma première solution
      Prochaine fois, dis plus Nooonnn j'ai fais çi ou ça... TESTE svp.
      Et avec VB.Net ta solution est pas la bonne, ton appli n'est pas transposable.
      resultat1 = Decimal.TryParse(TextBox1.Text, resultat1)

      Et pas besoin de ... bidouller
      A+
      0
    2. J'ai testé, mais du coup lorsqu'il fallait mettre dans la base ça ne fonctionnait pas, il fallait revenir sur le "." sinon oui c'était ça.
      0
    3. Contributeur
      up pour la modif
      0
    4. C'est Exactement ce qu'il me fallait ! Merci, décidément sans toi je ne m'en sortirais pas ! Mais bon c'est comme ça qu'on apprend et ces choses là ça ne s'oublie pas, merci encore !
      0
  2. Le truc c'est que le tryparse n'est même pas atteint ^^'
    Ca bloque sur une instruction toute simple avant, alors que la même qui est exactement identique au dessus fonctionne nikel
    0
    1. Contributeur
      beh oui, mais où ça bloque !! ?
      Peut être ici..
      resultat1 = CDec(TB_MtRecu.Text)
              sqlCnx.Open()

      Tu te sert d'un enregistrement avant d'ouvrir la table.
      0
    2. Dim resultat1 As Decimal, resultat2 As Decimal

      resultat2 = CDec(TB_Total_Global.Text)
      resultat1 = CDec(TB_MtRecu.Text)

      l'erreur est ici :
      resultat1 = CDec(TB_MtRecu.Text)

      On ne peut pas convertir ...

      alors que la :
      resultat2 = CDec(TB_Total_Global.Text)

      Qui est exactement pareil, ça passe.
      0
    3. Nope aucun soucis la dessus car j'entre la valeur à la main, pas besoin d'ouverture de base
      0
    4. resultat2 = CDec(TB_Total_Global.Text) , cette valeur provient d'une autre proc de cette maniere :

      TB_Total_Global.Text = CDbl(TB_Total_Global.Text) + NBreservparenfant.ExecuteScalar * remplissageprix.ExecuteScalar
      0
    5. Contributeur
      Up, nouveau croisement :)
      0
  3. Contributeur
    Je crois que j'ai trouver ton problème, j'ai fait un essais pour être sûr.
    TryParse se sert du séparateur LOCAL pour faire le transfert ce qui veux dire que tu ne doit pas changer la virgule en point.
    Si c'est un OS US il fera la même chose mais avec le point.
    A+
    0
    1. Contributeur
      quel est le format exact de TB_MtRecu.Text
      je veux dire, le formatage avec par exemple $ ou autre
      Et ce sera pas plus confortable d'initialiser Resultat1 / et 2 directement et ensuite se servir de la variable et plus chaque fois du TryParse (ça n'a rien à voir avec ta question)
      0
      1. J'essais pleins de choses pour voir ^^ j'ai essayer sans utiliser mes variables resultat, donc en mettant directement en dur dans la requête. Le tryparse j'ai testé aussi. Bref, sinon je ne comprend pas trop ce que tu veux dire par format du textbox ?
        0
    2.         Dim resultat1 As Decimal, resultat2 As Decimal
      
              resultat2 = CDec(TB_Total_Global.Text)
              resultat1 = CDec(TB_MtRecu.Text)


      On est d'accord, y'a aucune différence entre les deux ?

      Quand je met exactement la même valeur, j'obtiens l'erreur sur resultat1 = CDec(TB_MtRecu.Text)...

      ^^'
      0
      1. Quand je fais un Decimal.tryparse(TB_montantrecu.text, resultat1)

        J'ai bien la TB qui est a 23.23, mais le resultat est à 0D

        Alors que même syntaxe pour le 2

        Decimal.tryparse(TB_total_global.text, resultat2)

        J'ai la TB à 45.24 et le resultat2 à 45.24D.

        Quelque chose ne vas pas sur ma TB_montantrecu

        C'est vraiment bizarre, je vais voir du coté des propriétés...
        0
        1. Quand je rentre un entier ça passe sans erreur...
          0
        2. Quand je rentre une valeur decimal qui vient de resultat1, j'ai toujours 0.
          Mais quand c'est resultat2, la valeur est la bonne...

          Pourquoi un tel problème pour quelque chose d'aussi simpliste?
          0
        3. Contributeur
          Tu n'aurais pas déclaré Resultat1 en integer ou long ?
          0
        4. Contributeur
          Up, poste croiser
          0
        5. ^^' sorry. Eh bien pour faire plus simple je vais poster toute ma procédure,
          sinon, c'est bien de type Decimal.

          Private Sub B_Payer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Payer.Click
          
                  Dim moncode() As String
                  moncode = Split(LB_AdRech.SelectedItem, " ")
          
                  Dim sqlCnx As New System.Data.Odbc.OdbcConnection(My.Settings.CS_CantineBDD)
                  Dim updatefact As New System.Data.Odbc.OdbcCommand("", sqlCnx)
                  Dim maregex As New Regex("^\d{1,3}(\.\d{1,2})?$")
                  Dim dateentiere() As String
                  Dim resultat1 As Decimal, resultat2 As Decimal
                  dateentiere = Split(CB_DateFact.SelectedItem, "/")
                  resultat1 = CDec(TB_MtRecu.Text)
                  sqlCnx.Open()
                  If CB_DateFact.Text <> "" Then
                      If maregex.IsMatch(TB_MtRecu.Text) Then
          
                          If (Not (Decimal.TryParse(TB_MtRecu.Text, resultat1) < Decimal.TryParse(TB_Total_Global.Text, resultat2) And Decimal.TryParse(TB_MtRecu.Text, resultat1) >= 0)) Then
                              updatefact.CommandText() = "UPDATE facture SET montantrecu = " & resultat1 & ", datereg = '" & Today.Year & "-" & Today.Month & "-" & Today.Day & "' WHERE datefact = '" & dateentiere(2) & "-" & dateentiere(1) & "-" & dateentiere(0) & "' AND codeparentf = " & moncode(0) & ""
                              updatefact.ExecuteNonQuery()
                          Else
                              MsgBox("Veuillez saisir un montant comprit entre 0 et le montant total de la facture", MsgBoxStyle.OkOnly, "Avertissement")
                          End If
                      Else
                          MsgBox("Saisissez une valeur correcte", MsgBoxStyle.OkOnly, "Avertissement")
                      End If
          
                  Else
                      MsgBox("Veuillez d'abord selectionner une date correspondant à une facture d'une famille", MsgBoxStyle.OkOnly, "Avertissement")
                  End If
                      sqlCnx.Close()
              End Sub
          0
      2. Merci pour cette réponse lermite, j'ai effectivement mis en place une Regex qui gère cela :

        Dim maregex As New Regex("^\d{1,3}(\.\d{1,2})?$")

        Mais le soucis c'est que même en mettant le "."
        j'ai toujours l'erreur :

        La conversion de la chaîne "12.32" en type 'Decimal' n'est pas valide.

        Y'a rien de plus valide que ça ? Je ne comprend vraiment pas lol
        0
        1. Contributeur
          Bonjour,
          Une entrée décimale en texte est avec une virgule et les nombres sont avec un point, avant d'appliquer Math... ou autre faut changer la virgule en point.
          Voir avec la fonction Replace.
          A+
          Voir..
          resultat1 = Math.Round(CDec(Replace(TB_MtRecu.Text, ",", ".")), 2)

          Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
          NOTE : Je ne répond pas aux MP pour les questions techniques.
          0