Dubbio su codice ricerca duplicati

di il
7 risposte

Dubbio su codice ricerca duplicati

Ciao a tutti.
Ho una richiesta particolare su cui arrivo fino ad un certo punto.

Ho una tabella access su cui sono presenti 17.000 righe, attività su base mensile.
Questa tabella non ha una chiave primaria o meglio ne ha una ma che non rende il record univoco.
Questa tabella contiene al suo interno molti campi ma quelli che servono a me per il mio lavoro sono questi:
CF, PIVA, DUNS e PRID (sono tutti codici identificativi)

Purtroppo alcuni di questi record possono contenere questi campi e quindi duplicare il valore e io tramite dei ragionamenti interni devo poi determinare in quale record cancellare il valore duplicato.

Il codice che avevo applicato era il seguente e prevedeva di copiare il contenuto della tabella madre su una tabella fake dove far solo girare il loop di controllo...ma alcune volte funziona e altre volte no. Già qui mi servirebbe capire come mai.
Ovviamente in questo modo avrò un duplicato fisso ogni volta (stesso record) che ho risolto ma comunque gira male. Avete suggerimenti?
In caso di dubbi, chiedete pure e vi risponderò

Private Sub Command0_Click()

'===============================gestione eccezioni (to do)==================================
'capire come gestire i dummy duns e i campi vuoti
'se il record ha tutti i campi blank deve andare nella tabella gestione eccezioni
'se il record ha dei campi compilati (univoci) e altri blank deve andare nel file invio
'se il record ha dei campi compilati (univoci) e ha il dummy duns deve andare nel file invio con il duns sbiancato
'se il record ha uno dei campi compilati (univoco) e altri uguali ad altri record (eccezione o cosa???)
'se duplicati per piva ma hanno altri codici diversi, cancello il campo duplicato

'============================================================================================


'================================dichiarazione variabili tabelle============================
Dim DBCorrente As DAO.Database
Dim Tabella_Origine As DAO.Recordset
Dim Tabella_Invio As DAO.Recordset
Dim Tabella_Eccezione As DAO.Recordset
Dim Tabella_Supporto As DAO.Recordset
'===========================================================================================

'===============================dichiarazioni variabili supporto============================
Dim v_piva As String 'campo piva da verificare
Dim v_cf As String 'campo cf da verifica
Dim v_duns As String 'campo duns da verificare
Dim v_cesid As String 'campo cesid da verificare
Dim v_bp As String 'campo bp da verificare
Dim duplicato As Integer 'campo di controllo di duplicati di valori
Dim duplicatobp As Integer 'campo di controllo di duplicati bp
'===========================================================================================


'===================================setting delle tabelle===================================
Set DBCorrente = CurrentDb
Set Tabella_Origine = DBCorrente.OpenRecordset("T_ORIGINE")
Set Tabella_Invio = DBCorrente.OpenRecordset("T_INVIO")
Set Tabella_Eccezione = DBCorrente.OpenRecordset("T_ECCEZIONE")
Set Tabella_Supporto = DBCorrente.OpenRecordset("T_SUPPORTO")
'===========================================================================================

'======================================campi tabelle========================================
'|BPO  --> codice anagrafica kaleydos
'|PIVA --> piva anagrafica
'|CF --> cf anagrafica
'|DUNS --> duns anagrafica
'|CESID --> cesid anagrafica
'============================================================================================


Tabella_Origine.MoveFirst

Do While Tabella_Origine.EOF = False
    
    duplicato = 2 'associo alla variabile duplicato valori 0,questo ad ogni inizio ciclo della tabella origine
    duplicatobp = 0 'associo alla variabile duplicato bp 0,questo ad ogni inizio ciclo della tabella origine
    Tabella_Supporto.MoveFirst 'mi posiziono alla prima riga della tabella di supporto
    If IsNull(Tabella_Origine.Fields("PIVA")) Then
        v_piva = " "
        Else
            v_piva = Tabella_Origine.Fields("PIVA") 'associo al campo v_piva il valore piva corrente della tabella origine
    End If
    
    If IsNull(Tabella_Origine.Fields("CF")) Then
        v_cf = " "
        Else
            v_cf = Tabella_Origine.Fields("CF") 'associo al campo v_cf il valore cf corrente della tabella origine
    End If
    
    If IsNull(Tabella_Origine.Fields("DUNS")) Then
        v_duns = " "
        Else
            v_duns = Tabella_Origine.Fields("DUNS") 'associo al campo v_duns il valore duns corrente della tabella origine
    End If
    
    If IsNull(Tabella_Origine.Fields("CESID")) Then
        v_cesid = " "
        Else
            v_cesid = Tabella_Origine.Fields("CESID") 'associo al campo v_cesid il valore cesid corrente della tabella origine
    End If
    
    v_bp = Tabella_Origine.Fields("BPO") 'associo al campo v_bp il valore bp corrente della tabella origine
    
    'ciclo che termina quando la tabella origine è arrivata alla fine
    Do While Tabella_Supporto.EOF = False
        If Tabella_Supporto.Fields("BPO") = v_bp Then
            duplicatobp = 1
            ElseIf Tabella_Supporto.Fields("BPO") <> v_bp And v_piva <> Tabella_Supporto.Fields("PIVA") And v_cf <> Tabella_Supporto.Fields("CF") And v_duns <> Tabella_Supporto.Fields("DUNS") And v_cesid <> Tabella_Supporto.Fields("CESID") Then
                duplicato = 0
            ElseIf Tabella_Supporto.Fields("BPO") <> v_bp And v_piva = Tabella_Supporto.Fields("PIVA") Or v_cf = Tabella_Supporto.Fields("CF") Or v_duns = Tabella_Supporto.Fields("DUNS") Or v_cesid = Tabella_Supporto.Fields("CESID") Then
                duplicato = 1
        End If
        Tabella_Supporto.MoveNext
    Loop
    If duplicato = 0 Then
        Tabella_Invio.AddNew
        Tabella_Invio.Fields("BPO") = v_bp
        Tabella_Invio.Fields("PIVA") = v_piva
        Tabella_Invio.Fields("CF") = v_cf
        Tabella_Invio.Fields("DUNS") = v_duns
        Tabella_Invio.Fields("CESID") = v_cesid
        Tabella_Invio.Update
    End If
    If duplicato = 1 Then
        Tabella_Eccezione.AddNew
        Tabella_Eccezione.Fields("BPO") = v_bp
        Tabella_Eccezione.Fields("PIVA") = v_piva
        Tabella_Eccezione.Fields("CF") = v_cf
        Tabella_Eccezione.Fields("DUNS") = v_duns
        Tabella_Eccezione.Fields("CESID") = v_cesid
        Tabella_Eccezione.Update
    End If
    Tabella_Origine.MoveNext
Loop
Tabella_Origine.Close
Tabella_Invio.Close
Tabella_Supporto.Close
Tabella_Eccezione.Close
End Sub

7 Risposte

  • Re: Dubbio su codice ricerca duplicati

    Scusa ma la comprensione del problema è difficile, ed il codice senza TAG per il codice, non comprensibile...
    L'unica cosa chem i viene da chiedere... è, se gestisci un LOOP di ANALISI dei(17000) RECORDS non fai prima ad aggiungere un Campo alla Tabella e definire la Caratteristica del Record, che sarebbe poi quella che ora vorresti usare per DIVIDERLI in Tabelle diverse..., cosa inutile.
  • Re: Dubbio su codice ricerca duplicati

    Ho editato mettendo il code
    In che senso la caratteristica? La caratteristica la scopro post controllo dei record, non la conosco prima...
  • Re: Dubbio su codice ricerca duplicati

    spa856 ha scritto:


    Ho editato mettendo il code
    Molto bene.

    spa856 ha scritto:


    In che senso la caratteristica? La caratteristica la scopro post controllo dei record, non la conosco prima...
    Appunto... se la tua Tabella avesse un Campo aggiuntivo [Tipo]... in fase di Elaborazione sei in grado di determinare per ogni Singolo RECORD, il Tipo in base alla definzione che ne hai dato in calce..., a quel punto il Recordset è aperto, e vai in EDIT sul campo [Tipo] attribuendo un Valore Numerico o Alfabetico(Parlante) in base alla tua logica.
    Se poi vorrai trattare i dati per Tipo, ti basterà Filtrarli mantenendo l'origine sempre uguale... e non cambiare Tabella...
    Questo è anche il modo per usare un Database, altrimenti un foglio di Excel sarebbe meglio.
  • Re: Dubbio su codice ricerca duplicati

    Ok, ti posso garantire che non è possibile farlo in questo modo per motivi complicati da spiegare tramite forum.
    Basandosi sul codice da me allegato, riesci a capire quale può essere l'errore?
    Scusa se son molto diretto, non voglio farti/vi perdere tempo.
  • Re: Dubbio su codice ricerca duplicati

    Fai DEBUG passo passo e vedi cosa non funziona, risulta IMPOSSIBILE ad occhio trovare il BUG esplicito senza fare DEBUG in relatime, ammesso sia solo 1...
    Ad esempio, tu dici che in caso di Campi Blank fai una certa cosa... giusto...?
    Cosa poi tu intendi per Blank potrebbe essere un primo grosso problema, non per te ma per il tuo metodo...
    Tu controlli i campi confrontando con " " che è uno SPACE, dal punto di vista informatico non ha un senso questa cosa... un campo può essere anche NULL o NULLSTRING, e non soddisferebbe MAI il tuo test, almeno secondo la mia idea di Validazione del campo Vuoto/Nullo/Non Valorizzato/Valorizzato Male(appunto con lo spazio).
  • Re: Dubbio su codice ricerca duplicati

    1. Hai provato innanzitutto a sostituire tutti i Null con un valore significativo (es. "0")? Capisco si tratta di una operazione rognosa, da farsi anche manualmente, ma spesso io risolvo così.
    2. Conseguenza del punto 1. diventa più facile "estrapolare" i record duplicati e anche impedire che ne vengano creati altri se imposti un "valore predefinito (significativo)".
    3. Imposta un "Indice Multicampo Univoco" per impedire l'inserimento di valori duplicati.

    Non sto dando soluzioni esaustive, solo qualche suggerimento qua e là...poi sfuggono anche a me vari particolari...
  • Re: Dubbio su codice ricerca duplicati

    Non posso impedire duplicati, perchè le anagrafiche arrivano anche da aziende estere e quindi sovente sbagliano con i dati.
    Il lavoro serve appunto per fare data quality su base mensile e trovare per ogni singolo record il corrispondente record con almeno uno dei 4 campi duplicati...esempio

    Record 1
    CF 1
    PIVA 1
    DUNS 1
    PRID 1

    Record 2
    CF 2
    PIVA 2
    DUNS 2
    PRID 2

    Record 3
    CF 1
    PIVA 3
    DUNS 3
    PRID 3

    Il mio codice cerca di fare questo:

    Il record 2, che non ha nessun campo duplicato, viene spostato su una tabella che si chiama INVIO in quanto si può inviare come data quality
    Il record 1 e 3 invece hanno il CF uguale e io devo fare in modo che questo campo venga sbiancato su entrambe le anagrafiche e lasciati compilati solo gli altri...inoltre, capita che alcuni record possano avere alcuni valori vuoti...ad esempio una società tedesca non ha il CF perchè il CF è solo un dato italiano...spero di aver chiarito la problematica.
Devi accedere o registrarti per scrivere nel forum
7 risposte