Query Insert in VBA Access



  • Query Insert in VBA Access
    di gugluca (utente non iscritto) data: 11/01/2013 10:06:11

    Ciao a tutti,
    premetto che non conosco bene il VBA di access (me la cavicchio con quello di Excel).
    Avrei bisogno di eseguire una query di insert fra due tabelle di access nel codice VBA.
    Non riesco a capire cosa sbaglio.
    La tabella da dove pescare i dati si chiama 'DATABASE' e la tabella in cui inserire i dati si chiama 'TRACCIATO'.
    Vi riporto il codice qui di seguito.

    Grazie in anticipo

    Luca
     
    Dim DB As Database
    Set DB = CurrentDb
    DB.Execute "INSERT INTO TRACCIATO _
                SELECT DATABASE.A AS REC _
                     , DATABASE.B & DATABASE.C AS CODICE _
                     , DATABASE.D & DATABASE.E _
                     & DATABASE.F & DATABASE.G AS DATA _
                 FROM DATABASE _
                 WHERE DATABASE.A='00';"



  • di Vecchio Frac data: 11/01/2013 14:33:42

    VBA è praticamente identico in oggni ambiente Office, a parte le peculiarità proprie dei diversi applicativi.
    Comunque guardando il tuo codice così a naso la prima cosa che mi viene da osservare è che non puoi avere una stringa spezzata in questo modo. Se non hanno cambiato qualcosa nelle nuovissime versioni di Office, questa sintassi è palesemente sbagliata.
    Non dici peraltro se ottieni qualche messaggio di errore. Secondo me viene rilevato un problema di sintassi già in fase di stesura del codice, non di esecuzione :)

    Modifica come segue e fai sapere.
     
    Db.Execute "INSERT INTO TRACCIATO " & _
                "SELECT DATABASE.A AS REC " & _
                     ", DATABASE.B & DATABASE.C AS CODICE " & _
                     ", DATABASE.D & DATABASE.E " & _
                     "& DATABASE.F & DATABASE.G AS DATA " & _
                 "FROM DATABASE " & _
                 "WHERE DATABASE.A='00';"






  • di gugluca (utente non iscritto) data: 11/01/2013 15:15:45

    Ciao,
    grazie per la risposta!
    Ora funziona.. Ho solo aggiunto le parentesi quadre nella tabella 'DATABASE' nel 'FROM'
    La differenza rispetto al VBA con Excel la ritrovo essenzialmente nella differenza fra 'Fogli Excel' e 'Tabelle Access'.
    La procedura che sto provando a generare ora in Access, prima era in VBA di Excel.
    Ad esempio, prima copiavo da un foglio all'altro di excel con un ciclo for dei valori in celle precise (ad esempio foglio1.Range("a" & i) = foglio2.Range("a" & i-1).. Questa operazione come posso ricrearla in VBA Access?

    Grazie ancora di tutto



  • di gugluca (utente non iscritto) data: 11/01/2013 15:28:16

    Ciao,
    grazie per la risposta!
    Ora funziona.. Ho solo aggiunto le parentesi quadre nella tabella 'DATABASE' nel 'FROM'
    La differenza rispetto al VBA con Excel la ritrovo essenzialmente nella differenza fra 'Fogli Excel' e 'Tabelle Access'.
    La procedura che sto provando a generare ora in Access, prima era in VBA di Excel.
    Ad esempio, prima copiavo da un foglio all'altro di excel con un ciclo for dei valori in celle precise (ad esempio foglio1.Range("a" & i) = foglio2.Range("a" & i-1).. Questa operazione come posso ricrearla in VBA Access?

    Grazie ancora di tutto



  • di Vecchio Frac data: 11/01/2013 17:36:28

    Non ci sono più celle ma campi e record.
    Aggiungi un nuovo record, compili un campo.
    Il primo campo della tabella Tracciato riceve il valore dal primo select della tabella "database" (che hai chiamato Rec). E via così.
    Di passaggio, evita di dare alle tabelle nomi riservati altrimenti sei costretto a usare le quadre e non è sempre comodo ricordarselo.





  • di gugluca (utente non iscritto) data: 11/01/2013 18:02:28

    Ad esempio, in VBA Excel eseguo una macro del genere (sotto nel codice), con la quale, fisso l'ultimo campo valorizzato della colonna A ed eseguo un ciclo for che mi va a valorizzare le celle vuote della colonna B con il valore ritrovato dalla cella precedente (ad esempio se B4 è vuota, si prende il valore di B3)..

    In VBA access, come posso farlo all'interno di un campo di una tabella?

    Grazie mille

    Luca



     
    fine = Foglio1.Range("a1048576").End(xlUp).Row
    myVal = Foglio1.Range("b1").Value
    For i = 1 To fine 
        If Foglio1.Range("b" & i).Value = "" Then
        Foglio1.Range("b" & i).Value = myVal
        Else
            myVal = Foglio1.Range("b" & i).Value
        End If
    Next i



  • di Vecchio Frac data: 11/01/2013 21:21:14

    In Access non ha senso :)
    Usa DoCmd.RunSQL con un'istruzione INSERT INTO oppure UPDATE nel campo dove (WHERE ) è soddisfatta una condizione.
    Non posso essere più generico di così... non sappiamo cosa vuoi fare nè come è strutturato il database Access.
    E la risposta finale potrebbe essere completamente diversa.





  • di gugluca (utente non iscritto) data: 12/01/2013 00:37:27

    Provo a spiegare meglio l'esempio:
    Ho un Database (ottenuto dopo aver importato un file txt, per quello nella colonna 'B' ho dei valori 'null'), con numerosi campi.
    Il ciclo (in Excel) riempie i valori 'null' della colonna B fino all'ultima riga piena in questo modo:

    COLONNA B
    Valore 1
    null 1
    null 1
    null 1
    Valore 2
    null 2
    Valore 3
    null 3
    null 3

    I valori 'null 1' vengono riempiti con il 'Valore 1', i valori 'null 2' vengono riempiti con il Valore 2, ecc.. fino alla fine.
    Per questo utilizzavo il VBA di Excel ed il ciclo for, ma ora il file txt l'ho dovuto importare in Access in quanto ha più di un milione di righe e non riesco a gestirlo con Excel..

    Ho qualche alternativa in Access?
    Buona serata
    Luca



  • di Vecchio Frac data: 12/01/2013 11:15:56

    Non mi è chiaro il doppio passaggio txt --> Excel --> Access.
    Perchè una volta importato il file di testo in Excel hai bisogno di passare ad Access? Non puoi fare in Excel tutto il resto del programma? Tanto vale allora che importi direttamente in Access il file txt e fai tutto in quell'ambiente.
    Dovrebbe esserci qualcosa tipo DoCmd.TransferText che fa al caso tuo.





  • di gugluca (utente non iscritto) data: 12/01/2013 13:57:23

    Scusa, non mi sono spiegato tanto bene.
    Inizialmente facevo l'import del file txt in Excel ed eseguivo quel codice in Excel.
    Ora che il file txt supera il milione di righe non posso più fare l'import del txt in Excel (perché non riesco a gestirlo). Quindi faccio l'import del txt direttamente in Access, solo che a questo punto in Access non riesco ad eseguire quel ciclo.
    La soluzione come dicevi tu potrebbe trovarsi con una query di update con degli Iif, ma non capisco bene come fare (sempre che non si possa invece inserire un ciclo for..next o while..).



  • di Vecchio Frac data: 12/01/2013 14:09:23

    cit. " Ora che il file txt supera il milione di righe non posso più fare l'import del txt in Excel"
    ---> Vero, l'avevi detto e mi è sfuggito ^_^

    Per costruirti bene la query, usa la creazione guidata di Access, poi visualizza la query e guardati il codice (ma a quel punto ti basterà richiamare la query senza reimportare il codice in una funzione).
    Oppure crei la stessa funzione in Access, scorrendo il recordset una riga alla volta e se scovi un field nullo lo sostituisci con il valore appropriato.





  • di gugluca (utente non iscritto) data: 12/01/2013 14:39:41

    Ho provato a creare una query di update ma non riesco a capire come scriverla (né con procedura guidata né senza). In particolare, non riesco a capire come fare senza inserire un ciclo che mi riempie le celle vuote copiandomi l'ultima cella valorizzata e fino alla successiva cella valorizzata.



  • di Vecchio Frac data: 12/01/2013 15:34:24

    In Access, ecco una possibile sub di esempio.
    Creo un riferimento al recordset che contiene tutto il set di righe della "tabella1", la quale può contenere dei valori null.
    Ora, sostituisco questi valori null con l'ultimo valore valido per quel campo.
    In fase di prima applicazione (cioè se è la prima riga del recordset) a contenere valori nulli, tali valori vengono sostituiti con la parola "vuoto".
    Adatta tu il codice alla tua esigenza.
     
    Option Compare Database
    Option Explicit
    
    Sub test()
    Dim rs As Recordset, campo1, campo2, campo3
        Set rs = CurrentDb.OpenRecordset("tabella1")
        
        campo1 = "vuoto"
        campo2 = "vuoto"
        campo3 = "vuoto"
        
        While Not rs.EOF
            rs.Edit
            
            rs!campo1 = IIf(IsNull(rs!campo1), campo1, rs!campo1)
            campo1 = rs!campo1
            
            rs!campo2 = IIf(IsNull(rs!campo2), campo2, rs!campo2)
            campo2 = rs!campo2
            
            rs!campo3 = IIf(IsNull(rs!campo3), campo3, rs!campo3)
            campo3 = rs!campo3
            
            rs.Update
            rs.MoveNext
        Wend
    End Sub






  • di gugluca (utente non iscritto) data: 12/01/2013 20:26:12

    Grazie per l'esempio..
    E chi la conosceva la proprietà EOF???
    Ho provato da casa e mi sembra proprio di aver trovato il pezzetto di codice mancante per concludere la mia procedura in Access.
    Lunedì a lavoro provo sul DB completo.
    Grazie ancora e buona serata.

    Luca




  • di Vecchio Frac data: 12/01/2013 21:36:54

    Bè, ma è così che si cicla in un recordset... finchè non si incontra la fine del file (End Of File) ^_^





  • di gugluca (utente non iscritto) data: 14/01/2013 12:19:15

    Ho provato ora in ufficio direttamente sulla mia tabella (700.000 righe) a fare l'update..
    L'update viene fatto quasi per metà della tabella, finchè non esce fuori un errore:

    Errore di run-time '3049'. Impossibile aprire il database "". Possibile che il database non sia riconoscibile dall'applicazione oppure che il file sia danneggiato.

    Secondo voi, devo impostare qualcosa?




  • di Vecchio Frac data: 14/01/2013 13:06:36

    Credo che questa discussione sia legata in qualche modo all'altra, dove lamenti un problema di importazione di file di grandi dimensioni.
    Se per mezzo db lavora bene e poi si inchioda, o hai poca memoria RAM sul sistema oppure il file si è danneggiato (facile con Access). Oppure ci sono valori illegali in qualche campo.
    Spezza la tabellona in tabelle più piccole e riprova.





  • di gugluca (utente non iscritto) data: 14/01/2013 14:00:31

    Ok,
    grazie per l'info...
    Provo a spezzare il file in più file.
    A sti punti allora non c'è un miglioramento utilizzando Access anzichè Excel..

    Grazie ancora per l'aiuto!!




  • di gugluca (utente non iscritto) data: 14/01/2013 14:14:13

    Ok,
    grazie per l'info...
    Provo a spezzare il file in più file.
    A sti punti allora non c'è un miglioramento utilizzando Access anzichè Excel..

    Grazie ancora per l'aiuto!!




  • di Vecchio Frac data: 14/01/2013 14:28:58

    Access è davvero poco indicato per gestire settecentomila record.





  • di gugluca (utente non iscritto) data: 15/01/2013 14:40:53

    Quale strumento potrei utilizzare per gestire file txt di quelle dimensioni?



  • di Vecchio Frac data: 15/01/2013 19:10:08

    Bè, se Office è quello che passa il convento, Access è meglio di Excel.
    Però vedi i limiti di Access... 2GB quando va bene.
    Hai guardato SQL Server?
    L'articolo è vecchiotto ma mi sembra che potrebbe fare al caso:
    blogs.ugidotnet.org/lanny/archive/2006/04/21/MigraAccess2SQLServer.aspx