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