|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Bonjour à tous,
Je suis en train de faire des tests de blocage manuel d'enregistrement dans une base HyperFile Classique et HyperFile C/S, juste pour bien comprendre le fonctionnement sous Windev. Malgré plusieurs tests et plusieurs recherches ici et sur google, je n'arrive pas à faire fonctionner ce petit bout de code, je m'y prend surement mal. Code :
Code :
Ce que je croyais : 1 - On bloque l'enregistrement avec Hbloquenumenr. 2 - On ouvre la fenetre de modification, pour que l'utilisateur puisse modifier tranquille sa fiche. 3 - On débloque l'enregistrement. Durant l'opération 2, si un autre utilisateur essai de modifier la même fiche, on lui indique simplement que l'enregistrement est déjà bloqué et qu'il ne peut pas momentanément intervenir sur la même fiche. Je précise que j'ai fait le même test en Hyperfile Classique et en Hyperfile C/S, et que les résultats sont les mêmes. Les 2 utilisateurs peuvent modifier la même fiche en même temps, et le dernier qui valide la modif se retrouve avec une fenetre de conflit de modification (ce qui est bien sûr normal ...). Quelqu'un peut me dire d'où vient mon erreur ? ... Merci |
||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Développeur informatique Inscription : juin 2004 Messages : 1 190 ![]() |
Bonjour,
Dans ton premier exemple, que te renvoie HBloqueNumEnr(..) ? |
|
|
00
|
|
|
#3 | ||
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Dans tous les cas testé, j'ai le Herreurblocage qui est faux.
Pour vérifier quand même j'ai modifié vite fait en : Code :
Donc il a a priori bien effectué le blocage. Ce que je ne comprends pas, c'est que si je lance le 2ieme poste en même temps, là aussi, il me dit que le Blocage a réussi, alors que le même enregistrement est déjà bloque par le premier poste ... |
||
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Inscription : avril 2008 Messages : 554 ![]() |
Bonjour,
Etes vous sûr d'être sur la même base? Si oui, je suppose que vous ne bloquez pas le même enregistrement! Essayer (depuis les 2 postes) de rechercher le même enregistrement du fichier et bloquez le. |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Développeur informatique Inscription : juin 2004 Messages : 1 190 ![]() |
En lisant un peu plus l'aide sur HBloqueNumEnr(..), il est indiqué que le blocage est effectué pour l'accès d'autres applications.
Or ton test se fait avec la même application, sur 2 postes différents. Est-ce que je comprend mal ? Est-ce que le système de transaction ne serait pas mieux adapté ? |
|
|
00
|
|
|
#6 |
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Zouzoukha:Oui je suis sûr d'être sur la même table et le même enregistrement.
Lo²:Oui, la "définition" de hbloquenumenr est un peu ambigüe. On a du mal à cerner ce qu'ils veulent dire par "le blocage est effectué pour l'accès d'autres applications". C'est quoi d'autres applications ? ... un EXE différent qui interrogerai la même table ? ... plutôt rare comme cas, et je ne vois pas l'intérêt d'une fonction qui ne bloquerai les enregistrements que pour les autres applications. Si le hbloquenumenr fonctionne dans mon cas (même EXE sur plusieurs postes), il fonctionnera aussi dans le cas ou ce sont des EXE différents, vu que c'est un enregistrement de la table qu'on bloque (le marqueur est dans la table), l'EXE on s'en moque un peu. Donc je ne vois pas à quoi ca servirai ? ... Une transaction quand tu la commences doit être finie (par la commande htransactionfin) pour être effective au niveau de la table, si tu laisses une transaction "vacante" ne serait ce que pour une validation manuelle (un ouinon par exemple), tant qu'elle n'est pas "finie", elle n'est pas enregistrée dans la base, donc inutile dans mon cas, vu que l'enregistrement ne serait pas non plus verrouillé. J'ai regardé après un blocage à partir du Centre de Controle HyperfileSQL, la liste des blocages de la base, et bizarrement, lui me dit "Aucun blocage détecté", que ce soit en Hyperfile Classique ou sur la version HyperFile C/S, alors que le programme me dit que le blocage est bien effectué. J'ai qu'une seule table, difficile de me tromper. Au niveau de la Doc, c'est bien indiqué que cette commande fonctionne en HyperFile Classique, et en HyperFile C/S, je ne comprends pas. Quelqu'un sait comment ca doit fonctionner ? |
|
|
00
|
|
|
#7 | |
|
Membre Expert
![]() Nicolas JeanneauDéveloppeur informatique Inscription : octobre 2010 Messages : 640 ![]() |
Citation:
Même chose par exemple si tu gères une base pour ton appli et que tu vas chercher des données dans une autre base pour ton traitement, dans ce cas il faudra bien que les données soient bloquées le temps de la lecture sur l'autre base sinon tu auras des bizareries ! |
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Nicolas JeanneauDéveloppeur informatique Inscription : octobre 2010 Messages : 640 ![]() |
pour gérer ton problème, je me suis appuyé sur l'exemple verrou de Windev pour les blocages d'enregistrements. Ce n'est pas compliqué et ça marche plutôt pas mal.
Il faut cependant rajouté un déblocage systèmatique des enregistrements lors d'un "plantage" (gestion des exceptions), et lors de la fermeture de l'application vérifier que l'utilisateur n'a pas d'enregistrements bloqués (au cas où) et les débloquer (mettre dans un log les enregistrements bloqués pour savoir dans ton code où il y a eu un oubli). à bientôt, Nicolas |
|
|
00
|
|
|
#9 | |
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Citation:
Faut prendre le temps de lire ... Moi j'ai un WD17, et je n'ai pas d'exemple de verrou fournit avec. Tu peux me dire ou t'as vu ca ? Dans les exemples complets y a 2 exemples : - Gestion Commerciale (sans gestion des accès concurrentiel, j'ai regardé le code) - WD Planning Exemples Didactiques : - WD Graphe - WD Organigramme Dans tout ca, je peux te certifier qu'il n'y a pas d'exemple de blocage. J'ai cherché sur google pendant un petit moment, j'ai rien trouvé non plus qui fonctionne sous WD17. J'avais trouvé un exemple en WD16 (WD Qui Bloque), mais qui ne fonctionne pas en WD17, il manque à priori une DLL qu'il propose de télécharger, et si on accepte, il y a un beau message d'erreur qui ferme l'application. |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Nicolas JeanneauDéveloppeur informatique Inscription : octobre 2010 Messages : 640 ![]() |
Oui c'est bien cet exemple didactique
![]() Pour l'exe, je ne suis pas sûr que windev sache faire la différence entre plusieurs instances d'un même exe ce qui expliquerait qu'ils ne s'engagent pas à faire un blocage pour le même exe. Je n'ai jamais regardé dans une table hyperfile comment étaient bloqués les enregistrements (je n'utilise que SQL server en projet avec des blocages) mais je suis surpris que la table soit modifiée pour ajouter un marqueur !!! Est-ce que ton projet est bien spécifier en mode multi-utilisateurs dans la gestion des fichiers (voir description du projet) car sinon les notions de blocage ne sont exploitées ? |
|
|
00
|
|
|
#11 |
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
J'ai revérifié pour être sûr, oui il est bien en Multi-Utilisateurs ..
Pour le multiinstance, je me suis posé la même question, du coup j'ai aussi mis l'EXE sur un autre poste avec un accès C/S (j'ai 2 version du même prog, un en Hyperfile classique, et un autre en Hyperfile C/S), ou là il fait obligatoirement la différence au niveau des accès, et rien, c'est absolument pareil |
|
|
00
|
|
|
#12 | ||
|
Membre éprouvé
![]() Inscription : avril 2008 Messages : 554 ![]() |
Salut!
C'est quand même bizarre cette version 17 ![]() Je reste en 12 désolé! Cette fonction bloque bien l'enregistrement d'une commande chez moi et la même application chez les autres utilisateurs n'y accèdent pas pendant le blocage! A l'ouverture en modif d'un enregistrement d'une commande voici le code que j'utilise : Code :
|
||
|
|
00
|
|
|
#13 |
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Zouzoukha:Oui ca revient à ce que j'ai fait.
Je vais refaire des tests, et si ca fonctionne toujours pas je vais appeler le support PCSoft, parce que là ca commence à me fatiguer. |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : juillet 2010 Messages : 1 ![]() |
Bonjour.
Le comportement est du à l'appel de ouvreFille(). Lors de l'appel de la fonction OuvreFille, les traitements suivants sont exécutés : exécution du code "Déclaration des globales" de la fenêtre fille, exécution des codes d'initialisation des champs (l'ordre est indéterminé), exécution des traitements suivant l'appel de la fonction OuvreFille de la fenêtre mère, affichage de la fenêtre fille. Ce qui fait que ton enregistrement est bloqué juste le temps d'initialisation de ta fenêtre fille. |
|
|
00
|
|
|
#15 |
|
Membre actif
![]() Jean-François RiouxMain frame, Unix, Windows, AS400 Inscription : mars 2011 Messages : 110 ![]() |
...par expérience, l'utilisation de certaines fonctionnalités de Windev recommandent la prudence.
Personnellement, si cela peut aider, j'utilise ma propre méthode de blocage. L'application - conditionnelle - exige de créer une colonne "bEstBloqué" et "EstBloquéPar" dans chacune des tables souhaitées. Une fonction de traitement d'un enregistrement (préajout, modif, confirm etc) appelle la gestion du blocage. Pour la gestion globale, une petite fenêtre permet de déverouiller un enregistrement s'il y a erreur (et tu peux impliquer une ressource "super-utilisateur" pour la gestion de ces cas). Windev est un langage très efficace. Sa force est son intégration et sa rapidité de développement. Mais quelquesfois, le moteur d'une fonction (HAjoute, par exemple), ne fait pas qu'ajouter l'information, il en fait davantage. En as-tu besoin ? Pas toujours. Peut-être 80 % du temps (la règle du 80-20). |
|
|
10
|
|
|
#16 |
|
Membre à l'essai
![]() Inscription : juillet 2008 Messages : 55 ![]() |
Dvdgrou:Oui .. je m'en suis apercu entre temps .... ^^ ... merci.
Gardangel:Oui j'y ai pensé. une colonne pour gérer le blocage manuellement. Ca impose par contre beaucoup de choses en cas de plantage d'application, pour qu'il n'y ai pas d'enregistrement qui reste bloqué en écriture indéfiniment. Je continu mes tests là pour choisir la solution qui me conviendra le mieux. Plusieurs possibilités, mais je préfère faire beaucoup de tests maintenant histoire de ne pas avoir à recommencer toutes les modifs pour le passage en réseau sur l'appli concernée, j'ai quand même du taf. |
|
|
00
|
|
|
#17 |
|
Membre actif
![]() Jean-François RiouxMain frame, Unix, Windows, AS400 Inscription : mars 2011 Messages : 110 ![]() |
Beaucoup de choses ?
- Une table avec un booléen de blocage + "par qui" - Une procédure sur modif pour vérifier blocage - Une procédure pour retirer blocage (sur confirmation) - Un exécutable, traitement batch, whatever, s'exécutant sur le serveur de ta BD. Il vérifie si une connection dépasse X minutes sur un enregistrement et déconnecte. Exemple d'exécutable s'exécutant sur le serveur, pour centraliser les traitements communs : Mailing : tu remplies une table, l'exécutable-serveur s'occupe des envois et flag Oui, Non Blocage : après X minutes, déblocage Processus intégrés : suivi d'un "cas" comme un transport par exemple ou une demande informatique (la solution 360 typique) ou encore un lecteur RFID scannant live l'inventaire d'un entrepôt. Ton traitement, tu le codes une fois, tu l'utilises X fois. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com