Bonjour à tous,
J'ai développé une application qui permet d'ajouter des commandes (fichier command) depuis un poste connecté à internet.
La base est en hyperfilesql Client/Serveur accessible à distance.
L'application cliente (mono-utilisateur) accède à la base de donnée via le réseau internet et ajoute les enregistrements à la base. (j'utilise HDécritConnexion)
Pour le moment, tout fonctionne pour le mieux. (accès à la base et l'ajout d'enregistrement).
Ce qui m'importe dans la base de données, ce sont les fichiersCommand et LigneCommand.
Le fichier command regroupe les informations générales de la commande :
Command :
- IdCommande (Numérique Clé )
- IdClient (Numérique Clé avec Doublons)
- Date
- Total
- ...etc
Le fichier LigneCommand regroupe le détail d'une commande (Produits commandés avec Quantités...etc)
LigneCommand
- IdLigneCommande (Clé Unique Numérique)
- IdCommande (Numérique Clé avec Doublons)
- IdProduit (Clé Avec Doublons)
- QT
- ...etc
Au niveau de l'application cliente, l'utilisateur sélectionne le Client puis ajoute au fur et mesure les produits commandés dans une table mémoire (Table1) en précisant les quantités puis valide.
Voici le traitement que j'exécute lors de la validation
En mono-utilisateur il n'y a aucun souci. Cependant, s'il y a plusieurs applications clientes qui tournent au même moment, je me dois de gérer l'accès concurrent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 //Récuperer l'ID de la dernière commande et l'incrémenter Idc est un entier; Idc = HLitDernier(Command,IdCommande); Idc++; //Ajout d'une nouvelle Commande HRAZ(command); Command.IdCommande = Idc; command.IdClient = ... Command .... HAjoute(Command); //Ajout des Détails la commande LigneCommande //Récupérer l'id du dernier LigneCommande et l'incrementer IdL est un entier; HLitDernier(LigneCommand,IdLigneCommande); IdL = LigneCommand.IdLigneCommande; IdL++; //Ajout des Ligne de Commande depuis la table mémoire Pour TOUTE Ligne de Table1 HRAZ(LigneCommand); LigneCommand.idLigneCommande = IdL; IdL++; LigneCommand.IdCommande = Idc; LigneCommand.IdProduit=table1.IdProduit LigneCommand.Qt = .... //...etc HAjoute(LigneCommand) FIN
En effet, plusieurs utilisateurs peuvent valider une commande au même moment ; avec le code actuel, il est possible d'avoir des incohérences dans la base de données (Ou une violation de clé).
Pour y remédier, j'ai pensé à la fonction HBloquerFichier juste avant l'accès au données :
Est-ce une bonne solution ? Sinon pouvez-vous m'en proposer une meilleure?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 //On patiente tant que le fichier est bloqué (par une autre application) TANTQUE HBloqueFichier(Command,hBlocageEcriture)=Faux Temporisation(100, tempoDessin); FIN //---------------------------------------------------------------------- //Insertion des enregistrements //...... //...... //---------------------------------------------------------------------- //Libérer le fichier HDébloqueFichier(Command)
Je précise que l'accès à la base se fait par réseau Internet, donc je tente de minimiser les accès au serveur.
Merci par avance
Partager