Allineamento tabelle Access

martedì 07 giugno 2005 - 16.10

assauei Profilo | Newbie

Ciao a tutti,

mio malgrado mi trovo a lavorare con Access, devo fare in modo che una tabella su un database venga aggiornata quotidianamente sulla base della tabella di un altro database... sapete se Access è in grado di fare un allineamento di questo tipo?

Brainkiller Profilo | Guru

Ciao,
una bel problema. Effettivamente non ci ho mai pensato. Access in se non può farlo perchè il database è statico e risiede su disco, non c'è un servizio com in SQL Server.

Dipende dall'altra parte che database hai, dipende se sono sulla stessa subnet. In teoria se i dati non sono troppi potresti fare un webservice di transito che giri i dati da un DB all'altro che richiami tu via web, o tramite script.

Fornisci ulteriori info così troviamo una soluzione.
ciao
david

assauei Profilo | Newbie

Ciao,

si tratta di due datbase access che girano all'interno della stessa subnet, le tabelle in questione contano circa 9000 record... non sono così tanti.
Forse la soluzione più semplice è uno script eseguito periodicamente che allinei i contenuti delle due tabelle.

lbenaglia Profilo | Guru

> mio malgrado mi trovo a lavorare con Access, devo fare in modo che una tabella su un database
> venga aggiornata quotidianamente sulla base della tabella di un altro database...
> sapete se Access è in grado di fare un allineamento di questo tipo?

Ciao assauei,

Come ti ha già indicato David, Access non possiede un engine server side, quindi non esiste una "entità" in grado di coordinare query distribuite.
Ad ogni modo Access implementa una simpatica feature che ti permette ugualmente di eseguire query distribuite ;-)

Supponiamo di avere db1.mdb e db2.mdb che risiedono fisicamente in una share su due server distinti e di voler allineare il contenuto della Tabella1.
Nel db1 potresti salvare una query che esegua il seguente comando SQL:

INSERT INTO Tabella1
SELECT T1.*
FROM [MS ACCESS;Database=\\server\share\Db2.mdb].Tabella1 AS T1
LEFT JOIN Tabella1 AS T2 ON T1.Codice=T2.Codice
WHERE T2.Codice IS NULL

Ovvero, inserisco nella Tabella1 del db1 tutte le righe di Tabella1 del db2 che non sono già presenti nel db1.


Analogamente sul db2 andrai a scrivere una query che esegue l'allineamento opposto:

INSERT INTO Tabella1
SELECT T1.*
FROM [MS ACCESS;Database=\\server\share\Db1.mdb].Tabella1 AS T1
LEFT JOIN Tabella1 AS T2 ON T1.Codice=T2.Codice
WHERE T2.Codice IS NULL

L'esecuzione di queste query puoi effettuarla scrivendo un banale .vbs che tramite DAO o ADO vada ad interfacciarsi con i db e schedularne l'esecuzione ad un orario predefinito tramite uno Scheduled Task.
Ovviamente dovrai associare al task un utente in grado di accedere alle corrispettive share.

Prova a lavorarci un po' sopra ed in caso di dubbi siamo qua a disposizione :-)

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

assauei Profilo | Newbie

fantastico!
c'è un solo problema... mi capita spesso di usare l'asp anche se non è il linguaggio che utilizzo di più, per 'utilizzare uno script' infatti intendevo uno script asp... ma come si fa con .vbs? puoi farmi un esempio di come dovrebbe essere lo script?

lbenaglia Profilo | Guru

> intendevo uno script asp... ma come si fa con .vbs?
> puoi farmi un esempio di come dovrebbe essere lo script?

Allora, vediamo un esempio concreto.
Supponiamo di avere la tabella Students nei database db1.mdb e db2.mdb con la seguente struttura:

StudentID - Number e Primary Key
FirstName - Text(20)
LastName - Text(20)

La tabella db1.Students è popolata con i seguenti studenti:

StudentID..FirstName..LastName
----------- ----------- ---------
1.................Lorenzo.......Benaglia
2.................Luca............Bianchi
3.................Andrea........Montanari

La tabella db2.Students è popolata con i seguenti studenti:

StudentID..FirstName..LastName
----------- ----------- ---------
1.................Lorenzo.......Benaglia
4.................Gianluca......Hotz

Per semplicità i due database risiedono in locale sulla mia macchina (Supermicro) nelle seguenti share:
\\Supermicro\share1\db1.mdb
\\Supermicro\share2\db2.mdb

OK, andiamo a definire le query qryAlignDatabase in entrambi i database.

db1:

INSERT INTO Students
SELECT S1.*
FROM [MS ACCESS;Database=\\Supermicro\share2\db2.mdb].Students AS S1
LEFT JOIN Students AS S2 ON S1.StudentID = S2.StudentID
WHERE S2.StudentID IS NULL;

db2:

INSERT INTO Students
SELECT S1.*
FROM [MS ACCESS;Database=\\Supermicro\share1\db1.mdb].Students AS S1
LEFT JOIN Students AS S2 ON S1.StudentID = S2.StudentID
WHERE S2.StudentID IS NULL;

A questo punto preparo gli sctipt AlignDatabase1.vbs e AlignDatabase2.vbs che verranno schedulati sui corrispettivi server.


AlignDatabase1.vbs

<BOF>

Dim cn
Dim strFirstName

Const CN_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\share1\db1.mdb;"

On Error Resume Next

' Apro la connessione
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = CN_STRING
cn.open

' Eseguo la query qryAlignDatabase
cn.Execute "qryAlignDatabase"

' Chiudo la connessione e distruggo l'oggetto
cn.close
Set cn = Nothing

<EOF>


AlignDatabase2.vbs

<BOF>

Dim cn
Dim strFirstName

Const CN_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\share2\db2.mdb;"

On Error Resume Next

' Apro la connessione
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = CN_STRING
cn.open

' Eseguo la query qryAlignDatabase
cn.Execute "qryAlignDatabase"

' Chiudo la connessione e distruggo l'oggetto
cn.close
Set cn = Nothing

<EOF>

Beh, ora non ti resta che definire uno scheduled task sui due server che esegua periodicamente i .vbs

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

assauei Profilo | Newbie

perfetto!
non potevi essere più chiaro, grazie mille.
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