+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Tabella con record duplicati e contatore

  1. #1
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    71

    Tabella con record duplicati e contatore

    Buongiorno,
    ho una tabella con tre campi numerici di cui un ID Contatore come chiave primaria. Vorrei impedire la condizione di avere record con gli stessi valori negli altri due campi. Faccio alcuni esempi di cio' che vorrei ottenere:
    IDContatore Campo1 Campo2
    1 1 1
    2 1 2
    3 2 1
    4 2 3
    5 1 1 condizione da evitare
    n 4 5

    Volevo inserire nella tabella una chiave primaria multicampo, ma non so se e' la soluzione migliore. Non so se devo evitare la condizione quando eseguo l'inserimento dei dati nella maschera.
    Spero di essere stato chiaro. Ringrazio in anticipo

  2. #2
    Ferrari_and non è in linea Scolaretto
    Post
    236
    se crei un indice "CREATE UNIQUE INDEX" dei 2 campi Campo1 e Campo2 l' inserimento di un valore duplicato darà un errore che dovrai poi gestire.

    L'alternativa è gestire da maschera di inserimento se quella combinazione è già presente nel database.

    Quale delle 2 scegliere dipende molto dalla implementazione che hai realizzato e se in qualche altro modo tenti di inserire i dati all'inteno del database.

    Nessuno vieta di implementarle entrambe.

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,431
    Se la Chiave Primaria è IDContatore non puoi usare un Indice Univoco MultiCampo, pena riscrivere i riprogettare il DB...
    Secondo me puoi gestire da Codice l'eccezione e prevenire il problema... di solito lo si fa nella Maschera che consente di generare l'errore, quindi su BeforeUpdate, dove puoi inserire un codice semplicissimo ed effettuare il CANCEL dell'Update.
    codice:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
       Cancel= Campo1=Campo2
       If Cancel then 
          Me.Undo
          MsgBox "Attenzione duplicato..."
       End If
    End Sub
    Mi chiedo in cosa consista la differenza tra il Record con IDContatoree=1 e 5... dal momento che segnali solo il 5...
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  4. #4
    OsvaldoLaviosa ora è in linea Topo di biblioteca
    Luogo
    Conversano
    Post
    2,988
    Il suggerimento di prevenire da codice VBA è valido. Ma (secondo me) non guasta impostare anche:
    IDContatore = chiave primaria
    Campo1 e Campo2 = Indice Multicampo Univoco

    Io che ad esempio non so gestire quel codice, imposto spesso così e la cosa funziona e mi accontento.
    Ditemi i campi di tutte le vostre tabelle.

  5. #5
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    71
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Se la Chiave Primaria è IDContatore non puoi usare un Indice Univoco MultiCampo, pena riscrivere i riprogettare il DB...
    Secondo me puoi gestire da Codice l'eccezione e prevenire il problema... di solito lo si fa nella Maschera che consente di generare l'errore, quindi su BeforeUpdate, dove puoi inserire un codice semplicissimo ed effettuare il CANCEL dell'Update.
    codice:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
       Cancel= Campo1=Campo2
       If Cancel then 
          Me.Undo
          MsgBox "Attenzione duplicato..."
       End If
    End Sub
    Mi chiedo in cosa consista la differenza tra il Record con IDContatoree=1 e 5... dal momento che segnali solo il 5...
    Grazie Alex,
    ho indicato solo il record 5 perche' in ordine cronologico era l'ultimo inserito ed era in conflitto proprio con l'1. quindi all'inserimento del record 5 occorre intervenire per segnalare l'errore.
    Testo il codice e verifico la funzionalita'
    Grazie ancora

  6. #6
    Ferrari_and non è in linea Scolaretto
    Post
    236
    Domanda è ma Campo1 e Campo2 non devono essere mai = o nn si devono riperete ombinazioni = nel database già inserite?

  7. #7
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    71
    Quote Originariamente inviato da Ferrari_and Visualizza il messaggio
    Domanda è ma Campo1 e Campo2 non devono essere mai = o nn si devono riperete ombinazioni = nel database già inserite?
    Non si devono ripetere combinazioni uguali (mentre fra di loro possono avere lo stesso valore). I due campi sono IDContatori provenienti da altre tabelle.
    Io ho provato ad utilizzare il codice seguente ma non capisco perche' non funzioni, nel senso che inserendo una combinazione gia' esistente la variabile Cancel rimane comunque a 0. Qualche suggerimento??
    codice:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If DCount("*", "TabAbbinamentiClienti", "[NUMacIDancontatore]= " & Me.NUMacIDancontatore & " And [OPacIDnbcontatore]= " & Me.OPacIDnbcontatore & "") > 0 Then
        Cancel = Me.NUMacIDancontatore = Me.OPacIDnbcontatore
            If Cancel Then
            Me.Undo
            MsgBox "Attenzione duplicato, combinazione gia' presente"
            Else: Exit Sub
            End If
        End If
    End Sub

  8. #8
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    71
    Quote Originariamente inviato da mailman_1969 Visualizza il messaggio
    Non si devono ripetere combinazioni uguali (mentre fra di loro possono avere lo stesso valore). I due campi sono IDContatori provenienti da altre tabelle.
    Io ho provato ad utilizzare il codice seguente ma non capisco perche' non funzioni, nel senso che inserendo una combinazione gia' esistente la variabile Cancel rimane comunque a 0. Qualche suggerimento??
    codice:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If DCount("*", "TabAbbinamentiClienti", "[NUMacIDancontatore]= " & Me.NUMacIDancontatore & " And [OPacIDnbcontatore]= " & Me.OPacIDnbcontatore & "") > 0 Then
        Cancel = Me.NUMacIDancontatore = Me.OPacIDnbcontatore
            If Cancel Then
            Me.Undo
            MsgBox "Attenzione duplicato, combinazione gia' presente"
            Else: Exit Sub
            End If
        End If
    End Sub
    Chiedo scusa ma ragionando meglio sul codice ho semplificato nel modo seguente e adesso funziona:

    codice:
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If DCount("*", "TabAbbinamentiClienti", "[NUMacIDancontatore]= " & Me.NUMacIDancontatore & " And [OPacIDnbcontatore]= " & Me.OPacIDnbcontatore & "") > 0 Then
            Me.Undo
            MsgBox "Attenzione duplicato, combinazione gia' presente"
            Else: Exit Sub
            
        End If
    End Sub
    Grazie a tutti

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi