Tester si le champ d'une table est vide

olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008 - 23 oct. 2005 à 18:50
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 24 oct. 2005 à 01:01
Bonjour,



J'ai un applicatif qui me permet d'afficher dans une list box le nom de
toutes les tables d'une bdd puis dans une seconde list box le nom des
champs.

En suite en cliquant sur la 2ème list box j'affiche dans une textbox la valeur du champ.



Or je n'arrive pas à gerer cette affichage quand le champ est vide.



Voici le code que j'utilise :



Label5.Caption = "" & Rst.Fields(List2.ListIndex).Value



Ce code marche très bien, sauf lorsque le champ est vide : ca plante

"erreur d'éxécution 3021" Aucun enregistrement en cours



J'ai alors pensé faire quelque chose du genre :



If Rst.Fields(List2.ListIndex).Value Null Then 'Null ou ="" ou =Empty

Label5.Caption = "champ vide"

Else

Label5.Caption = "" & Rst.Fields(List2.ListIndex).Value

End If



Mais cela ne marche pas il n'accepte pas la syntaxe du test.



Voilà je suis à la recherche d'une idée.



Merci d'avance



Olivier

14 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
23 oct. 2005 à 19:13
Salut, essaie ça :

If Isnull(Rst.Fields(List2.ListIndex).Value) Then
Label5.Caption = "champ vide"
Else
Label5.Caption = Rst.Fields(List2.ListIndex).Value
End If

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
23 oct. 2005 à 19:24
Merci bien !



Mais non ca ne change rien, cela me donne exactement la même erreur.



Je ne comprend pas, j'ai aussi essayer çà :



If Rst.Fields(List2.ListIndex).Value Is Null Then

Label5.Caption = "champ vide"

Else

Label5.Caption = Rst.Fields(List2.ListIndex).Value

End If



Mais ca plante aussi.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 oct. 2005 à 19:27
If Isnull(Rst.Fields(List2.ListIndex)) Then EstVide

ciao...
BruNews, MVP VC++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 oct. 2005 à 19:27
salut,
cette syntaxe n'est pas très conseillée, mais elle permettra de tester au moins si le problème vient de la base, ou de l'interprétation VB du résultat :

Label5.Caption = IIf(Rst.Fields(List2.ListIndex).Value="", "Champ vide", Cstr(Rst.Fields(List2.ListIndex).Value))

PCPT [AFCK]
0

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

Posez votre question
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
23 oct. 2005 à 19:33
Merci BruNews mais ce code plante aussi :



If IsNull(Rst.Fields(List2.ListIndex)) Then

Label5.Caption = "champ vide"

Else
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 oct. 2005 à 19:39
alors y a un schmoll dans tes index de listbox, faut vérifier cela.

ciao...
BruNews, MVP VC++
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
23 oct. 2005 à 19:40
Si ça plante dans les 2 cas, c'est que ton rst ne remonte rien. A ce moment là, teste : if rst.eof .... pas d'enreg else label5.caption = ....

Sinon, reformule ta question.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
23 oct. 2005 à 19:47
pcpt ta solution me donne également le même résultat.



Je ne comprend vraiment pas pourquoi ca marche pour toute les bases sauf celle qui est vide.



- Pour info celle qui est vide a était créer de cette façon :



Set db = OpenDatabase(App.Path & "\BD.mdb")



Set TBL = New TableDef

TBL.Name = "joueurs" 'par exemple



Set fld = TBL.CreateField("name", dbText)

TBL.Fields.Append fld

Set fld = Nothing

Set fld = TBL.CreateField("score", dbText)

TBL.Fields.Append fld



db.TableDefs.Append TBL

Set fld = Nothing

Set TBL = Nothing

db.TableDefs.Refresh



Voilà comment la fameuse table vide est créé.



- ensuite je fait ca :



List1.Clear

For i = 0 To db.TableDefs.Count - 1

If (db.TableDefs(i).Attributes And dbSystemObject) = 0 Then

List1.AddItem db.TableDefs(i).Name

End If

Next i



pour lister toute mes table dans la list box1



- puis :



Private Sub List1_Click()



Dim i As Integer



List2.Clear



For i = 0 To db.TableDefs(List1.ListIndex).Fields.Count - 1

List2.AddItem db.TableDefs(List1.ListIndex).Fields(i).Name

Next i



End Sub



pour lister les champs dans listbox2



- et enfin :



Set Rst = db.OpenRecordset(List1.Text)



' Mon PB

If Rst.Fields(List2.ListIndex).Value Null Then 'Null ou ="" ou =Empty ou is null( ... ) ou autre solus

Label5.Caption = "champ vide"

Else

Label5.Caption = "" & Rst.Fields(List2.ListIndex).Value

End If



Pour afficher le contenu du champ dans la textbox.







Biensur j'ai d'autre fonctionnalité qui me permette de passer d'un
enregistrement à l'autre afin d evisualiser toute les valeurs.



J'éspère que tous ce code vous donnera une idée sur mon pb.
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
23 oct. 2005 à 19:53
Bienvue CanisLupus, tu à raison c'est bien çà !



Merci beaucoup !



il fallait donc faire çà :



If Rst.EOF True Or Rst.BOF True Then

Label5.Caption = "champ vide"

Else

Label5.Caption = "" & Rst.Fields(List2.ListIndex).Value

End If





Ouf ca marche enfin
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
23 oct. 2005 à 23:35
lut,
Petit commentaire un champ null dans une base n'est pas un champ vide. il est toujours trés difficille de les gérer donc si tu veux un conseil quand tu enregistres des données dans ta tables enregistre systématiquement une chaine vide "" si ton champ est vide. cela t'évitera de faire de multiples test sur tes tables.

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
olivier857 Messages postés 188 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 10 avril 2008
23 oct. 2005 à 23:50
Merci,

je tacherai d'y penser en prenant en considération ton intéressante remarque.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 oct. 2005 à 00:06
Il n'y a aucun malaise à tester si un champ est nul, IsNull de VB fait cela parfaitement.
ça se résume à tester le champ vt de la struct VARIANT, 1 cycle processeur, c'est assurément moins couteux que d'entrer de la donnée inutile, ne serait ce que le seul octet 0 d'une chaine vide.

ciao...
BruNews, MVP VC++
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
24 oct. 2005 à 00:19
Un peu de lecture vaut mieux que de longs discours sans arrière pensée bien sur et chacun à le droit d'avoir ses idée sur la question !!!!!

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 oct. 2005 à 01:01
La page indiquée ne traite que du NULL par le moteur SQL, rien de cela ici.
Il s'agit dans la question de tester un champ, ce que IsNull fait en interne par:
IsNull(var) (int) (var.vt == VT_NULL)

ciao...
BruNews, MVP VC++
0
Rejoignez-nous