3 - Evitare di inserire doppioni in tabella

Stato
Chiusa ad ulteriori risposte.

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
29.532
2.465
Como
2011MAC 365WIN
1.009
Una cosa che si vuole spesso evitare nell'inserimento di dati dalla maschera alla tabella è quello di inserire duplicati di dati.

Serve allora un controllo preventivo all'inserimento che verifichi se il nuovo dato che si vuole inserire sia o meno gà presente.

Riprendiamo la nostra tabella "Utenti ForumExcel" che ho utilizzato negli altri tutorial in cui come esempio ho giù inserito 4 Nick



Certo sono pochi dati e me li ricordo benissimo, però se ho già inserito centinaia o migliaia di utenti difficilmente ricorderò se un nick l'ho già inserito o meno.

Il codice devo inserirlo PRIMA che si attivi l'inserimento dei dati, ma DOPO aver aperto la tabella, quindi qui:



Un metodo che ho spesso trovato in rete per il controllo dei doppioni è tramite l'utilizzo della funzione DLookup
Visual Basic:
 Dim verifica As String

verifica = Chr(34) & Trim(Me!txtNick) & Chr(34)
    If DLookup("[Nick utente]", "[Utenti ForumExcel]", "[Nick utente] = " & verifica) Then
     MsgBox "Nome già presente!"
Else
        MsgBox "Nome Nuovo!"
    End If
Magari verificando anche che il campo non sia vuoto
Visual Basic:
Dim verifica As String

verifica = Chr(34) & Me!txtNick & Chr(34)

    If Not IsNull( If DLookup("[Nick utente]", "[Utenti ForumExcel]", "[Nick utente] = " & verifica)) Then
        MsgBox "Nome già presente!"
    Else
        MsgBox "Nome Nuovo!"
    End If
Questo è un metodo efficace ma in questo caso a scopo di esercizio voglio usare l'oggetto DAO (che ho già usato negli altri tutorial).

La cosa da fare per controllare se il nome che voglio inserire esiste o meno è quella di controllare tutti i nomi della tabella, a tal fine uso un ciclo Do ... Loop

Mi avvalgo della proprietà EOF che indica che la posizione del record corrente è successiva all'ultimo record in un Recordset oggetto (https://docs.microsoft.com/it-it/sq.../bof-eof-properties-ado?view=sql-server-ver15)

Quindi



E nel ciclo scrivo
Visual Basic:
If Me.txtNick = Tabella.Fields("Nick utente") Then
Così controllo il dato della casella di testo e il dato del campo ma aggiungo la funzione Trim per evitare - come ho detto sopra - di cercare dati con spazi iniziali che poi non vengano riconosciuti uguali

Se trovi due dati uguali fai qualcosa altrimenti usa la funzione MoveNext che passa al record succesivo scorrendo l'intera tabella
Visual Basic:
Do Until Tabella.EOF
        If Trim(Me.txtNick) = Trim(Tabella.Fields("Nick utente")) Then
            'dammi un avviso
        Else
            Tabella.MoveNext
        End If
    Loop
Se però ha trovato il doppione devo fare in modo che il codice non prosegua nella parta successiva in cui è previsto l'inserimento dei dati, altrimenti vanificherei questo controllo

Mi avvalgo di un operatore booeano che dichiaro con la variabile bln, e quindi imposto a True se il doppione è stato trovato e in tal caso esco dal Loop con un Exit Do



A questo punto prevdeo un controllo con IF ... End If , nel senso che se bln è vero (cioè se è presente il dato nella tabella) mi avvisa con un messaggio altrimenti inserisce il dato
Visual Basic:
 If bln = True Then
        MsgBox "Nome già presente!"
    Else
        With Tabella
            .AddNew
            ![Nick utente] = Me.txtNick
            .Update
            Me.txtNick = ""
            MsgBox "Nuovo utente inserito"
        End With
    End If
In ogni caso alla fine chiude la tabella e il database.

Questo il codice completo

Visual Basic:
Option Compare Database

Private Sub cmdInserimento_Click()
    Dim DBCorrente As DAO.Database
    Dim Tabella As DAO.Recordset
    Dim bln As Boolean

    If Len(Me.txtNick & "") = 0 Then Exit Sub

    Set DBCorrente = CurrentDb
    Set Tabella = DBCorrente.OpenRecordset("Utenti ForumExcel", dbOpenTable)

    Do Until Tabella.EOF
        If Trim(Me.txtNick) = Trim(Tabella.Fields("Nick utente")) Then
            bln = True
            Exit Do
        Else
            Tabella.MoveNext
        End If
    Loop

    If bln = True Then
        MsgBox "Nome già presente!"
    Else
        With Tabella
            .AddNew
            ![Nick utente] = Me.txtNick
            .Update
            Me.txtNick = ""
            MsgBox "Nuovo utente inserito"
        End With
    End If

    Tabella.Close
    Set DBCorrente = Nothing

End Sub
N.B. - Questo codice che è molto efficace va bene per piccoli database in quanto in database con migliaia o milioni di record sarebbe molto lento nella ricerca, in tal caso va benissimo la funzione DLookup che ho illustrato sopra

Riporto il codice completo anche con la funzione DLookUp
Visual Basic:
Option Compare Database

Private Sub cmdInserimento_Click()
    Dim DBCorrente As DAO.Database
    Dim Tabella As DAO.Recordset
    Dim verifica As String

    If Len(Me.txtNick & "") = 0 Then Exit Sub

    verifica = Chr(34) & Trim(Me!txtNick) & Chr(34)
    If Not IsNull(DLookup("[Nick utente]", "[Utenti ForumExcel]", "Trim([Nick utente]) = " & verifica)) Then
        MsgBox "Nome già presente!"
        Exit Sub
    End If
  
    Set DBCorrente = CurrentDb
    Set Tabella = DBCorrente.OpenRecordset("Utenti ForumExcel", dbOpenTable)

    With Tabella
        .AddNew
        ![Nick utente] = Me.txtNick
        .Update
        Me.txtNick = ""
        MsgBox "Nuovo utente inserito"
    End With
 
    Tabella.Close
    Set DBCorrente = Nothing

End Sub
Allego il file
 

Allegati

  • Like
Reactions: alfrimpa
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!