vendredi 27 juin 2014

gestion des erreurs et des accès concurrent en windev

Bonjours et bienvenue aux windeveurs et windeveuses.

Cet article concerne certaines problématiques qui apparaissent après le déploiement chez les clients. Notamment, les bugs qui passent entre les mailles de la validation et les problèmes de gestion des accès concurrentiels lors de l'utilisation d'une base de données hyperfile c/s.

Alors nous allons diviser cet article en deux parties ou nous allons voir la solution à ces problèmes.


gestion des erreurs


Ou devrais je dire récupération des messages d'erreur.

Vous savez bien que lorsqu'un bug survient, une fenêtre automatique de windev apparaît indiquant le message de l'erreur.
On ne peut pas modifier entièrement ces fenêtres car il font appel à des codes externes mais on peut quand même apporter quelques modification.

pour cela il faut d'abord charger ces fenêtres dans le projet.

Rien de plus simple. Dans le menu cliquez sur "fichier", dans le groupe "importer", cliquez sur "Des éléments WinDev et leurs dépendances".
Il ne vous reste plus qu'à sélectionner le répertoire adéquat comme indiqué dans l'image qui suit.



Et voila maintenant vous avez un nouveau modèle ainsi que trois fenêtres qui viennent s'ajouter à votre projet, mais ce qui nous intéresse c'est "WD_AfficheException", car c'est la que les erreur critiquent ou bug s'affichent.
Alors comment allons nous faire pour récupérer de façon automatique les erreur affichés dans cette fenêtre?

C'est très simple. Nous allons nous débrouiller pour nous l'envoyer par email (bien que le client final peut le faire lui même mais c'est rare qu'il le fasse). et pour cela nous allons utiliser deux adresses emails, une pour l'envoie et une pour la réception.

maintenant allez dans le code 'initialisation de la fenêtre et mettez ce code
sText_err est chaîne=AfficheDétail
sText_err=Remplace(sText_err,"pivo dent","Dental Pro",MotComplet)
sCore_email est chaîne=""
tabTableau_text_err est un tableau de 3 chaînes
ChaîneVersTableau(sText_err,tabTableau_text_err)
sText_err=TableauVersChaîne(tabTableau_text_err,"
")
SI AfficheAssistance="" ET ListeAssistance..Occurrence=0 ALORS
 Onglet1[3]..Visible = Faux
FIN

SI InternetConnecté() ALORS
 SI OuiNon(1,"Une erreur est survenue dans le programme","Voulez vous que votre fournisseur soit informé?") ALORS
  //Ouverture d'une session SMTP
  EmailOuvreSessionSMTP("Votreemaildenvoi@gmail.com","motdepass","smtp.gmail.com",587,Faux,EmailOptionSécuriséTLS)
  SI ErreurDétectée ALORS
   Erreur()
   RETOUR
  FIN
  //Remise à zéro des variables Email
  EmailRAZ()
  //Expéditeur du message
  Email.Expéditeur = "Votreemaildenvoi@gmail.com"
  //Destinataire(s) du message
  Email.Destinataire[1] = "Votreemaildereception@votredomaine.net"
  Email.NbDestinataire = 1
  //Pièces jointes
  Email.NbAttache = 0
  //Sujet et contenu du message
  Email.Sujet = "Bug Votre logiciel"
  Email.Message = ""
                //en principe en récupere des données qui font référence au client mais c'est obligatoire
  sCore_email="client: "+" le nom du client"+"
"

  sCore_email=sCore_email+"

"+sText_err
  
  Email.HTML = sCore_email
  
  //Envoi du message
  EmailEnvoieMessage("Votreemaildenvoi@gmail.com")
  SI ErreurDétectée ALORS
   Erreur(ErreurInfo(errComplet))
  SINON
   Info("Votre Fournisseur a été informé du bug")
  FIN
  
  //Fermeture de la session SMTP
  EmailFermeSession("Votreemaildenvoi@gmail.com")
 FIN
FIN



Évidement le code n'est pas complet, il faut mettre votre email et votre mot de passe voir même l'adapter pour qui fonctionne à votre guise.

NB: c'est une alternative au composant "CCFeedback" que vous ne pouvez pas personnaliser et qui n'est pas très simple à paramétrer, enfin selon moi.

Voila maintenant que nous avons mis le système de récupération des erreurs en place, passons à autres choses.


gestion des accès concurrent

Tout ceux qui ont travaillé avec hyperfilesql en mode client/serveur ont fait face à une fenêtre dérangeante lorsque deux enregistrement se chevauches. Nous vous inquiétez pas nous allons faire en sorte que cette fenêtre n’apparaît plus d’ailleurs j'en ai pas une sous la main pour la montrer à ceux qui ne l'ont jamais vue.
D'ailleurs la meilleur façon de contourner ce problème est d'utiliser le blocage des fichier. et comme ça nous allons obliger notre programme à bloquer le fichier avant modification et si le fichier et bloqué par un autre utilisateur recommencer l'opération

Pour cela nous allons créer une collection de procédures globales dans notre projet que j'appellerai "accesconcurrent". Et dans cette collection nous allons surcharger les fonctions de gestion des fichiers (HAjoute, Hmodifie,Hsupprime)

Et voila les code de chaqu'une des fonctions surchargées.

HAjoute:
PROCEDURE Hajoute(fichier,opt est un numérique=0)
TANTQUE HBloqueFichier(fichier,hBlocageEcriture)=Faux

FIN
SI opt=0 ALORS
 WL.HAjoute(fichier)
SINON 
 WL.HAjoute(fichier,opt)
FIN
HDébloqueFichier(fichier)
RENVOYER Vrai


HModifie:
PROCEDURE hmodifie(fichier,enre est un numérique=0,opt est un numérique=0)
TANTQUE HBloqueFichier(fichier,hBlocageEcriture)=Faux
 
FIN
SI opt=0 ET enre=0 ALORS
 BOUCLE
  WL.HModifie(fichier,hNumEnrEnCours,hBlocageEcriture)
  SI HErreurBlocage() ALORS
   trace("erreur")
  SINON
   SORTIR
  FIN
 FIN
 
SINON SI enre<>0 ET opt=0
 WL.HModifie(fichier,enre,hBlocageEcriture)
SINON SI opt<>0 ET enre=0
 WL.HModifie(fichier,hNumEnrEnCours,opt+hBlocageEcriture)
SINON SI opt<>0 ET enre<>0
 WL.HModifie(fichier,enre,opt+hBlocageEcriture)
FIN

HDébloqueFichier(fichier)
RENVOYER Vrai


HSupprime:
PROCEDURE HSupprime(Fichier,xEnre est un numérique=0,xOpt est un numérique=0)
TANTQUE HBloqueFichier(Fichier,hBlocageEcriture)=Faux
 
FIN
SI xOpt=0 ET xEnre=0 ALORS
 WL.HSupprime(Fichier)
SINON SI xEnre<>0 ET xOpt=0
 WL.HSupprime(Fichier,xEnre)
SINON SI xOpt<>0 ET xEnre=0
 WL.HSupprime(Fichier,hNumEnrEnCours,xOpt)
SINON SI xOpt<>0 ET xEnre<>0
 WL.HSupprime(Fichier,xEnre,xOpt)
FIN

HDébloqueFichier(Fichier)
RENVOYER Vrai


Et voila, nous avons presque terminé.

Oui enfin il faut se poser la question qu'est ce qui ce passe si on utilise une requête

Ne vous inquiétez pas windev a déjà prévue un système de gestion des erreur qui est moins bien que le notre mais qui est utile (voir la documentation de la fonction "HSurErreur"). et dans ce cas nous allons l'utiliser un peut.

Alors retournons à notre collection de procédure et ajoutons une nouvelle procedure

PROCEDURE SurErreurBlocage()

RENVOYER opRéessayer


et pour couronner le tout nous allons ajouter une ligne dans le code du projet
HSurErreur("*",hErrIntégrité+hErrDoublon+hErrModification+hErrMotDePasse,"SurErreurBlocage")


Et Voila. Nous avons terminé.
J’espère que cet article vous soit utile et à la prochaine

1 commentaire: