Précédent   Forum des professionnels en informatique > Environnements de développement > WinDev
WinDev Forum d'entraide sur la programmation en WinDev
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 13h36   #1
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
Par défaut Blocage manuel d'enregistrement dans une base

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 :
1
2
3
4
5
6
7
8
9
10
11
HLitRecherchePremier(Client,IDClient,Table1.Id)
SI HTrouve(Client) ALORS
	Info("Num en cours : "+HNumEnr+RC+"Nom : "+Client.Nom)
	HBloqueNumEnr(Client,hNumEnrEnCours,hBlocageLectureEcriture)
		SI HErreurBlocage()=Vrai ALORS
			Info("L'enregistrement est bloqué par "+RéseauUtilisateur+" !")
		SINON
			OuvreFille(FEN_Modif)
			HDébloqueNumEnr(Client,hNumEnrEnCours)
		FIN
FIN
J'ai aussi essayé ca:

Code :
1
2
3
4
5
6
7
8
9
10
HLitRecherchePremier(Client,IDClient,Table1.Id,hBlocageEcriture)
SI HTrouve(Client) ALORS
	Info("Num en cours : "+HNumEnr+RC+"Nom : "+Client.Nom)
		SI HErreurBlocage()=Vrai ALORS
			Info("L'enregistrement est bloqué par "+RéseauUtilisateur+" !")
		SINON
			OuvreFille(FEN_Modif)
			HDébloqueNumEnr(Client,hNumEnrEnCours)
		FIN
FIN
Quand j'ouvre l'appli sur 2 PC différents que ce soit via le réseau en utilisant le multiinstance pour l'Hyperfile Classic, ou en utilisant 2 version client sur 2 postes qui se connecte à un serveur Hyperfile C/S, l'enregistrement n'est jamais bloqué.

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
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 13h54   #2
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 1 190
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2004
Messages : 1 190
Points : 1 413
Points : 1 413
Bonjour,

Dans ton premier exemple, que te renvoie HBloqueNumEnr(..) ?
Lo² est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 18h28   #3
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
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 :
1
2
		test=HBloqueNumEnr(Client,hNumEnrEnCours,hBlocageEcriture)
		Info("Blocage : "+test)
Résultat -> Blocage : 1

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 ...
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 07h57   #4
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
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.
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 09h16   #5
Membre Expert
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 1 190
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2004
Messages : 1 190
Points : 1 413
Points : 1 413
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é ?
Lo² est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 09h49   #6
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
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 ?
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h11   #7
Membre Expert
 
Homme Nicolas Jeanneau
Développeur informatique
Inscription : octobre 2010
Messages : 640
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Jeanneau
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2010
Messages : 640
Points : 1 023
Points : 1 023
Citation:
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 ? ...
Imagines que tu travailles avec plusieurs projets sur la même base de données, dans ce cas tu auras plusieurs exe qui accèderont à ta base.
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 !
Nicolas_Jeanneau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h16   #8
Membre Expert
 
Homme Nicolas Jeanneau
Développeur informatique
Inscription : octobre 2010
Messages : 640
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Jeanneau
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2010
Messages : 640
Points : 1 023
Points : 1 023
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
Nicolas_Jeanneau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 10h41   #9
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
Citation:
Envoyé par Nicolas_Jeanneau Voir le message
Imagines que tu travailles avec plusieurs projets sur la même base de données, dans ce cas tu auras plusieurs exe qui accèderont à ta base.
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 !
Tu as mal lu ce que je disais. Je disais simplement qu'une fonction qui ne ferait que bloquer des enregistrements UNIQUEMENT POUR DES EXE DIFFERENTS ne servirait à rien, vu qu'une fonction de blocage classique bloque les enregistrements dans une table, le marqueur est dans la table, donc l'enregistrement est FORCEMENT BLOQUE POUR TOUS LES EXE, qu'ils soient identiques ou non.

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.
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h04   #10
Membre Expert
 
Homme Nicolas Jeanneau
Développeur informatique
Inscription : octobre 2010
Messages : 640
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Jeanneau
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2010
Messages : 640
Points : 1 023
Points : 1 023
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 ?
Nicolas_Jeanneau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h09   #11
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
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
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h50   #12
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
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 :
1
2
3
4
5
6
7
8
9
HLitRecherchePremier(Commande,NumCommande,gnIdCommande)
	SI HTrouve(Commande) ALORS
		SI PAS HBloqueNumEnr(Commande,hNumEnrEnCours,hBlocageEcriture) ALORS
			Ferme()
		FIN
		
		FichierVersEcran(FEN_FICHE_COMMANDE_CYBSTOCK)
          FIN
FIN
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 13h33   #13
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
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.
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 16h53   #14
Invité de passage
 
Inscription : juillet 2010
Messages : 1
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 1
Points : 1
Points : 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.
dvdgrou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 18h08   #15
Membre actif
 
Homme Jean-François Rioux
Main frame, Unix, Windows, AS400
Inscription : mars 2011
Messages : 110
Détails du profil
Informations personnelles :
Nom : Homme Jean-François Rioux
Localisation : Canada

Informations professionnelles :
Activité : Main frame, Unix, Windows, AS400
Secteur : Service public

Informations forums :
Inscription : mars 2011
Messages : 110
Points : 173
Points : 173
...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).
gardangel est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/02/2012, 20h22   #16
Membre à l'essai
 
Inscription : juillet 2008
Messages : 55
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 55
Points : 23
Points : 23
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.
Unkof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 19h24   #17
Membre actif
 
Homme Jean-François Rioux
Main frame, Unix, Windows, AS400
Inscription : mars 2011
Messages : 110
Détails du profil
Informations personnelles :
Nom : Homme Jean-François Rioux
Localisation : Canada

Informations professionnelles :
Activité : Main frame, Unix, Windows, AS400
Secteur : Service public

Informations forums :
Inscription : mars 2011
Messages : 110
Points : 173
Points : 173
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.
gardangel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h30.


 
 
 
 
Partenaires

Hébergement Web