Controllo campi problematico

di il
4 risposte

Controllo campi problematico

Buongiorno a tutti!
Sto lavorando da questa mattina ad un piccolo tool in access, un database contatti che verrà allocato sul server aziendale e aggiornato tramite una maschera che verrà girata alla rete vendita.
Premetto che la mia conoscenza dell'applicativo è piuttosto limitato, così come del relative codice VBA...mi scuserete pertanto se le mie soluzioni non risulteranno poi così eleganti!

Ho proceduto creando un form unbound con relativo pulsante per la registrazione del record. Una volta premuto il pulsante viene prima di tutto effettuato un controllo su alcuni campi, al fine di obbligare alla compilazione di tutti quelli che sono i field obbligatori.
Il codice è il seguente:
Private Sub RegisterB_Click()


CompanyName.SetFocus
If CompanyName.Text = "" Then
err = err + 1
MsgBox "Please insert the Company name"
End If

Combo37.SetFocus
If Combo37.Value = "" Then
err = err + 1
MsgBox "Please insert Subscriber name"
End If

Combo39.SetFocus
If Combo39.Value = "" Then
err = err + 1
MsgBox "Please insert the Country of company"
End If

Combo41.SetFocus
If Combo41.Value = "" Then
err = err + 1
MsgBox "Please insert the Type of contact"
End If

Combo43.SetFocus
If Combo43.Value = "" Then
err = err + 1
MsgBox "Please insert the Category of contact"
End If

Combo45.SetFocus
If Combo45.Value = "" Then
err = err + 1
MsgBox "Please insert the specific Segment"
End If

Combo51.SetFocus
If Combo51.Value = "" Then
err = err + 1
MsgBox "Please insert the Level of Interaction"
End If

Combo47.SetFocus
If Combo47.Value = "" Then
err = err + 1
MsgBox "Please insert almost the MAIN area of excellence"
End If

If err < 1 Then
Set db = CurrentDb
Set rst = db.OpenRecordset("DATABASE")
 With rst
     .AddNew
    !Company_Name = CompanyName
     !Company_Contact_Mail = Me.CompanyContactMail
     !Company_Contact_Phone = Me.CompanyContactPhone
     !Sales_Person = Me.Combo37
     !COUNTRY = Me.Combo39
     !Classification = Me.Combo41
     !Category = Me.Combo43
     !Segment = Me.Combo45
     !Level_of_Interaction = Me.Combo51
     !Area_of_Excellence_1 = Me.Combo47
     !Area_of_Excellence_2 = Me.Combo49
     .Update
    MsgBox "New contact: " & CompanyName & " has been successfully added"

 End With
 rst.Close
 End If
 ' (...) codice clear format
End Sub
Ora, il problema è molto semplice: non appena avviata la maschera, questa consente la registrazione del primo codice senza effettuare alcun controllo! Dopo il primo update, il controllo viene invece effettuato come dovuto.
Come intervenire?

GRAZIE a chiunque proverà a darmi delucidazioni in merito!
Saluti

PS si solo so, sono un animale per non aver rinominato le combo, I know it
PPS esistono di certo modi più eleganti per avere il medesimo risultato, ma ho cercato di andare incontro ai miei palesi limiti accontentandomi di un risultato quantomeno funzionale!

4 Risposte

  • Re: Controllo campi problematico

    tamaeril ha scritto:


    ...
    Private Sub RegisterB_Click()
    
    CompanyName.SetFocus
    If CompanyName.Text = "" Then
    err = err + 1
    ...
    If err < 1 Then
    ...
    End If
     ' (...) codice clear format
    End Sub
    Ora, il problema è molto semplice: non appena avviata la maschera, questa consente la registrazione del primo codice senza effettuare alcun controllo! Dopo il primo update, il controllo viene invece effettuato come dovuto.
    Dove/come hai dichiarato la variabile Err?
    Err è già un oggetto di VBA, hai usato quel nome casualmente o intenzionalmente?
    Cosa contiene la parte di codice che hai omesso, il clear format? (che forse era meglio definire clear form). Ho una mezza idea però prima di sparare preferisco prendere la mira.
  • Re: Controllo campi problematico

    Ciao e grazie per la celerità!

    Dunque, in merito al clear form, è un semplice susseguirsi di setfocus sui diversi campi che vengono "riempiti" con un valore = "", questo al termine di tutta la routine di aggiornamento

    Per quanto concerne l'err, ho preso l'oggetto da un altro codice similare....e ad essere sinceri non l'ho dichiarato! Potrebbe essere questo a generare l'anomalia? E nel caso, come è meglio dichiararlo?
  • Re: Controllo campi problematico

    tamaeril ha scritto:


    Dunque, in merito al clear form, è un semplice susseguirsi di focus sui diversi campi che vengono "riempiti" con un valore = ""

    Per quanto concerne l'err, ho preso l'oggetto da un altro codice similar. Ad essere sincere non l'ho dichiarata! Potrebbe essere questo? E nel caso, come è meglio porla?
    Come dicevo prima, Err è già previsto da VBA. In assenza di errori (non quelli che hai definito tu come verifica della compilazione del campo) vale 0.
    Quando scrivi
    If Err < 1 Then
    salti l'inserimento anche quando vale 0, cioè non si sono verificati errori in assoluto (sia quelli che tu hai definito tali tirando in campo Err ed aggiungendovi 1, sia quelli di VBA)
    Questo però è in apparente (o reale) contrasto con quello che hai detto all'inizio

    tamaeril ha scritto:


    il problema è molto semplice: non appena avviata la maschera, questa consente la registrazione del primo codice senza effettuare alcun controllo! Dopo il primo update, il controllo viene invece effettuato come dovuto.
    ed ecco la spiegazione "vera".
    Una casella combinata senza alcuna selezione non ha come valore "" ma Null
    Quindi al primo caricamento la verifica di ogni
    If [combo].Value = ""
    non sarà True, non darà alcun messaggio d'errore ed Err non sarà incrementato di 1. Solo con il codice di clear form in cui, credo, anche le combo vengono impostate a "" la verifica, come l'hai intesa tu, funziona.
    Soluzione?
    If Len([Combo].Value & vbNullString) = 0 Then
    così sia il valore Null sia "" (meglio usare però vbNullString) della combo saranno trattati nello stesso modo.
    Anche nel codice che fa la "pulizia" della maschera, invece di scrivere [""] usa vbNullString.
    Se non vuoi interferire con l'oggetto Err di VBA (visto che non l'hai usato consapevolmente) usa una variabile ad hoc:
    Private Sub RegisterB_Click()
    Dim intErr as Integer
    ...
    intErr = intErr + 1
    ...
    If intErr < 1 Then
    ...
    End Sub
    Perché nella prima verifica controlli il contenuto della proprietà .Text e non .Value? Sempre perché l'hai "trovato così"? .Text ha un uso diverso da quello di Visual Basic (.Net). Per quello che ti serve credo che sia giusto .Value
    Forse è per quello che usi il .SetFocus, perché solo in quel modo potevi leggere il contenuto di .Text.
    In generale non ti serve sposatare il focus sul controllo da verificare per leggerne la proprietà .Value, anzi è uno "spreco": sposta il focus sul controllo solo se riscontri l'errore in modo che l'utente possa correggere immediatamente.
  • Re: Controllo campi problematico

    Perfetto, funziona tutto finalmente!
    Grazie Phil, non mettevo le mani su Access da anni e anni e diverse cose, come l'err ma anche un paio di altre cosette in altri eventi, erano stati scorporati da stringe già esistenti e modificate per lo scopo. Come si è notato, con risultati discutibili!

    Che dire, mi ci rimetterò su per evitare alla prossima occasione di rischiare nuovamente di impazzire

    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
4 risposte