IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Partage Procédure Replication "Home Made" - Vos propositions d'amélioration


Sujet :

WinDev

  1. #1
    Membre éprouvé Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Points : 961
    Points
    961
    Par défaut Partage Procédure Replication "Home Made" - Vos propositions d'amélioration
    Bonjour à toutes et tous,
    Je partage avec vous une procédure de synchronisation de donnée, que j'utilise dans certains de mes projets.

    Le contexte et le suivant :
    nous avons plusieurs application cliente chacune avec leur base locale et les base locale sont sychronisée dans une base cenralisé distante.

    Exemple :
    Un utilisateur crée un Client, la ligne créee, est dans un premier temps enregistrée dans la base locale, puis est envoyée au serveur distant (même analyse avec connexions différentes)

    Méthode :
    J'ai ajouté à chaque fichier de mon analyse une rubrique qui joue le role d'un flag nommée "envoyé". Chaque fois que l'on ajoute ou que l'on modifie un enregistrement la rubrique "envoye" est mise à 0.
    Le mécanisme de synchonisation récupere en local les lignes avec rubrique envoyé = 0 et les envoie une à une au serveur
    Afin de faciliter la portabilité de ce traitement, j'ai ecris la procédure suivante qui prend en parametre le nom du fichier à syncrhoniser (fic)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    PROCÉDURE SynchroniserUnFichierLocalVersServeur(Fic)
     
    PROCÉDURE INTERNE ConnexionFic(Fich,Cnx)
    	HChangeConnexion(Fich,Cnx)
    	HOuvreConnexion(Cnx)
    	HCréationSiInexistant(Fich)
    FIN
     
    RubriqueCle est une chaîne= NomRubriqueCle(Fic)
     
     
    ConnexionFic(Fic,ConnexionLocale)
     
     
    R1 est une Source de Données
    //On récupére les ligne à envoyer
    CodeSQL est une chaîne = 
    [
    select * from %1
    where envoye = 0
    ]
     
     
    CodeSQL = ChaîneConstruit(CodeSQL,Fic)
     
     
    HExécuteRequêteSQL(R1,CodeSQL)
    Nb est un entier  = HNbEnr(R1)
    SI Nb= 0 ALORS
    // s'il n y a aucune ligne à syncrhoniser, on sort, inutile d'ouvrir la connexion distante (suite)
    	Trace("Aucune Ligne à syncrhoniser")
    	RETOUR
    FIN
     
     
    //Suite
    HLitPremier(R1)
    // On bascule vers la connexion Distante pour synchoniser
    ConnexionFic(Fic,ConnexionDistante)
    Id est une chaîne
    TabId est un tableau de chaînes
    Code est une chaîne 
    // On synchronise chaque ligne à envoyer
    TANTQUE PAS HEnDehors(R1)
    	//Récuperer le Identifiant unique de la clé
    	Code = "Id  = R1."+RubriqueCle
    	ExécuteCode(Code)
    	TableauAjoute(TabId,Id)// on stock les id  des lignes syncrhonisée afin de baisser le flag par la suite (*)
    	HLitRecherchePremier(Fic,RubriqueCle,Id)
    	SI HTrouve(Fic) ALORS
            //Si la ligne id existe deja : On est dans un cas de modif
    		HCopieEnreg(Fic,R1)
    		Code = Fic+".Envoye=1"
    		ExécuteCode(Code)
    		HModifie(Fic)
    	SINON
                    // Si la ligne n'existe pas on est dans un cas d'insertion
    		HRAZ(Fic)
    		HCopieEnreg(Fic,R1)
    		Code = Fic+".Envoye=1"
    		ExécuteCode(Code)
    		HAjoute(Fic)	
    	FIN
    	HLitSuivant(R1)
    FIN
     
     
    ConnexionFic(Fic,ConnexionLocale)
     
     
    //(*) on baisse les flags des ligne qui ont été syncrhonisée
    POUR TOUT Id DE TabId
    	HLitRecherchePremier(Fic,RubriqueCle,Id)
    	SI HTrouve(Fic) ALORS
    		Code = Fic+".Envoye=1"
    		ExécuteCode(Code)
    		HModifie(Fic)
    	FIN	
    FIN

    Je suis assez satisfait de cette procédure que j'ai integrée dans un composant ainsi que d'autre procédure de syncrhonisation.
    L'inconvient est que cette procédure n'est pas utilisable sous android, et ce à cause de la fonction ExecuteCode qui n'est pas disponible en android:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Code = "Id  = R1."+RubriqueCle
    ExécuteCode(Code)
    Dans ce code, je récupére le Id de la ligne à syncrhoniser, information nécessaire pour mettre à jour les flags et aussi pour se positionner sur la bonne ligne en connexion distante.

    Auriez-vous des suggestion qui permettrai de contourner l'utilisation de la fonction ExecuteCode, même s'il faut revoir mon algo.

    Merci pour toute réponse

    Bien à vous.

    Réda

    PS/Je ne tiens pas à utiliser l'outil de repliation pcsoft.
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!»

  2. #2
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Les indirections devraient pouvoir remplacer les ExecuteCode
    A priori, les indirections sont accepté par Android.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code = "Id  = R1."+RubriqueCle
    ExécuteCode(Code)
    Deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id  = {R1..nom+"."+RubriqueCle, indRubrique}
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code = Fic+".Envoye=1"
    ExécuteCode(Code)
    Deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Fic+".Envoye", IndRubrique}=1

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 266
    Points
    5 266
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Narwe Voir le message
    Les indirections devraient pouvoir remplacer les ExecuteCode
    A priori, les indirections sont accepté par Android.
    Et à partir de là on peut même passer à un appel de fonction/procédure classique qui est quand même (a mon avis) plus propre.)

    N'oublie pas dès maintenant de mettre en place tes CAS ERREUR/CAS EXCEPTION ainsi que la partie du code nécessaire à leur bon fonctionnement (ErreurDéclenche etc...)
    Note Les erreur perso vont de 1 à 1000
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre éprouvé Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Points : 961
    Points
    961
    Par défaut
    Citation Envoyé par Narwe Voir le message
    Les indirections devraient pouvoir remplacer les ExecuteCode
    A priori, les indirections sont accepté par Android.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code = "Id  = R1."+RubriqueCle
    ExécuteCode(Code)
    Deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id  = {R1..nom+"."+RubriqueCle, indRubrique}
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Code = Fic+".Envoye=1"
    ExécuteCode(Code)
    Deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {Fic+".Envoye", IndRubrique}=1
    Merci beaucoup, ça marche nickel chrome !
    J'ai tendance à sous-estimer la puissance des indirections.

    Merci encore
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!»

  5. #5
    Membre éprouvé Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Points : 961
    Points
    961
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    N'oublie pas dès maintenant de mettre en place tes CAS ERREUR/CAS EXCEPTION ainsi que la partie du code nécessaire à leur bon fonctionnement (ErreurDéclenche etc...)
    Merci. Oui je vais mettre tout ça au propre.

    Citation Envoyé par Voroltinquo Voir le message
    Note Les erreur perso vont de 1 à 1000
    J'ai pas compris cette remarque ?
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!»

  6. #6
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 266
    Points
    5 266
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par b_reda31 Voir le message
    J'ai pas compris cette remarque ?
    Erreur/ExceptionDéclenche permettent de traiter les erreurs/exceptions définies par le développeur, Erreur/ExceptionInfo renvoient alors le n° de l'erreur ainsi que le message défini par le développeur.
    Prenons le cas d'une application qui utilise une fonction récursive (souvent très gourmande en mémoire.) Suite aux tests, on s’aperçoit que la machine "sature" s'il y a plus de 10 traitements qui utilisent cette fonction. On va donc vérifier que l'utilisateur ne lance pas un 11° traitement. Si c'est le cas, on va lever une erreur.
    e.g. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ....
    SI nNbDemande >10 ALORS
         ErreurDéclenche(ERR_PREVENT_OVERFLOW,"Vous ne pouvez mettre que 10 tâches en file d'attente")
    FIN
    ....
    ou ERR_PREVENT_OVERFLOW est une constante. Comme je le faisais remarquer, la valeur de cette constante est comprise entre 1 et 1000.
    Le CAS ERREUR interceptera cette erreur comme si c'était une erreur WINDEV.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

Discussions similaires

  1. Librairie JS home made + chrome
    Par 01001111 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 01/10/2014, 13h13
  2. Tchat Home-Made PHP - Windows Live Messenger
    Par SpYd3r dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2011, 16h19
  3. Partage de fichiers simple Home ou Pro ?
    Par jloois dans le forum Windows 7
    Réponses: 2
    Dernier message: 24/11/2009, 21h03
  4. Problème de connexion entre WebParts "home made"
    Par pcr92 dans le forum SharePoint
    Réponses: 0
    Dernier message: 16/10/2007, 13h39
  5. [GCC]Faire compiler du C vers une machine "home-made"
    Par progfou dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 18/08/2006, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo