Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    9

    [ACCESS] Importare dati da foglio excel a piu' tabelle access

    Ciao a tutti,
    ho un problema che mi assilla gia' da qualche giorno.


    Ho un file excel contenente alcuni dati di fatture ricevute. I campi sono:
    codice:
    data | fattura (numero fattura) | ditta | importo fattura | bolla (DDT) | data bolla | Note | data1 | data2 | data3 | data4 | data5 | data6 | importo1 | importo2 | importo3 | importo4 | importo5 | importo6 | pag1 | pag2 | pag3 | pag4 | pag5 | pag6

    Questo file lo devo importare in un nuovo DB Access che ha le seguenti Tabelle


    codice:
     
    tbl_aziende 
      |----ID (Auto increment)
      |----azienda (testo)
      |---- ecc...
    
    
    tbl_bolle
     |--- ID (Auto increment)
     |--- id_fattura (id da tbl_fatture)
     |--- data_bolla (datetime)
     |--- num_bolla (testo)
    
    
    tbl_pagamenti
     |--- id(Auto increment)
     |--- id_fattura
     |--- data (datetime)
     |--- importo (valuta)
     |--- has_pagato (bool)
    
    
    tbl_fatture
     |--- id 
     |--- id_azienda (id da tbl_aziende)
     |--- data_fattura
     |--- num_fattura
     |--- importo

    Quello che devo riuscire a fare e':
    importare ogni riga del file excel nelle varie tabelle del DB e mantenere ovviamente i riferimenti.
    I campi data[1-6], importo[1-6], pag[1-6] sono (se compilate) 6 righe diverse della tabella tbl_pagamenti che dovranno puntare alla stesso id_fattura.


    Voi direte: e che ci vuole.... ecco appunto: che ci vuole???


    Sono piu' pratico con PHP/MYSQL che con ACCESS/VBA quindi comprenderete che non mi e' proprio facile.


    Vi spiego cosa ho pensato:

    1. Prima faccio una query di accodamento alla tbl_aziende con un select distinct (Si, essendo un file excel il nome di una singola azienda e' presente piu' volte)
    2. poi con un ciclo, leggo ogni riga del file excel
    3. di ogni riga: eseguo un insert alla tbl_fatture dei campi corrispondenti
    4. eseguo un insert sulla tabella tbl_bolle dei campi corrispondenti
    5. con un nuovo ciclo, da ripetere 6 volte, controllo se i campi data, importo e pag sono diversi da null e in caso contrario faccio tanti insert in tbl_pagamenti quanti sono i campi compilati




    Ovviamente per gli ultimi 2 punti devo riuscire a scrivere in maniera corretta l'id_fattura corrispondente....


    E adesso vi spiego cosa ho fatto:
    codice:
    Public Sub ImportaDatiExcel()
     
    ' Dichiaro il Recordset e la variabile per la Query
    Dim ThisDB As DAO.Database
    Dim oRSet As DAO.Recordset
    Dim AziendaID As DAO.Recordset
    Dim AziendaSQL As String
    Dim SQL As String
    
    
     
    ' Assegno un nuovo Recordset
    Set ThisDB = CurrentDb
    Set oRSet = ThisDB.OpenRecordset("sdtab", dbOpenDynaset)
     
    ' Creo la query per reperire i dati sul foglio Excel
    'SQL = "SELECT * FROM sdtab"
    'oRSet.Open SQL, CurrentDb
     
     
     
    ' Mediante un ciclo, scorro tutto il Recordset
    ' compiendo una serie di INSERT sulla tabella
    ' di destinazione appena creata
    With oRSet
        While Not .EOF
            'AziendaSQL = "SELECT azienda.ID FROM Azienda WHERE azienda.rag_sociale = lube" ' & oRSet.Fields("Ditta")
            Set AziendaID = ThisDB.OpenRecordset("SELECT azienda.ID FROM Azienda WHERE azienda.ID = 1")
            
            'Dim Note As String
            'Note = FixQuote(oRSet.Fields("Note"))
            
            SQL = "INSERT INTO fatture ( Azienda, data_fattura, num_fattura, importo_fattura, note_fattura ) VALUES (" & _
                "'" & AziendaID.Fields("ID").Value & "', '" & _
                     oRSet.Fields("Data").Value & "', '" & _
                     oRSet.Fields("Fattura").Value & "', '" & _
                     oRSet.Fields("Importo Fattura").Value & "', '" & _
                     oRSet.Fields("Note").Value & "')"
               
                   
            CurrentProject.Connection.Execute SQL
            oRSet.MoveNext
        Wend
    End With
     
    ' Chiudo il Recordset e annullo l'oggetto
    oRSet.Close
    Set oRSet = Nothing
     
    End Sub

    Per semplificarmi il tutto, anziche lavorare direttamente sul file excel, ho importato il foglio che mi serviva in una tabella access e da quella faro' l'import.

    Sono fermo al primo insert e gia' vorrei prendere a martellate tutto quanto.


    A questo punto vi chiedo:
    1) cosa vedete di sbagliato nel codice che ho postato?
    2) come faccio a tenere traccia dell'id_fattura nei vari inserimenti?


    Si accettano suggerimenti.


    Grazie a tutti


    Se volete vedere il file excel di prova

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da X_Ch4n Visualizza il messaggio
    ........ poi con un ciclo, ................. con un nuovo ciclo, .........
    Io punterei a fare tutto con un solo ciclo
    Il vantaggio è che puoi "decidere in partenza gli Id autoincrementali da dare ai tuoi record e metterteli in opportune variabili di VBA

    Tu sai che con VBA puoi forzare il valore di un Id autoincrementale di Access ???
    quindi con un DMax(Id) +1 decidi gli Id e poi
    - li Forzi nelle Key primarie
    - li metti (sempre gli stessi) nelle Key Secondarie

    Per ogni riga di Excel (passo de ciclo) ti popoli una per una tutte le tabelle che ti servono


    Per forzare un Id autoincrementale io farei cosi:

    codice:
    DBEngine(0)(0).Execute ("INSERT INTO T1 (Id, c1, c2) SELECT 79, 'wer' as x1, 'yuo' AS x2;")
    Chiaramente quel 79 non puo gia essere utilizzato nella tabella

    attento ai problemi di concorrenza, mentre fai i tuoi INSERT devi essere sicuro che nessun altro utente ti inserisca (per sfiga) un altro record

  3. #3
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Ma non riesco a modificare il messaggio ????
    Ci sono dei problemi ortografici ........

    Comunque è comprensibile

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    9
    Quote Originariamente inviata da nman Visualizza il messaggio
    Ma non riesco a modificare il messaggio ????
    Ci sono dei problemi ortografici ........

    Comunque è comprensibile
    Ciao e grazie della risposta.
    Puntavo anche io ad avere un unico ciclo che legga la riga del file excel (che ho opportunamente importato in access) e che man mano faccia i vari insert nelle tabelle.

    Il mio problema era principalmente come gestire gli id: essendo degli autoincrement, non sapevo di poterli impostare io. In realta' a conti fatti credo mi servira' un altro ciclo per poter prendere i dati pag[1-6], data[1-6] e importo[1-6]. Ma quello non credo sara' un vero problema.

    L'unica cosa che mi fa imbestialire e' che al momento, quel codice che ho postato non funge, continua a dirmi che c'e' un errore type mismatch ma non riesco a capire dove sia.... il "debugger" di Access/VBA non e' molto dettagliato.....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.