VBA Null

di il
21 risposte

21 Risposte - Pagina 2

  • Re: VBA Null

    Su questa
    Non ho testato il codice di @Alex, in VB .Net non funzionerebbe, perchè un oggetto Null restituisce errore se viene usato all'interno di Len ...
    Non ho modo qui di verificare se su vb.net funzionerebbe ma Alex ha messo LEN non del campo eventualmente nullo ma della
    concatenazione del campo con stringa vuota quindi credo che anche in vb.net funzionerebbe ...

    e su questa
    Non credo che lo abbia testato nemmeno @Alex, visto che il codice postato contiene errori, ci sono i punti e virgola invece delle virgole....
    in realtà dipende dove lo scrivi, direttamente nella query (non SQL ma direttamente nell'interfaccia) funziona ...

    direi che evitare inutili "scontri" sia la soluzione migliore e soprattutto non utile a nessuno, tantomeno al 3d
    peace!


    Rubik mi dispiace se ti sei offeso per questa mia
    Rubik non ti piaceva l'nz che ho proposto io?
    avrei fatto meglio a mettere una faccina sorridente perchè l'ho scritto in quel modo

    re-peace!
  • Re: VBA Null

    Rubik ha scritto:


    Grazie muttley005

    Non ho testato il codice di @Alex in VBA, in VB .Net non funziona, perchè un oggetto Null restituisce errore se viene usato all'interno di Len, un oggetto Nothing invece restituisce zero, anche far fare una conversione implicita al compilatore non è una buona regola di programmazione.
    Non credo che lo abbia testato nemmeno @Alex, visto che il codice postato contiene errori, ci sono i punti e virgola invece delle virgole....

    codice postato errato:
    Iif(Len(tuoriferimennto + "")=0;"Zero";">Zero")
    Secondo me non sai di cosa parli...!
    Questo è VBA e, la concatenazione di un NULL con una stringa VUOTA data da [""] oppure dalla costante [vbNullstring] obbliga il compilatore a fare il casting del DataType da Variant(null) a String, motivo per cui questo metodo funziona, da 25anni fortunatamente, per rilevare sia l'occorrenza del NULL che del NULLSTRING all'interno di una variabile o di un dato.

    I PUNTIVIRGOLA ci sono perchè se metti la stringa nel visualizzatore OGGETTI, tipo CONTROLSOURCE o in SQL da QBE, quella è la sintassi da usare, di mezzo abbiamo l'interprete...
    A me pare che tu sia molto saccente ma non sappia proprio molto di Access..., quindi studia prima di voler fare a tutti i costi il "gegnio", o meglio se vuoi fare il "cagarampini" vedi prima di imparare bene.
  • Re: VBA Null

    muttley005 ha scritto:


    Non ho modo qui di verificare se su vb.net funzionerebbe ma Alex ha messo LEN non del campo eventualmente nullo ma della
    concatenazione del campo con stringa vuota quindi credo che anche in vb.net funzionerebbe ...
    Il problema sta proprio nella concatenazione con il +, visto che l'oggetto è Null, la conversione implicita in VB .Net fa si che l'oggetto sia trasformato in un double impedendo di fatto la concatenazione con una stringa, il codice così come scritto non assicura risultati sicuri per sempre e in tutti gli ambienti.

    dovrebbe essere:
    ris = IIf(Len(CType(Me.MioCbo.Value, String) + "") = 0, "KO", "OK")
    che potrebbe portare ad altri problemi se il variant non fosse convertibile in String.

    Va considerato che Me.MioCbo.Value può contenere anche un numero!

    Per la tua soluzione con nz, nessuna offesa, anzi mi piace molto perché non comporta nessuna ambiguità.
  • Re: VBA Null

    Errore in:
    Ris = Ris + ComplicatissimoMetodo(Me.MioCbo, "OK")
    E crede (come da allegato precedente) che MioCbo sia Nullo!

    che chiama
    Private Function ComplicatissimoMetodo(Ctrl, SeVero As String) As String
    If Ctrl = Null Then
    ComplicatissimoMetodo = "KO"
    Else
    ComplicatissimoMetodo = IIf(Ctrl.Text <> "", SeVero, "KO")
    End If
    End Function

    E come dicevo, ora Ctrl è Object, ma ho provato anche come Control e Variant.
    Il fatto è che crede che MioCbo sia Nullo, quando invece esiste e poi dà errore quando cerco di passarlo come parametro a una funzione.
  • Re: VBA Null

    AP314 come cogli tu i suggerimenti eh ?!?
    addirittura una funzione ...
  • Re: VBA Null

    Quando usi una Combo, quesa punta di DEFAULT alla BOUNDCOLUMN, quindi quel VARIANT che invece usi, secondo te contiene l'OGGETTO o il VALORE...? Opterei per la seconda..., quindi non puoi usare la proprietà TEXT su [ctrl] in quanto non è un'oggetto ma un Valore... oltretutto come ti ho già detto NON USARE TEXT.

    Devi poi imparare a fare DEBUG e mettere la gestione errori, altrimenti prendi fischi per fiaschi..., come appunto esposto sopra.
    Private Function ComplicatissimoMetodo(CtrlValue As Variant, SeVero As String) As String
    If Len(CtrlValue & vbNullstring) = 0 Then
          ComplicatissimoMetodo = "KO"
    Else
          ComplicatissimoMetodo =  SeVero 
    End If
    End Function
    Da richiamare
    
    ComplicatissimoMetodo(Me.MioCbo, "OK")
    Altrimenti scrivi semplicemente come avevo suggerito sopra adattandola.

    P.S. se vuoi passare l'Oggetto devi dichiarare il Parametro come Object o come Access.Control, o come Access.ComboBox, questo solo per accedere all'intellisense della classe oggetto.
  • Re: VBA Null

    In aggiunta a quanto già detto dagli altri per la soluzione del problema specifico, evidenzio che questa riga è sbagliata.

    AP314 ha scritto:


    If Ctrl = Null Then
    Qualcosa confrontata con Null non restituisce né vero né falso ma Null.
    Nemmeno
    Null = Null
    restituisce Vero.
    Le soluzioni ti sono state già elencate. Ti sei imbattuto in quella che viene chiamata "Null propagation": il Null è "contagioso", solo poche cose lo neutralizzano e ci sono le funzioni ad hoc per trattarlo.

    PS: magari metti il codice vero fin da subito. Sei partito con un
    Ris=iif( Me.MioCbo.Text<>"","OK","KO")
    che non è quello che usavi.
Devi accedere o registrarti per scrivere nel forum
21 risposte