Eseguire INSERT INTO su Tabelle con differente numero di campi

di il
19 risposte

Eseguire INSERT INTO su Tabelle con differente numero di campi

Ciao a tutti.
In una maschera ho inserito un codice VBA che al verificarsi di alcune condizioni va a copiare tutti i campi di una tabella di un database1 (inutilizzato) alla medewsima tabella del database2 (in utilizzo).
Fino ad oggi ha sempre funzionato, il problema ora sta nel fatto che ho la necessità di eliminare alcuni campi sulla tabella del database2, quindi dovrei modificare il mio codice, in modo che la funzione INSERT INTO copi comunque tutti i campi da una tabella all'altra, tralasciando i campi della tabella del database1 che non sono presenti nella tabella del database2.
Non saprei proprio da dove iniziare

Spero di essere stato chiaro.

Di seguito il mio attuale codice
Private Sub Form_Load()
On Error GoTo FINE:
'Controllo autocompattazione
If Application.GetOption("Auto Compact") = True Then
Application.SetOption "Auto Compact", False
End If


'controllo importazione vecchio database
Dim TabUpdate As DAO.Recordset
Set TabUpdate = CurrentDb.OpenRecordset("SELECT * FROM ISUpdate WHERE Riga = '1' ")

If TabUpdate.Fields("Updated") = False Then

Dim oldfile As String, dbsOld As DAO.Database
oldfile = Application.CurrentProject.Path & "\Database1.accdb"
If EsisteFile(oldfile) Then

Dim answer As Integer, strSQL As String
answer = MsgBox("Do You want to copy Records from old Database?", vbQuestion + vbYesNo + vbDefaultButton2, "Copy Data")
        If answer = vbYes Then
        Set dbsOld = OpenDatabase(oldfile, False, False, ";pwd=aaa")
       CurrentDb.Execute "INSERT INTO Tabella1 Select * From Tabella1 IN '' [;DATABASE=" & oldfile & ";PWD=aaa];"
       
       
       TabUpdate.Edit 'Abilita la modifica del record
        TabUpdate.Fields("Updated") = True
        TabUpdate.Update 'Salva il record
    
       
       answer = MsgBox("Copy Complete, Do you Want to delete the old database?", vbQuestion + vbYesNo + vbDefaultButton2, "!!!Delete File!!!")
       If answer = vbYes Then
       Kill (oldfile)
       MsgBox ("Database1 DELETED")
       End If
        End If
End If
Set dbsOld = Nothing
    

End If
TabUpdate.Close


DoCmd.Close acForm, "frmStart"
DoCmd.OpenForm "NewContract", acNormal, "", "", , acNormal

FINE:
End Sub

19 Risposte

  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    fabionik2004 ha scritto:


    ... che la funzione INSERT INTO copi comunque tutti i campi da una tabella all'altra, tralasciando i campi della tabella del database1 che non sono presenti nella tabella del database2.
    INSERT INTO non è una funzione, è uno statement SQL
    Puoi definire i campi nella SQL
    INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase] SELECT [source.]field1[, field2[, …] FROM tableexpression
    Fonte:
    E la stessa cosa più o meno scritta in italiano: Istruzione INSERT INTO
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Grazie per la risposta. Esiste un metodo alternativo? Perchà la mia Tabella ha un centinaio di campi...
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    fabionik2004 ha scritto:


    Perchà la mia Tabella ha un centinaio di campi...
    In vba una stringa può contenere moltissimi caratteri, a dar retta a questo sito
    Holds sequences of unsigned 16-bit (2-byte) code points that range in value from 0 through 65535. Each code point, or character code, represents a single Unicode character. A string can contain from 0 to approximately two billion (2 ^ 31) Unicode characters.
    Ne hai abbastanza per un predicato SQL?
    Purché "di tanto in tanto" tu aggiunga alla stringa stessa altro testo:
    sSQL="SELECT * FROM T1 " & _
    "WHERE....." & _
    allora troverai un problema, che verrà segnalato come massima
    lunghezza ammissibile...

    Se invece scrivi:
    sSQL="SELECT * FROM T1 "
    sSQL=sSQL+"WHERE...."
    non avrai nessun problema.
    Fonte: https://it.comp.appl.access.narkive.com/aTzsjJvg/lunghezza-max-stringhe#post14
    Non ho trovato nulla in merito alla capacità del metodo Execute (e del relativo JET che si prende sul groppone il tutto) di gestire predicati SQL particolarmente lunghi. Lo puoi già fare adesso: da QBE prendi la tabella e fai un'accodamento ma anziché usare l'asterico per indicare tutti i campi li selezioni tutti e li porti nella griglia. Se li tiene... fatto!
    Altrimenti potresti appoggiarti a due query di selezione in cui tieni solo i campi che ti interessano e usi quelle due query come orgine e destinazione dei dati.
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Philcattivocarattere ha scritto:


    ...
    Altrimenti potresti appoggiarti a due query di selezione in cui tieni solo i campi che ti interessano e usi quelle due query come orgine e destinazione dei dati.
    questa, IMHO, è una buona idea da provare
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Ciao a tutti, riprendo questa mia vecchia richiesta di qualche mese fa perchè ho un piccolo aggiornamento:
    Dunque Mettiamo di avere 2 database con le stesse tabelle ma che hanno un diverso numero di campi.
    Database1 > Tabella1 con campi Art1 Art2 Art3
    Database 2 Y Tabella1 con i campi Art1 Art2

    Volendo copiare i campi di Database1 Tabella1 in Database2 Tabella1 da codice VBA utilizzando il codice INSERT INTO... Mi imbatto nel problema che non posso utilizzare Select * ma bisogna indicare nella selezione select solo i campi Art1, Art2 altrimenti l'INSERT INTO da errore

    Invece ho notato che se apro manualmente i due database, e faccio Copia Tabella1 del Database1 e Incolla nel database2, vieni fuori il messaggio che chiede come si vuole incollare la tabella che esiste gia, e se seleziono accoda dati, la tabella viene copiata correttamente tralasciando Art3 che non é presente Nella Tabella1 del database2.

    Dunque la mia domanda é, non é possibile fare questo da VBA evitando di dover elencare tutti i campi nella SELECT di INSERT INTO ?

    GRAZIE
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Per inserire i dati da una tabella ad un'altra (specificandone i campi e/o i valori) puoi impiegare gli statement del linguaggio SQL(come INSERT INTO) in modo da determinare la query di accodamento:
    https://support.microsoft.com/it-it/office/istruzione-insert-into-e12fd58b-33b1-479c-8221-e9f245ab8d24
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql

    Puoi anche impiegare l'oggetto RecordSet (DAO, ADO) con i metodi disponibili, se si vuole operare con codice VBA:

    https://www.devhut.net/2018/08/26/access-vba-inserting-new-records/
    https://codevba.com/msaccess/dao_recordset.ht
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Ciao, Grazie per la risposta, in effetti io riesco a fare l'INSERT. la mia domanda era come mai se faccio copia tabella e incolla nell'altro database, e seleziono accodamento, non c'é alcun problema se i campi della tabella di origine sono piu dell'altra?
    Mentre se faccio INSERT devo per forza selezionare nella SELECT i campi che voglio copiare se no mi da errore?
    Grazie
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    fabionik2004 ha scritto:


    come mai se faccio copia tabella e incolla nell'altro database, e seleziono accodamento, non c'é alcun problema se i campi della tabella di origine sono piu dell'altra?
    Mentre se faccio INSERT devo per forza selezionare nella SELECT i campi che voglio copiare se no mi da errore?
    Copia/Incolla è una operazione diversa da INSERT. Uso un linguaggio molto popolare:
    - la prima è "acchiappa quello che c'è"
    - la seconda punta su precisi campi che devono esistere e combaciare in quanto dichiarati esplicitamente nella query
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Grazie, e non si puo' fare "acchiappa quello che c'è" tramite VBA?
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Salve a tutti,
    secondo me, e' una feature interna di Access, inteso come applicativo e non come DBMS...

    Anche SQL Server Management Studio fa qualche magheggio di questo tipo, ma non al livello di Access... ma di nuovo, e' SSMS e non SQL Server...
    per cui, a mio parere, O si fa il magheggio copy&paste, O si scrive codice SQL (codice corretto) per fare l'operazione

    salutoni romagnoli
    --
    Andrea
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Scusate, ho preso una breve pausa dal progetto adesso provo a rimettermi sotto.
    Volendo usare SQL, ho pensato di creare una query tramite VBA che verifichi quali campi della TABELLA2 del database2 siano presenti nella TABELLA1 del database1 e dopo dovrei fare un INSERT INTO di questi campi dalla TABELLA1 alla TABELLA2
    pensate sia fattibile?
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Se la domanda è :
    " Vorrei copiare i records presenti nella tabella1 del DB1 nella tabella2 del DB2 considerando che i campi presenti nella tabella1 sono gli stessi di quelli presenti nella tabella2 e che la tabella1 contiene più campi della tabella2" la risposta è : Si .. Può ... Fare !
    I prerequisiti sono :
    1) - conosci discretamente bene VBA e sai fare debug
    2) - conosci il modello ad oggetti DAO (o ADO)
    3) - conosci la sintassi SQL
    Il punto 1 dipende solo da te.
    Il punto 2 è la chiave che ti permette di realizzare quello che chiedi.
    Il punto 3 già lo conosci (ovvero già sai che non puoi fare un banale select * from)

    Gli spunti per il punto 2 :
    2.1) - devi recuperare tramite DAO (o in alternativa ADO) l'elenco dei campi presenti nella tabella2 (la tabella di destinazione)
    2.2) - una volta che hai ottenuto l'elenco (e quindi il nome) dei campi della tabella2 costruisci la stringa SQL che poi eseguirai tramite DAO.QueryDef oppure ADOCmd.execute

    Concentrati sul 2.1 anche tramite ricerche nel web ... è un'operazione relativamente semplice
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    Ciao, grazie per le dritte. sono riuscito ad andare avanti con questo codice:
     
     Set DBx = CurrentDb
                                For Each Fld In DBx.TableDefs("Tabella2").Fields
                                    For Each FldOld In dbsOld.TableDefs("Tabella1").Fields
                                    If Fld.Name = FldOld.Name Then
                                    stringcopy = stringcopy & Fld.Name & ", "
                                    Exit For
                                    End If
                                    Next
                                Next
                                stringcopy = Left(stringcopy, Len(stringcopy) - 1)
    
                                      CurrentDb.Execute "INSERT INTO Tabella2 Select " & stringcopy & " From Tabella1 IN '' [;DATABASE=" & oldfile & ";PWD=111] ;"
                                 TabUpdate.Edit 'Abilita la modifica del record
                                TabUpdate.Fields("Updated") = True
                                 TabUpdate.Update 'Salva il record
    Pero' mi da errore su alcuni campi nella Select errore 3075 operatore mancante.
    Cosa potrebbe essere?
    Ho pensato magari la diversa lunghezza o tipologia dei campi? Ma sono quasi sicuro che siano tutti uguali
    potrei aggiunggere un ulteriore controllo sulla parte If Fld.Name = FldOld.Name Then
  • Re: Eseguire INSERT INTO su Tabelle con differente numero di campi

    fabionik2004 ha scritto:


    ...Cosa potrebbe essere?...
    I miei due centesimi:
    Prova ad esplicitare l'elenco dei campi per la tabella di destinazione. Lo standard dice:
    If you are adding values for all the columns of the table, you do not need to specify the column names in the SQL query. However, make sure the order of the values is in the same order as the columns in the table.
    Dato che tu non stai importando TUTTI i campi credo proprio che l'elenco sia necessario ed in più potrebbe essere che con il ForEach l'ordine non venga rispettato...
Devi accedere o registrarti per scrivere nel forum
19 risposte