Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb d'incompatibilité de type données dans rqt INSERT INTO

14 réponses
Avatar
The Marmotte
Bonjour à tous,

Voilà, j'exécute une requête SQL Ajout via VBA, pour laquelle les données à
insérer ont été stockées dans des variables de ma procédure. Or, une de ces
données est de type Double (puisqu'elle va être insérée dans un champ Double
de ma table), mais dans ma requête SQL, la virgule de décimale de ma donnée
est considérée comme un séparateur, et l'exécution de ma requête VBA produit
l'erreur : "le nombre de données insérées doit être égale au nombre de
champs de destination"

J'ai essayé plein de trucs, du genre transformer ma variable en
Replace(Str(MaVariable), ",", ".") ou Replace(MaVariable, ",", ".") pour
remplacer la virgule par un point, mais rien n'y fait (avec cette fonction,
ma variable se retrouve entre guillemets, comme c'est devenu une chaîne, et
du coup je suppose que la valeur renvoyée dans ma requête est, par exemple,
"150.25" au lieu de 150.25. Du coup j'essaie de stocker un String dans un
champ Double !), et j'obtiens une autre erreur d'exécution de requête :
"Incompatibilité de type".
Voici donc mon bout de code, merci pour votre aide, ça fait des heures que
je fais du surplace, j'en ai marre !!!

Dim NoLoc as Integer, DateLoc as Date, MontantLoc as Double, strSQL as
String

NoLoc = Me.IdLoc
DateLoc = NoJour & "/" & NoMois & "/" & NoAnnee
MontantLoc = Me.Montant * Me.Duree / Me.DureeTotale

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) "
strSQL = strSQL & "SELECT " & CInt(NoLoc) & " AS F1, " & CDate(DateLoc) & "
AS F2, "
strSQL = strSQL & Replace(Str(MontantLoc), ",", ".") & " AS F3;"
DoCmd.RunSQL strSQL

4 réponses

1 2
Avatar
Pierre CFI [mvp]
bonjour
on peut multiplier la variable, puis la diviser dans la chaine sql
Montant = Montant * 100

insert ...... & (Montant /100 ) & ...

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Jessy Sempere [MVP]" a écrit dans le message de news: c26vlb$ji4$
Bonjour

Effectivement c'est con cette histoire de séparateur décimal qui est
considéré comme un séparateur de champ en SQL...

Honnêtement en SQL je ne vois pas trop la solution par contre
il te suffit d'utiliser un recordset plutôt qu'un SQL et là tu n'auras
plus de problème...

Exemple :
******************************************************
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("TblRecapLoc", dbOpenDynaset)
With rst
.AddNew
.Fields("Loc") = CInt(Me.IdLoc)
.Fields("DateDeLoc") = CDate(NoJour & "/" & NoMois & "/" & NoAnnee)
.Fields("MontantNet") = Me.Montant * Me.Duree / Me.DureeTotale
.Update
End With
rst.Close: Set rst = Nothing
******************************************************
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"The Marmotte" <F... The Spammers> a écrit dans le message news:
4046ebdf$0$29933$
Bonjour à tous,

Voilà, j'exécute une requête SQL Ajout via VBA, pour laquelle les données
à

insérer ont été stockées dans des variables de ma procédure. Or, une de
ces

données est de type Double (puisqu'elle va être insérée dans un champ
Double

de ma table), mais dans ma requête SQL, la virgule de décimale de ma
donnée

est considérée comme un séparateur, et l'exécution de ma requête VBA
produit

l'erreur : "le nombre de données insérées doit être égale au nombre de
champs de destination"

J'ai essayé plein de trucs, du genre transformer ma variable en
Replace(Str(MaVariable), ",", ".") ou Replace(MaVariable, ",", ".") pour
remplacer la virgule par un point, mais rien n'y fait (avec cette
fonction,

ma variable se retrouve entre guillemets, comme c'est devenu une chaîne,
et

du coup je suppose que la valeur renvoyée dans ma requête est, par
exemple,

"150.25" au lieu de 150.25. Du coup j'essaie de stocker un String dans un
champ Double !), et j'obtiens une autre erreur d'exécution de requête :
"Incompatibilité de type".
Voici donc mon bout de code, merci pour votre aide, ça fait des heures que
je fais du surplace, j'en ai marre !!!

Dim NoLoc as Integer, DateLoc as Date, MontantLoc as Double, strSQL as
String

NoLoc = Me.IdLoc
DateLoc = NoJour & "/" & NoMois & "/" & NoAnnee
MontantLoc = Me.Montant * Me.Duree / Me.DureeTotale

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) "
strSQL = strSQL & "SELECT " & CInt(NoLoc) & " AS F1, " & CDate(DateLoc) &
"

AS F2, "
strSQL = strSQL & Replace(Str(MontantLoc), ",", ".") & " AS F3;"
DoCmd.RunSQL strSQL








Avatar
Jessy Sempere [MVP]
Re,

Sinon tu as encore une autre possibilité, c'est de définir ta variable
MontantLoc comme String
Ensuite tu la remplis de la façon suivante :
MontantLoc = Str(Me.Montant * Me.Duree / Me.DureeTotale)

Exemple :
*********************************************************
Dim NoLoc As Integer, DateLoc As Date, MontantLoc As String, strSQL As
String

NoLoc = Me.IdLoc
DateLoc = NoJour & "/" & NoMois & "/" & NoAnnee
MontantLoc = str(Me.Montant * Me.Duree / Me.DureeTotale)

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) " _
& "VALUES (" & CInt(NoLoc) & ", " & CDate(DateLoc) & ", " _
& MontantLoc & ");"
DoCmd.RunSQL strSQL
MsgBox strSQL
*********************************************************

Voilà ça fait 3 solutions possibles, est ce que ça marche chez toi ???

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Jessy Sempere [MVP]" a écrit dans le message
news: c271lg$kk0$
Re,

J'ai réussi en SQL chez moi, ça donne :

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) " _
& "VALUES (" & CInt(NoLoc) & ", " & CDate(DateLoc) & ", " _
& Replace(MontantLoc, ",", ".") & ");"
DoCmd.RunSQL strSQL

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Jessy Sempere [MVP]" a écrit dans le message
news: c26vlb$ji4$
Bonjour

Effectivement c'est con cette histoire de séparateur décimal qui est
considéré comme un séparateur de champ en SQL...

Honnêtement en SQL je ne vois pas trop la solution par contre
il te suffit d'utiliser un recordset plutôt qu'un SQL et là tu n'auras
plus de problème...

Exemple :
******************************************************
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("TblRecapLoc", dbOpenDynaset)
With rst
.AddNew
.Fields("Loc") = CInt(Me.IdLoc)
.Fields("DateDeLoc") = CDate(NoJour & "/" & NoMois & "/" &
NoAnnee)

.Fields("MontantNet") = Me.Montant * Me.Duree / Me.DureeTotale
.Update
End With
rst.Close: Set rst = Nothing
******************************************************
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------







Avatar
Pierre CFI [mvp]
en plus, je sais pas pourquoi j'ai dis çà, car je suis sur que replace marche (ce que tu viens de dire), car je l'ai utilisé la
semaine derniére
mais notre ami a mis Str avec, et là, no good

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Jessy Sempere [MVP]" a écrit dans le message de news: c271nb$kkb$
Salut Pierre

J'ai essayé aussi mais access transcrit le montant calculé dans le SQL
donc le montant avec les décimales...

Tu peux tester si tu veux, tu verras... ;-))

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Pierre CFI [mvp]" a écrit dans le message news:
#EZm#
bonjour
on peut multiplier la variable, puis la diviser dans la chaine sql
Montant = Montant * 100

insert ...... & (Montant /100 ) & ...

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Jessy Sempere [MVP]" a écrit dans le message
de news: c26vlb$ji4$

Bonjour

Effectivement c'est con cette histoire de séparateur décimal qui est
considéré comme un séparateur de champ en SQL...

Honnêtement en SQL je ne vois pas trop la solution par contre
il te suffit d'utiliser un recordset plutôt qu'un SQL et là tu n'auras
plus de problème...

Exemple :
******************************************************
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("TblRecapLoc", dbOpenDynaset)
With rst
.AddNew
.Fields("Loc") = CInt(Me.IdLoc)
.Fields("DateDeLoc") = CDate(NoJour & "/" & NoMois & "/" &
NoAnnee)


.Fields("MontantNet") = Me.Montant * Me.Duree / Me.DureeTotale
.Update
End With
rst.Close: Set rst = Nothing
******************************************************
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"The Marmotte" <F... The Spammers> a écrit dans le message news:
4046ebdf$0$29933$
Bonjour à tous,

Voilà, j'exécute une requête SQL Ajout via VBA, pour laquelle les
données



à
insérer ont été stockées dans des variables de ma procédure. Or, une
de



ces
données est de type Double (puisqu'elle va être insérée dans un champ
Double

de ma table), mais dans ma requête SQL, la virgule de décimale de ma
donnée

est considérée comme un séparateur, et l'exécution de ma requête VBA
produit

l'erreur : "le nombre de données insérées doit être égale au nombre de
champs de destination"

J'ai essayé plein de trucs, du genre transformer ma variable en
Replace(Str(MaVariable), ",", ".") ou Replace(MaVariable, ",", ".")
pour



remplacer la virgule par un point, mais rien n'y fait (avec cette
fonction,

ma variable se retrouve entre guillemets, comme c'est devenu une
chaîne,



et
du coup je suppose que la valeur renvoyée dans ma requête est, par
exemple,

"150.25" au lieu de 150.25. Du coup j'essaie de stocker un String dans
un



champ Double !), et j'obtiens une autre erreur d'exécution de requête
:



"Incompatibilité de type".
Voici donc mon bout de code, merci pour votre aide, ça fait des heures
que



je fais du surplace, j'en ai marre !!!

Dim NoLoc as Integer, DateLoc as Date, MontantLoc as Double, strSQL as
String

NoLoc = Me.IdLoc
DateLoc = NoJour & "/" & NoMois & "/" & NoAnnee
MontantLoc = Me.Montant * Me.Duree / Me.DureeTotale

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) "
strSQL = strSQL & "SELECT " & CInt(NoLoc) & " AS F1, " &
CDate(DateLoc) &



"
AS F2, "
strSQL = strSQL & Replace(Str(MontantLoc), ",", ".") & " AS F3;"
DoCmd.RunSQL strSQL
















Avatar
Jessy Sempere [MVP]
RE,

en plus, je sais pas pourquoi j'ai dis çà, car je suis sur que replace
marche (ce que tu viens de dire), car je l'ai utilisé la

semaine derniére


Oui effectivement ça fonctionne sans problème...

mais notre ami a mis Str avec, et là, no good


Ben non, ça ne pose aucun pb, sa donnée à déjà un "." au lieu d'avoir une
","
donc en gros la fonction replace ne sert à rien, vu qu'il n'y a pas de , à
trouver...

Donc en résumé, soit tu mets :
- Replace(MontantLoc, ",", ".")
ou alors tu mets :
- Str(MontantLoc)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Jessy Sempere [MVP]" a écrit dans le message
de news: c271nb$kkb$

Salut Pierre

J'ai essayé aussi mais access transcrit le montant calculé dans le SQL
donc le montant avec les décimales...

Tu peux tester si tu veux, tu verras... ;-))

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Pierre CFI [mvp]" a écrit dans le message
news:


#EZm#
bonjour
on peut multiplier la variable, puis la diviser dans la chaine sql
Montant = Montant * 100

insert ...... & (Montant /100 ) & ...

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Jessy Sempere [MVP]" a écrit dans le
message



de news: c26vlb$ji4$
Bonjour

Effectivement c'est con cette histoire de séparateur décimal qui est
considéré comme un séparateur de champ en SQL...

Honnêtement en SQL je ne vois pas trop la solution par contre
il te suffit d'utiliser un recordset plutôt qu'un SQL et là tu
n'auras




plus de problème...

Exemple :
******************************************************
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("TblRecapLoc", dbOpenDynaset)
With rst
.AddNew
.Fields("Loc") = CInt(Me.IdLoc)
.Fields("DateDeLoc") = CDate(NoJour & "/" & NoMois & "/" &
NoAnnee)


.Fields("MontantNet") = Me.Montant * Me.Duree /
Me.DureeTotale




.Update
End With
rst.Close: Set rst = Nothing
******************************************************
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"The Marmotte" <F... The Spammers> a écrit dans le message news:
4046ebdf$0$29933$
Bonjour à tous,

Voilà, j'exécute une requête SQL Ajout via VBA, pour laquelle les
données



à
insérer ont été stockées dans des variables de ma procédure. Or,
une





de
ces
données est de type Double (puisqu'elle va être insérée dans un
champ





Double
de ma table), mais dans ma requête SQL, la virgule de décimale de
ma





donnée
est considérée comme un séparateur, et l'exécution de ma requête
VBA





produit
l'erreur : "le nombre de données insérées doit être égale au
nombre de





champs de destination"

J'ai essayé plein de trucs, du genre transformer ma variable en
Replace(Str(MaVariable), ",", ".") ou Replace(MaVariable, ",",
".")





pour
remplacer la virgule par un point, mais rien n'y fait (avec cette
fonction,

ma variable se retrouve entre guillemets, comme c'est devenu une
chaîne,



et
du coup je suppose que la valeur renvoyée dans ma requête est, par
exemple,

"150.25" au lieu de 150.25. Du coup j'essaie de stocker un String
dans





un
champ Double !), et j'obtiens une autre erreur d'exécution de
requête





:
"Incompatibilité de type".
Voici donc mon bout de code, merci pour votre aide, ça fait des
heures





que
je fais du surplace, j'en ai marre !!!

Dim NoLoc as Integer, DateLoc as Date, MontantLoc as Double,
strSQL as





String

NoLoc = Me.IdLoc
DateLoc = NoJour & "/" & NoMois & "/" & NoAnnee
MontantLoc = Me.Montant * Me.Duree / Me.DureeTotale

strSQL = "INSERT INTO TblRecapLoc ( Loc, DateDeLoc, MontantNet ) "
strSQL = strSQL & "SELECT " & CInt(NoLoc) & " AS F1, " &
CDate(DateLoc) &



"
AS F2, "
strSQL = strSQL & Replace(Str(MontantLoc), ",", ".") & " AS F3;"
DoCmd.RunSQL strSQL




















1 2