Access 2003 - importazione dati da una tabella ad un'altra!

mercoledì 19 agosto 2009 - 13.04

maxforla Profilo | Newbie

Buongiorno a tutti!
Mi sono appena iscritto a questo forum spinto, soprattutto, dalla passione per access, passione che coltivo, nei miei piccoli spazio di tempo libero, da qualche tempo. Premesso che non sono un informatico, ne un esperto di linguaggi di programmazione, ma sono, invece, molto spinto dalla curiosità verso gli strumenti informatici, di cui ne faccio ampio uso, ho sviluppato, partendo da esempi di office, una mia piccola procedura di gestione ordini per gli agenti di vendita che operano nel mio team. Ho lavorato molto per arrivare dove sono arrivato e posso dire, con una punta di orgoglio, che sono soddisfatto! Però....quando si fà qualcosa, ci si accorge che la si vuole migliorare sempre di più. Adesso, per esempio, non so come fare per importare alcuni dati da una tabella ad un'altra, mettendo a confronto le due tabelle che contengono, per il 95%, gli stessi dati (sono i prodotti del nostro catalogo, oltre 10.000) ed estrapolare solo quei dati (prodotti nuovi) che non sono presenti nella prima tabella, ovvero quella a cui il programma fa riferimento! Mi direte di studiare l'SQL, cosa che sto facendo e che sinora non mi ha ancora permesso di risolvere il mio piccolo/grande problema. Bene, questo è il mio rompicapo! Se qualcuno, in questo forum, può darmi una mano lo ringrazio sin da questo momento ma voglio, comunque, ringraziare tutti coloro che avranno letto il mio post. Grazie ancora e buona continuazione di ferie a tutti e buona ripresa dei lavori a chi si appresta a farlo nei prossimi giorni.

lbenaglia Profilo | Guru

>Adesso, per esempio, non so come fare per importare alcuni dati da una
>tabella ad un'altra, mettendo a confronto le due tabelle che
>contengono, per il 95%, gli stessi dati (sono i prodotti del
>nostro catalogo, oltre 10.000) ed estrapolare solo quei dati
>(prodotti nuovi) che non sono presenti nella prima tabella, ovvero
>quella a cui il programma fa riferimento!

Ciao Orlando,

Qui trovi 3 esempi che potrebbero esserti utili:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=26003

Non dovrai fare altro che aggiungere il comando di INSERT <tabella di destinazione> prima delle SELECT.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maxforla Profilo | Newbie

Ciao Lorenzo e grazie molte per la tua preziosa attenzione!
Pur avendo provato le 3 query che mi hai cortesemente indicato, ho deciso di utilizzare la seguente query:
SELECT *
FROM Prodottinew AS A
WHERE NOT EXISTS
(SELECT *
FROM Articoli
WHERE Codice = A.Codice);
Questa query mi restituisce tutti i valori contenuti nella tabella "Prodottinew", molti dei quali sono già presenti nella tabella "Articoli". Io, invece, voglio selezionare, dalla tabella "Prodottinew", solo quelli che non sono presenti nella tabella "Articoli" ed accodarli/aggiungerli nella tabella "Articoli".
Nelle tue indicazioni finali ho letto che devo aggiungere il comando INSERT <nome Tabella> prima delle SELECT. Ho provato ma mi da errore.
Ho fatto qualche errore io nel copiare le query di esempio?
Grazie molte.

lbenaglia Profilo | Guru

>SELECT *
>FROM Prodottinew AS A
>WHERE NOT EXISTS
> (SELECT *
> FROM Articoli
> WHERE Codice = A.Codice);
>Questa query mi restituisce tutti i valori contenuti nella tabella
>"Prodottinew", molti dei quali sono già presenti nella tabella
>"Articoli".
No. Quella query ti restituisce tutte le righe di Prodottinew che NON SONO PRESENTI in Articoli.

>Io, invece, voglio selezionare, dalla tabella "Prodottinew",
>solo quelli che non sono presenti nella tabella "Articoli" ed
>accodarli/aggiungerli nella tabella "Articoli".

Come ti ho detto prima aggiungi un comando di INSERT a monte:

INSERT INTO Articoli SELECT * FROM Prodottinew AS A WHERE NOT EXISTS ( SELECT * FROM Articoli WHERE Codice = A.Codice );

>Grazie molte.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maxforla Profilo | Newbie

Lorenzo grazie molte per la cortesia e pazienza,
ho provato la query che mi hai indicato però, pur non segnalandomi alcun errore di sintassi o di altra natura, mi restituisce, come risultato finale, che le righe che saranno accodate sono 0.
La query è la seguente:
INSERT INTO Prodotti1
SELECT *
FROM Prodotti2 AS A
WHERE NOT EXISTS (
SELECT *
FROM Prodotti2
WHERE Codice = A.Codice
);

Le tabelle sono le seguenti:
Prodotti1
IDProdotto Codice Nome prodotto Prezzo unitario
10526 PROVA1 A € 10
10528 PROVA2 B € 20
10529 PROVA3 C € 15

Prodotti2
IDProdotto Codice Nome prodotto Prezzo unitario
1796 PROVA4 D € 50
1797 PROVA5 E € 21
1798 PROVA1 A € 10

Dall'esame delle due tabelle, dovrebbe, secondo la query sopra riportata, accodare alla tabella "Prodotti1" le righe della tabella "Prodotti2" con IDProdotto n. 1796 e 1797. Però, mi chiedo, se nella tabella "Prodotti1" esiste una riga con IDProdotto n. 1796 e 1797, corrispondenti a codici diversi, è possibile che il controllo veda solo l'ID come già presente e non vede, conseguentemente il Codice che è diverso ma non lo seleziona?
Grazie molte!

lbenaglia Profilo | Guru

>Lorenzo grazie molte per la cortesia e pazienza,
>ho provato la query che mi hai indicato però, pur non segnalandomi
>alcun errore di sintassi o di altra natura, mi restituisce, come
>risultato finale, che le righe che saranno accodate sono 0.
>La query è la seguente:
>INSERT INTO Prodotti1
>SELECT *
>FROM Prodotti2 AS A
>WHERE NOT EXISTS (
> SELECT *
> FROM Prodotti2
> WHERE Codice = A.Codice
>);
>
>Le tabelle sono le seguenti:
>Prodotti1
>IDProdotto Codice Nome prodotto Prezzo unitario
>10526 PROVA1 A € 10
>10528 PROVA2 B € 20
>10529 PROVA3 C € 15
>
>Prodotti2
>IDProdotto Codice Nome prodotto Prezzo unitario
>1796 PROVA4 D € 50
>1797 PROVA5 E € 21
>1798 PROVA1 A € 10
>
>Dall'esame delle due tabelle, dovrebbe, secondo la query sopra
>riportata, accodare alla tabella "Prodotti1" le righe della tabella
>"Prodotti2" con IDProdotto n. 1796 e 1797.
Infatti avviene proprio questo, hai provato con un db "pulito"?

>Però, mi chiedo, se nella tabella "Prodotti1" esiste una riga con IDProdotto n. 1796
>e 1797, corrispondenti a codici diversi, è possibile che il controllo
>veda solo l'ID come già presente e non vede, conseguentemente
>il Codice che è diverso ma non lo seleziona?
No, ma se su IDProdotto è definito un constraint UNIQUE, PK o un indice UNIQUE si verificherà un errore di runtime in fase di insert.

>Grazie molte!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maxforla Profilo | Newbie

Ciao Lorenzo,
ho provato, così come mi hai suggerito, ad applicare la query su un db pulito; l'esito è il medesimo: nessuna riga copiata!
Pensi che si possa fare altro?
Grazie!

lbenaglia Profilo | Guru

>ho provato, così come mi hai suggerito, ad applicare la query
>su un db pulito; l'esito è il medesimo: nessuna riga copiata!
Eh, l'esempio l'ho fatto anch'io e funziona correttamente.
Probabilmente c'è qualcosa che non ci hai detto...

>Pensi che si possa fare altro?
Si, zippa l'mdb e postalo.

>Grazie!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maxforla Profilo | Newbie

Ok Lorenzo,
ti allego il file pulito zippato.
Grazie molte!!

lbenaglia Profilo | Guru

>Ok Lorenzo,
>ti allego il file pulito zippato.

Ecco, mi era sfuggito l'errore nella tua query: referenzi 2 volte la tabella Prodotti2, mentre la query corretta è:

INSERT INTO Prodotti1 SELECT * FROM Prodotti2 AS A WHERE NOT EXISTS ( SELECT * FROM Prodotti1 WHERE Codice = A.Codice );

Ti riallego il db con la query qryAllineaTabelle.

>Grazie molte!!
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

lbenaglia Profilo | Guru

Non ho eseguito la query per non popolare la tabella Prodotti1, ma lanciandola si verifica un errore dato che IDProdotto è definito come AutoNumber.
La query funzionante è:

INSERT INTO Prodotti1 (Codice, NomeProdotto, PrezzoUnitario) SELECT Codice, NomeProdotto, PrezzoUnitario FROM Prodotti2 AS A WHERE NOT EXISTS ( SELECT Codice, NomeProdotto, PrezzoUnitario FROM Prodotti1 WHERE Codice = A.Codice );

Ovviamente gli IDProdotto di Prodotti1 differiranno da quelli di Prodotti2...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

maxforla Profilo | Newbie

Lorenzo sei un GRANDE!!
Mi hai risolto un rompicapo che mi assillava da tanto tempo, GRAZIE MOLTE!!

Posso approfittare per chiederti un'altra cosa?
Premesso che io ho tutto licenziato, sia windows xp Home Ediction che Office 2003 Professional, mi è capitato di recente, che aprendo il db non mi si aprono le tabelle nelle rispettive caselle a tendina. Per aprire regolarmente il db e lavorarci sopra, ho dovuto reinstallare Office e disabilitare gli aggiornamenti di windows. A cosa può essere attribuito questo fenomeno, considerando che i miei software sono originali e regolarmente licenziati?
Come si può risolvere il problema, senza dover rinunciare agli aggiornamenti di windows?
Grazie ancora!

lbenaglia Profilo | Guru

>Premesso che io ho tutto licenziato, sia windows xp Home Ediction
>che Office 2003 Professional, mi è capitato di recente, che aprendo
>il db non mi si aprono le tabelle nelle rispettive caselle a
>tendina. Per aprire regolarmente il db e lavorarci sopra, ho
>dovuto reinstallare Office e disabilitare gli aggiornamenti di
>windows. A cosa può essere attribuito questo fenomeno, considerando
>che i miei software sono originali e regolarmente licenziati?
Mi spiace, non so rispondere a questo quesito.

>Grazie ancora!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5