OVH Cloud OVH Cloud

champ textbox

8 réponses
Avatar
sam
je cree un recordset en ado comprenant deux champs, dont
un peut etre vide(chp2)

je veux mettre chp2 dans un textbox avec
textbox=rs1!chp2

et lorsqu'il est null il me met l'erreur suivante:
utilisation incorrecte de la valeur 'null'

8 réponses

Avatar
Denis P
Encore une fois, tu peux utiliser la fonction IIf.

TextBox = IIf (IsNull(rs1!chp2), "",rs1!chp2)

Donc la fonction IIf vérifie ta condition, ici IsNull(rs1!chp2). Si ta
condition est vraie, elle te retourne le premier argument soit une chaîne
vide dans le cas présent "", et si elle est fausse elle te retourne le
deuxième argument soit le contenu de ton recordset. Encore une fois, il
faut se rappeler qu'une chaîne vide n'est pas l'équivalent d'une valeur
Null.

@ +

Denis P
"sam" a écrit dans le message de
news:07f101c3c47d$ab6e3b30$
je cree un recordset en ado comprenant deux champs, dont
un peut etre vide(chp2)

je veux mettre chp2 dans un textbox avec
textbox=rs1!chp2

et lorsqu'il est null il me met l'erreur suivante:
utilisation incorrecte de la valeur 'null'


Avatar
François Picalausa
"Denis P" a écrit dans le message
de news:
Encore une fois, tu peux utiliser la fonction IIf.
TextBox = IIf (IsNull(rs1!chp2), "",rs1!chp2)



Bonjour/soir,

JAMAIS utiliser Iif. Sauf pour ralentir le programme de manière inutile...
Il existe If qui sert très bien et qui est plus rapide.
Et ne pas oublier qu'on veut défnir la propriété Text de l'objet et pas
l'objet.. pour plus de clarté, même si VB le fait automatiquement, toujours
le noter.

If IsNull(rs1!chp2) Then
TextBox.text = ""
Else
TextBox.text = rs1!chp2
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Denis P
Bonjour François,

Bon effectivement c'est mieux d'ajouter .Text. Petite erreur de ma part ce
matin.

Ensuite tu peux m'expliquer pourquoi IIf ralenti le programme inutilement,
comparé à un If Then Else. Vraiment je ne comprend pas trop là où est la
différence. Pour l'instant, moi tout ce que je sais, c'est que c'est moins
long à écrire avec IIF ;) et c'est la raison pourquoi je l'utilise.

Donc j'aimerais bien que tu me dises, d'où vient cette différence de
performance. Et tant qu'à parler de performance, aussi bien y aller pour
une autre question. Côté performance un Select Case est-il plus rapide
qu'une suite de If Then ElseIf et ça peu importe le nombre de Case ?

Merci pour tes réponses que j'apprécie toujours.

Denis P
"François Picalausa" a écrit dans le message de
news:u$
"Denis P" a écrit dans le message
de news:
> Encore une fois, tu peux utiliser la fonction IIf.
>TextBox = IIf (IsNull(rs1!chp2), "",rs1!chp2)

Bonjour/soir,

JAMAIS utiliser Iif. Sauf pour ralentir le programme de manière inutile...
Il existe If qui sert très bien et qui est plus rapide.
Et ne pas oublier qu'on veut défnir la propriété Text de l'objet et pas
l'objet.. pour plus de clarté, même si VB le fait automatiquement,


toujours
le noter.

If IsNull(rs1!chp2) Then
TextBox.text = ""
Else
TextBox.text = rs1!chp2
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
François Picalausa
"Denis P" a écrit dans le message
de news:O%
Bonjour François,

Bon effectivement c'est mieux d'ajouter .Text. Petite erreur de ma
part ce matin.

Ensuite tu peux m'expliquer pourquoi IIf ralenti le programme
inutilement, comparé à un If Then Else. Vraiment je ne comprend pas
trop là où est la différence. Pour l'instant, moi tout ce que je
sais, c'est que c'est moins long à écrire avec IIF ;) et c'est la
raison pourquoi je l'utilise.



Pourquoi, je ne sais pas. Mais sur un test de performance, c'est montré:
http://groups.google.fr/groups?selm=OWZSEB4KDHA.452%40TK2MSFTNGP11.phx.gbl


Donc j'aimerais bien que tu me dises, d'où vient cette différence de
performance. Et tant qu'à parler de performance, aussi bien y aller
pour une autre question. Côté performance un Select Case est-il plus
rapide qu'une suite de If Then ElseIf et ça peu importe le nombre de
Case ?



Toutes les explications pour réaliser un test de performance se trouvent
sur:
http://www.mvps.org/vb/index2.html?tips/benchmarks.htm

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Pascal
Bonjour,

On peut faire tout simplement:

TextBox.text = "" & rs1!chp2 (plus de probleme avec NULL)

Pascal

"François Picalausa" a écrit dans le message news:
u$
"Denis P" a écrit dans le message
de news:
> Encore une fois, tu peux utiliser la fonction IIf.
>TextBox = IIf (IsNull(rs1!chp2), "",rs1!chp2)

Bonjour/soir,

JAMAIS utiliser Iif. Sauf pour ralentir le programme de manière inutile...
Il existe If qui sert très bien et qui est plus rapide.
Et ne pas oublier qu'on veut défnir la propriété Text de l'objet et pas
l'objet.. pour plus de clarté, même si VB le fait automatiquement,


toujours
le noter.

If IsNull(rs1!chp2) Then
TextBox.text = ""
Else
TextBox.text = rs1!chp2
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
Denis P
Merci François de ces explications. Je vais donc en conclure que c'est un
des doux mystères de la vie auquel il ne faut pas chercher de réponse, mais
simplement admettre l'évidence.

@ +

Denis P
"François Picalausa" a écrit dans le message de
news:%
"Denis P" a écrit dans le message
de news:O%
> Bonjour François,
>
> Bon effectivement c'est mieux d'ajouter .Text. Petite erreur de ma
> part ce matin.
>
> Ensuite tu peux m'expliquer pourquoi IIf ralenti le programme
> inutilement, comparé à un If Then Else. Vraiment je ne comprend pas
> trop là où est la différence. Pour l'instant, moi tout ce que je
> sais, c'est que c'est moins long à écrire avec IIF ;) et c'est la
> raison pourquoi je l'utilise.

Pourquoi, je ne sais pas. Mais sur un test de performance, c'est montré:
http://groups.google.fr/groups?selm=OWZSEB4KDHA.452%40TK2MSFTNGP11.phx.gbl

>
> Donc j'aimerais bien que tu me dises, d'où vient cette différence de
> performance. Et tant qu'à parler de performance, aussi bien y aller
> pour une autre question. Côté performance un Select Case est-il plus
> rapide qu'une suite de If Then ElseIf et ça peu importe le nombre de
> Case ?

Toutes les explications pour réaliser un test de performance se trouvent
sur:
http://www.mvps.org/vb/index2.html?tips/benchmarks.htm

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com




Avatar
Zoury
Hello!

Pourquoi, je ne sais pas.



Lorsque tu utilise IIf(), VB analyse la condition en plus des 2 valeurs
retournées, même s'il n'en a besoin que d'une seule...

Pour prouver ce comportement de manière simple
<non testé>
'***
' Module1
Option Explicit

Private Sub Main()

Dim c As Collection

' Plante, erreur 91
Debug.Print IIf(Not c Is Nothing, c.Count, 0)

' Tandis que ceci ne plante pas..
If (Not c Is Nothing) Then
Debug.Print c.Count
Else
Debug.Print 0
End If

End Sub
'***

De plus, même si IIf() est plus rapide à écrire (et encore.... faudra me
donner des preuves de ça ;O) ) je trouve la structure standard plus facile à
lire.. Si la compréhension absolu ne fait pas partie de tes normes, tu peux
toujours faire un If ... then ... else sur la même ligne...

'***
If (Not c Is Nothing) Then Debug.Print c.Count Else Debug.Print 0
'***
ce qui est, je *crois*, est plus rapide qu'avec un End If...

ou encore
'***
If (Not c Is Nothing) Then _
Debug.Print c.Count _
Else _
Debug.Print 0
'***
qui est identique et aussi rapide, mais plus compréhensible... mais rendu
là.. autant utilisé la structure standard qui elle permait plus d'un ligne
par bloc de code... :O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Zoury
> TextBox.text = "" & rs1!chp2 (plus de probleme avec NULL)



Yep!

Pour votre information personnelle...

l'opérateur !, nommé : "bang operator", était utilisé il y a jadis et est
encore supporté aujourd'hui.. :O)

Il y atoutefois une différence fondamentale entre :
'***
Debug.Print rs!Champs1
Debug.Print rs.Fields.Item("Champs1")
Debug.Print rs.Fields("Champs1")
Debug.Print rs("Champs1")
'***

et
'***
Debug.Print rs.Fields.Item("Champs1").Value
Debug.Print rs.Fields("Champs1").Value
Debug.Print rs("Champs1").Value
'***

le premier renvoit un objet de type Object/Field (qui à la propriété Value
par défaut)
tandis que l'autre formulaire renvoit la valeur du champs (Variant/[type du
champs]).

'***
' Ajouter la référence Microsfot ActiveX Data Object 2.7 Library
' Module1
Option Explicit

Private Sub Form_Load()

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

Call rs.Fields.Append("Nom", adVarChar, 50)
Call rs.Open

rs.AddNew
rs.Fields("Nom") = "Picalausa"
rs.Update

rs.AddNew
rs.Fields("Nom") = "Alexis"
rs.Update

rs.AddNew
rs.Fields("Nom") = "Lefebvre"
rs.Update

Call rs.MoveFirst

Debug.Print TypeName(rs!Nom)
Debug.Print TypeName(rs.Fields("Nom").Value)

rs.Close

End Sub
'***

' Résultat
Field
String


Alors si jamais vous éprouvez des problèmes de "type mismatch", vous tenez
votre coupable.. :O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous