Gestion concurrentielle - multi utilisateurs

Résolu/Fermé
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 - 1 oct. 2015 à 16:15
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 - 2 oct. 2015 à 16:42
Bonjour,

J'ai une base de donnée sous Excel car je n'ai pas accès à un serveur SQL malheureusement. Je dois donc, avant que vous me disiez que ce n'est pas optimal d'utiliser Excel comme BDD, vous dire que je n'ai malheureusement pas le choix :-( (pas d'Acess non plus).
En gros j'ai un Userform qui sera ouvert sur plusieurs pc qui lancera des requetes SQL à la base (lecture et écriture).
Pour commencer à faire la gestion concurrentielle, j'ai fais le bout de code suivant :

Sub test_connection()
Dim wb_source As Workbook
Dim wb_bdd As Workbook
Dim link_bdd As String

Dim objOFS As Variant
Set objOFS = CreateObject("Scripting.FileSystemObject")

Set wb_source = ThisWorkbook
link_bdd = wb_source.Sheets(1).Range("B2").Value

i = 1
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Do While Not i = 11
On Error Resume Next
objOFS.MoveFile link_bdd & "\BDD.xlsx", link_bdd & "\BDD.xlsx"
If Err = 70 Then
Application.Wait (1000)
Else
Workbooks.Open (link_bdd & "\BDD.xlsx")
Set wb_bdd = ActiveWorkbook
Sheets(1).Range("A10000").End(xlUp).Offset(1, 0).Value = i & " procedure 1"
i = i + 1
wb_bdd.Close True
Application.Wait (1000)
'Exit Do
End If
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub


Je viens en gros regarder si je peux renommer la base avec le meme nom (pour éviter de la renommer). Si elle est ouverte, j'ai l'erreur 70 permission denied. j'attends donc avant de relancer la procédure do while. SI je peux renommer la base, je l'ouvre et inscris un numéro incrémental suivi de "procédure 1" puis je l'enregistre.
Le but étant que pour tester cette gestion, 2 utilisateurs pour commencer, lancent la macro1 et la macro 2 (meme macro mais avec procédure 2 écrit a coté du i, afin de voir quand les utilisateurs ont eu accès à la BDD. Si tout ce passe correctement on devrait avoir ca dans la BDD :

1 procédure1
1 procédure2
2 procédure1
3 procédure1
2 procédure 2
etc..
Ceci est assez aléatoire vu les delay appliqués. Mais le but étant de voir qui a écrit quoi et avant qui.

Voila seulement, ca fonctionne peu souvent, mais quand meme certaine fois. Le problème est qu'un message me demandant d'enregistrer la base car celle-si est ouverte ou introuvable. Cela veut dire que l'autre utilisateur avec la macro 2 a réussi a entrer dans la BDD alors que j'y étais déjà.

La macro 1 est lancé depuis le fichier1 et la macro 2 depuis le fichier1(copie) pour éviter la gestion de la lecture seule (dont je m'occuperai plus tard).

Avez-vous une idée de ce bug là dedans ?
Merci beaucoup pour vos avis d'experts ;-) mais j'ai rien trouvé sur la gestion concurrentiel sous excel malheureusement.

Bonne fin de journée

PS : Je ne pourrai que vous répondre demain matin
A voir également:

1 réponse

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 2/10/2015 à 09:11
Bonjour

Tu peux très bien utiliser la technologie ADO-SQL (on laisse la database fermée) avec un accès "optimist" (par défaut) sur une base Excel (posssédant plusieurs plusieurs tables au besoin relées entre elles)
On arrive ainsi à construire un vrai-faux système client-serveur front end -back end
Tu peux m^me construire une database au format Access sans posséder Access avec ADOX dérivé de ADO

Avant de pleurer d'^tre obligé d'utiliser Excel , logiciel indigne, peut-^tre faudrait il connaitre ses possibilités au besoin en lisant la documentation de Microsoft

Bonne continuation

Michel
0
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 28
2 oct. 2015 à 09:25
Bonjour,
Merci pour votre réponse, j'utilise déjà la technologie ADO-SQL pour communiquer avec ma base de donnée Excel, cependant lorsque deux personnes font des requetes en meme temps, il arrive de temps en temps des erreurs d'écriture dans la base à ce que j'ai pu constater.
J'ai également lu la documentation hier sur le ADOX pour access, cependant comme je n'ai pas le logiciel au bureau je ne peux pas transposer ma base de donnée dans cette feuille. Il faudrait que j'aie l'autoristation de prendre la bdd chez moi pour la mettre dans le document access...et ca, je crois que c'est malheureusement impossible.

Donc je ne pleure pas pour finir sur Excel, j'essaie jsute de trouver un moyen pour éviter que deux personnes se connectent en meme temps sur la base de donnée, meme avec des requetes SQL. J'essaie ce matin de faire une procédure qui renomme la base avec le nom du user et la renomme a son nom initiale une fois les requetes terminées cependant cela ne fonctionne pas encore.
Il faudrait arriver à faire une "liste d'attente" ou vraiment empecher toutes autres connexions à la base durant son utilisation.
Petite question pour vous :
SI j'arrivais a transposer la base dans un fichier access, aurais-je encore des soucis avec des requetes SQL ? Ou access gère bien la liste d'attente de requete ?

Merci beaucoup en tout ca pour votre réponse !
Meilleures salutations,
revovl3r
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
2 oct. 2015 à 11:32
Bonjour revolver et Michel,

J'attendais que quelqu'un de bien plus calé que moi réponde à ce sujet. C'est le cas avec Michel.
Mais j'allais te mettre sur la piste d'évolutions en parallèle sur des bases/fichiers dédiés et dès qu'on détecte qu'on est le seul en écriture on assemble le tout. Il suffit d'avoir un horodatage (je pensais à l'écriture d'un fichier csv - si applicable - nommé 'utilisateur_horodatage.csv') permettant de mettre les petits dans le bon ordre.

A+
0
rEVOLV3r Messages postés 223 Date d'inscription jeudi 12 août 2010 Statut Membre Dernière intervention 21 septembre 2022 28
2 oct. 2015 à 16:42
Bonjour,

Je vous écris pour vous dire que j'ai résolu le problème.
J'utilise un on error go to errorandler qui crée une file d'attente car je copie ma base de donnée dans un fichier TEMP sur le réseau et la déplace dans mon fichier c.\Temp afin d'appliquer les requetes dessus. Cela empêche les autres utilisateurs de se connecter dessus le temps de la requete. elle est ainsi redéplacé après finalisation des requetes.
Si jamias, le fait de tester de la renommer pour voir si elles est en lecture seule avec un error go to ne fonctionne pas bien avec les requetes au meme instant. Des bugs arrivent.
Il faut donc préconiser de déplacer la base.
Merci a vous.
bonne soirée
0