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

Impossible rendre vide un champ date

12 réponses
Avatar
domivax
Bonjour =E0 tous,

J'ai un formulaire avec un champ date et un bouton pour mettre =E0 jour
ma donn=E9e date dans sa table...

strSQL =3D "UPDATE TablePerson " & _
"SET PersonDateBirth =3D""" & IIf(Nz(NewDataDateBirth) =3D
True, "", NewDataDateBirth) & """ " & _
" WHERE PersonId=3D" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError

Quand le champ dans mon formulaire contient une date, aucun
probl=E8me... la date se met =E0 jour, par contre si mon champs formulaire
est vide Access me renvoie un message d'erreur "Erreur d'ex=E9cution
3464 - type de donn=E9es incompatible dans l'expression du crit=E8re"
alors que ce champ peut =EAtre vide.

J'ai bien compris qu'Access refuse d'ins=E9rer Null =E0 mon champ date
(malgr=E9 que la propri=E9t=E9 du champ "Null interdit : Non")

Dans la partie SET de ma requ=EAte, le b=E2t blesse au niveau des "" mais
alors comment faire pour autoriser d'ins=E9rer dans mon champ date =3D=3D=
=3D>
rien.

Merci pour votre aide.
A bient=F4t
Xavier

10 réponses

1 2
Avatar
Eric
Bonjour,

Essaie :

"UPDATE TablePerson " & _
"SET PersonDateBirth = " & IIf(IsNull(NewDataDateBirth), "Null",
Format(NewDataDateBirth, "#mm/dd/yyyy#")) & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value

a écrit :
Bonjour à tous,

J'ai un formulaire avec un champ date et un bouton pour mettre à jour
ma donnée date dans sa table...

strSQL = "UPDATE TablePerson " & _
"SET PersonDateBirth =""" & IIf(Nz(NewDataDateBirth) > True, "", NewDataDateBirth) & """ " & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError

Quand le champ dans mon formulaire contient une date, aucun
problème... la date se met à jour, par contre si mon champs formulaire
est vide Access me renvoie un message d'erreur "Erreur d'exécution
3464 - type de données incompatible dans l'expression du critère"
alors que ce champ peut être vide.

J'ai bien compris qu'Access refuse d'insérer Null à mon champ date
(malgré que la propriété du champ "Null interdit : Non")

Dans la partie SET de ma requête, le bât blesse au niveau des "" mais
alors comment faire pour autoriser d'insérer dans mon champ date ===>
rien.

Merci pour votre aide.
A bientôt
Xavier




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
3stone
Salut,

Ne pas confondre NULL et un chaine vide "" !

Puisque ta table autorise le NULL pour ce champ date,
le test est superflu...

Update TablePerson Set PersonDateBirth = NewDateBirth Where...

Le formatage est également superflu, pour autant que NewDateBith
ait comme source un champ au format date ou, si indépendant, la zone
de texte soit au format date.

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)




wrote:
Bonjour à tous,

J'ai un formulaire avec un champ date et un bouton pour mettre à jour
ma donnée date dans sa table...

strSQL = "UPDATE TablePerson " & _
"SET PersonDateBirth =""" & IIf(Nz(NewDataDateBirth) > True, "", NewDataDateBirth) & """ " & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError

Quand le champ dans mon formulaire contient une date, aucun
problème... la date se met à jour, par contre si mon champs formulaire
est vide Access me renvoie un message d'erreur "Erreur d'exécution
3464 - type de données incompatible dans l'expression du critère"
alors que ce champ peut être vide.

J'ai bien compris qu'Access refuse d'insérer Null à mon champ date
(malgré que la propriété du champ "Null interdit : Non")

Dans la partie SET de ma requête, le bât blesse au niveau des "" mais
alors comment faire pour autoriser d'insérer dans mon champ date ===>
rien.

Merci pour votre aide.
A bientôt
Xavier


Avatar
kdonu
Bonjour,
Merci pour vos réponses mais maintenant j'ai une erreur de syntaxe, je
pense que c'est le "Null" qui pose problème.

Mais j'ai contourné le problème avec une requête qui supprime le
champ :

If NewDataDateBirth = "" Or IsNull(NewDataDateBirth) = True Then
'modify datas
strSQL = "UPDATE TablePerson " & _
"SET PersonDateBirth = Null " & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError


Merci pour votre aide.
A bientôt
Avatar
Eric
Bonjour Pierre,

Pour la 1ère remarque, pas de problème.

Par contre, j'ai besoin de lumières, car bossant moins souvent sur
Access, pour la suite.

Le posteur construit sa chaîne SQL dans la procédure Click().
Soit NewDataDateBirth un contrôle ZdT indépendant au format Date
et strSQL="UPDATE TablePerson SET PersonDateBirth =" & NewDataDateBirth ...

- Si ce contrôle(NewDataDateBirth) n'est pas renseigné, il est Null mais
la construction de la chaîne SQL va retourner :
Update TablePerson Set PersonDateBirth= Where ...

- Si ce contrôle contient une date (28/03/2009), la chaîne SQL que
j'obtiens est :
Update TablePerson Set PersonDateBirth(/03/2009 WHERE ... et dans la
table le champ PersonDateBirth (champ de type Date) reçoit la valeur
31/12/1899.
- Si je mets ton instruction, alors le paramètre n'est pas passé.

Où ai-je faux ?

3stone a écrit :
Salut,

Ne pas confondre NULL et un chaine vide "" !

Puisque ta table autorise le NULL pour ce champ date,
le test est superflu...

Update TablePerson Set PersonDateBirth = NewDateBirth Where...

Le formatage est également superflu, pour autant que NewDateBith
ait comme source un champ au format date ou, si indépendant, la zone
de texte soit au format date.




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Michel Walsh
Si je peux m'insinuer dans la conversation, juste pour noter deux
alternatives...




La première, la plus simple, est d'utiliser DoCmd.RunSQL:


DoCmd.RunSQL"UPDATE ... SET ... WHERE PersonID =
FORMS!FormPerson01!COMBOBOX"


où on laisse la syntaxe

FORMS!NomDeFormulaire!NomDeControleRetournantUneValeur


à ***l'intérieur*** de la chaîne.


En efft, DoCmd, DXXXX (fonctions domaines), plusieurs propriétés tel que
sources d'enregistrement, ... peuvent résoudre automatiquement cette
syntaxe.



PAR CONTRE, CurrentDb NE LE PEUT PAS.






Seconde solution:


CurrentDb.Execute "UPDATE ... SET ... " & ( " WHERE PersonID =" +
FORMS!FormPerson01!List01.Value)



Ici, la 'magie' est effectuée par l'opérateur de concaténation + : il
propage les null (on ne me regarde pas quand on répète ce fragment de
phrase, là... )


Petite expérimentation dans la fenêtre d'exécution immédiate:


? " Hello " + null + "le monde"
null


? " Hello " & null" & "le monde"
Hello le monde



alors que & ne les propage pas. Donc, de retour à notre cas, si l'argument
est null, la clause WHERE s'élimine toute seule! Noter l'utilisation de ( )
pour s'assurer d'une syntaxe correcte. On ne veut pas une chaîne résultante:

"UPDATE ... SET ... WHERE"


ni


"UPDATE ... SET ... WHERE champ="



où la clause WHERE est nettement incomplète. (La première est sans
condition, la seconde ne fournit pas de valeur à laquelle on veut se
comparer).





Évidemment, il faut qu'il s'agisse d'un NULL. Une chaîne n'ayant aucun
caractère ou un zéro n'ont pas le même comportement:



? " Hello " + "" + "le monde"
Hello le monde


Je n'utilise pas de LIST BOX "value", du moins, pas dans ce contexte, je ne
saurais dire si cette bête retourne un NULL ou un vbNullString.


Mais avant de sauter de joie, et d'utiliser aveuglément des + de
concaténation tout partout, il faut aussi noter que + a des 'problèmes':


? 4 + " hello "
( run time error 13)


? 4 & " hello "
4 hello


Il semble que VBA ne sachant si on désire additionner quelque chose ou
concaténer deux chaînes, il suppose qu'on veut une addition. En fait,
roulement de tambours:


? "4" + 5
9


et non pas 45. Merci (teinte d'ironie) aux conversions automatiques entre
types de données, en VBA.



Bref, DoCmd est encore ce qu'il y a de plus simple, sans compter qu'il sait
comment faire pour des dates, des chaînes, des nombres virgule flottant
(point flottant), sans qu'on ait à s'acharner sur des formats ou des
délimiteurs...




Vanderghast, Access MVP




wrote in message
news:
Bonjour,
Merci pour vos réponses mais maintenant j'ai une erreur de syntaxe, je
pense que c'est le "Null" qui pose problème.

Mais j'ai contourné le problème avec une requête qui supprime le
champ :

If NewDataDateBirth = "" Or IsNull(NewDataDateBirth) = True Then
'modify datas
strSQL = "UPDATE TablePerson " & _
"SET PersonDateBirth = Null " & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError


Merci pour votre aide.
A bientôt
Avatar
3stone
SAPRISTI !

Michel Walsh ;-))

Cela fait un bail que l'on ne t'a plus lu ici.
Et c'est bien dommage...

Bien cordialement,

Pierre.

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)





Michel Walsh wrote:
Si je peux m'insinuer dans la conversation, juste pour noter deux
alternatives...




La première, la plus simple, est d'utiliser DoCmd.RunSQL:


DoCmd.RunSQL"UPDATE ... SET ... WHERE PersonID > FORMS!FormPerson01!COMBOBOX"


où on laisse la syntaxe

FORMS!NomDeFormulaire!NomDeControleRetournantUneValeur


à ***l'intérieur*** de la chaîne.


En efft, DoCmd, DXXXX (fonctions domaines), plusieurs propriétés tel
que sources d'enregistrement, ... peuvent résoudre automatiquement
cette syntaxe.



PAR CONTRE, CurrentDb NE LE PEUT PAS.






Seconde solution:


CurrentDb.Execute "UPDATE ... SET ... " & ( " WHERE PersonID =" +
FORMS!FormPerson01!List01.Value)



Ici, la 'magie' est effectuée par l'opérateur de concaténation + :
il propage les null (on ne me regarde pas quand on répète ce fragment
de phrase, là... )


Petite expérimentation dans la fenêtre d'exécution immédiate:


? " Hello " + null + "le monde"
null


? " Hello " & null" & "le monde"
Hello le monde



alors que & ne les propage pas. Donc, de retour à notre cas, si
l'argument est null, la clause WHERE s'élimine toute seule! Noter
l'utilisation de ( ) pour s'assurer d'une syntaxe correcte. On ne
veut pas une chaîne résultante:

"UPDATE ... SET ... WHERE"


ni


"UPDATE ... SET ... WHERE champ="



où la clause WHERE est nettement incomplète. (La première est sans
condition, la seconde ne fournit pas de valeur à laquelle on veut se
comparer).





Évidemment, il faut qu'il s'agisse d'un NULL. Une chaîne n'ayant aucun
caractère ou un zéro n'ont pas le même comportement:



? " Hello " + "" + "le monde"
Hello le monde


Je n'utilise pas de LIST BOX "value", du moins, pas dans ce contexte,
je ne saurais dire si cette bête retourne un NULL ou un vbNullString.


Mais avant de sauter de joie, et d'utiliser aveuglément des + de
concaténation tout partout, il faut aussi noter que + a des
'problèmes':


? 4 + " hello "
( run time error 13)


? 4 & " hello "
4 hello


Il semble que VBA ne sachant si on désire additionner quelque chose ou
concaténer deux chaînes, il suppose qu'on veut une addition. En fait,
roulement de tambours:


? "4" + 5
9


et non pas 45. Merci (teinte d'ironie) aux conversions automatiques
entre types de données, en VBA.



Bref, DoCmd est encore ce qu'il y a de plus simple, sans compter
qu'il sait comment faire pour des dates, des chaînes, des nombres
virgule flottant (point flottant), sans qu'on ait à s'acharner sur
des formats ou des délimiteurs...




Vanderghast, Access MVP




wrote in message
news:
Bonjour,
Merci pour vos réponses mais maintenant j'ai une erreur de syntaxe, je
pense que c'est le "Null" qui pose problème.

Mais j'ai contourné le problème avec une requête qui supprime le
champ :

If NewDataDateBirth = "" Or IsNull(NewDataDateBirth) = True Then
'modify datas
strSQL = "UPDATE TablePerson " & _
"SET PersonDateBirth = Null " & _
" WHERE PersonId=" & Forms!FormPerson01!List01.Value
CurrentDb.Execute strSQL, dbFailOnError


Merci pour votre aide.
A bientôt


Avatar
3stone
Salut,

Soit je n'ai pas compris la finalité de ce que l'on tente de faire,
soit j'ai lu de travers (très possible ;-)

mais, ce n'est pas parce qu'une zone de texte est "vide"
quelle en perd son nom...

Remarque, Michel Walsh a fait une répose très complète ;-)

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)



Eric wrote:
Bonjour Pierre,

Pour la 1ère remarque, pas de problème.

Par contre, j'ai besoin de lumières, car bossant moins souvent sur
Access, pour la suite.

Le posteur construit sa chaîne SQL dans la procédure Click().
Soit NewDataDateBirth un contrôle ZdT indépendant au format Date
et strSQL="UPDATE TablePerson SET PersonDateBirth =" &
NewDataDateBirth ...

- Si ce contrôle(NewDataDateBirth) n'est pas renseigné, il est Null
mais la construction de la chaîne SQL va retourner :
Update TablePerson Set PersonDateBirth= Where ...

- Si ce contrôle contient une date (28/03/2009), la chaîne SQL que
j'obtiens est :
Update TablePerson Set PersonDateBirth(/03/2009 WHERE ... et dans la
table le champ PersonDateBirth (champ de type Date) reçoit la valeur
31/12/1899.
- Si je mets ton instruction, alors le paramètre n'est pas passé.

Où ai-je faux ?

3stone a écrit :
Salut,

Ne pas confondre NULL et un chaine vide "" !

Puisque ta table autorise le NULL pour ce champ date,
le test est superflu...

Update TablePerson Set PersonDateBirth = NewDateBirth Where...

Le formatage est également superflu, pour autant que NewDateBith
ait comme source un champ au format date ou, si indépendant, la zone
de texte soit au format date.




Avatar
Michel Walsh
Par contre, je ne comprend pas pourquoi mes caractès plus ( + ) ont tous
disparus, rendant le texte ... inintelligible... :-(



Vanderghast, Access MVP
Avatar
Michel Walsh
Ah, et il vient encore de disparaître... il devait y en avoir un entre la
paire de parenthèses. Quelqu'un a une idée sur ce qui se passe? J'utilise
OE.



"Michel Walsh" wrote in message
news:
Par contre, je ne comprend pas pourquoi mes caractès plus ( ) ont tous
disparus, rendant le texte ... inintelligible... :-(



Vanderghast, Access MVP





Avatar
Francis
Michel Walsh a formulé ce lundi :
Ah, et il vient encore de disparaître... il devait y en avoir un entre la
paire de parenthèses. Quelqu'un a une idée sur ce qui se passe? J'utilise OE.



"Michel Walsh" wrote in message
news:
Par contre, je ne comprend pas pourquoi mes caractès plus ( ) ont tous
disparus, rendant le texte ... inintelligible... :-(



Vanderghast, Access MVP








Avec "MesNews", tous les "+" y sont! A voir du côté d'OE, probablement.

--
Francis

LOI DE MOSES
C'est quand on ne regarde pas que le but est marqué.
1 2