Apparition "étrange" de invalid use of NULL

praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011 - 13 juil. 2011 à 20:05
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011 - 14 juil. 2011 à 22:45
Bonjour,

Dans mon code je souhaite faire la somme de plusieurs champs dans ma base de donnée sous deux conditions.
J'ai vu qu'il fallait, pour cela, utiliser la syntaxe suivante :
"select sum(champs) from table where etc etc"
le résultat de cette somme s'enregistre dans le field(0) du recordset.

Mon problème est que lorsque je lance cette fonction (bouton qui permet d'afficher une sorte de récapitulatif d'où mes sommes), "des fois" le programme plante avec pour erreur "invalod use of null" et des fois ca passe Oo.
Je précise que les informations dont je fais la somme ne sont pas nulles et sont bien présente dans ma base de donnée.
J'en suis encore plus Étonné

Voila mon code (d'une manière "bourrin" j'ai fait autant de requête que de somme ... je ne savais pas comment était structuré un requête de PLUSIEURS sommes) :

place1 "select SUM(NbPlace1) FROM Reservation WHERE DateSeance #" & CDate(RecherchePlaceRestante.TDateSeance) & "# And HoraireSeance = '" & RecherchePlaceRestante.CHoraire.Text & "'"
place2 "select SUM(NbPlace2) FROM Reservation WHERE DateSeance #" & CDate(RecherchePlaceRestante.TDateSeance) & "# And HoraireSeance = '" & RecherchePlaceRestante.CHoraire.Text & "'"
place3 "select SUM(NbPlace3) FROM Reservation WHERE DateSeance #" & CDate(RecherchePlaceRestante.TDateSeance) & "# And HoraireSeance = '" & RecherchePlaceRestante.CHoraire.Text & "'"
place4 "select SUM(NbPlace4) FROM Reservation WHERE DateSeance #" & CDate(RecherchePlaceRestante.TDateSeance) & "# And HoraireSeance = '" & RecherchePlaceRestante.CHoraire.Text & "'"
Set rsplace1 = base.OpenRecordset(place1)
    LabelNb1 = rsplace1.Fields(0)
Set rsplace2 = base.OpenRecordset(place2)
    LabelNb2 = rsplace2.Fields(0)
Set rsplace3 = base.OpenRecordset(place3)
    LabelNb3 = rsplace3.Fields(0)
Set rsplace4 = base.OpenRecordset(place4)
    LabelNb4 = rsplace4.Fields(0)


voila j’espère que vous pourrez me dire d'où viens cette erreur

merci =)

ps : le debogage s'arrete ici : "LabelNb1 = rsplace1.Fields(0)"

15 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
13 juil. 2011 à 20:48
Bonjour,

Et tu as bien entendu tenté (premier réflexe) au moins de savoir si ton recordset ainsi constitué contenait quelque-chose quand "ça plante" ?


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
13 juil. 2011 à 22:20
Comment je peux le vérifier?
mise à part que je suis sur que le/les champs dont je veux faire la somme contiennent une valeur allant de 0 à 30
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 07:51
Comment je peux le vérifier?
mise à part que je suis sur que le/les champs dont je veux faire la somme contiennent une valeur allant de 0 à 30


Attendre un résultat ne veut pas dire qu'on l'a !
Tu n'as jamais entendu parler de Recordcount ?

Pour un recordset toto ===>> toto.recordcount renvoie le nombre d'enregistrements présents dans le recordset (0 si aucu_n).

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 08:18
Et après t'être assuré de la création d'un recordset et qu'il n'est pas vide ===>> garde présent à l'esprit ceci :
S'agissant d'une table de base de données : si un champ contient (pour une raison ou l'autre) une donnée non valide ===>> l'extraction de cette donnée contient un NULL. Et un NULL ne peut être affecté à un Label.
Cette petite demo t'en convaincra :
toto = Null
Label1.Caption = toto

Voilà.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 08:25
Fort de tout cela, tu prends certaines "dispositions", genre ===>>
toto = Null
If IsNull(toto) Then
   MsgBox "attention ! toto/ton champ contient un NULL. Cherche pourquoi !"
Else
    Label1.Caption = toto
End If


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
14 juil. 2011 à 13:59
D'accord, merci pour tes précisions,

Je vais faire en premier mes vérifications avec le recordcount (oui je savais qu'il existait mais il est vrai que je n'y ai pas pensé ^^')
Si mes vérifications sont bonne au niveau de mes recordset,
Et que je ne sais pas pourquoi (je continue à chercher) est-ce qu'il serait plus simple de mettre mes valeurs dans des textbox au lieu des labels? si ceux ci ne supporte pas le NULL
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 14:37
est-ce qu'il serait plus simple de mettre mes valeurs dans des textbox au lieu des labels? si ceux ci ne supporte pas le NULL

Drôle de manière de comprendre les choses
Que ce soit le caption d'un label, le texte d'une une textbox, le caption d'un bouton de commande ou quoi que ce soit d'autre qui attend un String ===>> même effet !
Allez tiens (comment- peut-on en arriver là !) ===>> regarde ===>>
Dim titi As String
toto = Null
titi = toto


Compris, maintenant ?
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 15:05
Et pour être plus précis :
Un NULL ne peut être affecté à une variable de type autre que Variant.

Et copie de l'aide VB ===>>
The Null keyword is used as a Variant subtype. It indicates that a variable contains no valid data.




____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
14 juil. 2011 à 15:42
Oui j'ai compris ^^ une variable qui n'attend pas de "null" ne peux pas en recevoir..

On reviens donc à : Pourquoi j'ai un "NULL" dans mon/mes champs?

Si tu veux, les variables qui sont dans les champs de ma base de donnée sont enregistrées grâce à plusieurs textbox qui doivent contenir QUE des chiffres (Je fais les vérifications isnumeric à chaque fois) donc quand je clic sur le bouton "enregistrer" les données sont obligatoirement numériques.
Dailleur, si je cherche à afficher un autre groupe de recordset je n'ai pas l'erreur invalid use of null ==> ce qui est justement Etrange ; bien-sur entre les deux cas les chiffres ne sont pas les mêmes.

Alors j'ai fait plein de test et j'ai remarqué une chose pour ma somme "NbPlace1" :
Quand ma somme est <10 ça marche je n'ai plus cette erreur >.<
Quand la somme est egal à 10 ou 11 j'ai l'erreur invalid use of null mais au dessus de 11 ca RE-marche.
=> je comprend pas et je ne pense pas que ce soit une coïncidence.

Et si je test à chaque somme si il exite un NULL => OK mais je le remplace par quoi?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 17:53
Si tu veux, les variables qui sont dans les champs de ma base de donnée sont enregistrées grâce à plusieurs textbox qui doivent contenir QUE des chiffres (Je fais les vérifications isnumeric à chaque fois) donc quand je clic sur le bouton "enregistrer" les données sont obligatoirement numériques.

C'est toi seul, qui connait ta table et tes champs.
Quand je lis ta requête, toutefois, je ne crois pas que tes champs ne contiennent que des numériques ! (on y voit au moins un champ de type date !)
Et à ce propos : ta requête traite le champ HoraireSeance comme s'il s'agissait d'un champ texte.
Est-ce le cas ? Si oui : sous quel format texte exactement ? Car, par exemple, "11:12" est plus petit que "2:12" alors que "11:12" est plus grand que "02:12"
Quand la somme est egal à 10 ou 11 j'ai l'erreur invalid use of null mais au dessus de 11 ca RE-marche.
=> je comprend pas et je ne pense pas que ce soit une coïncidence

Rien de logique pure dans cette conclusion ===>> hasard pur
Et si je test à chaque somme si il exite un NULL => OK mais je le remplace par quoi?

Tu ne remplaces pas un NULL ! tu corriges tes enregistrements (ta méthode)
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 18:17
Conseils :
- Donne le type Date/Time à tes champs destinés à l'enregistrement d'une Date ou d'une Heure
- vérifie leur validité (par Isdate) avant tout enregistrement
- enregistre-les dans ta table sous le format qu'elle accepte (la plupart du temps : mm/dd/yyyy pour les dates)
- tes requêtes sont alors à faire sur ces champs en encadrant par des # la valeur/critère
- utilise l'option Null interdit pour tes champs
Voilà qui me parait bien plus sage


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
14 juil. 2011 à 21:15
Oui alors, pour mes HoraireSeance ce sont bien des champs définies en tant que type texte pour éviter plus de problèmes etc..
-Mes dates je vérifie déjà qu'elle sont bien de type date avec Isdate. (dans ma requête, ce ne sont que des conditions donc je les ai déjà plus ou moins vérifier lors de leur inscription dans ma bdd).
-Pour le format de mes horaire c'est 09h30 par exemple.

Donc pour tes conseils, j'ai déjà tout fais sauf peut être vérifier l'option NULL interdit. ( Et pour mes champs horaire vu qu'ils sont en type texte).
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
14 juil. 2011 à 21:19
Mes champs que je manipulais pour faire mes sommes étaient bien en NULL interdit : NON.
=> j'ai changé en : OUI
je vais faire des test pour confirmer et si ça marche j'aurais appris beaucoups de choses
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 236
14 juil. 2011 à 21:34
Ouais !
Mais cela ne va pas te "réparer" ceux qui étaient déjà en NULL ou qui comportaient une donnée non valide (qui retourne un NULL en requête).


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
praetor62 Messages postés 35 Date d'inscription dimanche 19 décembre 2010 Statut Membre Dernière intervention 14 juillet 2011
14 juil. 2011 à 22:45
Oui c'est vrai mais comme ma base de donnée ainsi que mon programme ne sont qu'en test ( et heuresement lol) j'ai recompilé une nouvelle base de donnée donc tous mes enregistrement qui contenaient du "NULL" on ete supprimés.
Maintenant il reste plus qu'a rentrer des données dans la base pour voir si c'est bel et bien réparé.
J'ai fais deux ou trois test et ça à l'air de marcher =)
0