Newsgroup: it.comp.appl.access
Titolo: Connettersi ad un altro database Access

Il mio problema è il seguente: ho un database Access, chiamiamolo DB1 che
tengono continuamente aggiornato incrementandolo di release, ovvero aggiungo
tabelle, query, reports, codice, ecc. Di tanto in tanto faccio un deployment
in produzione, dove pero' esiste già la copia precedente, chiamiamo DB2, che
nel frattempo gli utenti hanno arricchito con dati ulteriori.
Quindi: DB1 è piu' nuovo in termini di funzionalità, DB2 è piu' vecchio ma
contiene dati piu' aggiornati. Il problema è che vorrei che da DB1 ci fosse
una procedura che, una volta lanciata, si collega a DB2 e si importa (in
pratica, sovrascrive) alcune tabelle di DB1 che sono rimaste indietro. IN
questo modo avrei DB1 sempre aggiornato sia come funzionalità che come dati,
e basterebbe fare un copia e incolla per deployare il database.
Invece ora mi tocca fare tutto a mano.
Vi chiedo se conoscete il codice Access (VB) per realizzare qualcosa del
genere: dall'interno di DB1.mdb devo in pratica dire:
collegati a DB2.mdb
delete from DB1.tabella1
insert into tabella1 select * from DB2.tabella1
delete from DB1.tabella2
insert into tabella2 select * from DB2.tabella2
close DB2.mdb
................
ecc. ecc.
Mi sapete dare il codice per realizzare il "collegati a DB2" e il
delete/insert ?
In alternativa: sapete se esiste qualche tool piu' o meno shareware per fare
quello di cui io ho bisogno?
Grazie 1.000
Paolo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 insert into tabella1 select * from DB2.tabella1
[...]
Se ci sono relazioni, immagino ce ne siano, deve essere rispettato
un certo ordine in DB1. sia per lo svuotamento delle tabelle, sia per
il successivo append.
Come siamo messi al riguardo?
.C. 

 Come siamo messi al riguardo?
Abbastanza bene direi, nel senso che chiaramente nella sequenza degli
inserimenti avrei rispettato tutti i vincoli di integrità referenziale
piuttosto che in generale le relazioni esistenti che tu citi.
Mi manca proprio la sintassi.... nel senso che logicamente so già cosa fare,
è solo il "come" che mi manca... ho poca esperienza di Access, ho sempre
usato altri database come Sybase e Oracle con sintassi (ovviamente) diverse.
Sai aiutarmi?


 diverse.
Bene, diciamo allora che disponiamo di due tabelle:
T_Delete contenente le tabelle ordinate per sequenza di svuotamento
(per le relazioni nelle quali è attiva la cancellazione in cascata
basterà indicare la Main Table);
T_Append contenente le tabelle ordinate per sequenza di Append.
Così viene evitato tutto il lavoro di determinazione
dell'ordine di Delete | Append.
Ci triviamo quindi in DB1, il database che - con riferimento ai dati -
andrà prima "svuotato" e poi "riempito".
Esistono password? Vuoi indicare nomi specifici di path\nomefile
per i due database o è sufficiente un generico riferimento a C:\DB1, etc?
Vuoi indicare nomi specifici per le tabelle elencate in T_Delete | T_Append
o è sufficiente un generico riferimento tipo T1, T2, etc?
.C.

 o è sufficiente un generico riferimento tipo T1, T2, etc?
Usiamo un riferimento generico, devo ancora valutare attentamente l'ordine
delle tabelle.
Qual'e' la sintassi?


 Qual'e' la sintassi?
Prima l'ortografia: Qual è!
Scusa, è più forte di me.
Poi la sintassi:
===================================
Private Sub Command0_Click()
Dim db As database, RemoteFilename As String
Dim RS_Delete As Recordset, RS_Append As Recordset
Dim SQL As String, LinkedTable As TableDef
Set db = CurrentDb
RemoteFilename = "C:\Access\db2.mdb"
Set RS_Delete = db.OpenRecordset("T_Delete")
Set RS_Append = db.OpenRecordset("T_Append")
' Svuota le tabelle locali elencate in RS_Delete
Do Until RS_Delete.EOF
    SQL = "DELETE " & RS_Delete![TableName] & ".* FROM " & 
RS_Delete![TableName] & ";"
    db.Execute SQL
    RS_Delete.MoveNext
Loop
' Collega dal database esterno le tabelle elencate in
' RS_Append aggiungendo il prefisso "Remote_"
Do Until RS_Append.EOF
    Set LinkedTable = db.CreateTableDef("Remote_" & RS_Append![TableName])
    LinkedTable.Connect = ";DATABASE=" & RemoteFilename
    LinkedTable.SourceTableName = RS_Append![TableName]
    db.TableDefs.Append LinkedTable
    RS_Append.MoveNext
Loop
' Esegue l'Append di ciascuna tabella Remote_XXX alla
' corrispondente XXX del database locale
RS_Append.MoveFirst
Do Until RS_Append.EOF
    SQL = "INSERT INTO " & RS_Append![TableName] & " SELECT Remote_"
    SQL = SQL & RS_Append![TableName] & ".* "
    SQL = SQL & "FROM Remote_" & RS_Append![TableName] & ";"
    db.Execute SQL
    RS_Append.MoveNext
Loop
' Elimina tutte le tabelle collegate
For Each LinkedTable In db.TableDefs
    If LinkedTable.Connect <> "" Then
        DoCmd.DeleteObject acTable, LinkedTable.Name
    End If
Next
End Sub
==================================
Con Access 2000 ti occorrono i riferimenti:
- Visual Basic For Applications
- Microsoft Access 9.0 Object Library
- Microsoft DAO 3.60 Object Library
.C. 

Sei troppo gentile ! Grazie, prometto di migliorare l'ortografia x la
prossima volta ! ;)
Ciao e 1.000 grazie ancora
Paolo


Ooooops..... mi sa che ho cantato vittoria troppo presto !!!!
Sulla prima riga,
Dim db As database
 
mi dice: compile error, user-defined type not defined.
In pratica non riconosce l'oggetto "database".
Devo per caso linkare qualcosa? Come?


Come non detto... ho linkato le librerie che mi avevi detto, ora si ferma
su:
Set RS_Delete = db.OpenRecordset ("MIGR_DELETE")
dicendo: Object variable or With block variable not set
.... CHE E' ?????


... e dopo un po' di smanettamento.... TUTTO OK , funziona ALLA GRANDE !
Many thanks !
Paolo


 ha scritto nel messaggio
news:44097175$0$18293$4faf...@reader1.news.tin.it...

scusate se mi intrometto: ma non è meglio dividere il database in BE e FE,
tenendo le tabelle  nel BE ?

 tenendo le tabelle  nel BE ?
Le intromissioni qui si chiamano interventi e son sempre gradite.
Penso comunque tu non abbia ben afferrato il problema di Paolo.
Rileggiti per benino il suo primo post.
.C. 

 ha scritto nel messaggio
news:4409daea$0$36925$4faf...@reader3.news.tin.it...

Sě, č vero, hai ragione!