Newsgroup: it.comp.lang.visual-basic
Titolo: [?] - Per iniziare vado bene

Ciao a tutti devo iniziare un prg che giri in rete.
  Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
  Set DB = wrkJet.OpenDatabase("Z:\ROBY\RETE2.mdb")
  Set rsDAO = DB.OpenRecordset("SELECT * FROM TABRETE", dbOpenDynaset,
dbSeeChanges)
Secondo voi ho iniziato bene o mi devo fermare?
Non devo esserci problemi se due utenti lavoro sulla stessa Tavella (rsDAO)
in questo modo cosa succede?
bye Roberto

 in questo modo cosa succede?
Cominci bene, considerando che usi DAO.
In rete, possibilmente, usa la convenzione UNC per i
percorsi (meglio "\\roby\robyshare" che z:\roby\..., il perché
lo vedi anche da questo messaggio; risolve poi questioni
relative alla "scomparsa" delle connessioni di rete permanenti)
Va meno bene - come considerazione generale - la SELECT *
(lo dico anche se probabilmente l'hai scritta così per brevità).
Spesso, lavorando in una rete, si tende ad aprire recordset
"controllati", ossia delle selezioni di cui si può ragionevolmente
prevedere la dimensione. Può essere il caso di tabelle "pivot" -
preselezioni di codici tramite i quali si effettuano selezioni
estese mirate - o sub-recordset da utilizzare come base per
query successive. Ad esempio, in una azienda, una query che
inizia con "SELECT * FROM Ordini" è un suicidio; seguita
da un "LEFT JOIN Fatture INNER JOIN Fornitori" può
essere una catastrofe. Meglio è pre-selezionare in base a un
periodo, caricare solo le intestazioni necessarie per distinguere
gli ordini e poi caricare solo l'insieme di dati relativo alle
informazioni richieste.
Per quanto riguarda la multiutenza, avendo utilizzato
l'opzione dbSeeChanges e lasciando i default per le altre,
ottieni un certo benefico effetto. L'impostazione è quella di
un Lock pessimistico attivato in fase di editing e disattivato
dopo l'update. Tutti gli errori generati da eventi Lock_edit
sono "trappable", ossia puoi gestirli da codice. Anche se
una tabella fosse aperta da Access per modifiche alla struttura,
otterresti un errore intercettabile.
In pratica, con le opzioni impostate, se un utente scrive dati
contemporaneamente ad un altro, la sua procedura viene messa
in sospensione per un breve periodo; se il lock viene rilasciato
in questo periodo può procedere con la scrittura, altrimenti
viene generato un errore intercettabile. A questo punto è
possibile impostare un attesa e ritentare la scrittura senza
che l'utente sappia che è in competizione con un altro. Lo
si avvisa solo se si supera un timeout (da gestire in proprio)
o se i dati non sono accessibili per motivi diversi (è caduta
la rete, qualcuno sta modificando la struttura del database ecc.)

 relative alla "scomparsa" delle connessioni di rete permanenti)
'Z' :č il Server. perciň uso il percorso in questo modo.
Visto che sie stato cosě gentile potresti controllare questa gestione di
blocco per favore ?
Private Sub Command1_Click()
On Error GoTo Err_Salva
  Dim Estrai As Integer
  Estrai = rsDAO("COD") + 1
Riprova:
  rsDAO.Edit                      'se trova bloccato va in Err_Salva.
Giusto?
  rsDAO("cod") = Estrai
  rsDAO.Update
  rsDAO.Bookmark = rsDAO.LastModified
  Text1.Caption = rsDAO("COD")
  Exit Sub
Err_Salva:
  inserire  Ritardo                'in che modo inserisco un ritardo?
  GoTo Riprova                  'Riprovo, e se trova di nuovo bloccato?
non ritorna piů in Err_Salva, Vero?
Se il msg č lungo puoi rispondermi anche via e-mail
bye Roberto

 non ritorna piů in Err_Salva, Vero?
Ritorna solo se si verificano altri blocchi.
Devi inserire prima di "Goto Riprova" una verifica
del tempo di attesa complessivo o, meglio, del numero
di iterazioni della procedura di attesa. Qualche cosa tipo:
    Screen.MousePointer = 11
    Iterazioni = Iterazioni + ProcWait()
    If Iterazioni > X then
        'Se si superano X iterazioni, quindi č trascorso
        'un periodo di tempo noto, comunica ed esce
        Screen.MousePointer = 0
        MsgBox Err.Decription
        Exit Sub
    end if
Un ProcWait() potrebbe essere
    Public Function WaitOneSecond() as Integer
    Dim TimeElapsed as Long
    Dim Dummy as Long
       ' Attende un secondo
        TimeElapsed = GetTickCount() + 1000
        Do while TimeElapsed > GetTickCount()
            Dummy = DoEvents()
        loop
        WaitOneSecond = 1
    end function

  percorsi (meglio "\\roby\robyshare" che z:\roby\..., il perché
in questo modo quando eseguo il prg da un altro utente MS JET mi dice che il
DB è aperto da un altro utente
anche se lo apro in questo modo OpenDatabase("\\roby\HD_roby\MIODB:MDB")
Dimmi tu dove sbaglio
bye Roberto

Così facendo otterrò quallo che voglio. Cioè l'utente non dovrà mai vedere
il msg "Errore durante la modifica perchè bloccato da un altro utente".
Voglio che se si verifichi l'errore aspetti affinchè non sia libero. come se
fosse un While affinchè non si verifichi la condizione di sbloccato.
la funzione lo dovuta cancellare perche il msg era lungo
Scusami Jimi ma non riesco a seguirti, primo o poi tutti gli utenti
salveranno i loro Record?
Questo discorso avviene con l' Edit, il discorso è lo stesso sull'AddNew?
bye Roberto

 Questo discorso avviene con l' Edit, il discorso è lo stesso sull'AddNew?
Con un'impostazione dbPessimistic (default) il lock avviene
prima di un edit o di un addnew.
Con un'impostazione dbOptimistic avviene prima di un Update.
In entrambi in casi, se il recordset è bloccato, si verifica un
roolback automatico. In ambiente multiutente è preferibile
mantenere il comportamento di default.

 Dimmi tu dove sbaglio
Forse hai usato in qualche dichiarazione l'opzione dbDenyWrite.
Purtroppo ne scaturisce anche un dbDenyRead in multiutenza.
O forse sono le impostazioni della rete.
Che rete hai ? Che protocolli ? NT con privilegi di accesso
a livello utente ? Privilegi sull'accesso ai file ? (ecc.)

 a livello utente ? Privilegi sull'accesso ai file ? (ecc.)
Ho semplicemente messo il DB sul un Pc1 486 con W95.
Rete LAN con protocolli TCP/IP
dbDenyWrite non so nemmeno di quale proprietą fa parte.
bye Roberto