Newsgroup: it.comp.appl.access
Titolo: Gestione in rete di tabelle collegate

Lavorando con A2000, BE unico e piů FE in rete, vorrei poter controllare in 
anticipo se un record č utilizzato da un altro utente. Nella pratica, piů 
utenti lavorano sulla maschera Bolle. Access segnala solo al momento 
dell'aggiornamento se il record č bloccato da un altro utente con una serie 
di domande "imbarazzanti" su quello che si vuole fare. Sarebbe bene invece 
che se un record č in uso, non posso nemmeno iniziare la variazione e tanto 
meno la eliminazione.
-- 
Ciao, Sandrobi
-----------------
Se la tua email č fasulla, ti invito a leggere 
http://wiki.news.nic.it/AntiSpam
 

 
http://wiki.news.nic.it/AntiSpam
Ti rispondo per sentito dire, anche se non è molto professionale, e mi 
correggano i sig.ri del NG se sparo qualche baggianata.
Se un utente sta editando un record con il blocco ottimistico, se un altro 
utente tenta di editare lo stesso record dovrebbe risultare errore. il gioco 
sta nell'aprire subito il record in modalità edit ancora prima di scrivere 
alcun dato. Poi gestirai tramite codice la decisione di effettuare la 
scrittura o meno. Così facendo il record risulterà "ad apertura esclusiva". 

Scusa, correggo ottimistico con pessimistico.
Michele 

 Michele
Si, questo metodo l'ho provato ma il problema è che vengono bloccati anche i 
record vicini. L'impostazione di blocco ottimistico o pessimistico non 
cambia il risultato. Lo stesso non cambia se imposto, sempre in Strumenti > 
Opzioni, il blocco a livello di record anziché a livello di pagina, perchè 
il blocco a livello di record vale sono in pochi casi particolari, non 
troppo chiari, basta leggere l'help spostando il ? sulla casella. Quindi 
temo sia proprio un limite del JET che va sopportato!
Probabilmente non è prevista la possibilità di sapere se un record sia 
aperto e solo lui e non uno dei sui vicini.
Sandrobi 

 ha scritto nel messaggio
news:450d2229$0$15864$4faf...@reader2.news.tin.it...

Questione interessante che, da ignorante quale sono, vorrei capire meglio.
Prima questione: se il db è condiviso e tutti gli utenti lo sanno, mi sembra
corretta la notifica del conflitto. Sotto questo profilo, non vedo
alternative alla gestione delle notifiche. Ogni utente sa che il record che
vuole modificare potrebbe essere oggetto di modifica da parte di altri e
deve essere consapevole che, se accade, dovrà mettersi in coda.
Seconda questione: la gestione da codice. Mi chiedo se è possibile aprire in
esclusiva il record se un altro utente lo sta modificando. Visto che il BE è
unico, uno dei due utenti deve prevalere ma, ammesso che ciò abbia un senso,
non ho idea di come possa avvenire. Penso ai privilegi d'accesso, ma se i
due utenti hanno privilegi identici? Tuttavia, se questo è possibile e
partendo dal presupposto che con un db condiviso tutti gli utenti dovrebbero
lavorare per uno scopo comune, eliminando la gestione delle notifiche, non
si mette a rischio lo scopo stesso per il quale il db è stato progettato?
Dubbi da niubbo.
Ciao.

 i record vicini. L'impostazione di blocco ottimistico o pessimistico non
Premetto che io sto usando il 2002 (XP)
Guarda, siccome mi sono incuriosito, mi sono creato due moduli su due mdb 
diversi.
Una volta aperte due istanze di access, ho fatto eseguire con F8 due 
funzioni che mi aprivano la stessa tabella di uno stesso database (un terzo) 
con il metodo opendatabase
Premetto che il terzo db, che chiamo dborig.mdb, è settato con
Accesso condiviso
Blocco record modificati
Blocco a livello di record
La funzione con cui apro il db è:
--------------------------------------------
Function prova()
On Error GoTo errore
Dim db As DAO.Database
Dim rcd1 As DAO.Recordset
Set db = DBEngine.OpenDatabase("c:\dborig.mdb")
Set rcd1 = db.OpenRecordset("Clienti", dbOpenDynaset, dbSeeChanges, 
dbPessimistic)
rcd1.Edit
Exit Function
errore:
If Err.Number = 3260 Then MsgBox "Bloccato"
End Function
----------------------------------------
Da notare dbseechanges e dbpessimistic.
Mandando in esecuzione con F8 (da due istanze di access aperte in 
contemporanea) una volta superato rcd1.edit sulla prima istanza, 
superandolo sulla seconda viene generato il 3260 che mi dice che il record è 
già in corso di modifica.
Invece eseguendo sempre la funzione sopra, e sulla seconda istanza la 
funzione:
----------------------------------------------
Function prova2()
On Error GoTo errore
Dim db As DAO.Database
Dim rcd1 As DAO.Recordset
Set db = DBEngine.OpenDatabase("c:\dborig.mdb")
Set rcd1 = db.OpenRecordset("Clienti", dbOpenDynaset, dbSeeChanges, 
dbPessimistic)
rcd1.Movenext
rcd1.Edit
Exit Function
errore:
If Err.Number = 3260 Then MsgBox "Bloccato"
End Function
----------------------------------------
da notare rcd1.movenext che si sposta sul secondo record anziche rimanere 
sul primo, il conflitto non compare e la funzione si conclude. Questo 
provando sia con blocco a livello di record, sia senza.
Di più non posso dire. Fammi sapere se concludi qualcosa.
In alternativa potresti utilizzare una tabella dove vengono registrati i 
record in corso di modifica, e costruire un passaggio obbligato tramite 
questa tabella, che risiede sul BE, per continuare l'accesso. Sarà una 
tabella aperta in blocco totale istantaneo in cui le operazioni di lettura e 
scrittura  dureranno solo la decisione di modificare un record o di 
cancellare la sua presenza una volta effettuato il salvataggio. In 
alternativa, un campo si/no in parallelo alle bolle che identifica il corso 
di modifica, ma te lo sconsiglio in quanto il blocco totale (e con blocco 
totale intendo l'opzione dbdenywrite nel recordset) per quanto breve 
andrebbe contro ad altri accessi per altri motivi.
Saluti e buona domenica, anche se qua piove.
Michele


Adesso ho capito a cosa alludi dicendo che il motore jet ha un difetto per 
il blocco record.
In effetti, nonostante in tutti e tre i database siano spuntate le opzioni 
Accesso condiviso, Blocco record modificati e blocco a livello di record, 
anche semplicemente aprendo la tabella del BE mi risultano bloccati i primi 
18 records, altro che blocco a livello di record!
Mi sa che il mio esperimento ha avuto solo fortuna o una serie di 
circostanze favorevoli. E' da considerarsi fasullo.....si vede che il motore 
jet stava bruciando carburante con pochi ottani.
Ti conviene gestirti da solo l'accesso ai records con una tabella di 
supporto, così sei tranquillo che tutto va come vuoi. Almeno quella, quando 
la blocchi, sai che è bloccata al 100%.
Michele

>
La speranza è l'ultima a morire.
Ti informo che ho provato ad aprire il database BE con la famigerata tabella 
Clienti (58 records) con il metodo Open di ADODB.connection.
Sempre fermo restando che il BE ha il blocco per i record modificati e il 
blocco a livello di singolo record, ho provato, sempre con due istanze di 
access, ad aprire due recordset ADODB con il blocco pessimistico. Bloccando 
il primo record con la prima istanza (per farlo non c'è edit, bensì basta 
dare un nuovo valore ad un campo), si genera errore di runtime tentando di 
modificare sia da tabella BE, sia dalla seconda istanza, solo il primo 
record, gli altri sono tutti liberi (ho provato con un ciclo per l'istanza, 
e a mano per ogni record della tabella).
Questo vuol dire, almeno per il momento, che ADO riesce ad interagire con 
l'opzione "Blocco a livello di record", e sempre tramite ADO, è possibile 
intercettare singolarmente tutti i records bloccati.
Domani ti spiego meglio, ora vado a dormire.
Michele