Condividi:        

Query accodamento

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Query accodamento

Postdi miko » 09/01/20 22:25

Salve,
Ho 2 tabelle identiche, tabella1 e tabella2, uguali in struttura, numero di records e campi, contenti gli stessi valori;
supponiamo che inizialmente le tabelle hanno entrambe 10 records
tramite vba inserisco/aggiungo, ad esempio, altri 5 record in tabella 1, che quindi passa da 10 a 15 records.
Ora devo copiare/incollare nella tabella 2, solo i 5 records che ho aggiunto in tabella 1 .

Con la creazione guidata ho realizzato la query di accodamento che poi ho convertito in vba.
Credo di aver capito che la query-vba con il codice, INSERT INTO … SELECT …FROM, così come viene realizzata dalla creazione guidata, copia l’intera tabella 1 dal primo all’ultimo record e la incolla in tabella 2;

mi interessa invece copiare solo gli ultimi 5 records.

Allora ho realizzato questo codice:

Codice: Seleziona tutto
Option Compare Database

Private Sub AGGIORNA
Dim NC As Integer, criterio As String
Dim DBCOrrente As DAO.Database
Dim Tabella1 As DAO.Recordset
Dim Tabella2 As DAO.Recordset
On Error Resume Next
Set db = CurrentDb
Set ds = db.OpenRecordset("SELECT Count(ID) AS IDA FROM Tabella1")
         NR1 = ds!IDA       
    ds.Close
Set ds = db.OpenRecordset("SELECT Count(ID) AS IDC FROM Tabella2")
         NR2 = ds!IDC       
    ds.Close
   If NR1 = NR2 Then
         MsgBox " INSERITE " & " " & record_Finali - record_esistenti & " " & " NUOVI RECORDS" & vbCrLf & "TABELLA 2 GIA' AGGIORNATA"
      db.Close     
      Exit Sub     
   End If
Set Tab1 = db.OpenRecordset("Tabella1", dbOpenDynaset)
Set Tab2 = db.OpenRecordset("Tabella2", dbOpenDynaset)
criterio = "INSERT INTO Tab2 (ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St) "
criterio = criterio & "SELECT ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St From Tab1 WHERE Tab1.ID > 10"  <<<<<   
   db.Execute criterio
Tab2.Close
Tab1.Close
db.Close
End Sub       


Il codice funziona se nella riga evidenziata, la clausola WHERE contiene un numero, in questo caso 10.
Ma se al posto del numero inserisco una variabile, ad esempio se scrivo … WHERE Tab1.ID > Tab2.ID, oppure WHERE Tab1.ID > NR2, ho errore ed il messaggio recita “ previsto 1”;
leggendo l’help pare di aver capito che è necessario il numero.

Vorrei modificare il codice, oppure la clausola WHERE, in modo da usare una variabile e non un numero, per indicare che si deve copiare, nell’esempio, dal record 11 al record 15;
se prima di aggiornare le tabelle l’ultimo record è LastIniziale, mentre dopo l’aggiornamento l’ultimo record
è LastFinale, come devo scrivere per dire “copia da LastIniziale + 1 a LastFinale” ?

inoltre leggo che il riferimento al DAO è ormai vecchio e superato, ed è preferibile riferirsi all ‘ ADO oppure
all’ ADODB, (non so se questi ultimi sono la stessa cosa).
Attualmente uso office 2013 e forse dovrei passare a versioni più recenti.
A quale devo fare riferimento?

Saluti grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Postdi archimede » 10/01/20 12:25

1. Non hai bisogno di una valanga di codice VBA, dovrebbe bastare una semplice Vista:
Codice: Seleziona tutto
INSERT INTO Tab2 (ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St)
SELECT ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St
  FEOM Tab1
 WHERE Tab1.ID not in (SELECT id FROM Tab2)

2. Ma a che ti servono due tabelle IDENTICHE?

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento

Postdi miko » 16/01/20 09:37

Buongiorno,
ho provato il codice ed ovviamente funziona, grazie.
Data la complessità di access e la mia scarsissima conoscenza, preferisco lavorare con macro e vba, così posso vedere e capire i vari step;
con le query vedo solo il risultato finale ma non riesco ancora a capire il codice.
Proverò a trasformare il tuo codice in vba.
Ho 2 richieste

1) se invece devo aggiungere tutti i records di tabella1 in tabella2, a partire dal record successivo all’ultimo record di tabella2,
ad esempio, se tabella1 contiene 10 record e tabella2 contiene 5 record,
come si modifica il codice per aggiungere tutti i 10 records di tabella1, in tabella2, a partire dal record 6 di tabella2 ?

2) nel codice ad inizio topic c’è questa linea
criterio = criterio & "SELECT ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St From Tab1 WHERE Tab1.ID > 10"
e scrivevo i problemi relativi.
Come posso usare una variabile invece del numero 10, in modo da avere un codice più generale ?
Ad esempio in un ipotetico ciclo

Dim NRec as integer( or Long)
NRec = tabell2.Ultimo Record
….
criterio = criterio & "SELECT ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St From Tab1 WHERE Tab1.ID > NRec + 1"

E poi ho dei dubbi,
il codice che ho scritto, ad inizio topic, copia l’intera tabella1 ed incolla in tabella2, sostituendo i dati già esistenti e contemporaneamente aggiunge i record mancanti, oppure copia-incolla solo i record mancanti?

Ma a che ti servono due tabelle IDENTICHE?


A scopo didattico, non avendo alcuna conoscenza di access, sono partito da situazioni semplici con pochi record in modo da non avere troppi dati e confondermi, e poi era riferito anche al topic del confronto tabelle, ma le tabelle in futuro saranno diverse.

Saluti, grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Postdi archimede » 16/01/20 12:22

miko ha scritto:con le query vedo solo il risultato finale ma non riesco ancora a capire il codice.
Ok, ma lavorare con un db senza conoscere SQL è come lavorare con Excel senza conoscere VBA (inoltre, secondo me, in SQL scrivi MENO codice che in VBA per fare la stessa cosa). Senza contare che alla fine in VBA devi comunque scrivere delle istruzioni SQL per cui...
miko ha scritto:se invece devo aggiungere tutti i records di tabella1 in tabella2, a partire dal record successivo all’ultimo record di tabella2
Dipende da cosa si intende con "ultimo" (un db non è come un foglio Excel, le righe NON hanno un ordine predefinito). Ad esempio:
Codice: Seleziona tutto
INSERT INTO Tab2 (ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St)
SELECT ID, Nes, Nco, DATA, N1, N2, N3, N4, N5, N6, Jy, St
  FEOM Tab1
 WHERE Tab1.ID > (SELECT max(id) FROM Tab2)

miko ha scritto:Come posso usare una variabile invece del numero 10, in modo da avere un codice più generale ?
Scrivendo la query come nei miei esempi.
miko ha scritto:il codice che ho scritto, ad inizio topic, copia l’intera tabella1 ed incolla in tabella2, sostituendo i dati già esistenti e contemporaneamente aggiunge i record mancanti, oppure copia-incolla solo i record mancanti?
Nè uno nell'altro mi pare: aggiunge i records con Tab1.ID > 10.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Query accodamento

Postdi miko » 21/01/20 06:21

salve,
grazie delle spiegazioni, tutto chiaro.
ciao
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "Query accodamento":


Chi c’è in linea

Visitano il forum: Nessuno e 62 ospiti