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.
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
É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.
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:
HModifie:
HSupprime:
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
et pour couronner le tout nous allons ajouter une ligne dans le code du projet
Et Voila. Nous avons terminé.
J’espère que cet article vous soit utile et à la prochaine
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