Condividi tramite

Accodare da file excel, cancellare e sovrascrivere

Anonimo
2017-12-18T14:07:58+00:00

Ciao

sto tentando di creare una procedura che mi accodi dei dati da file excel in access.

La procedura consiste nel prendere il file excel che interessa e accodare i dati.

I dati vengono accodati prima in una tabella temporanea (li faccio partire una query che mi controlla se ci sono duplicati) poi se tutto è ok (con una query di accodamento) in quella principale.

Devo prevedere delle casistiche:

  • eventualità che nel file excel ci siano dati uguali gia presenti in access e quindi di non accodare un duplicato con un messaggio di avviso
  • eventualità che accodi un file excel (n. 1) con dei dati e in un secondo momento accodo altro file excel (n.2) con gli stessi dati ma con qualche aggiunta e quindi la scelta di abbandonare l’accodamento oppure sovrascrivere tutto. Nel caso della sovrascrizione devo cancellare sia nella tabella principale che nella temporanea l’ accodamento del penultimo file (n.1)  e accodare i dati dell’ultimo file (n.2 quello con le aggiunte)

Nel caso della sovrascrizione mi sono incartato e non riesco a venirne fuori, non  trovo il modo di dirgli di cancellare solo gli ultimi inseriti e reinserire quelli nuovi

Private Sub btnBrowse_Click()

Dim diag As Office.FileDialog

Dim item As Variant

Set diag = Application.FileDialog(msoFileDialogFilePicker)

diag.AllowMultiSelect = False

diag.Title = "Per favore seleziona un file Excel"

diag.Filters.Clear

diag.Filters.Add "Excel SpreadSheets", "*.xls, *.xlsx"

Dim palla As String

Dim mydb As Database

Dim myrs As DAO.Recordset

Set mydb = CurrentDb

If diag.Show Then

If MsgBox("Conferma che vuoi inserite i dati", vbYesNo) = vbYes Then

For Each item In diag.SelectedItems

Me.txtFileName = item

Call DoCmd.TransferSpreadsheet(acImport, acSpreadsheetTypeExcel8, "TempFromExcel", item, True)

palla = "SELECT NumDuplicati as Duplicato from qryTempFromExcel;"

Set myrs = mydb.OpenRecordset(palla)

If myrs.EOF = False Then

Duplicato = myrs!Duplicato

End If

myrs.Close

Set myrs = Nothing

Set mydb = Nothing

If Duplicato > 1 Then

If MsgBox("Attenzione alcuni dati che stai inserendo sono già presenti. Vuoi sovrascivere ?", vbYesNo) = vbNo Then

Exit Sub

‘qui dovrei inserire l’istruzione della sovrascrizione e cancellazione’

Else: DoCmd.OpenQuery " qryAccodaletture", acViewNormal

MsgBox "I dati sono stati inseriti con successo", vbonlyOk, "Avviso"

End If

End If

Next

Exit Sub

End If

End If

End Sub

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-12-18T21:05:43+00:00

ciao Francesco,

credo che così' sia impossibile darti indicazioni.

Quali sono questi motivi tecnici? il collegamento è il modo nativo di procedere.

Ipotizzo uno scenario visto il tuo ermetismo.

file xls clienti :

file xls clienti2 con due righe in più, notare le ultime due righe:

tabella di access preposta all'accoglimento dei dati da XlS:

con uno di questi due predicati popoli la tabella con i soli dati mancanti nel file di xls di riferimento,

io prediligerei la prima ( ho ristretto il popolamento a due soli campi):

INSERT INTO

         ClientiXLS ( idcliente, NomeSocietà )

SELECT

         clienti.IDCliente, clienti.NomeSocietà

FROM

        [Excel 12.0 Xml;Database=C:\Users\sandr\Desktop\clienti.xlsx].clienti

LEFT JOIN

       ClientiXLS AS C

ON

     c.idcliente=clienti.idcliente

WHERE

       c.idcliente is null;


INSERT INTO

          ClientiXLS ( IDCliente, NomeSocietà )

SELECT

           clienti.IDCliente, clienti.NomeSocietà

FROM

          [Excel 12.0 Xml;Database=C:\Users\sandr\Desktop\clienti.xlsx].clienti

WHERE

         not Exists 

            (SELECT

                     c.IDCliente

            from

                    ClientiXLS as C

           where

                     c.idcliente=clienti.idcliente);


ovviamente da te personalizza il path, nome di tabelle e campi.

se infatti risolvi la query sul file xls clienti ottieni :

se poi lanci la seconda sul file cliente2 :

accodando solamente le due righe non esistenti

ottenendo il conseguente popolamento della tabella :

11 righe scritte complessivamente.

se riesegui una delle due query ottieni :

perché tutte le righe sono già esistenti.

Non credo servano tabella di appoggio o particolari come la conta di records o altri artifizi.

Questo significa che devi creare n query tante quante sono i file di xls in modo dinamico in un loop.

Vedi ora se riesci ad adattare quanto consigliato nel tuo scenario, e per le prossime volte, cerca di fornire dettagli che possano mettere in condizione chi ti vuole aiutare di aiutarti altrimenti i tuoi post rimangono irrisolti.

Resta il fatto che il collegamento è la scelta migliore.

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-12-19T10:11:15+00:00

    Ciao

    hai ragione non sono stato molto preciso ed alla fine ho seguito il tuo consiglio e ho fatto il collegamento. Le tue dritte mi sono molto utili. Grazie infinite

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-12-18T14:48:41+00:00

    Per vari motivi non lo posso fare

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-12-18T14:31:37+00:00

    ciao Francy74,

    se il file di Excel è concepito con "simil regole relazionali" cioè è ricalcante una tabella di un database, perché non collegare il file anziché "ricopiare" i dati in Access?

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento