OVH Cloud OVH Cloud

Pb INSERT into

10 réponses
Avatar
JCM
Bonjour a tous

J'ai un beug dans la commande ci-dessous, cela vient de
FGlibelle qui est egal a "pain patisserie fraiche" je
pense qu'il faut ajouter une replace FGlibelle mais je ne
vois pas comment l'ecrire

Call ADOcnx.Execute("insert into " & TableIDC
& "(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", " & FGlibelle
& ", " & FGValeur & ")")

Merci de vos reponses
Cordialement
JCM

10 réponses

Avatar
Zoury
Salut Jean-Claude! :O)

En SQL les type "String" doivent être entouré d'apostrophes.

ex :
----
insert into matable(champ1, champ2) values ('test', 2)
---
où, par exemple, champ1 est de type varchar et champ2 int.


maintenant, je ne connais pas le type de tous les champs de ta reqête, mais
si on suppose que seul FGlibelle est de type String alors tu aurais :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & FGValeur & ")")
'***

note bien la différence.. ceci :
", " & FGlibelle & ", "
devient ceci :
", '" & FGlibelle & "', "

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Salut Zoury

Merci pour ta réponse, cela fonctionne après corrections
et je note dans mon pense-bete ces précieuses
recommandations.

J'ai un autre problème sur cette appli. J'ai un MSFlexGrid
dans lequel j'ai saisi des infos, à partir d'un
bouton "enregistre" je fais une boucle sur celui-ci pour
enregistrer les infos dans une table Access.

Au premier tour de la boucle pas de problème, au second
j'ai ce message d'erreur : le nombre de valeurs de la
requetre doit coincider avec le nombre de champs de
destination.

Pourtant les infos a enregistrer coincident bien avec les
champs de la table, d'ailleurs le premier tour enregistre
bien, voila mon code

'boucle fgIDC (41 lignes)
Dim FGlibelle As String
Dim FGValeur As String
Dim lavaleur As Integer
voirligneFG = -1

Do While voirligneFG <= 41
'capture des infos de FgIDC
voirligneFG = voirligneFG + 1
'laligneFG = FgIDC.Row
FGlibelle = fgIDC.TextMatrix(voirligneFG, 0)
FGValeur = fgIDC.TextMatrix(voirligneFG, 1)
lavaleur = CInt(FGValeur)

'recherche de IDIDC
Call MyFonctions.ExecSQL("Select IDIDC from TypeIDC
where libelle='" & FGlibelle & "'", ADOrst, ADOcnx)
LeTypeIDC = ADOrst("IDIDC")
'entre le nouvel enregistrement
LIDTypeIDC = RubIDCSelect

Call ADOcnx.Execute("insert into " & TableIDC
& "(IDTypeIDC, IDIDC, libelle, IDC) values ('" & _
LIDTypeIDC & "', '" & LeTypeIDC & "', '" & FGlibelle
& "', " & FGValeur & ")")
Loop

Je n'arrive pas a voir ou est l'erreur

Cordialement
Jean Claude

PS j'ai posé une question sur un menu dynamique, mais cela
n'a pas l'air d'inspirer les visiteurs, peut-etre as tu la
réponse
-----Message d'origine-----
Salut Jean-Claude! :O)

En SQL les type "String" doivent être entouré


d'apostrophes.

ex :
----
insert into matable(champ1, champ2) values ('test', 2)
---
où, par exemple, champ1 est de type varchar et champ2 int.


maintenant, je ne connais pas le type de tous les champs


de ta reqête, mais
si on suppose que seul FGlibelle est de type String alors


tu aurais :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & FGValeur & ")")
'***

note bien la différence.. ceci :
", " & FGlibelle & ", "
devient ceci :
", '" & FGlibelle & "', "

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
Salut Jean-Claude! :O)

Au premier tour de la boucle pas de problème, au second


<snip>
Je n'arrive pas a voir ou est l'erreur



as-tu imprimé la requête afin d'y lire les valeurs impliquées ? parfois
(souvent en fait) on trouve des choses intéressantes ;O)

'***
Dim sQuery As String
sQuery = "insert into " & TableIDC & _
"(IDTypeIDC, IDIDC, libelle, IDC) values ('" & _
LIDTypeIDC & "', '" & _
LeTypeIDC & "', '" & _
FGlibelle & "', " & _
FGValeur & ")"
Debug.Print sQuery ' imprime dans la fenêtre d'exécution
'Call ADOcnx.Execute(sQuery)
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Merci Zoury

pour ta réponse, avec le Debug.Print sQuery cela fonctionne

Le problème vient de la variable
Dim lavaleur As Integer
lavaleur = CDec(FGValeur)

qui doit remplir le champs IDC de ma table (déclaré lors
de la création de la table en numérique, décimal, 1
décimal)

la variable lavaleur a également 1 décimale, mais cela
l'enregistre en valeur arrondie

J'ai essayé CCur cela ne change pas le problème

Cordialement
Jean Claude
-----Message d'origine-----
Salut Jean-Claude! :O)

Au premier tour de la boucle pas de problème, au second


<snip>
Je n'arrive pas a voir ou est l'erreur



as-tu imprimé la requête afin d'y lire les valeurs


impliquées ? parfois
(souvent en fait) on trouve des choses intéressantes ;O)

'***
Dim sQuery As String
sQuery = "insert into " & TableIDC & _
"(IDTypeIDC, IDIDC, libelle, IDC)


values ('" & _
LIDTypeIDC & "', '" & _
LeTypeIDC & "', '" & _
FGlibelle & "', " & _
FGValeur & ")"
Debug.Print sQuery ' imprime dans la fenêtre


d'exécution
'Call ADOcnx.Execute(sQuery)
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
> Dim lavaleur As Integer
lavaleur = CDec(FGValeur)



la variable lavaleur a également 1 décimale, mais cela
l'enregistre en valeur arrondie



lavaleur est de type Integer (entier) et ne peut donc pas contenir de
décimal.. utilise plutôt un type single. Aussi, fait gaffe lors de la
conversion de la donnée Single en String.. VB converti une valeur décimale
selon tes configurations systèmes.

je veux dire :
'***
?4.5
4,5
'***

ainsi la valeur passé à la requête contient une virgule et non un point. Or
ton serveur SQL lui (tout comme VB) considère le point comme étant
séparateur décimal. Tu devrais donc remplacer la virgule par un point.

Tu obtiens possiblement déjà une erreur mais ton "On Error Resume Next" te
prive de cette information...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Re salut

Effectivement il est préférable de saisir (dans le
MSFlrxGrid) lavaleur avec un point car elle servira
ulterieurement dans des calculs (multiplication)

Si je declare (pour 102.4)
Dim lavaleur As Single
lavaleur = CSng(FGValeur)

lavaleur2,4
et cela beug

Cordialement
JCM
-----Message d'origine-----
Dim lavaleur As Integer
lavaleur = CDec(FGValeur)



la variable lavaleur a également 1 décimale, mais cela
l'enregistre en valeur arrondie



lavaleur est de type Integer (entier) et ne peut donc pas


contenir de
décimal.. utilise plutôt un type single. Aussi, fait


gaffe lors de la
conversion de la donnée Single en String.. VB converti


une valeur décimale
selon tes configurations systèmes.

je veux dire :
'***
?4.5
4,5
'***

ainsi la valeur passé à la requête contient une virgule


et non un point. Or
ton serveur SQL lui (tout comme VB) considère le point


comme étant
séparateur décimal. Tu devrais donc remplacer la virgule


par un point.

Tu obtiens possiblement déjà une erreur mais ton "On


Error Resume Next" te
prive de cette information...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
102,4 est la représentation formatté de la valeur (selon les configs
système) il faudra donc remplacer (Replace()) la virgule par un point
lorsque l'on concatène la valeur à la chaine

ex :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & Replace(FGValeur, ",", ".") & ")")
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic Classique
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Salut Zoury

Cela ne fonctionne pas car
Replace(FGValeur, ",", ".") donne une valeur string
et il faut une valeur numérique

si je fais :

dim Lavaleur as single
lavaleur=Csng (Replace(FGValeur, ",", ".")) cela me dit
type incompatible

Cordialement
Jean claude


-----Message d'origine-----
102,4 est la représentation formatté de la valeur (selon


les configs
système) il faudra donc remplacer (Replace()) la virgule


par un point
lorsque l'on concatène la valeur à la chaine

ex :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & Replace(FGValeur, ",", ".") & ")")
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic Classique
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
> Cela ne fonctionne pas car
Replace(FGValeur, ",", ".") donne une valeur string
et il faut une valeur numérique



Faux. :O)

Il te faut une String représentant une valeur numérique. Car c'est une
string que tu dois passer en paramètre.

et si tu essai comme ceci ? :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & Replace(CSng(FGValeur), ",", ".") & ")")
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Re salut Zoury

OK j'ai modifié mon code, le debug.print sQuery m'affiche
102.7
par contre le Insert into beug avec le message type de
données incompatible dans l'expression du critère

dois-je transformer le champs IDC de ma table en texte car
il est en numérique ?

si c'est le cas, quand j'aurais à extraire cette valeur
dans une autre procédure elle sera en string soit "102.7"

et si je veux la multiplier à une variable numérique il me
faudra la convertir en single soit

150*Csng(102.7) est-ce bien cela ?

Cordialement
Jean Claude
-----Message d'origine-----
Cela ne fonctionne pas car
Replace(FGValeur, ",", ".") donne une valeur string
et il faut une valeur numérique



Faux. :O)

Il te faut une String représentant une valeur numérique.


Car c'est une
string que tu dois passer en paramètre.

et si tu essai comme ceci ? :
'***
Call ADOcnx.Execute("insert into " & TableIDC & _
"(IDTypIDC, IDIDC, libelle, IDC) values (" & _
LIDTypeIDC & ", " & LeTypeIDC & ", '" & _
FGlibelle & "', " & Replace(CSng(FGValeur), ",", ".")


& ")")
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.