Controllo su dati obbligatori in una maschera.

di il
8 risposte

Controllo su dati obbligatori in una maschera.

Quella che riporto è una function che esamina tutti i controlli Casella di testo e casella combinata in una maschera e quando ne trova uno vuoto restituisce un messaggio di errore. Tra tutte le caselle di testo della maschera una si chiama Note e non vorrei che questa venisse controllata. Dove devo apportare le modifiche? Credo che bisogna agire al livello del For ma non so come procedere.

Private Sub Form_BeforeUpdate(Cancel As Integer)
If DatoObbligatorio(Me) Then Cancel = -1
End Sub
Public Function DatoObbligatorio(ByVal Maschera As Form) As Boolean

Dim Ctl As Control
Dim Num As Integer

DatoObbligatorio = False
Num = 0

'Esamina ciclicamente tutti i controlli Casella di testo e casella combinata e quando ne
'trova uno vuoto imposta su 1 la variabile di controllo Num ed esce dal ciclo'
For Each Ctl In Maschera
If Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox Then
If Ctl = " " Or IsNull(Ctl) Then
Num = 1
Exit For
End If
End If
Next Ctl
If Num = 1 Then


MsgBox "Dato obbligatorio nel campo " & Ctl.Name & " , " & vbCr & "inserirlo, per favore.", _
vbInformation, "Dato obbligatorio omesso"
DatoObbligatorio = True
Else
DatoObbligatorio = False
End If

End Function

8 Risposte

  • Re: Controllo su dati obbligatori in una maschera.

    Ma secondo te sarà mai possibile che per OGNI MASCHERA ci siano tutti i controlli che vanno compilati…? Non ci credo nemmeno se vedo… quindi il codice che proponi è solo Teoricamente sensato ma praticamente non utile tanto meno scritto come Funzione Public da richiamare come hai fatto e ne è dimostrazione proprio la tua richiesta.

    Faccio poi presente questo:

    If Ctl = " " Or IsNull(Ctl) Then 

    Lo spazio non corrisponde a campo NON compilato… e questo è un controllo sbagliato.

    Questo tipo di controllo verifica sia il NULL che il NULLSTRING, diverso dallo spazio.

    If Len(Ctl.Value & vbNullstr4ing)=0 Then

    Altra cosa che rende impossibile il funzionamento del tuo codice:

    For Each Ctl In Maschera

    L'oggetto Maschera non consente l'iterazione, devi iterare la Collection Controls:

    For Each Ctl In Maschera.Controls

    Ora nasce il problema non molto compatibile con il tuo metodo… che non è particolarmente tecnico.

    I Controlli hanno una proprietà di Validazione o ValidationRules che contribuisce alla gestione dei vincoli da inserire, a seguito del rispetto o meno dei vincoli si genera un Errore a livello di Form che viene gesito, questo sistema è estremamente più potente e funzionale in quanto consente di personalizzare esattamente le REGOLE per ogni Controllo Associato e non…

    Il tuo codice, che tutto sommato fa quello che dici ora diventa un problema in quanto scritto come lo hai scritto che è generalizzato per Form diventa non gestibile come personalizzazione di Maschera.

    Quindi io fossi in te userei le ValidationRoules, se invece vuoi usare quel codice e renderlo sempre Flessibile devi usare una Variante, ovvero la proprietà TAG dei controlli, da compilare con un Carattere o Valore che ti consente di discriminare quelli obbligatori da quelli non obbligatori.

    Esempio, nei controlli Obbligatori alla proprietà TAG inserisci “OBBLIGATORIO”

    quindi modificherai il tuo codice così, migliorando anche il codice:

    Public Function DatoObbligatorio(ByVal Maschera As Form) As Boolean
    
    	Dim Ctl As Control
    	DatoObbligatorio = False
    
    	'Esamina ciclicamente tutti i controlli Casella di testo e casella combinata e quando ne
    	For Each Ctl In Maschera.Controls
    		If ctl.TAG="OBBLIGATORIO" Then
    			If Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox Then
    				If LEN(Ctl.value & vbNullstring)=0 Then
    					DatoObbligatorio=True
    					MsgBox "Dato obbligatorio nel campo " & Ctl.Name & " , " & vbCr & "inserirlo, per favore.", vbInformation, "Dato obbligatorio omesso"
    					Exit For
    				End if
    			End if
    		End If
    	Next Ctl
    
    End Function

    Metterei la gestione errori…

  • Re: Controllo su dati obbligatori in una maschera.

    Ciao,

    seguirei le info di @Alex 

    altrimenti implementare la If in:

    If (Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox) And Ctl.Name <> "TuoNomeControllo" Then

    Altrimenti …beh, io non faccio mai di queste cose… 
    perchè, se un campo è obbligatorio oppure no e quali sono i valori consentiti o meno, li definisco in progettazione della Tabella e mai da codice tranne in rarissimi casi dove è strettamente necessario implementare dei controlli sulla base dei valori di altri campi etc.. etc…
    E sempre in progettazione tabella imposto anche il contenuto dei messaggi di errore da restituire all'utente.

    Access fa tutto in automatico e non devo fare nient'altro… e soprattutto quando si va a leggere la struttura della tabella già si capisce con cosa abbiamo a che fare. Sono regole di integrità della tabella che si stabiliscono fin dalla sua creazione.
    Farlo a posteriori, come in una form, non mi piace, appesantisce il tutto inutilmente e lo considero una inutile perdita di tempo… il 99,999% dei controlli si assolvono agevolmente in struttura tabelle.

    Attenzione quando scrivi il codice… in questa function hai dichiarato inutilmente delle variabili solo per indicare se sarà Vero o Falso il valore che la function deve restituire…. e hai ripetuto inutilmente più volte il False da assegnare alla Function…. 
    Semplificare, snellire e scrivere bene il codice, mi raccomando.

  • Re: Controllo su dati obbligatori in una maschera.

    26/05/2023 - By65Franco ha scritto:


    Vi ringrazio per le vostre puntuali risposte. 

    Sto imparando ora. Questo è solo un esempio per iniziare a maneggiare questo linguaggio. Lo so che non è la migliore soluzione nè quella definitiva. 

    Se per esempio volessi farlo nella tabella, come mi suggerisci

    Vi ringrazio per le vostre puntuali risposte. 

    Sto imparando ora. Questo è solo un esempio per iniziare a maneggiare questo linguaggio. Lo so che non è la migliore soluzione nè quella definitiva. 

    Se per esempio volessi farlo nella tabella come dovrei procedere? Per esempio, vado alla data e voglio che essa sia sempre immessa, allora metto Richiesto Sì, però poi il messaggio di errore “non mi piace”, è troppo vago. Posso cambiare il messaggio di errore?

  • Re: Controllo su dati obbligatori in una maschera.

    Non è vero che è troppo vago… anzi…!

    L'errore viene restituito su Form_Error e puoi intercettarlo dicendo quale controllo non soddisfa… è differibile con il codice errore se si tratta di Dato richiesto o di mancanza di soddisfazione delle ValidationRoules.

    Considera sempre che le regole di Validazione le puoi mettere nelle Tabelle, vengono poi richiamate nelle Form quando le costruisci e gestibili sempre su Errore.

    Esempio:

    Private Const ERR_ONETOMANYCONFLICT = 3101
    Private Const ERR_RELATEDRECORDS1 = 3200
    Private Const ERR_RELATEDRECORDS2 = 3201
    Private Const ERR_REQUIREDDATA = 3314
    Private Const ERR_DUPLICATEKEY = 3022
    Private Const ERR_NOCURRRECFOUND = 3021
    Private Const ERR_DATATYPE = 2113
    Private Const ERR_INPUTMASK = 2279
    Private Const ERR_NULLKEY = 3058
    Private Const ERR_NULLVALUE = 3162
    Private Const ERR_ZEROLENGTHSTRING = 3315
    Private Const ERR_DATAVALIDATION1 = 2107
    Private Const ERR_DATAVALIDATION2 = 3317
    Private Const ERR_ITEMNOTINLIST1 = 2237
    Private Const ERR_ITEMNOTINLIST2 = 2473
    
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
        Const NEXT_MSG = "See next message for details."
    
        Select Case DataErr
            Case Is = ERR_ITEMNOTINLIST1, ERR_ITEMNOTINLIST2
            
                Response = acDataErrContinue
                MsgBox "Valore digitato non consentito." & vbNewLine & "Seleziona solo tra i valori nella lista."
                ActiveControl.Undo
                            
            Case ERR_REQUIREDDATA
                MsgBox "Required value missing!" & vbCr & _
                       NEXT_MSG, vbInformation, "WARNING"
                Response = acDataErrDisplay
    
            Case ERR_RELATEDRECORDS1, ERR_RELATEDRECORDS2
                MsgBox "Relation conflict!" & vbCr & _
                       NEXT_MSG, vbInformation, "WARNING"
                Response = acDataErrDisplay
    
            Case ERR_NULLKEY, ERR_NULLVALUE, ERR_ZEROLENGTHSTRING
                MsgBox "Field can not be empty.", vbInformation, "WARNING"
                Response = acDataErrContinue
    
            Case ERR_DUPLICATEKEY
                MsgBox "The value is already in use to " & _
                       "create an unique record. Change the value.", _
                        vbInformation, "WARNING"
                Response = acDataErrContinue
    
            Case ERR_DATATYPE, ERR_INPUTMASK
                MsgBox "The value has an incorrect data type" & vbCr & _
                       "(f.i. text value in a numeric field).", _
                       vbInformation, "WARNING"
                Response = acDataErrContinue
                ActiveControl.Undo
    
            Case ERR_DATAVALIDATION1, ERR_DATAVALIDATION2
                'Custom validation rules: show corresponding error message
                 MsgBox AccessError(DataErr), vbInformation, "WARNING"
                 Response = acDataErrContinue
    
            Case Else
                'Display the default error message
                Response = acDataErrDisplay
        End Select
    
    End Sub
    
  • Re: Controllo su dati obbligatori in una maschera.

    Per esempio per un campo data Scadenza:

    Come vedi puoi sfruttare tutte le proprietà dal formato alla formattazione, il nome Etichetta, valore predefinito, messaggio di Errore, se richiesto oppure no…. etc…

    Per esempio nella Proprietà " Valido se " puoi impostare un qualsiasi funzione di controllo che puoi generare con il Generatore di Espressioni nel caso di necessità:

    Insomma… un metodo per definire Validazioni, Messaggi e Formati che saranno validi per tutto il progetto… e in più si garantisce l'integrità della stessa.

  • Re: Controllo su dati obbligatori in una maschera.

    26/05/2023 - Nat ha scritto:

    Vi ringrazio per le vostre puntuali risposte. 

    Sto imparando ora. Questo è solo un esempio per iniziare a maneggiare questo linguaggio. Lo so che non è la migliore soluzione nè quella definitiva. 

    Se per esempio volessi farlo nella tabella come dovrei procedere? Per esempio, vado alla data e voglio che essa sia sempre immessa, allora metto Richiesto Sì, però poi il messaggio di errore “non mi piace”, è troppo vago. Posso cambiare il messaggio di errore?

    Segui i consigli di @Alex , sono molto preziosi…

    Cmq un pochetto sei migliorato, Bravo!!!!

    Se ti piace c'è un mare di argomenti da approfondire, vedo che l'impegno non manca , vedrai che passo dopo passo inizi a padroneggiare alcune cose che ti porteranno sempre un poco più avanti. 

  • Re: Controllo su dati obbligatori in una maschera.

    Certo che li seguo! (Anche se mi ha sgridato vabbè! ahha)

    Grazie. Io ho fatto solo un esame di informatica, dove si programmava in Java, quindi più o meno so come si procede, o meglio, come si dovrebbe procedere. Già quel suggerimento sul valore predefinito risolve tutti i miei problemi in questo caso. Grazie a tutti!

  • Re: Controllo su dati obbligatori in una maschera.

    26/05/2023 - Nat ha scritto:


    Certo che li seguo! (Anche se mi ha sgridato vabbè! ahha)

    ahahahaha… sicuramente aveva ragione di farlo ;)

    Bravo !!!

Devi accedere o registrarti per scrivere nel forum
8 risposte