Newsgroup: it.comp.appl.access
Titolo: Esportazione ed importazione dati

Ciao a tutti, e mi scuso in anticipo per la lunghezza del messaggio.
Uso Access2000, ed ho scritto una piccola applicazione per un amico, che la
usa al lavoro con soddisfazione. Semplificando al massimo, diciamo che tale
applicazione e' un database di articoli, in cui la chiave principale e'
anche il codice dell'articolo, ed e' il classico campo "contatore", che si
incrementa ad ogni aggiunta.
Visto che al mio amico capita di dover viaggiare, egli vorrebbe potersi
portar via tale applicazione sul portatile, e vorrebbe poter AGGIUNGERE
articoli a questo database. Quando tornera' in ufficio, bisognera' IMPORTARE
tali nuovi articoli nel database che e' rimasto in ufficio. Poniamo che alla
sua partenza l'ultimo articolo fosse il numero 30: ebbene, se mentre era via
ha aggiunto al database sul portatile10 articoli, occorrera' aggiungere al
database dell'ufficio gli articoli dal 31 al 40. Se pero' in ufficio sono
stati nel frattempo aggiunti altri articoli, tali nuovi articoli dovranno
essere ACCODATI ai nuovi, ovviamente rinumerando la chiave principale (e
quindi i codici): nel caso in esame, i 10 articoli che verranno accodati
prenderanno ad esempio i codici dal 51 al 60.
Tutto facile, tutto bello, vero? Ebbene, questo lo si puo'fare benissimo con
un banale copia&incolla: apro la tabella del portatile, seleziono i nuovi
record, li copio, indi apro la tabella dell'ufficio e li incollo. Il
problema e': COME DIAVOLO FACCIO a farglielo fare da programma? Io vorrei un
pulsantino "esporta", grazie al quale il mio amico potrebbe esportare in un
file (dal database del portatile) gli articoli dal numero X al numero Y, ed
anche un pulsantino "importa", grazie al quale il mio amico (sul database
dell'ufficio) potrebbe importare dal file appena creato i nuovi articoli,
che verrebbero ACCODATI e la cui chiave verrebbe RINUMERATA automaticamente.
Come posso fare? Ho visto che esiste TransferSpreadsheet, che mi
permetterebbe di esportare i record in un file Excel.Ma l'importazione me la
farebbe CREANDO UNA NUOVA TABELLA, mentre io ho bisogno che i dati vengano
ACCODATI alla tabella esistente. Certo, potrei intervenire facendo
esplicitamente una copia dalla nuova tabella alla vecchia e cancellando la
nuova tabella non piu'necessaria... ma esiste sicuramente un metodo
piu'veloce, vero? :-)
Non rispondetemi "usa la possibilita' di replicazione del database", perche'
la replicazione del database crea questo simpatico effetto collaterale: i
campi contatore di un database replicato vengono incrementati CASUALMENTE, e
non piu' di un'unita'. Se l'ultimo codice era il 34, aggiungendo un nuovo
record il suo codice sara' -12354634, il successivo sara' 
2763271364
, il
successivo sara' 364367434, e cosi' via. Ovvio il motivo per cui si comporta
cosi': si evitano doppioni durante la sincronizzazione. Certo e' che a me
non va affatto bene: i codici devono continuare ad incrementarsi di
un'unita' per volta...
Grazie in anticipo.
Ciao,
Angelo.-

Supponiamo che il database che contiene la tabella si chiami dati.mdb
e che la tabella si chiami Articoli.
Supponiamo poi che dati.mdb contenente i dati da aggiungere venga
copiato nella cartella c:\aggiorna.
Nel mdb dove vuoi aggiungere i record, crea una query la cui
istruzione SQL di base è:
INSERT INTO Articoli (Campo1, Campo2, Campo3) SELECT (Campo1, Campo2,
Campo3) From Articoli IN "c:\aggiorna\dati.mdb"
dove al posto di Campo1, Campo2 e Campo3 devi mettere l'elenco di
TUTTI i campi della tabella articoli TRANNE il campo contatore.
Questo ti permette di aggiornare i dati in entrambe le direzioni
(portatile->ufficio e viceversa)
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Così disse Ivan Lelli Ven 25 Aug 2000 09:34:52 +0200)
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com/
---------------------------------------------
... e quello di it.comp.as400:
http://www.faq400.com/
---------------------------------------------

...


...



SELECT * INTO nuovatabella IN "c:\esporta.mdb" FROM Articoli


SELECT * INTO nuovatabella IN "c:\esporta.mdb" FROM Articoli
Quindi questa e' la query da usare quando avro' il mdb vuoto, eh?
Grazie ancora!
Ciao,
Angelo.-

>poi la tabella, ma per questo serve conoscere VBA.
Mh, senza stare ad ammattire troppo, posso semplicemente fare cosi': preparo
un mdb vuoto e lo salvo in un posto sicuro (dove non rischi di essere
toccato da nessuno). Quando poi si trattera' di esportare i record, copiero'
questo mdb in un nuovo file, in modo da avere sempre a disposizione un mdb
vuoto da utilizzare.
Grazie ancora.
Ciao,
Angelo.-

 vuoto da utilizzare.
Era effettivamente molto piu'semplice: e'bastato usare la CreateDatabase,
funzione che non conoscevo :-)
Ce l'ho fatta. Ovviamente cio' che mi serviva era un pelo piu'complicato di
quel che avevo descritto nell'esempio: i dati da esportare non appartengono
ad una sola tabella, ma a cinque tabelle correlate tra di loro. Dopo aver
esportato i dati nudi e crudi nel file esterno, ho dovuto aprire tramite dei
recordset ogni tabella e rinumerare i codici "di legame", dopo essermi
costruito una tabella d'appoggio con le accoppiate "vecchio codice - nuovo
codice". Solo dopo questa operazione preliminare i dati sono pronti per
essere importati nel database originale. Funziona come una scheggia, ed ho
passato una domenica di programmazione divertente come non mi capitava da
tempo (sono un vecchio C-ista, passato ad Access + VB per necessita').
Ti ringrazio ancora tantissimo.
Ciao,
Angelo.-