EVITARE DATI DUPLICATI SU CONDIZIONE

di il
7 risposte

EVITARE DATI DUPLICATI SU CONDIZIONE

Ciao a tutti

Son di nuovo qui a chiedere una mano. Avviso che ho già verificato tra gli argomenti se fosse presente qualcosa simile al mio quesito ma non ho trovato "risposta" ai miei dubbi.

Io ho tre tabelle relazionate tra loro.
tblDOCUMENTI:
  • IDDOC (PK) - relazione 1-N con tblTERRENI
  • IDPROPRIETARIO
  • IDCOMODATARIO
  • RAPP
  • DATAINIZIO
  • DATAFINE
  • DATASTIPULA
  • IDTIPODOCUMENTO
  • CESSAZIONE
tblTERRENI:
  • IDTERRENO(PK)
  • IDDOC
  • IDCOMUNE
  • SEZIONE
  • FOGLIO
  • PARTICELLA
  • SUPCATASTALE(HA)
  • SUPUTILIZZATA(HA)
  • CESSAZIONE
  • FRAZIONAMENTO
  • DATACESSAZIONE
  • DATAFRAZIONAMENTO
tblCOMUNI:
  • IDCOMUNE(PK) - relazione 1-N con tblTERRENI
  • COMUNE
  • PROVINCIA
  • REGIONE
Dunque, a me piacerebbe che durante l'inserimento di un terreno, venga fuori un messaggio che mi avvisi se il terreno che sto inserendo è già presente a sistema.
Cioè, vorrei che il messaggio si aprisse quando a sistema esiste un IDTERRENO che ha i campi IDCOMUNE, SEZIONE, FOGLIO, PARTICELLA uguali a quelli che sto inserendo, ed anche qui avrebbe altre condizioni.
E' possibile, infatti, che si tratti di un rinnovo di un documento e pertanto è normale che i terreni siano identici (così come dovrebbero essere identici l'IDPROPRIETARIO e l'IDCOMODATARIO.

In ogni caso, io ho creato una query "Q_DocTerritoriali" che racchiude tutti i campi delle tre tabelle.

Ed ho inserito questo codice (per fare una prova) sull'attivazione dell'ultimo campo da inserire nella maschera "frmInsTerreni":
If DCount("*", "Q_DocTerritoriali") > 0 Then
    If "[IDCOMUNE] =" & Me.IDCOMUNE And "[sezione] =" & Me.SEZIONE And "[foglio] =" & Me.FOGLIO And "[particella] =" & Me.PARTICELLA Then
    MsgBox "Terreno già presente a sistema!!!"
    Else
    Me.SUPERFICIEUTILIZZATA_HA_ = DSum(Me.SUUPERFICIECATASTALE_HA_ - [Q_DocTerritoriali]![Superficieutilizzata_(ha)], "Q_DocTerritoriali")
    End If
Il problema è che mi riporta sempre il messaggio anche quando non ci sono dei terreni duplicati (e che quindi hanno tutti i campi identici) ... pertanto sicuramente sbaglio qualcosa nel codice, ma non riesco a capire cosa .... di sicuro sbaglio la DSum ma sarà oggetto di un altro 3D in futuro.

Grazie a tutti in anticipo e scusate il papiro

7 Risposte

  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Salve,
    In ogni caso, io ho creato una query "Q_DocTerritoriali" che racchiude tutti i campi delle tre tabelle.
    il risultato di questa query qual'è, quanti record rende?...tutti, quindi maggiori di zero.
    I criteri li dovresti passare alla query e successivamente contare i record.
    Saluti Gianni
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Marcdreamer ha scritto:


    a me piacerebbe che durante l'inserimento di un terreno, venga fuori un messaggio che mi avvisi se il terreno che sto inserendo è già presente a sistema.
    Cioè, vorrei che il messaggio si aprisse quando a sistema esiste un IDTERRENO che ha i campi IDCOMUNE, SEZIONE, FOGLIO, PARTICELLA uguali a quelli che sto inserendo
    In visualizzazione struttura TABELLA imposta un INDICE MULTICAMPO UNIVOCO sui 4 campi che hai indicato
    https://support.microsoft.com/it-it/office/creare-e-utilizzare-un-indice-per-migliorare-le-prestazioni-0a8e2aa6-735c-4c3a-9dda-38c6c4f1a0ce?ui=it-it&rs=it-it&ad=it
    leggi "Creare un indice multicampo" e metti la spunta su Univoco.
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Gianni55 ha scritto:


    Salve,
    In ogni caso, io ho creato una query "Q_DocTerritoriali" che racchiude tutti i campi delle tre tabelle.
    il risultato di questa query qual'è, quanti record rende?...tutti, quindi maggiori di zero.
    I criteri li dovresti passare alla query e successivamente contare i record.
    Saluti Gianni
    Buongiorno Guanno, Si ho già impostato alcuni criteri nella query.
    I campi tblDocumenti.cessazione (deve essere falso), datafine(deve essere maggiore alla data pdierna), tblTerreni.cessazione(deve essere falso)

    Quindi, racchiude solo i documenti che sono "validi" alla data odierna, è ovvio che se il documento è cessato posso riusare gli stessi, idem se la particella in qiestione è cessata.

    Per Osvaldo, biongiorno anche a te, mettere un indice multicampo univo non mi permetterebbe in nessun caso di inserire i dati. Non terrebbe conto dei criteri della query.

    Buona giornata
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Ma ti rendi conto di quello che hai scritto qui:
    
        If "[IDCOMUNE] =" & Me.IDCOMUNE And "[sezione] =" & Me.SEZIONE And "[foglio] =" & Me.FOGLIO And "[particella] =" & Me.PARTICELLA Then
    
    questa "[IDCOMUNE] =" è una stringa e non l' [IDCOMUNE] che forse vorresti prendere dalla query Q_DocTerritoriali per confrontarlo.
    Inoltre dovresti far vedere il predicato della Q_DocTerritoriali.
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Stifone ha scritto:


    Ma ti rendi conto di quello che hai scritto qui:
    
        If "[IDCOMUNE] =" & Me.IDCOMUNE And "[sezione] =" & Me.SEZIONE And "[foglio] =" & Me.FOGLIO And "[particella] =" & Me.PARTICELLA Then
    
    questa "[IDCOMUNE] =" è una stringa e non l' [IDCOMUNE] che forse vorresti prendere dalla query Q_DocTerritoriali per confrontarlo.
    Inoltre dovresti far vedere il predicato della Q_DocTerritoriali.
    Ciao Stifone, no ... non me ne ero reso conto (anche se in teoria avrei dovuto).

    Questo tipo di righe le uso infatti per collegare due maschere (ovviamente metto in correlazione solo un campo ). Quindi, ti ringrazio per avermelo fatto ricordare

    Comunque, chiedo scusa per gli errori di sintassi ma le mie basi di Access si rifanno ad un semplice corso Eipass. Attualmente, sto cercando di approfondire il tema di Access e di VB tramite libri e manuali, ma purtroppo a volte non è sempre chiaro.

    Qui sotto, metto il predicato SQL della query:
    SELECT tblCOMODATI.IDCOMODATO, tblCOMODATI.IDCOMODATARIO, tblCOMODATI.IDPROPRIETARIO, tblCOMODATI.IDDECEDUTO, tblCOMODATI.IDEREDE, tblCOMODATI.DATASTIPULA, tblCOMODATI.DATAINIZIO, tblCOMODATI.DATAFINE, tblCOMODATI.SENZADURATA, tblCOMODATI.IDTIPOCOMODATO, tblCOMODATI.CFProprietario, tblCOMODATI.CFComodatario, tblCOMODATI.RAPP, tblCOMODATI.CESSAZIONE, tblCOMODATI.DATACESSAZIONE, tblTERRENI.IDTERRENO, tblTERRENI.IDCOMUNE, tblTERRENI.SEZIONE, tblTERRENI.FOGLIO, tblTERRENI.PARTICELLA, tblTERRENI.[SUPERFICIECATASTALE(HA)], tblTERRENI.[SUPERFICIEUTILIZZATA(HA)], tblTERRENI.CESSAZIONE, tblTERRENI.FRAZIONAMENTO, tblTERRENI.DATACESSAZIONE, tblTERRENI.DATAFRAZIONAMENTO
    FROM tblTIPOCOMODATO INNER JOIN (tblCOMUNI INNER JOIN (tblCOMODATI INNER JOIN tblTERRENI ON tblCOMODATI.IDCOMODATO = tblTERRENI.IDCOMODATO) ON tblCOMUNI.IDCOMUNE = tblTERRENI.IDCOMUNE) ON tblTIPOCOMODATO.IDTC = tblCOMODATI.IDTIPOCOMODATO
    WHERE (((tblCOMODATI.IDTIPOCOMODATO) Like 1 Or (tblCOMODATI.IDTIPOCOMODATO)=2 Or (tblCOMODATI.IDTIPOCOMODATO)=3) AND ((tblCOMODATI.CESSAZIONE)=False) AND ((tblCOMODATI.DATACESSAZIONE) Is Null) AND ((tblTERRENI.CESSAZIONE)=False) AND ((tblTERRENI.DATACESSAZIONE) Is Null));
    
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Buongiorno Guanno
    Volevo dire Gianni
  • Re: EVITARE DATI DUPLICATI SU CONDIZIONE

    Gianni55 ha scritto:


    I criteri li dovresti passare alla query e successivamente contare i record.
    Buongiorno Guanno, Si ho già impostato alcuni criteri nella query.
    non ho detto alcuni ma tutti facendo riferimento alla maschera:
    If "[IDCOMUNE] =" & Me.IDCOMUNE And "[sezione] =" & Me.SEZIONE And "[foglio] =" & Me.FOGLIO And "[particella] =" & Me.PARTICELLA
    Quindi nella query sotto idComune nel criterio >Forms!TuaMaschera!TuoControlloIdComune così per tutti gli altri.
    in vis struttura della query salvi la query quidi Esegui,avendo l'accortezza di aprire la Form sul record voluto,e vedere quanti record ti rende una volta verificato il tuo codice diventa:
    If DCount("*", "Q_DocTerritoriali") > 0 Then
            MsgBox "Terreno già presente a sistema!!!"
        Else
        Me.SUPERFICIEUTILIZZATA_HA_ = DSum(Me.SUUPERFICIECATASTALE_HA_ - [Q_DocTerritoriali]![Superficieutilizzata_(ha)], "Q_DocTerritoriali")
        End If
    Saluti
    Gianni
    P.S. Sono orribili quei nomi campo tutto maiuscolo e chilometrici.
Devi accedere o registrarti per scrivere nel forum
7 risposte