Evitare errori Null in sincronizzazione tabelle

di il
7 risposte

Evitare errori Null in sincronizzazione tabelle

Ciao a tutti.
Mi trovo a dover riversare dati da alcune tabelle di un mio DB in tabelle analoghe di un altro DB (non mio)
Parlo di tabelle "analoghe" in quanto, sebbene di base i due DB richiedano gli stessi dati, tuttavia io tratto i miei in modo diverso; ad es. io uso il campo Denominazione, l'altro il campo Ditta, per me l'indirizzo usa 3 campi (Citta, Indirizzo, CAP - in tal modo posso effettuare ricerche specifiche), l'altro un campo unico Indirizzo, e così via.

Pensavo di aver risolto in VBA in questo modo:

'RIVERSO TUTTI I FORNITORI
Dim Rst As DAO.Recordset
Dim Totale As Integer

Totale = 0

Set Rst = CurrentDb.OpenRecordset("SELECT * FROM tblFornitori")

With Rst
    .MoveLast
    .MoveFirst
    Do Until .EOF
        Debug.Print !IDFornitori
        DBEngine(0)(0).Execute ("INSERT INTO Fornitori ([N°],[Fornitore],[Indirizzo],[Telefono e fax],[Fax],[e-mail e WEB],[Campo di attività]) VALUES (" & _
                                !IDFornitori & ",'" & !Denominazione & "','" & !Sede & " - " & Replace(!Indirizzo, "'", " ") & " - " & !CAP & "','" & !Tel1 & "','" & !Fax & "','" & !Website & " - " & !MailDitta & "','" & !Campo & "');"), dbFailOnError
        Totale = Totale + 1
        .MoveNext
    Loop
End With

Rst.Close
Set Rst = Nothing

MsgBox "FINITO" & vbNewLine & "Inseriti " & Totale & " records", vbOKOnly + vbCritical, "Fine inserimento"

Funziona, i dati vengono riversati nella tabella bersaglio, trane nel caso in cui io abbia qualche campo nullo (vuoi perchè non possiedo il dato, vuoi perchè in quel caso non mi interessa.
Avrei pensato ad un ResumeNext, ed in effetti tutto è stato riversato, apparentemente senza saltare nessun dato.

E' il modo giusto di evitare l'errore, o potrei rischiare perdite di dati o simili? Se non è il modo giusto, in che modo gestire la cosa?

Grazie
Andrea

7 Risposte

  • Re: Evitare errori Null in sincronizzazione tabelle

    MI inizio a rispondere da solo, dopo aver controllato tutti i dati: su 88 record ne sono stati inseriti 77. Mancano quelli dove il mio campo indirizzi è null.....
    Quindi con il Resume Next salta a piè pari e passa al record seuccessivo, e perdo dati.....
    Riformulo quindi la domanda: Come la gestisco, visto che la mia soluzione non va assolutamente bene?

    Grazie
    Andrea
  • Re: Evitare errori Null in sincronizzazione tabelle

    Prima cosa non serve il MoveLast iniziale...
    Quando un valore è null va inserito NULL nella Query non valore null... sono cose diverse... e tu usi il valore di null.
    
    INSERT INTO T1 (Campo) Values (NULL)
    Tu avendo un valore null non valorizzi nella stringa il dato corretto.

    Tuttavia mi chiedo perchè lo fai 1 Record alla volta...?
  • Re: Evitare errori Null in sincronizzazione tabelle

    Circa il MoveLast iniziale: a volte quando uso i recordset e mi aspetto X records, me ne ritrovo sempre e solo 1. Da qualche parte tempo fa avevo letto che bisognava fargli "scorrere" il recordset andando in fondo (movelast) e poi ritornando su (movefirst). Non sapendo se e quando fosse opportuno utilizzarlo, ho preso il vizio di farlo ogni volta, almeno sono sicuro di ritrovarmi il recordset come lo ho creato.

    Circa il valore NULL: il valore non è sempre NULL, infatti nel 90% dei casi il campo è popolato

    Circa 1 record alla volta: So che con un SELECT...INTO passerei tutti i record da una tabella all'altra, ma i campi delle due tabelle hanno nomi diversi, oltre al fatto che devo combinare alcuni campi miei per ottenere il campo unico richiesto nell'altra tabella, e l'unico modo che mi viene in mente è quello che ho usato, un record per volta
  • Re: Evitare errori Null in sincronizzazione tabelle

    Ragiona sempre prima...

    Sul Null è ovvio, devi prevedere che incasso di valore null scriva NULL.

    Per il movelast serve solo se vuoi leggere la proprietà Recordcount corretta, cosa che non fai... quindi non serve.

    Per la query unica... le motivazioni che dai non sono affatto motivo inibente basta scrivere la query corretta con Alias e condizionamenti.
  • Re: Evitare errori Null in sincronizzazione tabelle

    @Alex ha scritto:


    Ragiona sempre prima...
    Sante parole..... soprattutto nel mio caso

    Sulla questione NULL ho imparato un'altra cosa.

    Sul movelast hai perfettamente ragione (vabbe, lo do per scontato), in effetti facendo mente locale la problematica ce l'ho ogni volta che ho bisogno di contare i record del recordset.....

    Circa la query corretta, sto......studiando un pò come utilizzare gli alias (almeno meglio di come li uso di solito) e soprattutto i condizionamenti.

    Quando (se) risolvo faccio sapere

    Grazie per le imbeccate

    Andrea
  • Re: Evitare errori Null in sincronizzazione tabelle

    Innanzitutto: Grazie!

    Dopo un pò di....studio (l'ignoraza regna sovrana) ho risolto.

    Nel caso qualcun altro avesse lo stesso problema:
    
    sSQL = "INSERT INTO Fornitori ([N°],[Fornitore],[Indirizzo], [e-mail e WEB]) SELECT [IDFornitori] As [N°], [Denominazione] As [Fornitore], IIf([tblFornitori.Indirizzo] Is Null,Null, [Sede] & "" - "" & [tblFornitori.Indirizzo] & "" - "" & [CAP]) As [Indirizzo], IIf([MailDitta] Is Null,Null,[MailDitta] & "" - "" & [Website]) As [e-mail e WEB] FROM tblFornitori"
    
    Questa la stringa "tipo" che ho usato (mancano molti campi, ma la soluzione è la stessa)
    Il problema del campo [Indirizzo]: si trova sia nella mia tabella che in quella di destinazione; poichè risulterebbe un errore di "riferimento circolare" (cioè sto usando come alias un nome di un campo), bisogna specificare la tabella di origine (quindi [tblFornitori.Indirizzo] e non solo [Indirizzo])
    Il problema dei campi miei null: l'ho risolto con l'IIf
    In tutto il resto, occhio ai doppi apici......

    Spero sia questa la risposta cui dovevo arrivare.

    Andrea
  • Re: Evitare errori Null in sincronizzazione tabelle

    Ovviamente si, ottimo.
Devi accedere o registrarti per scrivere nel forum
7 risposte