CISA FotoGallery

Statistiche

Tot. visite contenuti : 914046
Home Articoli tecnici HowTo Repliche III parte: Programmazione e tecniche JRO

Repliche III parte: Programmazione e tecniche JRO

Si premette che quanto detto nei precedenti articoli sulle repliche e quanto di seguito sarà aggiunto fa riferimento alla versione di MS Jet 4.0.

Per poter replicare un database sono disponibili i seguenti strumenti:

-) Sincronia file;
-) Replica;
-) Replication Manager;
-) Sincronizzazione Internet;
-) Tecniche programmazione JRO.


Sincronia file

La Sincronia File è uno strumento che ci permette di creare immediatamente una replica con un semplice drag e drop trascinando un nostro database con il mouse da Esplora Risorse all'icona della cartella Nuovo Sincronia File. Facendo ciò un file MDB standard si trasforma in un database con tabelle e campi che supportano la replica. L'accessorio Sincronia File si installa assieme al sistema operativo, ma solo il setup dell'installazione di Ms Access aggiunge al registro di Windows un identificatore di Classe (CLSID) per i file .mdb e per il programma di sincronizzazione di Sincronia file. Quando si trascina un file .mdb in Sincronia file, Windows riconosce l'ID e risponde richiamando il programma di sincronizzazione che converte il database in una replica, e poi dà l'opzione di localizzare la Replica Master; questa caratteristica permette sia di localizzare la replica nella cartella Nuovo Sincronia File oppure nella locazione originale della Replica Master. Quando poi si cerca di sincronizzare le repliche, Sincronia File richiama il programma di sincronizzazione per aggiornare le repliche. In Sincronia file non c'è possibilità di schedulare gli aggiornamenti. L'aggiornamento avviene solo quando si fa click sul pulsante Aggiorna Tutto o Aggiorna selezione.

Nota Prima di creare una replica di un database, MS Jet 4.0 chiede se si vuole fare un backup. Se si pensa sia necessario averne una copia non replicata conviene farlo. Inoltre se si vuole fare una replica di una versione di Access precedente, viene chiesto di convertirlo ad Access 2000.


Replica

In Ms Access, andando in Strumenti-Replica, accediamo a tutti i comandi che ci permettono di rendere replicabile un database, di creare più repliche, di sincronizzarle, e comporre eventuali conflitti. Nella fase di creazione replica, mettendo la spunta al flag "Impedisci Eliminazione", che è una nuova funzione di Access2000, si ha la possibilità di impedire agli utenti di eliminare record. E' un modo semplice per impedire che per distrazione o inesperienza un utente cancelli accidentalmente un record. La replica comunque può presentare delle eliminazioni di record che si sono propagate attraverso la replica gestita dall'Amministratore.
L'eliminazione di un record ha la più alta priorità nella fase di sincronizzazione rispetto a qualunque modifica che sia associata ad un record in sincronizzazione. In Access 2000 abbiamo inoltre che un record eliminato aggiunge una voce nella tabella dei conflitti relativa ad una tabella utente. Nelle versioni precedenti si ignoravano gli aggiornamenti persi a causa di una eliminazione.

Replication Manager

Microsoft Replication Manager si trova in Microft Office Developer 2000. E' uno strumento che permette la creazione e distribuzione di repliche.


Sincronizzazione Internet

Con una sincronizzazione Internet, è possibile replicare un database su una connessione Internet o intranet. E' necessario che la replica che si trova sul server Internet abbia installato e configurato Replication Manager.
Ms Jet 4.0 introduce nuove caratteristiche quali il supporto del protocollo HTTP 1.1, la possibiltà di accedere tramite un proxy server, riduzione dei tempi di trasferimento dati e l'aggiunta di chiavi di registro per controllare il timeout del Sincronizzatore (Agente di Replication Manager che permette schedulare le sincronizzazioni).

Tecniche programmazione con JRO

Se tra i riferimenti di un nostro database inseriamo il riferimento al file msjro.dll, accediamo alla libreria JRO "Microsoft Jet and Replication Objects 2.6 Library", i cui metodi ci permettono di replicare un database, di creare repliche parziali, di sincronizzare repliche e compattare.

Creare una replica

Per la creazione di una replica si usa il metodo MakeReplicable. Il metodo crea una Replica Master, aggiunge campi e tabelle speciali che già conosciamo.

Supponiamo di voler replicare un database MiaReplica.mdb che si trova in una cartella C:\MiaCartella.


Sub CreaRepMaster(newReplica As String, Optional ColumnTracking As Boolean)

On Error GoTo RepMaster_Error

Dim RepMaster As New JRO.Replica
Dim fs As Object

' Prima di creare la replica forniamo all'utente la possibilità di eseguire
' un backup del database che si vuole replicare

If MsgBox("Vuoi creare una copia di backup", vbYesNo, "AccessGroup") = vbYes Then

Set fs = CreateObject("Scripting.FileSystemObject")
fs.Copyfile newReplica, "C:\Miacartella\MiReplicaBck.mdb"
End If

'Permettiamo la replica

If ColumnTracking = True Then
RepMaster.MakeReplicable newReplica
Else
RepMaster.MakeReplicable newReplica, False
End If

Set RepMaster = Nothing

RepMasterExit:
Exit Sub

RepMaster_Error:
MsgBox "Errore nr.: " & Err.Number & vbCrLf + vbLf & Err.Description
Resume RepMasterExit

End Sub


La sub CreaRepMaster prima di richiamare il metodo MakeReplicabile chiede all'utente se vuole eseguire una copia di salvataggio. Al sì dell'utente crea un'istanza di FileSystemObject e con il metodo Copyfile esegue il backup del file. Questo risulta un'utile operazione nel caso in cui si voglia ripristinare il database.


Sub CallCreaRepMaster()

Dim path As String
Dim repName As String

path = "C:\MiaCartella\"
repName = "MiaReplica.mdb"

CreaRepMaster path & repName, True

End Sub




Richiamando la sub CallCreaRepMaster si passano due argomenti. Il primo concatena path, che è la directory dove risiede il database che si vuole replicare e repName, che è il nomefile del database. Il secondo argomento opzionale è la variabile booleana che ci permette mantenere la traccia a livello di colonna dei conflitti di sincronizzazione. Dato che la sub CreaRepMaster come impostazione predefinita crea repliche con il tracciamento di colonna, non è necessario specificare Vero per la creazione di una replica.

Repliche parziali

La replica parziale è appunto una replica che non contiene tutti i dati che ha una replica completa. L'utilità è quella che si può avere quando computer portatili o uffici periferici debbano accedere solo ad un sottoinsieme dei dati che risiedono nella sede centrale. L'altro vantaggio sta nel minor tempo impiegato nelle fasi di sincronizzazione, in quanto è minore il numero degli aggiornamenti.

Con il metodo CreateReplica si crea una replica parziale vuota. Ogni replica parziale contiene un insieme Filters. Gli oggetti Filter dell'insieme Filters specificano ognuno un set di dati contenuti nella replica parziale. Pertanto, affinchè una replica parziale contenga dati è necessario specificare uno o più oggetti Filter dell'insieme Filters, e poi richiamare il metodo PopulatePartial.
Il filtro può essere una relazione tra tabelle o una clausola WHERE di una istruzione SQL, senza la parola chiave WHERE. Per aggiungere e specificare i filtri si usa il metodo Append dell'insieme Filters. Il metodo Append accetta tre argomenti:

i) TableName E' la tabella in cui il filtro specifica il contenuto dei dati;
ii) FilterType Una costante che denota se si tratta di una tabella o una relazione;
iii) FilterCriteria Il nome della relazione o la clausola WHERE.

Il metodo PopulatePartial elimina tutti i record di una replica parziale e inserisce i nuovi dati filtrati. Questo metodo accetta due argomenti. Una variabile oggetto che è la replica parziale che si vuole popolare e una variabile stringa che è il percorso ed il nome della replica completa a cui la replica parziale si vuole sincronizzare. Il metodo PopulatePartial si usa la prima volta quando si crea una replica parziale o quando si modificano i filtri. Per utilizzare il metodo PopulatePartial la replica deve essere aperta in accesso esclusivo, in quanto vengono per prima cosa rimossi tutti i record.

Creiamo la sub che ci servirà per la eliminazione della vecchia replica parziale.
 

Sub delFile(strFile)

On Error GoTo delFile_Error

'Utilizziamo ADO e creiamo una connessione

Dim conn1 As New ADODB.Connection
Dim fs As Object

Set fs = CreateObject("Scripting.FileSystemObject")

'Cancelliamo la vecchia replica parziale

fs.deletefile strFile

delFile_Exit:
Exit Sub

delFile_Error:

MsgBox "Errore nr.: " & Err.Number & vbCrLf + vbLf & Err.Description
Resume delFile_Exit

End Sub


Creiamo la sub che ci rende una replica parziale
 

Sub makePartial(path As String, repName As String, sourceName As String)

Dim rep As New JRO.Replica

rep.ActiveConnection = path & sourceName
rep.CreateReplica path & repName, repName, jrRepTypePartial, jrRepVisibilityGlobal, , jrRepUpdFull

End Sub

E', quindi, una replica di tipo parziale, visibilità globale, e completo aggiornamento.

Ora filtriamo la replica
 

Sub makePartialFilter(path As String, repName As String, sourceName As String)

Dim rep As New JRO.Replica

Dim fCriteria As String
Dim fTblName As String
Dim strFile As String

'cancelliamo ora la vecchia replica parziale che supponiamo essere nel
'percorso c:\MiaCartella

strFile = "c:\MiaCartella\MiaReplicaParz.mdb"
delFile (strFile)

'Ora creiamo la nuova replica parziale richiamando la sub makePartial

makePartial path, repName, sourceName

'Invochiamo il metodo Append per inserire i filtri
'Apriamo prima una connessione

rep.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
path & repName & ";Mode=Share Exclusive"

'Il primo filtro agisce sulla tabella Impiegati e filtra tutti gli
'Impiegati che sono "Addetti Compravendita"

fTblName = "Impiegati"
fCriteria = "Titolo=" & Chr(34) & "Addetti Compravendita" & Chr(34)


rep.Filters.Append fTblName, 1, fCriteria


'Il secondo filtro agisce sulla tabella Clienti e filtra
'tutti i Clienti che risiedono a Buenos Aires

fTblName = "Clienti"
fCriteria = "Città=" & Chr(34) & "Buenos Aires" & Chr(34)

rep.Filters.Append fTblName, 1, fCriteria

'Infine popoliamo la nuova replica parziale

rep.PopulatePartial path & sourceName

End Sub


Nota Il secondo argomento di Append assume il valore 1 o 2.

Con 1 indicheremo la costante jrFilterTypeTable
Con 2 indicheremo la costante jrFilterTypeRelationship

Infine la sub che la richiama passando nome file e origine:
 

Sub callMakePartialFilter()

Dim path As String
Dim repName As String
Dim sourceName As String

path = "C:\MiaCartella\"
repName = "MiaReplicaParz.mdb"
sourceName = "MiaReplica.mdb"

makePartialFilter path, repName, sourceName

End Sub


Sincronizzare


Supponiamo di avere una MiaRepMaster.mdb e una MiaRep.mdb da sincronizzare.
 

Sub SincroRep()

Dim rep1 As New JRO.Replica
Dim conn As New ADODB.Connection


'Crea la connessione con MiaReplica
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\MiaCartella\MiaReplica.mdb"
rep1.ActiveConnection = conn


'Sincronizza
rep1.Synchronize "C:\MiaCartella\MiaReplicaParz.mdb", jrSyncTypeImpExp, jrSyncModeDirect
End Sub

Compattazione

La libreria JRO ha un numero di funzioni che vanno al di la della gestione delle repliche. Ha ad esempio la compattazione di un database.


Sub CompactMDB(oldName As String, newName As String, oldPath As String, newPath As String)

Dim jt As New JRO.JetEngine
Dim strIn As String
Dim strOut As String

strIn = oldPath & oldName
strOut = newPath & newName

jt.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strIn, _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strOut

End Sub


E la sub che la richiama specificando target ed eventuale percorso


Sub callCompactMDB()

CompactMDB "MiaReplica.mdb", "MiaReplica1.mdb", "C:\MiaCartella\", "C:\MiaCartella\"

End Sub