Convert | VB.net

Résolu/Fermé
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 - 19 janv. 2012 à 12:10
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 - 19 janv. 2012 à 17:21
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
A voir également:

8 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 19/01/2012 à 12:32
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 14:01
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 14:43
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 14:47
Quand je rentre un entier ça passe sans erreur...
0
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 14:53
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 janv. 2012 à 15:39
Tu n'aurais pas déclaré Resultat1 en integer ou long ?
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 janv. 2012 à 15:40
Up, poste croiser
0
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 15:42
^^' 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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:02
        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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 janv. 2012 à 16:10
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:15
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 janv. 2012 à 16:21
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:23
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 19/01/2012 à 16:30
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:30
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:31
Nope aucun soucis la dessus car j'entre la valeur à la main, pas besoin d'ouverture de base
0
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 16:32
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
19 janv. 2012 à 16:33
Up, nouveau croisement :)
0
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
Modifié par Xineroks le 19/01/2012 à 17:05
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 19/01/2012 à 17:15
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
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 17:13
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 191
Modifié par lermite222 le 19/01/2012 à 17:18
up pour la modif
0
Xineroks Messages postés 158 Date d'inscription lundi 9 janvier 2012 Statut Membre Dernière intervention 25 janvier 2014 3
19 janv. 2012 à 17:21
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