Capitolo 14. Lavorare in Rete

 

14.1 Struttura di Rete

                                                                                                                                                                                                                    Vogliamo fare qui alcune considerazioni di carattere generale che possono risultare utili a chi intende preparare un sistema di Rete con vari utenti che lavorano da macchine diverse ma che accedono tutti ad un’unica banca dati.

 

La Rete si realizza con il necessario Hardware, del quale non vogliamo qui occuparci ed il risultato concreto dell’esistenza di una rete é che ogni computer collegato vede, oltre che ai propri dischi specifici ( certamente il C: ed eventualmente D. , E: etc. )  anche un alto disco (Server di Rete) , non presente fisicamente sulla propria macchina e contraddistinto con una lettera prefissata durante la configurazione del sistema di Rete.

 

Per alcune configurazioni il Server di Rete é visto da tutte le macchine con la stessa lettera, ad esempio , che so, “W”. In tal caso i programmi presentati finora sono validi senza modifica con la sola avvertenza che la variabile “PATHMDB” venga definita come :

 

pathmdb = W:\CARTELLA_DEI_DATI\MAGFILE

 

In altri casi, una macchina vede per esempio il disco remoto con la lettera “H:”, un’altra con la lettera “J:”  etc. pur restando comunque il fatto che i dati sono collocati una volta sola sul disco remoto, indipendentemente dalla lettera sotto la quale li si vede.

 

Esiste allora il problema di indirizzare la procedura al momento del lancio nella giusta Cartella: Disco, Percorso e Database. Ci sono due soluzioni possibili: la prima prevede che l’EXE (ottenuto per compilazione del Progetto) sia posto nella stessa cartella ove sono i dati, cioe’ nel Server. In questo caso il problema si risolve modificando la routine “APRIPROGETTO” come segue (chiamiamola “APRIPROGETTO1” per distinguerla da quella nota):

 

Sub apriprogetto1()

 

'generali

'--------------------

acapo = Chr$(13) + Chr$(10)

‘pathmdb = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAGFILE.MDB"

pathmdb = App.Path & "\MAGFILE"

 

'Connessione

'---------------------

Cn.CursorLocation = adUseClient

Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _

            "Data Source=" & pathmdb

End Sub

La variabile App.Path identifica sempre la Cartella di partenza della Procedura, quindi il trucco funziona sempre e soltanto se avremo messo i Dati e l’EXE nella stessa Cartella.

 

Per verificare questi concetti si proceda allora alla compilazione del Progetto1 di uno qualunque degli Esercizi precedenti dopo aver apportato la modifica sopra indicata e scegliendo imperativamente  come Cartella di creazione del file “EXE”  la:

 

     “C:\GRIGLIE_ADO\ARCHIVIODATI”

 

Lanciando ora l’EXE da questa Cartella, l’istruzione App.Path permette di cercare i dati in questa stesa Cartella e tutto funzionerà

 

 

14.2 EXE e Dati in Cartelle diverse

 

Quanto sopra va bene, come detto, se l’EXE ed i Dati sono nella stessa cartella.

 

Ci sono però situazioni di Rete in cui questo, per vari motivi, non si può fare.

 

In questo caso, se ammettiamo per esempio che il File dati “MAGFILE” si trovi nella Cartella “ARCHIVIODATI” o qualunque altro percorso (“PIPPO\ARCHIVIO\ETC”) del disco remoto, succede che, per il primo computer, la Cartella dati é la “H:\ARCHIVIODATI\CDRFILE”  mentre per il secondo computer é la “J:\ARCHIVIODATI\CDRFILE”. In altre parole la variabile “PATHMDB” , con cui abbiamo lavorato finora, va definita macchina per macchina.

 

Ciò significa che ciascun computer deve conservare memorizzati sul proprio disco fisico i dati che compongono il percorso e li deve richiamare al momento del lancio.

 

Il modo migliore di memorizzare dei dati é quello di usare un Database specifico da collocare su ogni macchina. L’abbiamo già incontrato: é il “MIOFILE” , di cui abbiamo parlato sopra e che, per il momento, possiede solo la Tabella “ARTTEMP”. É il posto giusto per aggiungere una seconda Tabella con nome ad esempio “RETFILE” , con queste caratteristiche:

 

Campo   Nome campo            Tipo              Dim

 

1           DISCO                     Testo               1

2           PERCORSO               Testo              50

3           DATABASE               Testo              50

 

Dotiamo questa Tabella di un solo Record, nel quale scriveremo gli elementi per indirizzare il Path di Rete.

 

DISCO=          ”C”                                          perché per noi il disco “Server” é proprio il “C”

PERCORSO=   ”GRIGLIE_ADO\ARCHIVIODATI”  perché é in questa Cartella che c’é il Database.

DATABASE=   “MAGFILE.MDB”                                  nome del Database su cui lavoriamo.

 

Prepariamo allora una nuova Cartella la ESERCIZIO_14_ADO copiando ed incollando per esempio la Cartella ESERCIZIO_11_ADO.

 

Modifichiamo per prima cosa il Form_Load di MENU, lancio del progetto,  come segue:

 

Private Sub Form_Load()

 

'apertura progetto

'--------------------

If flarete = 0 Then

apriprogetto

End If

 

End Sub

 

Al lancio del progetto la variabile Global  “FLARETE” vale appunto zero e la routine “APRIPROGETTO” viene lanciata.

 

Modifichiamo ore la Subroutine “APRIPROGETTO” presente sul Modulo1 e lanciata dall’evento “FORM_LOAD” del “MENU”  come segue:

 

Sub apriprogetto()

On Error GoTo errori:

 

'generali

'--------------------

acapo = Chr$(13) + Chr$(10)

 

'rete

'--------------------------------------

pathmia = "C:\GRIGLIE_ADO\ARCHIVIODATI\MAG.MIA\MIOFILE.MDB"

 

'Connessione Mia

'---------------------

CnMia.CursorLocation = adUseClient

CnMia.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _

            "Data Source=" & pathmia

Selezione = "Select * from RETFILE"

ret11.Open "" & Selezione & "", CnMia, adOpenStatic, adLockOptimistic

 

'pathmdb

'---------------------

pathmdb = ret11!disco & ":\"

'-------------------------------------

If Trim(ret11!percorso) <> Empty Then

pathmdb = pathmdb & Trim(ret11!percorso) & "\"

End If

'-------------------------------------

If Trim(ret11!Database) <> Empty Then

pathmdb = pathmdb & Trim(ret11!Database) & ".MDB"

End If

 

'Connessione

'---------------------

Cn.CursorLocation = adUseClient

Cn.CursorLocation = adUseClient

Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _

            "Data Source=" & pathmdb

art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

art11.Close

 

'ordinamento

'--------------------

artordi = 1

proordi = 1

 

'errori

'--------------------

Exit Sub

 

errori:

MsgBox ("Errore di setting dei dati !")

If ret11!disco <> Empty Then

frmRete.txtDisco.Text = ret11!disco

Else

frmRete.txtDisco.Text = Empty

End If

If ret11!percorso <> Empty Then

frmRete.txtPercorso.Text = ret11!percorso

Else

frmRete.txtPercorso.Text = Empty

End If

If ret11!Database <> Empty Then

frmRete.txtDatabase.Text = ret11!Database

Else

frmRete.txtDatabase.Text = Empty

End If

 

frmRete.Show

Unload Menu

End Sub

 

I nuovo oggetti ADO vanno inoltre dichiarati in Modulo1

 

' global generali

'-------------------

Global pathmdb

Global pathmia

Global acapo

Global Cn As New ADODB.Connection

Global CnMia As New ADODB.Connection

Global ret11 As New ADODB.Recordset

Global Selezione

Global flarete

 

La Routine APRIPROGETTO apre un RecordSet “RET11” dalla Tabella “RETFILE” del Database “MIOFILE” posizionato nella Cartella di lancio standardizzata “C:\GRIGLIE\ARCHIVIODATI\MAG.MIA” (oppure, in un progetto reale, “C:\MAG.MIA”) e costruisce la variabile “PATHMDB” con i dati lì immagazzinati.

 

Dopo di che tenta una Connessione e l’apertura di un RecordSet, per esempio “ART11”.

Se la connessione riesce, il RecordSet viene richiuso di nuovo, il flag “FLARETE” viene posto a uno e si procede.

 

In caso invece di errato “PATHMDB”, la Connessione non si realizza ed Progetto va in errore.

 

L’Errore si può verificare perché il sistema Rete non é attivo oppure perché il Database ha collocazione diversa da quella che abbiamo lasciato l’ultima volta etc, . Questo Errore  viene intercettato aprendo un apposito Form “FRMRETE” che avremo aggiunto al nostro Progetto e che si presenta come segue:

 

 

 

Nel Form sono presenti tre TextBox a nome “TXTDISCO”, “TXTPERCORSO” e “TXTDATABASE” che vengono riempite nella Routine di errore o lasciate blank a seconda del contenuto del campo dell’unico Record della Tabella “RETFILE”

 

Per esempio ammettiamo che il campo “DISCO” sia stato lasciato vuoto; apparirà la seguente situazione:

 

 

Le TextBox di questo Form vanno riempite con dati tali che il Disco di Rete, il Percorso di Rete ed il nome del Database siano reali. Nel nostro caso didattico il Disco é “C” ma per un sistema vero dovremo impostare “H” oppure “J” a seconda di come la nostra macchina vede il Server di Rete.

 

L’evento Click del bottone “CONFERMA” verifica questi dati fino a che essi siano buoni, cioè fino a che  il “PATHMDB” che ne risulta corrisponda ad una vera situazione di Rete, li memorizza nel “RETFILE”  e la procedura non li chiederà più ai  prossimi rilanci, pur controllandoli sempre.

 

La Connessione che prima era fallita viene ora attivata e testata con l’apertura di un RecordSet, per esempio “ART11”. Se la connessione riesce, il RecordSet viene richiuso di nuovo, il flag “FLARETE” viene posto a uno e si procede.

 

Il passaggio di “FLARETE” da zero ad uno assicura che la “APRIPROGETTO”  nel Form_Load di “MENU” venga lanciata una ed una sola volta.

 

Ecco la Routine:

 

Private Sub cmdConferma_Click()

 

'controlla directory

'--------------------------

On Error Resume Next

zdire = txtDisco & ":\" & Trim(txtPercorso)

If Dir(zdire, 16) = "" Then

titolo = "Attenzione"

Messaggio = "      Directory " & acapo & zdire & acapo & "      Non Esiste "

Stile = vbOKOnly + vbExclamation ' Definisce pulsanti.

Risposta = MsgBox(Messaggio, Stile, titolo, 0, 0)

Exit Sub

End If

 

'ricalcola pathmdb

'--------------------------

'On Error GoTo errori

 

pathmdb = txtDisco & ":\"

If Trim(txtPercorso) <> Empty Then

pathmdb = pathmdb & Trim(txtPercorso) & "\"

End If

If Trim(txtDatabase) <> Empty Then

pathmdb = pathmdb & Trim(txtDatabase) & ".MDB"

End If

 

'controlla database

'-------------------------------------

Cn.Close

 

'Connessione che prima era fallita

'-----------------------------------

Cn.CursorLocation = adUseClient

Cn.Open "data Provider=Microsoft.Jet.OLEDB.4.0;Provider=MSDataShape.1;" & _

            "Data Source=" & pathmdb

Selezione = "SELECT * from ARTFILE order by ARTCODI"

art11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

flarete = 1

 

'registra i dati di rete

'--------------------------

ret11!disco = Left(frmRete.txtDisco.Text, 1)

ret11!percorso = Left(frmRete.txtPercorso.Text, 50)

ret11!Database = Left(frmRete.txtDatabase.Text, 50)

ret11.Update

 

'lancia menu

'-------------------------------------

Menu.Show

art11.Close

Unload frmRete

 

'errori

'--------------------

Exit Sub

 

errori:

titolo = "Attenzione !"

Messaggio = "Errore nel Nome del Database !"

Stile = vbOKOnly + vbExclamation ' Definisce pulsanti.

Risposta = MsgBox(Messaggio, Stile, titolo, 0, 0)

frmRete.Show

 

End Sub

 

 

 

Fine del Capitolo 14.  Lavorare in Rete