2009-03-19 16 views
12

J'ai un champ facultatif dans une base de données que je retire à l'aide d'un jeu d'enregistrements DAO. Je dois vérifier si le champ est défini avant de le concaténer avec d'autres champs. Jusqu'à présent, j'ai l'extrait de code suivant que j'ai essayé avec les deux Is et = (c'est la syntaxe manifestement fausse [[Is | =]]) en vain. Il semble que si j'utilise = il ne sera pas comparer correctement avec Null et si j'utilise Is alors il se plaint qu'il ne compare pas avec un objet.Comment pouvez-vous vérifier null dans un jeu d'enregistrements DAO VBA?

S'il y a une manière plus simple de faire ceci je suis totalement ouvert à cela. prettyName prend 3 Strings comme paramètres et au début j'essayais juste de passer rs.Fields ("MiddleName") directement, mais il a vomi à une valeur nulle. Je préférerais faire quelque chose de plus direct comme ça, mais c'est le meilleur que je puisse trouver.

Répondre

27

Que diriez-vous:

IsNull(rs.Fields("MiddleInitial").Value) 

Vous pouvez également jeter un oeil à this article qui a quelques explications sur les valeurs NULL dans l'accès des applications VBA et comment les gérer.

7

Pour l'exemple que vous présentez, Nz travaillerait:

thisMiddleInitial = Nz(rs!MiddleInitial,"") 

Ou concaténer simplement la chaîne avec une chaîne vide:

thisMiddleInitial = rs!MiddleInitial & "" 
2

Votre question a été répondue par remou, me semble, mais il me semble que vous essayez d'obtenir une concaténation correcte des champs de nom. Dans ce cas, vous pouvez utiliser la propagation Mid() et Null dans VBA pour obtenir le résultat.

Je n'utilise les champs initiaux du milieu séparés, donc ma formule habituelle de concaténation de nom est:

Mid(("12" + LastName) & (", " + FirstName), 3) 

La chaîne « 12 » au début va être jeté loin si LastName est non nul et ignoré si est null, car l'opérateur de concaténation + propage Nulls.

Pour étendre cette inclure du milieu intials ressemblerait à ceci:

Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3) 

En supposant que votre UDF ne fait pas une sorte de nettoyage compliqué de surnoms/abréviations/etc, ce qui pourrait le remplacer entièrement, semble. moi.

+0

Astuce astucieux, mais en s'appuyant sur cette différence plutôt obscure entre les opérateurs + et & est risqué, imo. Si quelqu'un revient plus tard et essaie de nettoyer le code, il peut décider de remplacer tous les + par des &, ou vice versa, par souci de cohérence, sans se rendre compte que cela change le comportement. –

+0

Je ne m'inquiète pas trop de la possibilité que quelqu'un qui ne comprend pas les bases des opérateurs de concaténation de Jet SQL ne fasse rien. Ils pourraient tout aussi bien gâcher un UDF créé dans le même but simplement parce qu'ils ne comprennent pas comment cela fonctionne. –

+0

D'accord, savoir comment fonctionnent les opérateurs est une chose assez fondamentale. – onedaywhen

0

If rst.Fields("MiddleInitial").Value = "Null" Then

Cela fonctionne pour moi. J'utilise MS SQL Database.