Problème uptdate dans application multi-utilisateurs (Access)

kat40 Messages postés 38 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 19 mars 2008 - 1 avril 2004 à 21:38
kat40 Messages postés 38 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 19 mars 2008 - 2 avril 2004 à 16:42
Bonjour à tous,

J'ai besoin de votre aide, voic mon problème:

Comment pourais-je faire pour que deux utilisateurs en même temps puissent faire un update dans ma base de données (Access) sans que mon programme VB (ou que la BD) génère une erreur.

Peut-être aviser le deuxième utilisateur que l'application est occupée (attendre 2 minutes)ou peut-être aussi bloquer la saisie des données (bouton ajouter)

Merci a l'avance

3 réponses

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
1 avril 2004 à 21:53
La méthoide classique dans ce genre de problème (c'est ce que fait une carte réseau éthernet en cas de collision d'un paquet qu'elle émet, par exemple)
c'est la suivante :

1- Tentative d'execution de l'action
2- Si echec, attendre un certain temps
3- Refaire l'étape 1

Bien sur, on n'autorise qu'un certain nombre de tentatives
Et pour ce qui est du "certain temps", le mieux est de ne pas fixer une valeur en dure dans ton code. A chaque besoin d'attente, tire un nombre aléatoire pour attendre entre 5 et 15 secondes par exemple.
Ainsi, si tu as 2 clients qui sont bloqués au même moment par un troisième, ils ne se débloqueront pas en même temps et passerons alors bien l'un après l'autre (ce serait vraiment le coup de malchance que tes deux racines de nombres aléatoires soient identiques sur les deux machines !!

Christophe R.
0
kat40 Messages postés 38 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 19 mars 2008
1 avril 2004 à 22:10
Je comprend bien la logique, mais comment le faire en code??? As-tu un exemple?

Est-ce que ça rapport avec la commande doEvents?
Merci de ton aide
0
kat40 Messages postés 38 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 19 mars 2008
2 avril 2004 à 16:42
Voici mon code:
'********************************************
' Définition de la fonction bouton ACCEPTER *
'********************************************
Private Sub cmdAccepter_Click()
Dim cnx As New ADODB.Connection
adoDepannage.CursorType = adOpenDynamic
adoDepannage.LockType = adLockPessimistic
Dim chemin As String
chemin = chercherChemin
cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & chemin & ";Persist Security Info=False"
cnx.Open
cnx.BeginTrans
Dim calcul2 As Double
vide = False
VerifierChampVide
If vide = False Then
If ajouter = True Then
If MsgBox("Voulez-vous enregister les nouvelles données pour la demande de dépannage?", vbYesNo, "Ajouter... ?") = vbYes Then
If TestExcel() = True Then
'On Error GoTo erreur
ModifierNumero
CalculerSoldeRestant
calcul2 = CalculRequete + Val(txtMontant.Text)
If calcul2 > 4000 Then
calcul2 = calcul2 - Val(txtMontant.Text)
MsgBox " SOLDE INSUFFISANT" & vbNewLine & "Vous en dépassez la limite de 4000$"
cmdAnnuler_Click
Exit Sub
End If
txtNumeroSequentiel.Text = txtNum.Text
txtNumero.Text = cboCle.Text + "-" + txtNumeroSequentiel.Text
txtDepot.Text = "---"
txtDateReception.Text = "----/--/--"
txtType.Text = "aucun"
txtEncaisse.Text = "N"
txtRembourse.Text = "N"
txtAs107.Text = "N"
txtMontantCheque.Text = "0.00"
test = recevoirDonnees(cboRaison.Text, txtCp12.Text, txtDate.Text, txtMontant.Text, txtNom.Text, txtPrenom.Text, txtNumero.Text, txtNomAutorise.Text, txtPrenomAutorise.Text, txtNomDemande.Text, txtPrenomDemande.Text)
adoDepannage.Recordset.Update
cnx.CommitTrans
cboCle.Enabled = False
cboRaison.Enabled = False
txtCp12.Enabled = False
txtDate.Enabled = False
txtMontant.Enabled = False
txtNom.Enabled = False
txtPrenom.Enabled = False
txtNumeroSequentiel.Enabled = False
txtNomAutorise.Enabled = False
txtPrenomAutorise.Enabled = False
txtNomDemande.Enabled = False
txtPrenomDemande.Enabled = False
adoDepannage.Recordset.Resync
adoDepannage.Recordset.Requery
adoDepannage.Refresh
' frmAS107.Show
' frmAS107.SetFocus
' Unload frmAS107
MsgBox "Voter formulaire de demande de dépannage est en cours d'impression", vbInformation
ajouter = False
Unload Me
' Exit Sub
Else
MsgBox "Impossible de créer le formulaire AS107 inexistant" + vbNewLine + "Le chemin est invalide." + vbNewLine + "Pour en changer le chemin, allez dans OUTILS --> Parcourir(choisir le chemin de la feuille) -- > Appliquer" + vbNewLine + vbNewLine + vbNewLine + " DEMANDE DE DÉPANNAGE ANNULÉE", vbCritical, "Erreur"
adoDepannage.Refresh
If adoDepannage.Recordset.RecordCount > 0 Then adoDepannage.Recordset.CancelUpdate
cnx.RollbackTrans
cmdAnnuler2.Enabled = False
cmdAccepter.Enabled = False
cmdAjouter.Enabled = True
adoDepannage.Refresh
adoDepannage.Enabled = True
cboCle.Enabled = False
cboRaison.Enabled = False
txtCp12.Enabled = False
txtDate.Enabled = False
txtMontant.Enabled = False
txtNom.Enabled = False
txtPrenom.Enabled = False
txtNumeroSequentiel.Enabled = False
txtNomAutorise.Enabled = False
txtPrenomAutorise.Enabled = False
txtNomDemande.Enabled = False
txtPrenomDemande.Enabled = False
cmdAjouter.SetFocus
adoDepannage.Recordset.Resync
adoDepannage.Recordset.Requery
ajouter = False
End If
ajouter = False
cmdAnnuler_Click
End If
End If
End If
Exit Sub
'erreur:
' MsgBox "Votre demande de dépannage à généré une erreur, veuillez recréer votre demande" + vbNewLine + "Cause possible : Deux utilisateurs utilisent le programme en même temps"
' Unload Me
' Load Me
End Sub

Pouvez-vous m'aider s.v.p
0
Rejoignez-nous