Record duplicati + campi

di il
22 risposte

Record duplicati + campi

Ciao,
Avrei bisogno di evitare l'inserimento di record duplicati riferiti a più campi assieme
Ad esempio se ho una tabella TBL1 con i seguenti campi Campo1,Campo2, Campo3.
Mettiamo caso che siano tutti record numerici, vorrei evitare che si possa inserire un record 1,1,1 se è già presente.

Attualmente il mio campo ID lo uso come riferimento per altre tabelle per il singolo record, quindi se è possibile eviterei di modificarlo.

Vi ringrazio in anticipo per il supporto!

22 Risposte

  • Re: Record duplicati + campi

    Su BeforeUpdate verifica la presenza di un Record che soddisfa i 3 Criteri... usando DCOUNT e mettendo in AND i 3...!
    Il Parametro CANCEL dell'evento consente di CANCELLARE appunto l'evento di Update PRIMA venga eseguito.
    
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Dcount("*","NomeTabella","Campo1=1 AND Campo2=1 AND Campo3=1")>0 then
       Cancel=True
       MsgBox "Duplicato"
    End iF
    End Sub
  • Re: Record duplicati + campi

    Puoi anche impostare un "Indice Multicampo Univoco" che fa la stessa cosa della proprietà Indicizzato: Sì (duplicati non ammessi), ma spalmato sui tre campi. Leggi la guida in linea per capire di cosa si tratta e come impostarlo.
  • Re: Record duplicati + campi

    OsvaldoLaviosa ha scritto:


    Puoi anche impostare un "Indice Multicampo Univoco" che fa la stessa cosa della proprietà Indicizzato: Sì (duplicati non ammessi), ma spalmato sui tre campi. Leggi la guida in linea per capire di cosa si tratta e come impostarlo.
    Pur essendo disponibile la definizione di INDICE MULTICAMPO, è indicato quasi esclusivamente per criteri di Ordinamento ciclici o ripetitivi al fine di ottimizzare le prestazioni in estrazione.
    Gestire Indice Multicampo UNIVOCI poi è un po più complesso che semplicemente controllare prima.
    Sono certo che non ti era scappato, ma per chiarezza spieghiamo che serve infatti effettuare una Gestione Errori non standard nele Sub ma intercettando specificatamente l'Evento Error di Form ed individuando il codice errore specifico... perchè nessuno si può accontentare di leggere il MsgBox di tentativo di duplicazione dati e non poter fare nulla...!
    Ovviamente nulla di impossibile... ma come tutte le cose sono da valutare in base alle proprie conoscenze e consapevolezze, ed a mio avviso in questo caso specifico potrebbe non essere adatto.
  • Re: Record duplicati + campi

    Ciao, grazie ad entrambi per le risposte.
    Ho 2 domande, una di informazione e una di un errore che mi esce:
    1) Con il codice di Alex non mi compare il msgbox di errore come da codice ma un messaggio di run-time "Tipo di dati non corrispondenti nell'espressione criterio.".
    2) Se imposto direttamente nella tabella un controllo nella proprietà "Valido Se" e "Messaggio Errore", funziona allo stesso modo?

    Grazie ancora!
  • Re: Record duplicati + campi

    AndryFox ha scritto:


    Ciao, grazie ad entrambi per le risposte.
    Ho 2 domande, una di informazione e una di un errore che mi esce:
    1) Con il codice di Alex non mi compare il msgbox di errore come da codice ma un messaggio di run-time "Tipo di dati non corrispondenti nell'espressione criterio.".
    Posta il Codice che hai usato, il mio era solo esemplificativo ovviamente dovevi adattarlo al tuo caso specifico... quindi se non lo hai fatto è normale, se lo hai fatto magari hai commesso un errore che dobbiamo vedere.

    AndryFox ha scritto:


    2) Se imposto direttamente nella tabella un controllo nella proprietà "Valido Se" e "Messaggio Errore", funziona allo stesso modo?
    Grazie ancora!
    Lascia stare queste cose, sono gestibili ma creano confusione.
    Alla base di questo c'è un errore concettuale in chi non conosce a fondo le strutture CLIENT-SERVER e purtroppo Access in questo è maestro ad aumentare la confusione.
    Le Tabelle, rappresentano il Server, ed al server si delegano solo le azioni che il Server deve fare... quello di cui stai occupandoti è esclusivo controllo del Client o dell'interfaccia utente, quindi della Maschera.
    Se spalmi o disperdi Validazioni/Controllo o altro confondendo le 2 competenze, poi non riuscirai più ad avere una Logica di verifica solida.
    Oltretutto gli Allarmi/Messaggi di JET, non sono gli stessi rilevabili dal Client, quindi rischieresti di dover fare lavoro inutilmente doppio.
    Delega la Maschera per tutti questi controlli.
  • Re: Record duplicati + campi

    Ciao Alex, velocissimo nella risposta, grazie!
    Ho adattato semplicemente il codice che mi hai dato con i dati della mia tabella, ovvero:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If DCount("*", "TblArticoli", "Articolo=1 AND Colore=1 AND Stagione=1") > 0 Then
    Cancel = True
    MsgBox "Combinazione Articolo&Colore&Stagione già presente."
    End If
    End Sub
    Ho compreso il codice, ovvero che va a contare nella TblArticoli tutte("*") le combinazioni di record tra i campi "Articolo", "Colore", "Stagione" e se esiste già (>0) non lo lascia inserire ma da un messaggio di errore.

    Con il debug mi da errore nella DCount quando cerco di inserire anche una qualsiasi altra combinazione Articolo Colore Taglia non presente.
  • Re: Record duplicati + campi

    Dal codice di ERRORE che dicevi prima la mia impressione è che uno di quei Campi [Articolo/Colore/Stagione] non sia Numerico... di conseguenza si arrabbia... ma questo noi non lo possiamo sapere.
    La sintassi per i campi Testo cambia.
  • Re: Record duplicati + campi

    Scusami, l'errore è mio che ho generalizzato troppo.
    Ho usato l'esempio con valori numerici per spiegare il problema ma in realtà sono campi di testo.
  • Re: Record duplicati + campi

    Scusa ma quando ti ho chiesto di postare il TUO codice per cosa penavi servisse...?
    Ora formatta come richiesto dal Tipo.
  • Re: Record duplicati + campi

    Ho provato a leggere ed informarmi ma non riesco a capire perchè non funziona nel mio caso specifico.

    Faccio il controllo di ogni valore confrontando nella TblArticoli il campo articolo con il campo nella maschera cboArticolo e cosi via, ma mi va in errore di run-time 13 Tipo non corrispondente.
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If DCount("*", "TblArticoli", "[Articolo]='" & Me.cboArticolo & "'" And "[Colore]='" & Me.lstColore & "'" And "[Stagione]='" & Me.cboStagione & "'") > 0 Then
       MsgBox "Combinazione Articolo&Colore&Stagione già presente."
    End If
    End Sub
  • Re: Record duplicati + campi

    Perché questo

    AndryFox ha scritto:


    ... "[Articolo]='" & Me.cboArticolo & "'" And "[Colore]='" & Me.lstColore & "'" And "[Stagione]='" & Me.cboStagione & "'") > 0 Then
    ...
    non dà come risultato una Where Condition senza la parola Where sintatticamente corretta
    Recentemente ho fatto un "minimanuale" su come si concatenano stringhe di vario tipo e sull'uso di variabili stringa per agevolare l'individuazione del punto in cui c'è l'errore, forse può essere utile anche a te
    (niente che non si possa trovare in forma più precisa e tecnica in un sito e/o manuale decente)
  • Re: Record duplicati + campi

    In effetti, con un pò di fatica devo ammettere, ho visto e capito la mia esagerazione di apici e virgolette.

    Per i futuri ricercatori la formula corretta è questa:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    If DCount("*", "TblArticoli", "[Articolo]='" & Me.cboArticolo & "' And [Colore]='" & Me.lstColore & "' And [Stagione]='" & Me.cboStagione & "'") > 0 Then
    MsgBox "Combinazione Articolo&Colore&Stagione già presente."
    End If
    End Sub

    Grazie a tutti!
  • Re: Record duplicati + campi

    Il codice, comunque, non tiene conto del famoso problema degli apici presenti nelle stringhe, per cui manca totalmente tale controllo.
    Basta che un articolo contenga l'apice ed il tuo codice non funziona più...

    Quindi devi aggiungere il controllo con Replace$() per OGNI valore.

    Personalmente mi sono creato una banalissima UDF chiamata Apici() che entrambe le cose (racchiude fra apici e raddoppia gli apici eventualmente presenti):
    
    Public Function Apici(ByVal pValue As String) As String
        If pValue = vbNullString Then 
            Apici = "''"
        Else
            Apici = Chr$(39) & Replace(S, "'", "''") & Chr$(39)
    End Function
    Il cui uso rende più semplice sia la lettura che la manutenzione del codice:
    If DCount("*", "TblArticoli", "[Articolo]=" & Apici(Me.cboArticolo) & " And [Colore]=" & Apici(Me.lstColore) & " And [Stagione]=" & Apici(Me.cboStagione)) > 0 Then
        MsgBox "Combinazione Articolo&Colore&Stagione già presente."
    End If
    N.B. Analoghe funzioni le uso per le date e per i valori numerici
  • Re: Record duplicati + campi

    gibra ha scritto:


    Il codice, comunque, non tiene conto del famoso problema degli apici presenti nelle stringhe, per cui manca totalmente tale controllo.
    che nel mio minimanuale nel link citato era evidenziato. Modestamente.

    gibra ha scritto:


    Quindi devi aggiungere il controllo con Replace$() per OGNI valore.

    Personalmente mi sono creato una banalissima UDF chiamata Apici() che entrambe le cose (racchiude fra apici e raddoppia gli apici eventualmente presenti):
    
    Public Function Apici(ByVal pValue As String) As String
        If pValue = vbNullString Then 
            Apici = "''"
        Else
            Apici = Chr$(39) & Replace(S, "'", "''") & Chr$(39)
    End Function
    Questa volta o faccio una figura che Gibra non mi rivolge più la tastiera o... me la segno sul calendario perché trovare un errore suo è come il bisestile in corrispondenza degli anni che terminano con due zeri.
    Scrive Replace$ e dopo nella funzione c'è Replace. E questo è uno. Ma soprattutto, c'è una S qui che non si capisce da dove arriva
    Apici = Chr$(39) & Replace(S, "'", "''") & Chr$(39)
    forse era pValue?
Devi accedere o registrarti per scrivere nel forum
22 risposte