Come esprimere il valore "qualsiasi"

Anonimo
2020-05-24T13:01:10+00:00

Buongiorno!

Avrei bisogno di far assumere a 4 variabili il valore "qualsiasi", nel senso che se il campo non viene riempito o flaggato o selezionato da una casella combinata, il suo valore prenda tutti i valori possibili.

Le 4 variabili sono:

  1. Alfanumerica  --> String
  2. Numerica        --> Byte o Integer
  3. Data                --> Date
  4. Sì/No              --> Boolean

Domanda: a seconda del tipo di variabile, come posso far assumere alla variabile il valore "qualsiasi" (o tutti i valori)?

Dim vnome as String

Dim vprofessione as Integer

Dim vdata as Date

Dim vgenere as Boolean

If Not IsNull(Me![Nome]) Then

    vnome = Me![Nome]

Else

    vnome ............................................................

End If

If Not IsNull(Me![Professione]) Then

    vprofessione = Me![Professione]

Else

    vprofessione ............................................................

End If

If Not IsNull(Me![Data_Nascita]) Then

    vdata = Me![Data_Nascita]

Else

    vdata ............................................................

End If

If Not IsNull(Me![Genere]) Then

    vgenere = Me![Genere]

Else

    vgenere ............................................................

End If

Grazie e buona domenica!

Francesco

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-25T05:41:54+00:00

Come immaginavo la stampa del valore assunto dalla variabile sWhere ha svelato il "mistero". Ci sono alcune cose che andrebbero verificate:

  • Via: il nome del controllo farebbe presagire il contenuto stringa del campo che andrai a filtrare mentre quello che viene stampato è un numero ed è senza apici. Si tratta di un campo stringa (e allora ci vogliono gli apici) o un campo numerico (magari una chiave che si riferisce ad altra tabella)? A mio avviso l'errore che ricevi potrebbe essere relativo alla mancanza di apici intorno al valore 17 (ammesso che questo valore sia corretto);
  • Nella costruzione della clausola where (dentro sWhere per intenderci) ci vanno SEMPRE i nomi dei campi e i relativi valori che devono essere conformi alla natura del campo. In fondo a quanto hai riportato trovo "vfrequenza = ....". Non può funzionare, vfrequenza, per quanto ci siamo detti è il nome della variabile mentre il nome del campo, immagino, sarà Frequenza. Questo a prescindere dagli apici (che non vanno) intorno al valore 0/-1
  • Altra annotazione in merito sempre all'ultimo campo "Frequenza": immaginando che la tua maschera sia costruita per generare dei criteri di estrazione devi imporre nelle proprietà del controllo il valore di "SI" a "Stato Triplo". I campi SI/NO valgono per loro natura 0/-1. Solo cambiando la proprietà stato triplo puoi aggiungere una terza possibilità da sfruttare appunto come criterio di estrazione "Tutti" (ovvero tutte le signore Maria presenti sia che frequentino sia che non frequentino).

Prima di riportarti il codice che ho utilizzato per il test (e che ho finalmente provato successo) concludo dicendo che di fronte ad un errore non bisogna mai partire in modo schizofrenico tentando la qualunque. Occorre utilizzare gli strumenti messi a disposizione da VBA per capire e apportare i necessari correttivi. Il primo passo è comunque CAPIRE quello che si scrive, anche se suggerito da altri.

Nel codice ho eliminato l'uso delle variabili in quanto, nel tuo caso, inutili alo scopo prefissato. I concetti restano identici.


    Dim sWhere As String

    If Len(Me!Nome.Value & "") > 0 Then

        sWhere = sWhere & "AND Nome LIKE '*" & Replace(Me!Nome.Value, "'", "''") & "*' "

    End If

    If Len(Me!professione.Value & "") > 0 Then

        sWhere = sWhere & "AND Professione = '" & Me!professione.Value & "' "

    End If

    If Len(Me!data_nascita.Value & "") > 0 Then

        sWhere = sWhere & "AND data_nascita = #" & Format(Me!data_nascita.Value, "mm/dd/yyyy") & "# "

    End If

    If Len(Me!genere.Value & "") > 0 Then

        sWhere = sWhere & "AND genere = '" & Me!genere.Value & "' "

    End If

    If Len(Me!Frequenza.Value & "") > 0 Then

        sWhere = sWhere & "AND frequenza = " & Me!Frequenza.Value & " "

    End If

    If Len(sWhere) > 0 Then

        sWhere = " WHERE " & Mid(sWhere, 5)

    End If


David

La risposta è stata utile?

2 persone hanno trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T22:09:10+00:00

La condizione non comincia per "AND" perché ho imposto


sWhere = " WHERE " & Mid(sWhere, 5)


Non ne usciamo. Non stai applicando il codice suggerito o lo fai modificando qualcosa che non devi.

Aggiungi al mio codice l'istruzione 


Debug.Print sWhere 


prima di CurrentDb.Execute

come più volte suggerito...

David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T20:48:42+00:00

@Mimmo

Non c'è bisogno dello spazio, è implicito nella costruzione del valore della variabile:

    If Len(sWhere) > 0 Then

        sWhere = " WHERE " & Mid(sWhere, 5)

    End If

@Francesco

stampa il valore della variabile nella finestra immediata per capire il problema. Dopo la precedente istruzione aggiungi un

Debug.Print sWhere

David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T19:45:42+00:00

Sostituisci nel mio codice la parte relativa al nome come segue:


If Len(Me!Nome & "") > 0 Then

sWhere = sWhere & "AND Nome LIKE '*" & Replace(Me!Nome.Value,"'","''") & "*'"

End If


David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T17:59:51+00:00

Post Francesco:

If Len(Me!Nome.Value & "") > 0 Then

CurrentDb.Execute "SELECT ID INTO Prova FROM Anagrafica WHERE NOME = " & Chr(34) & Me!Nome.Value & Chr(34)

Else

CurrentDb.Execute "SELECT ID INTO Prova FROM Anagrafica"

End If

Post David:

Dim sWhere as String

If Len(Me!Nome & "") > 0 Then

sWhere = sWhere & "AND Nome = " & Chr(34) & Me!Nome & Chr(34)

End If

If Len(Me!Professione & "") > 0 Then

sWhere = sWhere & "AND Professione = " & Chr(34) & Me!Professione & Chr(34)

End If

If Len(Me!Genere & "") > 0 Then

sWhere = sWhere & "AND Genere = " & Chr(34) & Me!Genere & Chr(34)

End If

If Len(Me!Data & "") > 0 Then

sWhere = sWhere & "AND Data_Nascita = #" & Format(Me!Data,"mm/dd/yyyy") & "#"

End If

If Len(sWhere) > 0 Then

sWhere = " WHERE " & Mid(sWhere, 5)

End If

CurrentDb.Execute "SELECT ID INTO Prova FROM Anagrafica" & sWhere

sempre che i nomi dei controlli corrispondano a quelli inseriti nel codice di esempio.

E' consigliabile usare Chr(34) al posto del carattere Apice per evitare segnalazione di errore, in esecuzione, qualora nei controlli vengano inseriti valori con l'apostrofo.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T17:08:55+00:00

Ciao Franscesco,

nessuna delle due opzioni :-) credo che tu non abbia prestato troppa attenzione all'ultima parte della mia risposta, che era proprio quella che immaginavo ti sarebbe servita: costruire al volo la clausola where della tua query in base al valore delle variabili.


....

    dim sWhere as String

    If Len(vNome & "") > 0 Then

        sWhere = sWhere & "AND Nome = '" & vnome & "' "

    End If

    If Len(vProfessione & "") > 0 Then

        sWhere = sWhere & "AND Professione = '" & vProfessione & "' "

    End If

    If Len(vGenere & "") > 0 Then

        sWhere = sWhere & "AND Genere = '" & vGenere & "' "

    End If

    If Len(vData & "") > 0 Then

        sWhere = sWhere & "AND Data_Nascita = #" & Format(vData,"mm/dd/yyyy") & "#"

    End If

    If Len(sWhere) > 0 Then

        sWhere = " WHERE " & Mid(sWhere, 5)

    End If

    CurrentDb.Execute "SELECT ID INTO Prova FROM Anagrafica" & sWhere


Ho scritto tutto senza provare e quindi non escludo qualche errore, ma quello che importa è il senso di come puoi creare la parte finale (clausola where) al volo in dipendenza delle variabili.

David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2020-05-24T13:56:39+00:00

Ciao Francesco,


    Dim vnome as Variant

    Dim vprofessione as Variant

    Dim vdata as Variant

    Dim vgenere as Variant

    If Len(Me!Nome.Value & "") > 0 Then

        vnome = Me!Nome.Value

    End If

    If Len(Me!Professione.Value & "") > 0 Then

        vProfessione = Me!Professione.Value

    End If

If Len(Me!Data_Nascita.Value & "") > 0 Then

        vdata = Me!Data_Nascita.Value

    End If

    If Len(Me!Genere.Value & "") > 0 Then

        vgenere = Me!Genere.Value

    End If

    MsgBox "vNome: " & (vNome = vbNullString) & vbcrlf _

                  & "vProfessione: " & (vProfessione = vbNullString) & vbcrlf _

                  & "vData: " & (vData = vbNullString) & vbcrlf _

                  & "vGenere: " & (vGenere = vbNullString)


Ciascuna delle quattro variabili, nel caso in cui non venissero valorizzate, avrebbe valore stringa vuota e di conseguenza potresti, ad esempio, costruire una clausola where ad-hoc a runtime testando il valore di confronto di queste variabili con vbNullString (come nel msgbox finale).

David

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

18 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2020-05-24T16:12:38+00:00

    Ehmm... due sono le opzioni: 

    1. non ho applicato bene la tua soluzione
    2. non mi sono spiegato bene

    Nella tabella Anagrafica ci sono 1000 record.

    Una maschera dà la possibilità all'utente di selezionare le persone in base a nome, professione, data, genere (uomo/donna). In realtà le selezioni sono molte di più, ma prendiamo queste per semplificare.

    Ora, se su nome scrivo 'Francesco', va tutto bene, creo un File di 15 record:

    CurrentDb.Execute "SELECT ID INTO Prova FROM Aagrafica WHERE NOME = '" & vnome & "'"

    Se su nome non scrivo niente, ho bisogno che sul file Prova vengano inseriti tutti e 1000 i record, perché la variabile deve includere, nel caso non venga selezionato niente, QUALSIASI valore.

    E invece mi dà zero record.

    La risposta è stata utile?

    0 commenti Nessun commento