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 :

Rechecher des enregistrements absents [WD19]


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut Rechecher des enregistrements absents
    Bonjour,
    j'ai réalisé une application où des utilisateurs ont une base de données en local sur leur pc et qui doivent synchroniser régulièrement leur base avec une base de données en HFSQL sur un serveur.
    Chaque fois qu'ils synchronisent, je rempli une table Synchronisation avec le numéro de matricule de l'utilisateur, la date de synchronisation et si la synchronisation est totale ou partielle.
    je voudrais pouvoir extraire la liste des utilisateurs dont la dernière synchronisation remonte à X temps.

    J'ai fait quelques recherches avec NOT IN mais ça ne répond qu'à une partie de mon problème:
    je voudrais faire ressortir la liste des utilisateurs qui n'apparaissent jamais dans la table de synchronisation et la liste de ceux dont le dernier enregistrement dans la table est inférieur à la date choisie.

    Comment je peux faire ma requête?

    je vous remercie
    Qui vit par le Troll périra par le Troll!

  2. #2
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Comme souvent, si cela ne marche pas dans un sens, il faut essayer dans l'autre...

    Donc en retournant le problème:
    Sélectionne TOUS les utilisateurs et enlève ce qui on fait une synchro récente.
    Et la le NOT IN servira bien pour le "enlève".

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 804
    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 804
    Points : 5 251
    Points
    5 251
    Billets dans le blog
    1
    Par défaut
    Une autre solution :
    Sélectionner les utilisateurs (NOT IN SYNCHRO) ou (SYNCHRO "lointaine")
    Sans la structure de tes tables, je ne peux pas développer plus, mais l'idée est là.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Bonjour,
    je vous remercie pour vos réponses;

    en attendant j'avais avancé en faisant ceci:
    je parcours tous mes utilisateurs et je recherche pour chacun combien j'ai de synchronisation enregistrées. Si 0 alors on garde l'utilisateur car il n'a jamais synchronisé; si supérieur à 0, alors je recherche la date de la dernière synchronisation, si elle est inférieure à la date souhaitée, je garde l’utilisateur.
    Qui vit par le Troll périra par le Troll!

  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
    Bonjour,
    il est inutile de créer plusieurs sujets qui traitent la même problèmatique.
    Je vous ai répondu dans votre précédent post et je vous ai orienté vers cette discussion.

    vous avez en fait 2 "sous-requêtes" à faire, l'une pour récupérer les lignes absentes (voir clause sql "exists") et l'autre pour récupérer les lignes qui ont été modifié depuis la dernière synchronisation (par ex:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from Distant,Local ... where Distant.DateSynchro>Local.DateSyncro and Distant.id = Local.id....
    )

    Ensuite il suffit de contruire la requête final à unissant les deux sous-requête à l'aide de la clause "UNION".
    « 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
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Bonjour,
    je suis en train de voir comment mettre en place la réplication de bases pour faire ma synchronisation et ne plus passer par des appels serveur comme vous me l'aviez indiqué.

    Aujourd'hui, quand un utilisateur fait une synchronisation, j'enregistre dans ma table de synchronisation le numéro du matricule et la date de la synchronisation pour que mon client puisse s'assurer que ses employés remontent bien leurs données.

    La problématique est donc de faire ressortir quels utilisateurs ne remontent pas leurs informations.

    Ces deux sujets sont bien liés à la synchronisation des bases mais ce sont deux problèmes différents.
    Qui vit par le Troll périra par le Troll!

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 29
    Points : 34
    Points
    34
    Par défaut
    Et si dans la table utilisateur, tu rajoutais un champ "date dernière synchro" que tu mettais à jour à chaque synchro de l utilisateur ?

    Ça simplifierais les requêtes à faire

  8. #8
    Membre à l'essai
    Homme Profil pro
    Analyste developpeur
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 21
    Points
    21
    Par défaut
    Je pousserais le vice encore plus loin même. Pourquoi ne pas conserver la date localement et bloquer l'application si la synchro n'est pas faite. Tu peux même ajouter un message d'avertissement les jours précédent.

    Paz d'ajout dans la banque, pas de contrôle a faire et si un utilisateur veut embarquer la bDD en conservant l'application, tu limites la durée de vie de l’accès aux infos.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Je ne peux pas bloquer l'application car l'utilisateur doit pouvoir l'utiliser même s'il n'a pas accès à internet ou une connexion très limitée; je propose d'ailleurs à l'ouverture et à la fermeture de l'application s'il souhaite faire la synchronisation des données.
    Qui vit par le Troll périra par le Troll!

  10. #10
    Membre à l'essai
    Homme Profil pro
    Analyste developpeur
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 21
    Points
    21
    Par défaut
    Pour ma part, je le ferais quand même mais avec des précautions.

    Chaque ouverture/ fermeture un message proposant la synchro
    Quand pas de synchro depuis disons 15 jours (ca depend de la politique interne), un message tous les jours indiquant que l'application sera bloqué dans 8,7,6 etcc jours
    Quand pas de synchro depuis disons 21 jours , application bloqué avec une petite fenetre invitant a proceder a la synchro OU a entrer le code de deblocage obtenable par telephone aupres d'un admin.

    Comme ca, meme en cas de pas d'internet (durant 3 semaines, vraiment ????) ils peuvent encore appeler pour etre débloqué.

    et pour le code de deblocage, je me souviens plus de la commande mais windev fournit une joli fonction de generateur de cle pour validation des licenses.

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    Bonjour;
    Je vais répondre suivant ce que j'ai compris, c.à.d. tu fais des ajouts dans Synchronisations pas des modifications.

    Exemple :

    Utilisateurs :
    Mat Nom
    001 AAA
    002 BBB
    003 CCC
    004 DDD
    005 EEE
    006 FFF

    Synchronisations :
    Id Mat Date
    001 001 Date1
    002 004 Date1
    003 002 Date2
    004 001 Date2
    005 006 Date2
    006 002 Date3
    007 001 Date3
    008 004 Date3
    009 006 Date3

    dans ce cas

    [ sélectionner tous les matricules dans Utilisateurs qui n'existent pas dans Synchronisations ] + [(Sélectionner tous les matricules dans Synchronisations dont la date est inférieure ou égale à la date choisie) qui n'existent pas dans (Sélectionner tous les matricules dans Synchronisations dont la date est supérieur à la date choisie) ]

    désolé je ne connais pas SQL, sinon je ferai des roquettes

    Bon Dev.

  12. #12
    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 fouedusa Voir le message

    [ sélectionner tous les matricules dans Utilisateurs qui n'existent pas dans Synchronisations ] + [(Sélectionner tous les matricules dans Synchronisations dont la date est inférieure ou égale à la date choisie) qui n'existent pas dans (Sélectionner tous les matricules dans Synchronisations dont la date est supérieur à la date choisie) ]

    désolé je ne connais pas SQL, sinon je ferai des roquettes

    Bon Dev.
    C'est ce que j'ai proposé de faire. La première requête est une requête de sélection avec clause "exists", et la seconde est une requête de sélection avec un simple critère,
    et enfin, ce que vous notez comme "+" est une clause "UNION".
    « 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!!»

  13. #13
    Membre à l'essai
    Homme Profil pro
    Analyste developpeur
    Inscrit en
    Octobre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste developpeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 10
    Points : 21
    Points
    21
    Par défaut
    sinon je vais tout de meme arreter de donner mon avis et etre constructif.

    Soit table USER

    IDUSER
    USERNAME
    ETC...

    et la table SYNCHRO

    IDSYNCHRO
    IDUSER
    DATESYNCHRO

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT USERNAME FROM USER WHERE IDUSER NOT IN (select IDUSER FROM SYNCHRO) OR IDUSER IN (SELECT IDUSER FROM SYNCHRO WHERE DATESYNCHRO > PARAMDATE)

    c'est pas beau et on doit pouvoir faire mieux avec une jointure mais ca devrait déjà faire ton job

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 174
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par b_reda31 Voir le message

    vous avez en fait 2 "sous-requêtes" à faire, l'une pour récupérer les lignes absentes (voir clause sql "exists") et l'autre pour récupérer les lignes qui ont été modifié depuis la dernière synchronisation (par ex: Select * from Distant,Local ... where Distant.DateSynchro>Local.DateSyncro and Distant.id = Local.id....)

    Ensuite il suffit de contruire la requête final à unissant les deux sous-requête à l'aide de la clause "UNION".
    Oui j'ai bien vu, je crois que cette solution est valide quand il s'agit de MODIFICATION (de la date) des lignes dans synchronisation pas quand il s'agit d'AJOUT de lignes a chaque synchronisation (on peut avoir plusieurs synchronisations pour le même utilisateur).

    Bon Dev

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    Bonjour,
    je vous remercie pour vos réponses.

    j'ai essayé la méthode de doubleseb dans le centre de contrôle HyperFile mais il ne reconnait pas la table de synchronisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fichier SYNCHRO inconnu
    J'ai bien fait attention de remplacer tous les noms de fichiers et de rubriques par les miens sans faire d'erreur.
    Qui vit par le Troll périra par le Troll!

  16. #16
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 804
    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 804
    Points : 5 251
    Points
    5 251
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Si nous avions une copie écran de ton analyse, nous pourrions peut être, être plus clairs
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    j'ai un fichier Utilisateur avec comme rubriques:
    - NumeroMatricule (texte de 50 caractères)
    - Nom (texte de 50 caractères)
    - Prénom (texte de 50 caractères)

    et un fichier HistoSynchro avec comme rubriques :
    - IDHistoSynchro (texte de 50 caractères généré par un GetGuid()
    - NumeroMatricule
    - Date (format AAAAMMJJ)
    - Heure (format HHMMSS)

    et voici la requête que je cherche à faire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Utilisateur.NumeroMatricule FROM Utilisateur WHERE Utilisateur.NumeroMatricule NOT IN (select HistoSynchro.NumeroMatricule FROM HistoSynchro) OR Utilisateur.NumeroMatricule IN (SELECT HistoSynchro.NumeroMatricule FROM HistoSynchro WHERE HistoSynchro.Date > '20171023')

    voici le message d'erreur complet:
    Echec de l'initialisation de la requete
    Erreurrenvoyée par le serveur <MonServeur:4900>
    Erreur dans le code SQL de la requete <SOUSREQUETE_00000000071AB670>. Initialisation de la requete impossible
    Fichier HistoSynchro inconnu
    je vous remercie
    Qui vit par le Troll périra par le Troll!

  18. #18
    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 391
    Points
    9 391
    Par défaut
    A partir du moment où histoSynchro est dans l'analyse, tu devrais pouvoir faire des requêtes que le lisent. Ici, ta requête semble correcte ; le problème serait donc ailleurs.

    Essaie de faire une requete toute simple, du style :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Utilisateur.NumeroMatricule FROM Utilisateur , HistoSynchro WHERE Utilisateur.NumeroMatricule =  HistoSynchro.NumeroMatricule
    Bien entendu, le résultat ne correspond pas à ta demande, mais l'idée est juste de voir si tu peux accéder à ce fichier HistoSynchro. Si cette

    L'autre point, c'est comment tu lances ta requete : hExecuteRequete( ..), ou encore hExecuteRequeteSQL(.. ) , autre syntaxe ? , avec quels paramètres ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 365
    Points : 176
    Points
    176
    Par défaut
    la requête fonctionne bien.
    J'accède bien à mon fichier car je m'en sert pour extraire un journal des synchronisations qui fonctionne bien.

    Pour exécuter mes requêtes, j'utilise SQLExec() et SQLAvance.
    Qui vit par le Troll périra par le Troll!

  20. #20
    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 391
    Points
    9 391
    Par défaut
    Je viens de regarder l'aide de SQLExec()... Pour moi, SQLExec() est une version amenée à disparaître, et à être remplacée par hExecuteRequeteSQL() ; je préfère nettement l'autre fonction.

    D'autre part, tu peux accéder à Utilisateur, et aussi à HistoSynchro. L'idée du test était de voir si tu pouvais accéder à Utilisateur et HistoSnchro en même temps, dans la même requête. En effet, il faut peut-être préciser quelque chose comme local.utilisateur vs distant.histoSynchro ou quelque chose comme ça.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. recup des enregistrement les plus récents.
    Par julien_guy dans le forum Langage SQL
    Réponses: 8
    Dernier message: 29/06/2004, 11h04
  2. HELP!Comment supprimer des enregistrements de tables jointes
    Par ROOTPARIS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/06/2004, 16h41
  3. Réponses: 7
    Dernier message: 21/04/2004, 17h16
  4. Réponses: 3
    Dernier message: 29/12/2003, 13h47
  5. Enlever tous les M&Mme des enregistrements
    Par marc olivier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/07/2003, 12h24

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