Newsgroup: it.comp.lang.visual-basic
Titolo: Problemi in multiutenza

Ciao a tutti.
Ho un problema con un programma che sto realizzando in ufficio
relativamente alla parte che riguarda l'accesso ai dati in
multiutenza.
Se avete un po' di pazienza vi racconto tutto :-)
PREMESSE:
1. la base dati e l'eseguibile sono su una directory condivisa di un
server (NT 4.0)
2. ciascun client (W95) esegue il programma lanciandolo dal server
(icona linkata all'eseguibile)
3. il programma e' realizzato in VB5
4. l'apertura della base dati e' effettuata, ovviamente, in modalita'
condivisa, utilizzando il blocco ottimistico (LockEdits = False)
PROCEDURA:
Fedele al detto "Chi prima arriva meglio alloggia", il primo utente
che arriva, appunto, si posiziona su un record, DOPO AVER SCRITTO IN
UNA TABELLA APPOSITAMENTE CREATA (che ho chiamato, con poca fantasia,
"Blocchi"), IL SUO NOME, LA TABELLA ALLA QUALE HA ACCEDUTO E L'ID DEL
RECORD CHE HA BLOCCATO (es.: nel campo Utente scrivo "Nando", nel
campo Tabella scrivo "Libri" e nel campo Chiave scrivo "321").
Lo sfortunato che arriva per secondo, fa un controllo per vedere se
nella tabella Blocchi c'e' gia' qualcuno che sta usando lo stesso
record che, illuso, vorrebbe usare lui (il 321 della tabella Libri).
Ovviamente se non trova alcun record, o tra quelli che ci sono non
c'e' il record che gli serve, effettua l'operazione di scrittura del
nome, della tabella e dell'id del record che si appresta a bloccare e
procede.
In caso affermativo, cioe' se trova un record contenente la stessa
tabella e lo stesso id che serve a lui, il programma lo avvisa che non
e' possibile accedere al record perche' e' bloccato da un altro
utente.
A questo punto il secondo utente puo' scegliere se riprovare a
bloccare il record, oppure annullare.
ECCO IL PROBLEMA:
Supponiamo che il secondo utente decida di annullare E NON FA
NIENT'ALTRO, cioe' non continui ad usare il programma.
Quando il primo utente chiude la maschera del record che ha bloccato,
il programma apre la tabella Blocchi e cancella il record
precedentemente scritto, in modo che altri utenti possano effettuare
altre modifiche allo stesso.
Il problema e' proprio questo: quando apro la tabella Blocchi, mi
posiziono sul record da eliminare e tento di eliminarlo, ricevo un
messaggio da VB che mi dice (piu' o meno): "Impossibile salvare. Il
record e' bloccato dall'utente "admin" sulla macchina "TEST01"".
PECCHE', WHY??????
IL SECONDO UTENTE HA ACCEDUTO SOLO IN LETTURA PER VEDERE SE POTEVA
BLOCCARE IL RECORD!
Da quando l'accesso in lettura effettua un blocco di pagina????
Il bello e' che se il secondo utente, invece di non fare niente, si
mette a consultare un'altra tabella, tutto procede tranquillamente.
E' come se dovessi fare un refresh della base dati, ma non credo.
RICAPITOLANDO:
L'utente A scrive nome, tabella e id nella tabella Blocchi e
visualizza il record da modificare (operazioni effettuate: apertura
tabella, seek con esito negativo, scrittura, chiusura)
L'utente B apre la tabella Blocchi per vedere se puo' modificare lo
stesso record (operazioni effettuate: apertura tabella, seek con esito
positivo, chiusura)
L'utente A finisce le modifiche e cancella dalla tabella Blocchi il
record che aveva inserito prima (operazioni effettuate: apertura
tabella, seek con esito positivo, delete, chiusura) ** ERRORE **
C'e' qualcuno al quale sia capitata la stessa cosa, oppure anche se
non gli e' capitata mi sa dire come risolvere il problema?
E' piuttosto urgente, dato che e' un bel po' che tento di risolverlo
da solo.
Grazie per essere arrivati fin qui :-)))
Nando
P.S.: In ufficio abbiamo la licenza SELECT della Microsoft, quindi
niente manuali e a chiedere di comprarli passano, a essere ottimisti,
3-4 mesi.

3-4 mesi.
tanto non servono..


Anche in questo caso dovresti avere disponibile sul CD la
documentazione in linea, che contiene la versione elettronica di tutti
i manuali.
Ciao
--------------------------------------------------------------------
Fulvio Senore
Eliminate "zz" dall'indirizzo e-mail per scrivermi (spammers...)
Remove "zz" from e-mail address to write me (spammers...)
--------------------------------------------------------------------

corruzione del database in caso di spegnimento del server.
Per il data control non c'e' problema, dato che avevo gia' deciso di
non usarlo, ma devo prendere in seria considerazione l'uso delle
transazioni, che attualmente non sono implementate.
Leggendo l'help di VB qua e la', mi sembra di aver capito che usando
le connessioni e gli oggetti RDO le prestazioni migliorano
sensibilmente. E' cosi'? Inoltre i blocchi vengono gestiti in maniera
diversa, o mi sbaglio?
Ciao e grazie per i consigli
P.S.: Ricordati del codice di esempio per bloccare i byte di un file,
per favore.


Spiacente, ma non ho mai implementato questo metodo. Avevo solo fatto
una prova e visto che funzionava.
In definitiva devi aprire il file fasullo come binary. Poi provi a
bloccare un byte con l'istruzione lock: se tutto va bene il byte era
libero, altrimenti scatta un errore intercettabile. Sta a te
intercettarlo e dire all'utente che il record è occupato.
