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 :

Une Réplication Homemade : Mettre à jour un fichier par rapport à un autre


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 Une Réplication Homemade : Mettre à jour un fichier par rapport à un autre
    Bonjour,
    j'ai un petit problème, je vous explique le contexte en simplifiant un peu :

    J'ai deux fichiers HFSQL :
    - Produits_Serveur : de type HFSQL C/S stocké sur un serveur
    - Produits_Local : de type HFSQL Classique stocké sur un poste client qui accède aussi à la base (Produits_CS) via internet.

    Les deux fichiers ont strictement la même structure et devraient aussi avoir le même contenu.
    Initialement, le contenu du fichier Produits_Local est rempli par Produits_Serveur, ce qui les rend identique ... au départ...

    Ensuite, il arrive que l'administrateur modifie le fichier Produits_CS, en ajoutant de nouveaux produits, ou en modifiant un produit, ou en supprimant un produit.

    Je voudrais ainsi "synchroniser" le fichier Produit_Local avec Produit_CS depuis le poste client à la demande.

    Pour cela, j'ai pensé à 2 solutions mais qui ne sont pas tout à fait optimale/correcte :

    Solutions 1 : Pas optimal
    Au niveau du poste client, je récupère le numéro de version de Produit_CS à l'aide de HVersion, si celui-ci est supérieur à la dernière version connue (stockée en local),
    je synchronise les fichiers de manière "naive" : je vide le fichier Produit_Local et je le rempli par Produit_CS (requête de sélection sur l'ensemble du fichier Produit_CS).
    Cette technique a le mérite de bien marcher, seulement elle n'est pas très optimale. Ceci est principalement dû au fait de la lourdeur de la requête (SELECT * FROM Produit_CS)
    Au lieu de récupérer seulement les ligne à modifier, là je récupère toout le contenu du fichier. Ce dernier peut contenir des milliers de lignes, et comme le traitement transite par internet, j'obtient des latence assez importantes !

    Je souhaite donc trouver un mécanisme qui me permette de récuperer seulement les tuples qui ont été modifiés (depuis la dernière synchronisation) et non tous les tuples de manière naïve
    Pour cela j'ai commencé à mettre en place la Solution 2 : (Incomplète)
    - J'ai ajouté aux deux fichiers une nouvelle rubrique "NumVersion".
    - J'ai mis en place au niveau de Produit_CS, un trigger qui incrémente le NumVersion à chaque modification d'une ligne par l'administrateur.
    - Ainsi, il devient possible de récupérer depuis le poste client les tuples ayant été modifiés (après dernière synchronisation), et ce par une simple requête sql de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Récupération des tuples dont le numversion serveur est supérieur au numversion local
    SELECT * FROM Produit_CS, Produit_Local WHERE Produit_CS.ID=Produit_Local.Id AND Produit_CS.NumVersion>Produit_Local.NumVersion;
    Comme vous l'avez certainement remarqué, bien que cette méthode est plus optimale que la première, seulement on ne peut récupérer à l'aide de cette requête les nouveaux produits ou les produits à supprimer !
    Si l'admin ajoute de nouveaux produits, ces derniers ne seront pas récupéré par cette requete.
    Il en est de même pour la suppression... Quoi qu'ici je peux considérer une suppression comme une modification et ce par la mise à 1 d'une rubrique "Supprimé", afin d'éviter toute suppresion physique,
    mais pour l'ajout, je n'arrive pas à formuler cela en SQL : "Récupérer de Produit_CS, les tuple dont le Id n'existe pas en Produit_Local"

    Des suggestions ?

    PS. Je souhaite éviter de passer par le serveur de réplication windev.
    « 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
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Pour recenser les product_id qui existent dans Produit_CS mais pas dans produit_Local, tu peux faire cette requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select product_id from produit_CS 
    minus
    select product_id from produit_local
    Ou si tu veux récupérer via cette requete les product_id, mais aussi le contenu de l'enregistrement :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from produit_CS p1 
    where not exists (select * from produit_local p2 where p2.product_id = p1.product_id)

    Et tu peux aussi gérer les suppressions par une requête similaire, en inversant les rôles de produit_CS et produit_local.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    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 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Fait aussi attention lors des ajouts dans ta table locale. En fonction de l'ordre des traitements, tu risques d'avoir des problèmes d'ID, surtout lors du premier remplissage de ta table.
    Les options hFIxedIdAuto ou hForcedIDAuto seront bien utiles.
    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 tbc92 Voir le message
    Ou si tu veux récupérer via cette requete les product_id, mais aussi le contenu de l'enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from produit_CS p1 
    where not exists (select * from produit_local p2 where p2.product_id = p1.product_id)
    Super! merci cela marche très bien, j'ai fusionné votre requête à la mienne à l'aide de la clause UNION, ce qui permet de récupérer en une seule requête les nouveaux enregistrements ainsi que ceux modifiés depuis dernière synchronisation.
    Merci encore!!


    Citation Envoyé par Voroltinquo
    Fait aussi attention lors des ajouts dans ta table locale. En fonction de l'ordre des traitements, tu risques d'avoir des problèmes d'ID, surtout lors du premier remplissage de ta table.
    Les options hFIxedIdAuto ou hForcedIDAuto seront bien utiles.
    j'imagine que vous parlez ici des IdAutomatique ? il est vrai que cela peut poser problème, notamment lors du remplissage, il possible d'avoir les mêmes produits avec des ID différents...
    Dans mon cas, je n'utilise pas de IDAuto, je gère la génération de l'Id à la main. les ID sont des rubriques clé primaire de type entier. Donc je pense que le problème ne se pose pas, à moins que je vous ai mal compris
    « 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
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 807
    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 807
    Points : 5 263
    Points
    5 263
    Billets dans le blog
    1
    Par défaut
    Je n'aime pas répondre à des sujet clos, mais en effet, je parlais des Id Auto et donc le pb ne se pose pas
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Italie

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Points : 10
    Points
    10
    Par défaut exemple de code
    bonjour b_reda31, je suis un débutant de windev, puisque je dois mettre à jour une table identique selon votre exemple, je voulais vous demander s'il est possible d'avoir le code windev complet de vos deux requêtes de mise à jour pour Solutions1 et Solution2 merci et salutations
    francesco










    Citation Envoyé par b_reda31 Voir le message
    Super! merci cela marche très bien, j'ai fusionné votre requête à la mienne à l'aide de la clause UNION, ce qui permet de récupérer en une seule requête les nouveaux enregistrements ainsi que ceux modifiés depuis dernière synchronisation.
    Merci encore!!




    j'imagine que vous parlez ici des IdAutomatique ? il est vrai que cela peut poser problème, notamment lors du remplissage, il possible d'avoir les mêmes produits avec des ID différents...
    Dans mon cas, je n'utilise pas de IDAuto, je gère la génération de l'Id à la main. les ID sont des rubriques clé primaire de type entier. Donc je pense que le problème ne se pose pas, à moins que je vous ai mal compris

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Comparer 2 fichiers et mettre à jour un fichier par rapport à l'autre
    Par Pleyel dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/05/2020, 14h18
  2. [Toutes versions] Remplir des cellules dans un fichier par rapport à un autre en VBA
    Par gregou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/01/2015, 10h40
  3. [Toutes versions] Mettre a jour un fichier excel par rapport à un autre
    Par david14120 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/04/2014, 23h30
  4. Réponses: 1
    Dernier message: 13/01/2011, 11h45
  5. [DOM] Mettre à jour un fichier XML (par URL)
    Par ensiie dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 21/01/2007, 12h56

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