Evitare inserimento duplicati

di il
20 risposte

Evitare inserimento duplicati

Buongiorno a tutti
Sono nuovo nel forum e Vi ringrazio anticipatamente per quanti mi vorranno aiutare.
Uso access da autodidatta da un po' di tempo e qualcosa mastico ma non sempre riesco a trovare la soluzione ad un problema.
Nel caso specifico ho cercato in internet e su YouTube ma senza risultati.
Ma vengo al punto: ho una versione di access 2007, devo evitare di inserire dei record duplicati ma il controllo lo dovrei fare unendo i dati di tre campi di cui due su una tabella ed un terzo in un altra collegata tramite una relazione molti a molti.
In pratica i primi due sono "DataOraInizio" e "DataOraFine" il terzo è l'ID della persona che fatto la prestazione con quegli orari.
Il problema è che ovviamente la stessa prestazione può essere fatta, con gli stessi orari, da più persone ma non più volte dalla stessa persona.
Di conseguenza creare un indice multicampo sulla tabella contenente i primi due campi non risolve in quanto le duplicazioni sono possibili e consentite.
Combinando invece il terzo campo, "ID" della persona, bisognerebbe non fosse possibile ma non so come procedere.
Spero di essere stato chiaro e qualcuno mi sappia aiutare.
Buona giornata.

20 Risposte

  • Re: Evitare inserimento duplicati

    Ciao, benvenuto.
    Detta così mi pare tu abbia un problema di struttura.
    Scusa sto cercando di capire ... hai una tabella "attività" che chiamerò T_ATT
    e poi hai un'altra tabella anagrafica delle persone che chiamerò T_ANAG
    immagino che la T_ANAG abbia vagamente questi campi: id_anag, cognome, nome, ...
    io, da quello che hai scritto, ho capito che la tua T_ATT abbia come campi: dataOraInizio, dataOraFine, ...
    non ti pare che manchi qualcosa?
    la tabella dovrebbe avere anche il riferimento all'anagrafica quindi id_anag
    in questo modo avresti tutti i 3 campi e potresti facilmente creare la terna come PK
    ma forse non sto capendo ...
  • Re: Evitare inserimento duplicati

    Innanzitutto grazie per la risposta tempestiva.
    Riflettendo sulla tua risposta mi è venuto un dubbio e sono andato a verificare e in effetti non ho una relazione Molti a Molti ma le tre tabelle sono "relazionate" in questo modo TBL_Personale > uno >>>> molti > TBL_Straordinari; poi TBL_Straordinari > uno >>>>> molti > TBL_Dettagli_Straordinari.
    Il problema è che i campi da controllare sono sempre in tabelle diverse 1 sulla TBL_Straordinari (IDpersonale lato molti) e 2 sulla TBL_Dettagli_Straordinari (DataOraInizio e DataOraFine)
    Grazie per l'attenzione
  • Re: Evitare inserimento duplicati

    Se la tua struttura è come dici dovresti avere
    TBL_Personale: id_persona (pk), altri dati anagrafici
    TBL_Straordinari: id_straordinario (pk), id_persona (fk) + un campo (data? altro?) che insieme ad id_persona siano univoci (puoi creare un indice univoco o gestirne l'univocità via codice) ed eventuali altri campi della tabella
    TBL_Dettagli_Straordinari: id_dettaglio (pk), id_straordinario (fk), altri campi della tabella

    per il secondo campo da rendere univoco insieme ad id_persona (nella tab TBL_Straordinari) parlavi di DataOraInizio e DataOraFine quindi potresti mettere quelli ... ma sei sicuro servano entrambi (sempre insieme a id_persona) per creare un indice univoco? io (ma dipende dal contesto) probabilmente metterei solo uno dei 2 DataOra
  • Re: Evitare inserimento duplicati

    Direi che hai inquadrato il problema.

    Ma ammesso che usi uno solo dei due DataOra come faccio a creare un indice univoco che controlli immediatamente l'inserimento prima che venga "caricato" il record nella tabella TBL_Dettagli_Straordinari, visto che il controllo va fatto assieme ad un campo che si trova in un altra tabella (TBL_Straordinari).

    ???
  • Re: Evitare inserimento duplicati

    "Puoi creare un indice univoco o gestirne l'univocità via codice"

    È li che casca l'asino, che sarei io
  • Re: Evitare inserimento duplicati

    Ciao.

    Dai un occhiata all'esempio (sezione general 6.218) su questo sito.
    https://www.accessgroup.it/sitocomune
  • Re: Evitare inserimento duplicati

    Lucfire ha scritto:


    Direi che hai inquadrato il problema.

    Ma ammesso che usi uno solo dei due DataOra come faccio a creare un indice univoco che controlli immediatamente l'inserimento prima che venga "caricato" il record nella tabella TBL_Dettagli_Straordinari, visto che il controllo va fatto assieme ad un campo che si trova in un altra tabella (TBL_Straordinari).

    ???
    c'è qualcosa che non capisco, continui a dire che va fatto il controllo con un campo della TBL_straordinari ... e non è quello di cui abbiamo parlato??! facciamo così, mi "Osvaldizzo" (sei nuovo ma se frequenterai il forum capirai) e ti chiedo di dirmi tutti i nomi dei campi di tutte le 3 tabelle, il loro significato e cosa deve risultare univoco. (senza offesa Osvaldo )
  • Re: Evitare inserimento duplicati

    TLB_Personale:
    ID_Personale > contatore chiave primaria
    Qualifica
    Nome
    Cognome
    Sede di servizio

    TBL_Straordinari:
    ID_Straordinari > contatore chiave primaria
    ID_Personale > numerico > relazione con TBL_Personale
    Tipologia straordinario
    Sede (al momento dello straordinario)
    Qualifica (al momento dello straordinario)

    TBL_Dettaglio_Straordinario
    ID_Dettaglio > contatore chiave primaria
    ID_Straordinari > numerico > relazione con TBL_Straordinari
    DataOraInizio
    DataOraFine


    I tre campi in grassetto sono quelli da controllare l'univocità.

    Porta pazienza ma non ci arrivo, anzi un'idea ce l'ho ma non so se è quella giusta:
    mi porto ID_Personale della seconda tabella nella terza tramite dlookup e creo un indice multicampo.

    Può essere?

    Altrimenti potrei provare il suggerimento di fratac
  • Re: Evitare inserimento duplicati

    Prima chiarisci cosa contengono le 3 tabelle a livello concettuale
    la prima è l'anagrafica del personale giusto?
    la seconda e la terza? io da come capisco le vedo molto un'unica tabella, poi vediamo cosa rispondi, potrei sbagliarmi
  • Re: Evitare inserimento duplicati

    Il personale presenta un documento per il pagamento degli straordinari dove di volta in volta cambia la tipologia ma all'interno dello stesso foglio ci possono essere più periodi. Di conseguenza ho dovuto fare la terza tabella. Penso che dal punto di vista della struttura il DB sia concepito bene.
    Il controllo serve ad evitare che venga presentato un documento per il pagamento degli straordinari in momenti diversi ma con stessi periodi di lavoro.
  • Re: Evitare inserimento duplicati

    Ciao. Per me la via più veloce è quella di usare dcount o count, facendo confrontare se esistono record estrapolati tramite una query che soddisfino i tre requisiti che ti occorrono.
    Praticamente è solo una riga di codice con un confronto.
    Se il confronto è uguale o superiore ad uno, significa che il periodo è già stato inserito. Naturalmente occhio all'ora esatta. Altrimenti paghi un sacco di straordinari in più
  • Re: Evitare inserimento duplicati

    fratac ha scritto:


    Ciao. Per me la via più veloce è quella di usare dcount o count, facendo confrontare se esistono record estrapolati tramite una query che soddisfino i tre requisiti che ti occorrono.
    Praticamente è solo una riga di codice con un confronto.
    Se il confronto è uguale o superiore ad uno, significa che il periodo è già stato inserito. Naturalmente occhio all'ora esatta. Altrimenti paghi un sacco di straordinari in più
    Costruire la query non ho problemi ma come la colloco all'interno del codice per la verifica prima di confermare il salvataggio del record?
  • Re: Evitare inserimento duplicati

    Lucfire ha scritto:


    Il personale presenta un documento per il pagamento degli straordinari dove di volta in volta cambia la tipologia ma all'interno dello stesso foglio ci possono essere più periodi. Di conseguenza ho dovuto fare la terza tabella. Penso che dal punto di vista della struttura il DB sia concepito bene.
    Il controllo serve ad evitare che venga presentato un documento per il pagamento degli straordinari in momenti diversi ma con stessi periodi di lavoro.
    non sono d'accordo, io probabilmente avrei fatto un'unica tabella TBL_Straordinari così composta:
    ID_Straordinario (PK)
    ID_Personale (FK sulla TBL_Personale)
    Tipologia straordinario
    Sede (al momento dello straordinario)
    Qualifica (al momento dello straordinario)
    DataOraInizio
    DataOraFine

    pensaci, sono tutti dati appartenenti allo stesso concetto, poco importa se presentano un documento con varie voci per la stessa tipologia e qualifica.
    Tecnicamente a quel punto avresti potuto mettere come univoci i campi senza problemi

    Al momento dell'inserimento del nuovo record mantieni i dati necessari (sede, tipologia e qualifica) dall'ultimo inserimento, oppure ancora meglio li avrei messi nell'anagrafica (almeno qualifica e forse sede, dipende) come "dato in linea" e li avrei ribaltati sulla TBL_straordinari come storico (anzi in un applicativo di Medicina Del Lavoro che ho fatto ho proprio quest'ultima situazione, anche se non si parla di straordinario ma di visite)

    EDIT: se non vuoi cambiare struttura puoi passare da una dlookup/dcount/dmax ... certo ... ma rimane che per me la struttura è sbagliata e te lo dimostrano queste complicazioni.
  • Re: Evitare inserimento duplicati

    muttley005 ha scritto:



    non sono d'accordo, io probabilmente avrei fatto un'unica tabella TBL_Straordinari così composta:
    ID_Straordinario (PK)
    ID_Personale (FK sulla TBL_Personale)
    Tipologia straordinario
    Sede (al momento dello straordinario)
    Qualifica (al momento dello straordinario)
    DataOraInizio
    DataOraFine

    pensaci, sono tutti dati appartenenti allo stesso concetto, poco importa se presentano un documento con varie voci per la stessa tipologia e qualifica.
    Tecnicamente a quel punto avresti potuto mettere come univoci i campi senza problemi

    Al momento dell'inserimento del nuovo record mantieni i dati necessari (sede, tipologia e qualifica) dall'ultimo inserimento, oppure ancora meglio li avrei messi nell'anagrafica (almeno qualifica e forse sede, dipende) come "dato in linea" e li avrei ribaltati sulla TBL_straordinari come storico (anzi in un applicativo di Medicina Del Lavoro che ho fatto ho proprio quest'ultima situazione, anche se non si parla di straordinario ma di visite)

    EDIT: se non vuoi cambiare struttura puoi passare da una dlookup/dcount/dmax ... certo ... ma rimane che per me la struttura è sbagliata e te lo dimostrano queste complicazioni.
    Probabilmente hai ragione che le cose sarebbero state più semplici ma ora devo fare di necessità virtù in quanto il DB è già in uso e devo poter fare questo controllo senza stravolgere la struttura.
    Il ragionamento iniziale è stato che siccome il dipendente presenta il foglio per il pagamento strutturato in un certo modo, l'inserimento in maschera delle prestazione doveva rispecchiare il più possibile il cartaceo.
    Invece come dici tu sarebbe stato necessario creare più record "Straordinari" per un unico documento contenente più periodi.
    Il mio approccio è sempre quello di mettermi dalla parte dell'utilizzatore finale, forse sbagliando ma trovo molte meno obiezioni o osservazioni.

    Proverò a cimentarmi nella soluzione citata nel tuo ultimo capoverso, suggerita anche da Fratac.

    Per il momento grazie ma se non ci riesco, magari nella sintassi, vi chiederò ancora aiuto.

    Buona giornata.
Devi accedere o registrarti per scrivere nel forum
20 risposte