Mise à jour de champ date impossible!

Résolu
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 8 mars 2008 à 13:26
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 - 9 mars 2008 à 13:01
Bonjour,

je n'arrive pas à mettre à jour les deux champs date (mais de type texte) de ma table contrat. En fait, je voudrai insérer du vide dans ces champs dates au cas où il s'agirai d'un contrat à durée indéterminée. la structure de ma table est :

numcontrat, type texte
datedebutcontrat, type texte
datefincontrat, type texte
numtypecontrat, type numérique
numemp, type texte

Voici ma première requête

cn.Execute "update tablecontrat set numcontrat = '" & txtnumcontrat & "',datedebutcontrat='""',datefincontrat='""',numtypecontrat=" & x & " where numemp = " & txtcodeemp & ""

Mais j'ai l'erreur suivante : "Type de données incompatible dans l'expression du critère"

Ma deuxième requête est :

cn.Execute "update tablecontrat set numcontrat = '" & txtnumcontrat & "',null,null,numtypecontrat=" & x & " where numemp = " & txtcodeemp & ""

et là j'ai l'erreur "Erreur de syntaxe dans l'instruction UPDATE"
Quelqu'un pourrait-il m'aider s'il vous plaît?

Merci d'avance.

Cordialement.

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 mars 2008 à 14:44
Salut
D'abord, commençons par afficher tes requètes en mode 'lisible' :

"update tablecontrat " & _
"   set numcontrat = '" & txtnumcontrat & "', " & _
"       datedebutcontrat='""', " & _
"       datefincontrat='""', " & _
"       numtypecontrat=" & x & _
" Where numemp = " & txtcodeemp & ""
et
"update tablecontrat " & _
"   set numcontrat = '" & txtnumcontrat & "', " & _
"       null, " & _
"       null, " & _
"       numtypecontrat=" & x & _
" Where numemp = " & txtcodeemp & ""

Bon, déjà, on s'aperçoit que les requètes ne respectent pas la syntaxe VB ou SQL :
Dans requète 1 :
"       datedebutcontrat='""', "
va te donner un texte ressemblant à 
        datedebutcontrat='"',
puisque deux " à la suite à l'intérieur d'une chaine VB se traduit par un seul " dans le résultat.
Donc oui, problème de syntaxe VB
Suffit de laisser '' et de ne pas insérer de " à l'intérieur :
"       datedebutcontrat='', "
Idem pour la fin de la syntaxe : le "" devrait prooquer une erreur VB, mais comme il y a eu une précédente erreur de ", le nombre total de " dans la ligne est pair, donc masque cette erreur.

Dans requète 2 :
Dans une structure Set, il te faut répéter le nom des champs (et respecter leur ordre).
Un Null tout seul ne fonctionnera pas sous SQL
+ Supprimer le "" final qui ne sert à rien

Divers 1 :
Si ta variable vb nommée 'x' est de type numérique, je te conseille de l'insérer sous forme d'un texte dans la chaine de la requète (plus propre et moins risqué) :
"       numtypecontrat   = " & CStr(x) & _

Divers 2 :
A l'inverse, es-tu sûr que ton champ 'numcontrat' soit de type texte dans la définition de ta DB ?
Car tu as mis des ' pour encadrer la valeur. Si le champ est numérique, cela provoquera une erreur --> Supprime les ' d'encadrement.

Conclusion :
Plutôt que de mettre la syntaxe SQL directement dans la syntaxe du Execute, passe par une variable chiane temporaire. Cela te permettra de faire un Debug.Print ou un MsgBox de cette variable et de voir la gueule de la requète avant de la soumettre et ainsi voir tout de suite d'où vient le problème.
Si les champs de ta table acceptent les valeurs Null, insère plutôt des Null que des champs vide ''.

Après correction, tes requètes sont identiques et resselerait à ça :
"update tablecontrat " & _
"   set numcontrat       = " & txtnumcontrat & ", " & _
"       datedebutcontrat = Null, " & _
"       datefincontrat   = Null, " & _
"       numtypecontrat   = " & CStr(x) & _
" Where numemp = " & txtcodeemp

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 mars 2008 à 00:50
Re
Simplement comme ça :
   Dim maRequete As String
   maRequete = "Update ..."
   Debug.Print maRequete
ou
   MsgBox maRequete
   cn.Execute maRequete
et regarde dans la fenêtre de debug (Ctrl-G) : Il t'affichera le contenu de ce que tu as préparé.
Tu n'as plus qu'à vérifier que la syntaxe est correcte

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
8 mars 2008 à 22:20
Salut Jack,
Merci beaucoup d'avoir si bien mis en forme mon message. Merci également pour ton aide. Je pense avoir essayé le datedebutcontrat=null  et le datedebutcontrat='' et j'avais toujours ces erreurs (la 1 je crois). Mais, je vais rééssayer quand même car tes explications sont très clairs et je n'avais pas essayé le CStr(x). Par contre je ne sais pas comment utiliser le debug.print et le Msgbox qui semble être d'excellents moyens de vérifier le résultat de ses requêtes. Pourrais-tu m'éclaircir sur ce point une fois de plus s'il te plaît? Merci d'avance.

Cordialement
0
js8bleu Messages postés 576 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 27 janvier 2014 2
9 mars 2008 à 13:01
Salut Jack,

j'ai enfin pu régler le problème en fait je n'avais pas de '' à la fin de la requête car en effet le type du " & txtnumemp & " ne correspondait pas. Je te remercie beaucoup pour ton aide. Par contre un problème demeure celui de l'incrémentation automatique. Voici ce que j'aimerai faire :

vérifier dans ma table employe s'il y a au moins un enregistrement
si non alors
numemp = 1
sinon
numemp = dernier numemp + 1
fin si

NB:Avec numemp à présent de type numérique.

J'ai déjà posté dans le forum sans trouver de solution adéquate. Merci d'avance de m'aider.

Cordialement
0
Rejoignez-nous