Funzione per eliminare record duplicati con campi vuoti.

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    31/10/2024 - ProfiloBasso ha scritto:


    Purtroppo le ipotesi o i consigli sulla base di intuizioni non mi possono aiutare e io ho necessità di fare i controlli a partire da questa tabella, qualsiasi altro suggerimento che non parta da questo punto fermo non mi serve.

    Se sono sceso su un forum è perchè ho già provato tutte le strade percorribili e ragionato su come risolvere questa cosa, ma l'unica soluzione è lavorare sulla tabella finale, in alternativa l'unica altra soluzione è distruggere l'intero MONSTRE database cresciuto negli anni a suon di necessità e richieste varie e rifare tutto da zero.

    Dato che rifare tutto da zero è una soluzione non percorribile, devo per forza lavorare sulla tabella finale.

    Ripeto, a me basta che qualcuno risolva come nella settimana enigmistica il mio primo quesito della tabella standard con 10 campi.

    Se qualcuno mi fa vedere come si fa, io prenderò la logica e la adatterò al mio caso specifico.

    Access e tutti i database si basano su precise regole di progettazione che tutte insieme prendono il nome di NORMALIZZAZIONE. Gli utenti esperti e non sanno (o dovrebbero sapere) che si affronta il forum secondo il regolamento che impone una conoscenza base dell'applicazione. Ogni altra forma di voler aggirare gli ostacoli entrerebbe in conflitto con i principi e lo spirito del forum per cui esiste.
    ProfiloBasso ti consiglio vivamente di ripensare tutto il tuo progetto in via normalizzata, perché percorrendo la strada che hai intrapreso continuerai “all'infinito” a pretendere da Access cose sempre più complicate, forzando e affaticando il database stesso.

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    31/10/2024 - ProfiloBasso ha scritto:


    Se i dati fino al campo5 sono identici in entrambi i record e dal campo6 al campo10 trovo record identici ma alcuni vuoti, allora il record con campi vuoti deve essere eliminato, perchè terrò il record identico ma con più informazioni.

    ecco il dato mancante…

    come disse colombo (Peter Falk) ascoltando una registrazione: “cercavo un suono che non doveva esserci e invece dovevo cercare un suono che doveva esserci”

    una sp dove oltrer alla base (mytest) aggiungi 1 per ogni campo popolato successivo zero se null

    il valore massimo che ottieni a parità della base mytest e' il record con meno campi null.

    la butto lì

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    31/10/2024 - ProfiloBasso ha scritto:


    allora terrò sempre e comunque il record con più campi compilati, ovvero il secondo.

    Ma se due record sono uguali per A,B,C,D ed E: il primo ha valorizzati F e G. Il secondo ha valorizzati I ed L. Quale tieni?

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    31/10/2024 - Sgrubak ha scritto:


    31/10/2024 - ProfiloBasso ha scritto:


    allora terrò sempre e comunque il record con più campi compilati, ovvero il secondo.

    Ma se due record sono uguali per A,B,C,D ed E: il primo ha valorizzati F e G. Il secondo ha valorizzati I ed L. Quale tieni?

    Giusta domanda.

    Questa combinazione non potrà mai capitare e non sto a spiegare il perchè, perchè vorrebbe dire entrare nel merito di troppe logiche.

    Il dato certo è che a parità di dati identici nei campi da 1 a 5, sicuramente uno dei due record ha più campi compilati dell'altro nei restanti campi da 6 a 10.

    L'ipotesi di due campi F e G e I e L non si potrà mai verifciare. 

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    Continuo a non capire una cosa. Stai procedendo in una direzione che andrebbe bene per un foglio di calcolo tipo excel. Perché operare con Access?

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    @ProfiloBasso, come avrai abbondantemente capito, tutti i tuoi problemi sono dovuti al ‘genio’ che ha optato per la classica ‘soluzione veloce fai da te’ abbondantemente SBAGLIATA.

    Ora, se non e' possibile aggiustare una cosa sbagliata, ma si vogliono solo mettere delle pezze, va da se che quella pezza NON RISOLVE NULLA ma tappa solo un buco e, molto probabilmente ne sta creando un'altro da qualche altra parte.

    Comunque, la soluzione del tuo problema e' SEMPLICE!

    Poiche Access e' un “Relational Database Management System”, dove la parola magggica e' "Relational" (Relazionale) e quindi SEGUE LA LOGICA del Modello RELAZIONALE dei Dati,

    MA IL TUO modello dei dati, al di la della struttura “tabellare” (righe e colonne) NON E' relazionale, 

    va da se che dovrai IMPLEMENTARTI A MANO, le operazioni che ti servono.

    Il concetto di “record duplicati con campi vuoti” nel “Modello Relazionale dei Dati” NON ESISTE, non c'e', non ce sta', nema, niet!

    E' un po' come voler usare il gasolio in una macchina a benzina: perche' non dovrebbe funzionare? Sono tutti e due carburanti che si usano sui mezzi di trasporto, liquidi e si acquistano tutti e due al distributore di carburante. DEVE funzionare! Anche no!

    Nel Modello Relazionale dei Dati, Codd insegna (Edgard F. “Ted” Codd e' colui che lo ha inventato), due record sono duplicati quando “HANNO LO STESSO SPIACCICATO IDENTICO VALORE SU TUTTI I CAMPI”.

    E poiche' tale concetto NON ESISTE, NON ESISTONO “operatori RELAZIONALI” per trovare “record duplicati con campi vuoti”. 

    Al che, come avrai abbondantemente capito, ti tocchera' andare di “olio di gomito”, anzi, di olio alle giunture delle dita, perche' dovrai scrivere quantita' non indifferenti di codice.

    .

    Ma tu penserai: vabbe, dovro scrivere codice.

    EBBENE, NO, perche' non ci sara' solo da scrivere codice banalotto, MA SERVIRA' MOLTO DI PIU'!

    E mo! te lo spiego: SENZA I SERVIZI di indicizzazione, controllo consistenza dei dati offerti dal Modello Relazionale dei Dati, da quanto capisco, tu hai diversi record, chiamiamoli “pseudo duplicati”, e li devi rimuovere tutti.

    Ok, la tua tabella e' composta da, arrotondiamo, 50000 record. Dovrai confrontare ogni record con tutti gli altri. Totale

    >>> duecento_cinquanta MILIONI di confronti

    (vabbe, sono SOLO cento_venticinque MILIONI ;-) )

    Vabbe, lo fai una volta evvvia.

    Naaaa…. e quando aggiugerai nuovi record?

    Diciamo che non sei “bischero” e non inserirai un sacco di record per dopo riconfrontarli tutti tra loro di nuovo, MA, farai i controlli un record alla volta subito prima o dopo il suo inserimento.

    Ok, vuol dire che ogni volta dovrai fare, 50000, 50001, 50002, 50003 … 60000 … 100000 controlli SOLO per assicurarti di non avere record “pseudo duplicati”.

    NB: eccolo qui il buco appena aperto con la toppa di cui sopra ;-)

    Si puo' farei meglio? Ovviamente si, MA NON A GRATISSSE. 

    Servono strutture dati dedicate, tecniche di programmazione, insomma, CONOSCENZA, acquisita  in TANTI ANNI e con TANTI SOLDI.

    OPPURE … rullo di tamburi … optare per la soluzione che non vuoi applicare ;-)

    .

    In realta' ci sono soluzioni alternative: cambiare azienda, cambiare mestiere, trovare l'amante giovane e scappare all'estero dove non c'e' estradizione (se no la moglie ti piglia e ti 'sradica' ;-) ), andare in pensione ;-)

    Nota: il tu sistema ha UN SACCO di rogne! 

    60 campi? NON SI FA

    troppe logiche? NON SI FA

    chissà che altro. 

    Il problema e che piu' vai avanti, piu' le scelte sbagliate si faranno sentire complicandoti la vita. 

    E NO, NON ESISTE una ‘soluzione semplice basta che funzioni’.

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    01/11/2024 - migliorabile ha scritto:


    @ProfiloBasso, come avrai abbondantemente capito, tutti i tuoi problemi sono dovuti al ‘genio’ che ha optato per la classica ‘soluzione veloce fai da te’ abbondantemente SBAGLIATA.

    Ora, se non e' possibile aggiustare una cosa sbagliata, ma si vogliono solo mettere delle pezze, va da se che quella pezza NON RISOLVE NULLA ma tappa solo un buco e, molto probabilmente ne sta creando un'altro da qualche altra parte.

    Comunque, la soluzione del tuo problema e' SEMPLICE!

    Poiche Access e' un “Relational Database Management System”, dove la parola magggica e' "Relational" (Relazionale) e quindi SEGUE LA LOGICA del Modello RELAZIONALE dei Dati,

    MA IL TUO modello dei dati, al di la della struttura “tabellare” (righe e colonne) NON E' relazionale, 

    va da se che dovrai IMPLEMENTARTI A MANO, le operazioni che ti servono.

    Il concetto di “record duplicati con campi vuoti” nel “Modello Relazionale dei Dati” NON ESISTE, non c'e', non ce sta', nema, niet!

    E' un po' come voler usare il gasolio in una macchina a benzina: perche' non dovrebbe funzionare? Sono tutti e due carburanti che si usano sui mezzi di trasporto, liquidi e si acquistano tutti e due al distributore di carburante. DEVE funzionare! Anche no!

    Nel Modello Relazionale dei Dati, Codd insegna (Edgard F. “Ted” Codd e' colui che lo ha inventato), due record sono duplicati quando “HANNO LO STESSO SPIACCICATO IDENTICO VALORE SU TUTTI I CAMPI”.

    E poiche' tale concetto NON ESISTE, NON ESISTONO “operatori RELAZIONALI” per trovare “record duplicati con campi vuoti”. 

    Al che, come avrai abbondantemente capito, ti tocchera' andare di “olio di gomito”, anzi, di olio alle giunture delle dita, perche' dovrai scrivere quantita' non indifferenti di codice.

    .

    Ma tu penserai: vabbe, dovro scrivere codice.

    EBBENE, NO, perche' non ci sara' solo da scrivere codice banalotto, MA SERVIRA' MOLTO DI PIU'!

    E mo! te lo spiego: SENZA I SERVIZI di indicizzazione, controllo consistenza dei dati offerti dal Modello Relazionale dei Dati, da quanto capisco, tu hai diversi record, chiamiamoli “pseudo duplicati”, e li devi rimuovere tutti.

    Ok, la tua tabella e' composta da, arrotondiamo, 50000 record. Dovrai confrontare ogni record con tutti gli altri. Totale

    >>> duecento_cinquanta MILIONI di confronti

    (vabbe, sono SOLO cento_venticinque MILIONI ;-) )

    Vabbe, lo fai una volta evvvia.

    Naaaa…. e quando aggiugerai nuovi record?

    Diciamo che non sei “bischero” e non inserirai un sacco di record per dopo riconfrontarli tutti tra loro di nuovo, MA, farai i controlli un record alla volta subito prima o dopo il suo inserimento.

    Ok, vuol dire che ogni volta dovrai fare, 50000, 50001, 50002, 50003 … 60000 … 100000 controlli SOLO per assicurarti di non avere record “pseudo duplicati”.

    NB: eccolo qui il buco appena aperto con la toppa di cui sopra ;-)

    Si puo' farei meglio? Ovviamente si, MA NON A GRATISSSE. 

    Servono strutture dati dedicate, tecniche di programmazione, insomma, CONOSCENZA, acquisita  in TANTI ANNI e con TANTI SOLDI.

    OPPURE … rullo di tamburi … optare per la soluzione che non vuoi applicare ;-)

    .

    In realta' ci sono soluzioni alternative: cambiare azienda, cambiare mestiere, trovare l'amante giovane e scappare all'estero dove non c'e' estradizione (se no la moglie ti piglia e ti 'sradica' ;-) ), andare in pensione ;-)

    Nota: il tu sistema ha UN SACCO di rogne! 

    60 campi? NON SI FA

    troppe logiche? NON SI FA

    chissà che altro. 

    Il problema e che piu' vai avanti, piu' le scelte sbagliate si faranno sentire complicandoti la vita. 

    E NO, NON ESISTE una ‘soluzione semplice basta che funzioni’.

    Grazie, farò tesoro di tutti i consigli, eventualmente potrei optare anche per una soluzione che non hai citato, vivere di rendita.

  • Re: Funzione per eliminare record duplicati con campi vuoti.

    31/10/2024 - sihsandrea ha scritto:


    31/10/2024 - ProfiloBasso ha scritto:


    Se i dati fino al campo5 sono identici in entrambi i record e dal campo6 al campo10 trovo record identici ma alcuni vuoti, allora il record con campi vuoti deve essere eliminato, perchè terrò il record identico ma con più informazioni.

    ecco il dato mancante…

    una sp dove oltrer alla base (mytest) aggiungi 1 per ogni campo popolato successivo zero se null

    il valore massimo che ottieni a parità della base mytest e' il record con meno campi null.

    Diciamo che dovendo scrivere una funzione questo sarebbe il punto dal quale partirei anche io … 

    Si potrebbe scrivere qualcosa del genere per un campo che contiene la ‘sommatoria’ dei campi significativi :

    Valore : iif(isnull([Campo6]);0;1) + iif(isnull([Campo7]);0;1) + iif(isnull([Campo8]);0;1) e così via (importante : utilizzare ; oppure , dipende da dove si scrive la query - QBE vs VBA)

    Poi si imporrebbe l'ordinamento crescente (ma andrebbe bene anche decrescente) sui primi 5 campi  e decrescente sul campo Valore in modo da ottenere sempre come primo record dei 2 aventi chiave doppia basata sui primi cinque campi il record con i campi più ‘riempiti’ …

    Poi si potrebbe procedere alla cancellazione del secondo record …

Devi accedere o registrarti per scrivere nel forum
22 risposte