If Not IsNull(Me.combobox) Then...
rispetto a:
If Nz(Me.combobox) > 0 Then...
E che differenza c'è tra Me!combobox e Me.combobox?
C'entrano qualcosa queste "quisqulie" da principiante??
Io uso la function IsNothing sotto esposta.
Di uso generale, utile appunto per verificare se campo/controllo
contiene valori.
ad. es......... If IsNothing(me.combo1) then.......
Da 'Building Access Applications by John L. Viescas', reperibile in
rete.
Spero che ti possa aiutare, ciao
Sergio
Public Function IsNothing(ByVal varValueToTest) As Integer
'-----------------------------------------------------------
' Does a "nothing" test based on data type.
' Null = nothing
' Empty = nothing
' Number = 0 is nothing
' String = "" is nothing
' Date/Time is never nothing
' Inputs: A value to test for logical "nothing"
' Outputs: True = value passed is a logical "nothing", False = it
ain't
' Created By: JLV 01/31/95
' Last Revised: JLV 01/31/95
'-----------------------------------------------------------
Dim intSuccess As Integer
On Error GoTo IsNothing_Err
IsNothing = True
Select Case varType(varValueToTest)
Case 0 ' Empty
GoTo IsNothing_Exit
Case 1 ' Null
GoTo IsNothing_Exit
Case 2, 3, 4, 5, 6 ' Integer, Long, Single, Double, Currency
If varValueToTest <> 0 Then IsNothing = False
Case 7 ' Date / Time
IsNothing = False
Case 8 ' String
If (Len(varValueToTest) <> 0 And varValueToTest <> " " And
varValueToTest <> vbNullString) Then IsNothing = False
End Select
IsNothing_Exit:
On Error GoTo 0
Exit Function
IsNothing_Err:
IsNothing = True
Resume IsNothing_Exit
End Function
Nullo o Vuoto (empty) sono due cose decisamente diverse.
Empty, generalmente riferisce ad una stringa ha significato che il
valore e' assegnato ed e', appunto, vuoto ("")
Null, di piu' ampio respiro, significa che quel valore *non* e'
assegnato ed al momento e' sconosciuto.
>
> If Not IsNull(Me.combobox) Then...
>
> rispetto a:
>
> If Nz(Me.combobox)> 0 Then...
Questo non lo so ;-{) (*)
io generalmete uso "" & quellochee' = "" (per le strighe o assimilate,
uhmmmm.... sarebbe meglio dire per i "variant")
>
> E che differenza c'è tra Me!combobox e Me.combobox?
Normalmente il "!" si usa quando il controllo a dx e' un controllo
utente. Ormai e cosi' pervicacemente attaccata alle mie dita la
situazione che lo faccio in automatico il porre "." o "!".
Sul sito di Karl potrebbe esserci una chiara esposizione (non la trovo).
Sostituire "!" con "." e' generalmente indifferente (non il contrario)
se non ricordo male
>
> C'entrano qualcosa queste "quisqulie" da principiante??
Se uno comincia a porsi queste domande e' sulla buona strada.
Spesso sotto queste "quisquilie" c'e' la differenza fra una vita sana
alla mulino bianco e andare al "manicomio"
(*)
--
ac (x=y-1)
questa in particolare la trovo esilarante
If .... And varValueToTest <> " " ..... IsNothing = False
--
ac (x=y-1)
P.S. www.donkarl.com/it
--
ac (x=y-1)
Cuor contento il ciel l'aiuta....
*Nothing* è il nome della funzione, che (ribadisco e ringrazio) è
dovuta a John L. Viescas.
Non c'entrano gli oggetti.
I casi presi in considerazione dalla function per il valore di campi
o controlli sono invece:
' Null = nothing
' Empty = nothing
' Number = 0 is nothing
' String = "" is nothing (lo stesso vale per vbNullString, che è
leggermente diverso)
' Date/Time is never nothing
Mi sembra piuttosto completa, almeno in questi anni (come si vede
Viescas l'ha datata 1995)
ha sempre funzionato; se si può integrare o eliminare ridondanze tanto
meglio.....comunque è già discussa sul web.
Ciao a tutti
Sergio
Forse non mi sono spiegato.
La funzione l'ho letta e credo di averla compresa. Che in quella
funzione non centrino nulla gli oggetti e' una cosa acclarata. C'e' scritto.
Cerco di essere piu' chiaro.
Normalmente la parola "nothing" e' associata agli oggetti e *non* alle
variabili scalari, per le quali, non a caso, si usa *null* e quindi il
fatto che quella funzione si chiami *isNothing* per un lettore
superficiale (e' ironica) come il sottoscritto puo' essere fuorviante,
ad esempio, sempre il sottoscritto, se la avesse scritta, la avrebbe
chiamata isCustomValued (invertendo i ritorni di funzione).
Che poi la funzione funzioni non c'e' ombra di dubbio anche se non si
capisce perche' le Date non possano essere Nothing e perche' una
variabile " " e' non nothing mentre una variabile " " lo e'.
Il vbNullString, se non rammento male, e' chr(0) e sempre se non ricordo
male e' il "\0" del C che significava, grossomodo, terminatore di
stringa et quindi una striga "\0" era una nullstring.
Altra piccola incongruenza.
Sappiamo tutti che il dato boolean e' inventato pero' far ritornare un
Integer (perche' non un Long,poi, che e' piu' "performante") e poi dire
che la funziona ritorna False (0) o True (-1), al solito, funziona, ma
un po' di coerenza nella vita non guasterebbe.
Io ho un sacro rispetto degli scrittori ma qualche volta qualche
corbelleria (IMHO) la dicono, o peggio la scrivono, e soprattutto sul
Web con una certa frequenza si legge il contrario di quello che e'.
P.S. Anche il test sul numerico, per dirla in modo originale, "lascia il
tempo che trova" ma sarebbe perfetto se si chiamasse, appunto,
isCustomValued
S. E. & O.
--
ac (x=y-1)
Ciao Francesca e Alessandro,
mentre lotto con l'insonnia cerco di rispondere alle osservazioni di
Alessandro.
Adesso mi sembra chiaro ed interessante; tra l'altro, rispetto alla
function originale ho trovato la valutazione di vbNullString
introdotta successivamente (non so all'epoca la costante vbNullString
fosse supportata in vba).
Concordo sul fatto che sia bene non accontentarsi di una cosa che
funziona; d'altronde siamo qui per questo.
Entrando nel merito:
-Il nome della function in effetti non mi sembra una scelta felice; ho
comunque lasciato finora la denominazione dell'autore.
-La valutazione di vbString in effetti sembra zoppicare; cosa ne pensi
di:
If Asc(varValueToTest) = 32 Or _
varValueToTest <> "" Or _
varValueToTest <> vbNullString Then IsNothing = False
(volendo considerare "vuota" una stringa fatta solo di spazi, il che
mi sembra sostenibile..de gustibus)
-Lascerei come vedi la valutazione di vbNullString sebbene in ambito
vba sia nei fatti equivalente a ""; vedi sopra, invece di
accontentarmi del risultato preferirei usare appropriatamente "" o la
costante vbNullString quando richiesto dalle API. Qualcuno ha scritto
peraltro che l'utilizzo di quest'ultima in luogo di "" migliori le
prestazioni in vba perchè vbNullString non alloca spazio in memoria;
sarei curioso su come si possa misurare la differenza. Cosa ne pensi?
-A questo proposito dici che mettere 0 o -1 in una variabile Long
invece di Integer migliorerebbe le prestazioni? A parte questo usare
Boolean o Integer sono sempre 2 byte, mi sembrano solo due diverse
scuole di pensiero.
-La valutazione di vbDate non è chiara sebbene funzionante; ovviamente
se un valore è valutabile come data non può essere (impropriamente
definito) IsNothing = true. Se Null penso venga valutata come numero.
E bene che sia cosi'. Io sono intervenuto sul post poiche' Francesca
chiedeva dei "perche'" specifici e la funzione isNothing, dopo averla
letta, mi sembrava "fuorviante" che e' diverso da "non funzionante" ;-{)
Il mio riferimento al sito di Karl era nello specifico riferito all'uso
di "!" (bang) o "." (dot)
>
> -La valutazione di vbString in effetti sembra zoppicare; cosa ne pensi
> di:
> If Asc(varValueToTest) = 32 Or _
> varValueToTest<> "" Or _
> varValueToTest<> vbNullString Then IsNothing = False
> (volendo considerare "vuota" una stringa fatta solo di spazi, il che
> mi sembra sostenibile..de gustibus)
Ripeto, l'importanza e' che si sappia cosa si sta usando poi sul come e'
perche' certe volte e' meglio glissare.
>
> -Lascerei come vedi la valutazione di vbNullString sebbene in ambito
> vba sia nei fatti equivalente a ""; vedi sopra, invece di
> accontentarmi del risultato preferirei usare appropriatamente "" o la
> costante vbNullString quando richiesto dalle API. Qualcuno ha scritto
> peraltro che l'utilizzo di quest'ultima in luogo di "" migliori le
> prestazioni in vba perchè vbNullString non alloca spazio in memoria;
> sarei curioso su come si possa misurare la differenza. Cosa ne pensi?
sono partito dal fondo quindi cfr. risposta al periodo successivo.
>
> -A questo proposito dici che mettere 0 o -1 in una variabile Long
> invece di Integer migliorerebbe le prestazioni? A parte questo usare
> Boolean o Integer sono sempre 2 byte, mi sembrano solo due diverse
> scuole di pensiero.
Uhmmmm..... Boolean dovrebbe essere di tipo "Byte" (un byte). La mia
storia sul "Long" e' sesso degli angeli. Non credo che in alcun nostro
(we all) applicativo possa portare a variazioni prestazionali
percepibili(*). La mia era una notazione di "stile" a qualcuno che ha la
sfrontatezza di "scrivere"(**) (ovviamente non mi riferisco a te) piu'
che di effettiva necessita' correttiva. Ritorni un boolean allora:
Function blabla() As boolean
Ma io predico bene e razzolo male di fatto uso nella maggioranza dei
casi tipi "variant" che non sono il massimo in termine di prestazioni e
occupaziione di memoria ma:
Dim x
set x = openrecordset(qualchecosa)
se ne frega se recordset e' ADO, DAO o qualsiasi improbabile sarchiapone
anche se, alcune volte, ti manda la giornata di traverso:
Function y(px)
.........
call y(cbx)
In "px" tu speri di trovare il value, quella era la tua intenzione, ed
invece trovi, correttamente, l'oggetto cbx.
Perdere tempo a ottimizzare un ciclo di 10^6 con prestazioni accettabili
quando magari in un ciclo 10^3 e' inserita una DlookUp o una Select e'
non aver capito il senso ("Così tra questa Infinità s'annega il pensier
mio:") (***)
>
> -La valutazione di vbDate non è chiara sebbene funzionante; ovviamente
> se un valore è valutabile come data non può essere (impropriamente
> definito) IsNothing = true. Se Null penso venga valutata come numero.
Date e' un altro "tipo" inventato. Di fatto access usa un numerico
(single?) in cui la parte intera sono giorni a partire dall'1/1/1900
(credo, sull'Help c'e' scritto ma non ho voglia di verificare e la mia
memoria e' ormai "fritta") e la parte frazionaria e' l'ora. "0" se non
ricordo male e' la mezzanotte del 31/12/1899. E' sufficiente trasformare
un campo Date/Time in numerico e viene fuori esplicitamente.
(*) Forse in quelle di @Alex Baraldi uauauauauauaua ;-{)
(**) Ci sarebbe da discutere su come vengono preparati e soprattutto
tradotti certi "tomi"
(***) Mi scuso per la mia abominevole citazione
--
ac (x=y-1)
Funziona!
> Normalmente il "!" si usa quando il controllo a dx e' un controllo
> utente. Ormai e cosi' pervicacemente attaccata alle mie dita la
> situazione che lo faccio in automatico il porre "." o "!".
> Sul sito di Karl potrebbe esserci una chiara esposizione (non la trovo).
vedrò..
> Sostituire "!" con "." e' generalmente indifferente (non il contrario)
> se non ricordo male
grazie
> capisce perche' le Date non possano essere Nothing e perche' una
infatti mi chiedevo come si fa con ado a cancellare il valore in un
campo data (non ci riesco..)
> Sappiamo tutti che il dato boolean e' inventato pero' far ritornare un
> Integer (perche' non un Long,poi, che e' piu' "performante") e poi dire
> che la funziona ritorna False (0) o True (-1), al solito, funziona, ma
> un po' di coerenza nella vita non guasterebbe.
ho notato che spesso True e false mi danno problemi, allora uso 0 e -1
(e in genere le cose mi si aggiustano..)
> isCustomValued
...questioni..nominalistiche!?
> Ciao Francesca e Alessandro,
ciao
> Entrando nel merito:
> If Asc(varValueToTest) = 32 Or _
> varValueToTest <> "" Or _
> varValueToTest <> vbNullString Then IsNothing = False
> (volendo considerare "vuota" una stringa fatta solo di spazi, il che
> mi sembra sostenibile..de gustibus)
lo trovo deliziosamente ...vintage!
Qualcuno ha scritto
> peraltro che l'utilizzo di quest'ultima in luogo di "" migliori le
> prestazioni in vba perchè vbNullString non alloca spazio in memoria;
> sarei curioso su come si possa misurare la differenza. Cosa ne pensi?
interessante
> -A questo proposito dici che mettere 0 o -1 in una variabile Long
> invece di Integer migliorerebbe le prestazioni? A parte questo usare
> Boolean o Integer sono sempre 2 byte, mi sembrano solo due diverse
sarebbe interessante sapere la verità oggettiva su come stanno le cose
> un campo Date/Time in numerico e viene fuori esplicitamente.
dunque se in Ado assegno "0" ad un campo data, io "cancello" il valore
in quel campo?
Perchè 'vintage'?