PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → [WD20] Actualiser table en "temps réel"
[WD20] Actualiser table en "temps réel"
Started by Adrien Bonnel, Aug., 02 2015 10:09 PM - 24 replies
Posted on August, 02 2015 - 10:09 PM
Bonjour,
Quelqu'un connaîtrait-il une solution sans passer par un timer pour actualiser automatiquement une table sur un temps donné ou quand la base de données a subi des modifications ?
J'utilise l'accès natif MySQL et non pas HFSQL.
Merci bien ;).
Posted on August, 03 2015 - 3:03 PM
Bonjour Adrien

pourquoi "sans passer par un timer" ?

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Disponible : WXShowroom.com, WXReplication (open source)
Bientôt : WXEDM (open source)
Plus d'information sur http://fabriceharari.com


On 8/2/2015 2:09 PM, Adrien Bonnel wrote:
Bonjour,
Quelqu'un connaîtrait-il une solution sans passer par un timer pour
actualiser automatiquement une table sur un temps donné ou quand la base
de données a subi des modifications ?
J'utilise l'accès natif MySQL et non pas HFSQL.
Merci bien ;).
Registered member
204 messages
Popularité : +4 (8 votes)
Posted on August, 03 2015 - 3:11 PM
Sans passer par un timer ça risque d'être compliqué.

Je sais pas si l'utilisation des sockets est bien compliqué en windev. Recevoir une notification sur un événement donné (la BD change).

Mais si tu veux uniquement t'éviter un gros traitement de call de BD lourd, j'ai une petite idée.

Dans la BD, tu créer une table de 1 colonne, 1 ligne, et tu y stock la date de la dernière modification de la table désiré. (cette table sera mit à jour via un trigger sur la table désiré).

Dans ton application avec un timer (et oui) tu ne fais qu'aller voir la date de dernière modification si elle est supérieure à la dernière fois que tu as faite une mise à jour.

Si oui, tu refresh la table.

Ça utilise quand même un timer, mais au moins, tu refresh pas ton tableau au complet sans arrêt pour aucune raison.
Posted on August, 03 2015 - 4:58 PM
Fabrice Harari a écrit :
> pourquoi "sans passer par un timer" ?

Mathieu BROUSSEAU a écrit :
Sans passer par un timer ça risque d'être compliqué.


Bonjour,
Disons que j'avais déjà essayé la solution du timer, mais je la trouvais "lourde".
Je pensais que le traitement aurait pu être allégé avec les threads voire les sockets, mais je n'ai pas trop compris le principe de fonctionnement, surtout pour le mettre en place dans mon cas.
Si vous me dites qu'il n'y a pas d'autres façons de procéder, tant pis je m'y résignerai :).
Posted on August, 03 2015 - 6:31 PM
Bonjour Adrien,

c'est quoi "lourde" ?

Ton programme doit régulièrement vérifier s'il y a du nouveau, et si
oui, l'afficher.

"Régulièrement" = avec un timer, et ce n'est pas "lourd" du tout.
Maintenant, si le traitement de vérif et mise à jour est mal écrit, ca
peut devenir lent ou pas pratique pour l'utilisateur, mais le timer n'y
est pour rien.

Bien sur le timer peut être dans un thread secondaire, mais le principe
est le même.

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Disponible : WXShowroom.com, WXReplication (open source)
Bientôt : WXEDM (open source)
Plus d'information sur http://fabriceharari.com


On 8/3/2015 8:58 AM, Adrien Bonnel wrote:
Fabrice Harari a écrit :
pourquoi "sans passer par un timer" ?

Mathieu BROUSSEAU a écrit :
Sans passer par un timer ça risque d'être compliqué.

Bonjour,
Disons que j'avais déjà essayé la solution du timer, mais je la trouvais
"lourde".
Je pensais que le traitement aurait pu être allégé avec les threads
voire les sockets, mais je n'ai pas trop compris le principe de
fonctionnement, surtout pour le mettre en place dans mon cas.
Si vous me dites qu'il n'y a pas d'autres façons de procéder, tant pis
je m'y résignerai :).
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 03 2015 - 6:50 PM
Bonsoir,

Un timer c'est un peu "rude" pour l'utilisateur car si la requete est longue il va voir l'application figée sans comprendre pourquoi...

Le plus "fin" est d'utiliser un thread pour effectuer ma requete et récupérer les modifications et de mettre a jour la table en faisant une demande de mise a jour (autant utiliser les nouvelles fonctions de la 20) ou alors en gerant cela par événements avec un PostMessage pour prevenir le thread principal de l'application de mettre a jour la table. Car seul le thread principal doit gerer l'IHM.
Registered member
204 messages
Popularité : +4 (8 votes)
Posted on August, 04 2015 - 2:20 PM
Ce que tu fais avec un timer c'est la requête qui vérifie s'il y a du nouveau. Si cette requête est lourde soit ton serveur est monté sur un pentium 133 ou ta requête de " Il y a du nouveau " est mal conçu.
Posted on August, 04 2015 - 4:34 PM
Bonjour,

il me semble que la lst 82 traite des notifications push depuis le serveur via socket.
Je ne l'ai jamais mis en place, mais je pense que c'est une manière élégante de signaler la mise à jour d'un fichier. Il faut cependant, pour que ce soit pleinement efficace, que tous les clients intègrent cette fonctionnalité.

Cordialement.

Jonathan.
Posted on August, 07 2015 - 11:05 AM
Intéressant cette histoire de LST 82, je vais contacter PC Soft à la rentrée (scolaire) pour savoir si elle peut convenir à mon besoin et, auquel cas, je verrai pour la commander.

Sinon, j'ai procédé ainsi :

Déclarations globales de la fenêtre contenant ma table
SI Timer("Refresh_Requests", Val(INILit("Table", "RefreshTime", "", sConfig)) * 100, 1) = 0 ALORS
Erreur("Création du timer impossible")
FIN


Procédure Refresh_Requests :

Procedure Refresh_Requests()

ExécuteTraitement(Table, trtInit)
Registered member
204 messages
Popularité : +4 (8 votes)
Posted on August, 07 2015 - 2:17 PM
Tout dépendamment de ce qui se trouve dans ton code d'initialisation de ta table.

Si tu recharges complètement ta table, c'est sur et certain que c'est lourd comme " Solution ".

Essaie plutot avec

Procedure Refresh_Requests()

SI Procedure_Qui_Verifie_Si_Modif_Dans_La_BD() = Vrai ALORS
ExécuteTraitement(Table, trInit)
FIN



il te reste plus qu'à créer la procédure qui fait une requête à la BD pour savoir s'il y a des modifs et retourne vrai ou faux.
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on August, 26 2015 - 8:28 PM
Bonsoir,
J'ai préféré avancer sur le reste afin de revenir sur cette partie plus tard, histoire de ne pas me pénaliser niveau temps.

J'ai donc créé un thread pour tester et j'ai une erreur ("Création du timer impossible")
Voici le code, si jamais vous voyez où j'ai pu me planter :-/.

Dans la partie "Fin d'initialisation" de ma fenêtre :

ThreadExecute("Thread_" + MoiMême..Nom, threadNormal, "Thread_Refresh")


Procédure "Thread_Refresh"

Procedure Thread_Refresh()

SI TimerSys("Table_Refresh", RegistreLit("HKEY_CURRENT_USER\Software\Azumi\Win_Main", "Table_Refresh_Time"), 1) = 0 ALORS
Erreur("Création du timer impossible")
FIN


Procédure "Table_Refresh"

Procedure Table_Refresh()

sTables est une chaîne = "Table, Table_Break"

POUR TOUTE CHAINE sTable DE sTables SEPAREE PAR ", "
Trace(sTable)
ExécuteTraitement(sTable, trtInit)
FIN


La valeur de "Table_Refresh_Time" en base de registre est de 100, et inscrite dans une clé de type DWORD 32 bits.

Merci d'avance ;).

PS : J'ai un autre effet Kiss-Kool lié à mon rafraichissement automatique, mais j'y viendrai quand celui-ci sera résolu.
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 26 2015 - 9:50 PM
Plutot logique... On ne lance pas un timer dans un thread secondaire ;)
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on August, 28 2015 - 7:33 AM
Euh comment peut-on faire dans ce cas ? :-/
Posted on August, 28 2015 - 12:17 PM
Bonjour

On lance le timer dans le thread principal -OU- on utilise un thread
secondaire

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

Disponible : WXShowroom.com, WXReplication (open source)
Bientôt : WXEDM (open source)
Plus d'information sur http://fabriceharari.com


On 8/27/2015 11:33 PM, Adrien BONNEL wrote:
> Euh comment peut-on faire dans ce cas ? :-/
Posted on August, 28 2015 - 6:54 PM
Bonjour,

Peut-être, est-il possible d'utiliser HVersion(nomfichier).
(dans une procédure lancée dans un timer ou à l'occasion d'un événement à déterminer en fonction de l'application ou quand l'utilisateur le demande)

Je n'ai jamais essayé avec autre chose que HFSQL mais cette fonction semble utilisable aussi avec les accès natifs.
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on August, 28 2015 - 8:21 PM
Fabrice Harari a écrit :
On lance le timer dans le thread principal -OU- on utilise un thread
secondaire


Euh ce n'est pas ce que j'ai tenté de faire juste au-dessus ? o_O
Registered member
4 messages
Posted on August, 29 2015 - 7:26 AM
le plus simple est de vérifier avec HVersionFichier("Le_Fichier_en_Question") dans une procédure avec un Timer.

--
Jean Francois Piechaud
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on August, 29 2015 - 7:56 AM
Bonjour Jean-François,
Euh je ne trouve pas cette fonction dans la documentation.
Vous auriez un lien s'il vous plaît ?
De même, est-ce une fonction compatible avec l'accès natif MySQL ?
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on August, 29 2015 - 1:08 PM
Bonjour,

Ce n'est pas bien sorcier pourtant :)

ThreadExecute("Thread_" + MoiMême..Nom, threadNormal, "Table_Refresh")


Procedure Table_Refresh()

sTables est une chaîne = "Table, Table_Break"

POUR TOUTE CHAINE sTable DE sTables SEPAREE PAR ", "
// Ton traitement de verif, je ne sais pas trop qui dis si tu dois refresh la table puis :
ExécuteThreadPrincipal(MAJTable, sTable)
FIN


Procedure MAJTable(LOCAL sTable est une chaîne)
ExécuteTraitement(sTable, trtInit)


Il y a encore peut-être des petites erreurs car j'ai fais cela vite fait de tete mais tu as le gros du taff ;)
Posted on August, 29 2015 - 1:22 PM
Non, tu as essayé de créer un timer DANS le thread secondaire, au lieu
de CHOISIR entre un timer et un thread secondaire


On 8/28/2015 12:21 PM, Adrien BONNEL wrote:
Fabrice Harari a écrit :
On lance le timer dans le thread principal -OU- on utilise un thread
secondaire

Euh ce n'est pas ce que j'ai tenté de faire juste au-dessus ? o_O
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on August, 29 2015 - 11:33 PM
J'essaie cela demain, merci bien :).
Posted on February, 23 2018 - 9:05 AM
j'ai besoin de votre contact damien
Posted on February, 23 2018 - 12:27 PM
On eput simplement utiliser Hversionfichier en comparant le numéro de la version précédente avec celui de la version actuelle et executer le traitement adapté.puis
Registered member
351 messages
Popularité : +13 (17 votes)
Posted on February, 23 2018 - 12:47 PM
Bonjour,
Il y a bien plus simple maintenant depusi le version 22.
J'utilise le HSurveille c'est génial.
https://doc.pcsoft.fr/fr-FR/?1000022407&name=HSurveille

Bon dev
Registered member
182 messages
Popularité : +10 (10 votes)
Posted on February, 23 2018 - 5:22 PM
j F Piechaud a écrit :
> On eput simplement utiliser Hversionfichier en comparant le numéro de la version précédente avec celui de la version actuelle et executer le traitement adapté.puis

Pat 16 a écrit :
Bonjour,
Il y a bien plus simple maintenant depusi le version 22.
J'utilise le HSurveille c'est génial.
https://doc.pcsoft.fr/fr-FR/?1000022407&name=HSurveille

Bon dev


Dans le cas d'un serveur HFSQL, oui c'est faisable.
Mais relisez bien mon cas : je ne l'utilise pas vu que je suis sur MySQL ...
Pis bon, depuis le temps, c'est réglé cette affaire ...