Tester si le champ d'une table est vide

Signaler
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
16
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 !?
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
If Isnull(Rst.Fields(List2.ListIndex)) Then EstVide

ciao...
BruNews, MVP VC++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
47
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]
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

Merci BruNews mais ce code plante aussi :



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

Label5.Caption = "champ vide"

Else
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
alors y a un schmoll dans tes index de listbox, faut vérifier cela.

ciao...
BruNews, MVP VC++
Messages postés
3757
Date d'inscription
mardi 23 septembre 2003
Statut
Modérateur
Dernière intervention
13 mars 2006
16
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 !?
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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.
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

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
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
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é
Messages postés
188
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
10 avril 2008

Merci,

je tacherai d'y penser en prenant en considération ton intéressante remarque.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
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é
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++