CURRENCY : UN TYPE MÉCONNU (MONEY SOUS SQL-SERVER)
PtitJeoJeo
Messages postés85Date d'inscriptionmardi 29 janvier 2002StatutMembreDernière intervention18 avril 2005
-
16 juil. 2002 à 16:52
jeuxsimple
Messages postés6Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention20 avril 2008
-
20 avril 2008 à 02:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
jeuxsimple
Messages postés6Date d'inscriptionmercredi 5 mars 2008StatutMembreDernière intervention20 avril 2008 20 avril 2008 à 02:25
merci beaucoup skrol29 c bien marcher .merci de ton aide a+
FENETRES
Messages postés196Date d'inscriptionjeudi 15 juillet 2004StatutMembreDernière intervention14 avril 2009 4 janv. 2008 à 11:50
Très pertinent, le conseil est toujours d'actualité !
nourwahiba
Messages postés82Date d'inscriptionmardi 18 octobre 2005StatutMembreDernière intervention23 juin 2011 2 août 2006 à 11:10
bonjour skrol29
merci pour votre reponse et je vais l'essayer immediatement sur mon pc j'esoere que ca va y aller
merci
bonne suite ....
skrol29
Messages postés114Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention17 novembre 2014 30 juil. 2006 à 22:45
Nourwahiba : En VB ou SQL-Serveur le type monétaire se gère de la même manière que toutes les autres valeurs de type numérique. Simplement tu dois faire attention à quelque chose qui est général pour les valeurs numériques : si ton Visual Basic est en français, la conversion passive de numérique en chaîne se fait avec une virgule comme séparateur de décimale. Or celle-ci n'est pas accpetée par SQL-Serveur qui attend un point. Il faut donc faire une conversion explicite de tes montants en utilisant la fonction Format() de Visual Basic.
Exemple :
$SQL = "INSERT INTO ma_table (montant) VALUES (". & Format(montant,"0.0000") & ")"
nourwahiba
Messages postés82Date d'inscriptionmardi 18 octobre 2005StatutMembreDernière intervention23 juin 2011 29 juil. 2006 à 16:15
bonjour
je veux savoir comment faire pour inserer une variable cuurency ( vb) dans une table sql serveur ( champ en money) car quand j'ai essayé d'inserer ma facture( n° facture , ttc) dans ma table sa me pose un probleme
alors quoi faire exactement
cs_gogomanu
Messages postés29Date d'inscriptionmardi 7 janvier 2003StatutMembreDernière intervention26 mars 2009 18 juin 2003 à 13:21
Excellent currency, en regardant dans les docs j'avais pas bien compris à quoi ça servait j'avais l'impression que c'était une sorte de "double" en fait.
Très bon à savoir, je me suis flingué la tête à faire une procédure d'arrondi, ça parait tout con mais j'ai dû la retoucher plusieurs fois!
Public Function Arrondi(Calc As Variant, Optional ByVal ArrondiNombres% 2, Optional ByVal JusteTronquer As Boolean False) As Double
' Arrondi à N chiffres après la virgule (0,003 -> 0,00 0,005 -> 0,01)
' Calc: Nombre à arrondir
' ArrondiNombres: Nombre de chiffres après la virgule
' JusteTronquer: Arrondir en dessous
'
' Optimisation avec un select case pour essayer d'améliorer ce qui est
' facilement améliorable: arrondi 2 est très fréquent par exemple.
'
Dim Decal As Double, Decal2 As Double, Tmp As Double
On Error GoTo Err
Select Case ArrondiNombres
Case 2:
Decal = 100
Decal2 = 0.005
Case 0:
Decal = 1
Decal2 = 0.5
Case 1:
Decal = 10
Decal2 = 0.05
Case 3:
Decal = 1000
Decal2 = 0.0005
Case Else:
Decal = 10 ^ ArrondiNombres
Decal2 = (1 / (Decal + Decal))
End Select
If JusteTronquer Then Decal2 = 0
Tmp = Nz(Calc, 0)
If Decal2 <> 0 Then Tmp = Tmp + Decal2 ' pour ne pas déformer le "Double"
If Decal <> 1 Then Tmp = Tmp * Decal
'*** Je veux garder la partie ENTIERE EXACTE (merci access de daube)
Tmp = Int(Tmp)
If Decal <> 1 Then Tmp = Tmp / Decal
Arrondi = Tmp
'*** La première version paraissait simple: mais bug dans certains cas !!! :
' Arrondi = Int((Nz(Calc, 0) + Decal2) * Decal) / Decal
'********** fin de la première version
Fin:
Exit Function
skrol29
Messages postés114Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention17 novembre 2014 17 juil. 2002 à 13:28
>Je conseil de travailer en entier long (donc en centimes)
C'est justement comme cela que fonctionne le type Currency.
Il stock le montant sans la virgule, et le gère comme un entier pour les opérations linéaires (somme, multiplication). Mais il restitue la représentation interne divisées 1000 (4 décimales) pour l'affichage et les autres calculs.
Trop fort le Currency.
Sirocooo
Messages postés412Date d'inscriptionmercredi 19 décembre 2001StatutMembreDernière intervention 7 avril 20081 17 juil. 2002 à 11:50
Par expérience je peux dire aujourdh'ui que stocker ses données avec virgule flotante ou fixe source de bugs et d'erreurs.
Quand on développe une grosse appli, un jour ou l'autre ca pete à la figure !!!
Je conseil de travailer en entier long (donc en centimes) c'est beaucoup plus fiable et précis.
à bon entendeur,...
cs_OphidiaN
Messages postés235Date d'inscriptionmercredi 4 avril 2001StatutMembreDernière intervention 9 novembre 2007 16 juil. 2002 à 18:35
kler, j'avais jamais vu....
PtitJeoJeo
Messages postés85Date d'inscriptionmardi 29 janvier 2002StatutMembreDernière intervention18 avril 2005 16 juil. 2002 à 16:52
20 avril 2008 à 02:25
4 janv. 2008 à 11:50
2 août 2006 à 11:10
merci pour votre reponse et je vais l'essayer immediatement sur mon pc j'esoere que ca va y aller
merci
bonne suite ....
30 juil. 2006 à 22:45
Exemple :
$SQL = "INSERT INTO ma_table (montant) VALUES (". & Format(montant,"0.0000") & ")"
29 juil. 2006 à 16:15
je veux savoir comment faire pour inserer une variable cuurency ( vb) dans une table sql serveur ( champ en money) car quand j'ai essayé d'inserer ma facture( n° facture , ttc) dans ma table sa me pose un probleme
alors quoi faire exactement
18 juin 2003 à 13:21
Très bon à savoir, je me suis flingué la tête à faire une procédure d'arrondi, ça parait tout con mais j'ai dû la retoucher plusieurs fois!
Public Function Arrondi(Calc As Variant, Optional ByVal ArrondiNombres% 2, Optional ByVal JusteTronquer As Boolean False) As Double
' Arrondi à N chiffres après la virgule (0,003 -> 0,00 0,005 -> 0,01)
' Calc: Nombre à arrondir
' ArrondiNombres: Nombre de chiffres après la virgule
' JusteTronquer: Arrondir en dessous
'
' Optimisation avec un select case pour essayer d'améliorer ce qui est
' facilement améliorable: arrondi 2 est très fréquent par exemple.
'
Dim Decal As Double, Decal2 As Double, Tmp As Double
On Error GoTo Err
Select Case ArrondiNombres
Case 2:
Decal = 100
Decal2 = 0.005
Case 0:
Decal = 1
Decal2 = 0.5
Case 1:
Decal = 10
Decal2 = 0.05
Case 3:
Decal = 1000
Decal2 = 0.0005
Case Else:
Decal = 10 ^ ArrondiNombres
Decal2 = (1 / (Decal + Decal))
End Select
If JusteTronquer Then Decal2 = 0
Tmp = Nz(Calc, 0)
If Decal2 <> 0 Then Tmp = Tmp + Decal2 ' pour ne pas déformer le "Double"
If Decal <> 1 Then Tmp = Tmp * Decal
'*** Je veux garder la partie ENTIERE EXACTE (merci access de daube)
Tmp = Int(Tmp)
If Decal <> 1 Then Tmp = Tmp / Decal
Arrondi = Tmp
'*** La première version paraissait simple: mais bug dans certains cas !!! :
' Arrondi = Int((Nz(Calc, 0) + Decal2) * Decal) / Decal
'********** fin de la première version
Fin:
Exit Function
Err:
MsgBox "Erreur Arrondi: " & vbCr & Err.Number & ": " & Err.Description, vbExclamation
Resume Fin
End Function
17 juil. 2002 à 13:28
C'est justement comme cela que fonctionne le type Currency.
Il stock le montant sans la virgule, et le gère comme un entier pour les opérations linéaires (somme, multiplication). Mais il restitue la représentation interne divisées 1000 (4 décimales) pour l'affichage et les autres calculs.
Trop fort le Currency.
17 juil. 2002 à 11:50
Quand on développe une grosse appli, un jour ou l'autre ca pete à la figure !!!
Je conseil de travailer en entier long (donc en centimes) c'est beaucoup plus fiable et précis.
à bon entendeur,...
16 juil. 2002 à 18:35
16 juil. 2002 à 16:52
Ptitjeojeo