Come è possibile verificare la presenza di null in un set di record DAO VBA?
-
21-08-2019 - |
Domanda
Ho un campo opzionale in un database che sto estraendo usando un set di record DAO. Devo verificare se il campo è impostato o meno prima di concatenarlo con altri campi. Finora ho il seguente frammento di codice che ho provato con Is
e =
(questa è la sintassi ovviamente errata [[Is | =]]
) senza alcun risultato. Sembra che se uso Null
non comparerà correttamente con <=> e se uso <=> allora si lamenta che non sta confrontando con un oggetto.
While Not rs.EOF
If rs.Fields("MiddleInitial") [[Is | =]] Null Then thisMiddleInitial = "" Else thisMiddleInitial = rs.Fields("MiddleInitial")
If prettyName(myLastName, myFirstName, myMiddleInitial) = prettyName(rs.Fields("LastName"), rs.Fields("FirstName"), thisMiddleInitial) Then
MsgBox "Yay!"
End If
rs.MoveNext
Wend
Se c'è un modo più semplice per farlo, ne sono totalmente aperto. prettyName prende 3 stringhe come parametri e inizialmente stavo solo provando a passare rs.Fields (" MiddleName ") direttamente ma vomitava a un valore Null. Preferirei fare qualcosa di più diretto come quello, ma questo è il migliore che ho potuto inventare.
Soluzione
Che ne dici di:
IsNull(rs.Fields("MiddleInitial").Value)
Puoi anche dare un'occhiata a questo articolo che contiene alcune spiegazioni sui valori null nelle app Access VBA e su come gestirle.
Altri suggerimenti
Nell'esempio che mostri, Nz funzionerebbe:
thisMiddleInitial = Nz(rs!MiddleInitial,"")
O semplicemente concatenando la stringa con una stringa vuota:
thisMiddleInitial = rs!MiddleInitial & ""
Mi sembra che Remou abbia risposto alla tua domanda, ma mi viene in mente che potresti semplicemente provare a ottenere la corretta concatenazione dei campi dei nomi. In tal caso, è possibile utilizzare la propagazione Mid () e Null in VBA per ottenere il risultato.
Non utilizzo campi iniziali medi separati, quindi la mia solita formula di concatenazione dei nomi è:
Mid(("12" + LastName) & (", " + FirstName), 3)
Il " 12 " la stringa all'inizio verrà eliminata se LastName non è Null e ignorata se è null, poiché l'operatore di concatenazione + propaga Nulls
Estenderlo per includere le intime intermedie sarebbe simile al seguente:
Mid(("12" + LastName) & (", " + FirstName) & (" " + MiddleInitial), 3)
Supponendo che il tuo UDF non stia facendo una sorta di complicata pulizia di soprannomi / abbreviazioni / ecc., questo potrebbe sostituirlo del tutto, mi sembra.
If rst.Fields("MiddleInitial").Value = "Null" Then
Questo funziona per me. Uso il database MS SQL.
Penso che l'opzione NoMatch potrebbe funzionare in questa situazione:
Se rs.NoMatch = True Allora
Preferisco utilizzare quanto segue per tenere conto sia dei valori di stringa Null che Empty. È un buon controllo utilizzare moduli che raccolgono valori dagli utenti.
If Trim(rs.Fields("MiddleInitial") & "") = "" then