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 :

Problème TRI : Liste / Fichier (algorithme) [WD18]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 46
    Par défaut Problème TRI : Liste / Fichier (algorithme)
    J'ai un fichier de relation entre deux fichiers, il s'appelle FicheRaf_Personne. Il est composé de :

    - IDFicheRaf_Personne (la clef composée)
    - IDPersonne
    - IDFicheRaf

    J'ai maintenant un champ liste de références de personnes (ex : NAL01, NES01, TRB01, ...). Je souhaite sauvegarder cette liste dans FicheRaf_Personne, mon problème est qu'il faut effectuer un tri (par insertion ?) des références afin de ne pas remettre dans mon fichier de relation des REF de personne qui y sont déjà.
    Pour ce faire j'ai une requête qui sélectionne mes IDPersonne en fonction de mon IDFicheRaf, j'arrive donc à récupérer les refs de personnes existantes mais je bute sur la comparaison par rapport à ma liste. Je ne parviens pas à faire l'algorithme en WLangage.

    Voici mon code initial qui malheureusement ne fonctionne pas :

    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
    // Parcours de toutes les personnes par fiche en cours 
    SI PAS HExécuteRequête(REQ_ModificationFiche_Personne,hRequêteDéfaut,IDFicheEnCours) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    FIN
     
    HLitPremier(REQ_ModificationFiche_Personne)
    TANTQUE PAS HEnDehors(REQ_ModificationFiche_Personne)
    	POUR TOUTE LIGNE DE LISTE_Personne
    		// Si la personne dans la liste n'est pas dans le fichier on l'ajoute
    		SI LISTE_Personne..ValeurMémorisée = REQ_ModificationFiche_Personne.IDPersonne ALORS
    			RETOUR
    		SINON	
    			FicheRaf_Personne.IDFicheRaf = IDFicheEnCours
    			FicheRaf_Personne.IDPersonne = LISTE_Personne..ValeurMémorisée
    			HAjoute(FicheRaf_Personne)
    		FIN
    	FIN	
     
    	Info("Res REQ en cours : "+REQ_ModificationFiche_Personne.IDPersonne)
    	HLitSuivant(REQ_ModificationFiche_Personne)
    FIN
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 915
    Par défaut
    Bonjour,

    Le problème vient de ton parcours de ta liste.

    A la place de POUR TOUTE LIGNE DE LISTE_Personne je ferais un parcours du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    POUR id = 1 _A_ ListeOccurrence(LISTE_Personne)
    	LISTE_Personne[id]..Valeur
    FIN

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HLitPremier(REQ_ModificationFiche_Personne)
    TANTQUE PAS HEnDehors(REQ_ModificationFiche_Personne)
    	POUR TOUTE LIGNE DE LISTE_Personne
    		// Si la personne dans la liste n'est pas dans le fichier on l'ajoute
    		SI LISTE_Personne..ValeurMémorisée = REQ_ModificationFiche_Personne.IDPersonne ALORS
    			RETOUR
    		SINON	
    ....
    		FIN
    	FIN	
    ...
    FIN
    Aie...

    L'algorithme en soi "n'est pas faux". Si je comprend bien, tu parcours ta requête et pour chaque identifiant de ta requête, tu regardes si cet identifiant se trouve dans la liste afin d'éviter les doublons sur ton champ IDPersonne.

    En regardant dans la doc, on peut se rendre compte que le parcours d'une liste (au sens champ du terme) peut être complétée par l'indice, je commencerai donc par là. En effet, je ne suis pas sûr que le POUR TOUTE LIGNE te sélectionne la ligne correctement et que par conséquent l'instruction LISTE_Personne..ValeurMémorisée = .... fonctionne comme tu l'espères.

    J'écrirai donc quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    POUR TOUT LIGNE i de LISTE_Personne
     (...) = LISTE_Personne[i]..ValeurMémorisée
    FIN
    En ce qui concerne la logique générale, quel est l'intérêt d'effectuer un tri ? Si ce que tu cherches à vérifier c'est la (non-)existence d'un couple (IDFicheRaf, IDPersonne), une requête peut le faire sans aucun souci !

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 46
    Par défaut
    En essayant vos deux parcours j'obtiens le même résultat qu'avec mon parcours. Si vous regardez ma première boîte de dialogue Info, j'affiche le résultat de ma requête, il faut ensuite que CHAQUE valeur de ma liste soit comparée à ce résultat à moins qu'il soit identique dans ce cas je sors. Le soucis est que si la comparaison entre les deux n'est pas identique, il va tenter direct de m'ajouter la valeur de ma liste alors qu'elle est peut-être déjà présente dans mon fichier. Suis-je assez clair car même pour moi cela ne l'est pas trop ...

    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
    // Parcours de toutes les personnes par fiche en cours 
    SI PAS HExécuteRequête(REQ_ModificationFiche_Personne,hRequêteDéfaut,IDFicheEnCours) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    FIN
     
    HLitPremier(REQ_ModificationFiche_Personne)
    TANTQUE PAS HEnDehors(REQ_ModificationFiche_Personne)
    	Info("Res REQ en cours : "+REQ_ModificationFiche_Personne.IDPersonne)
    	POUR TOUTE LIGNE i DE LISTE_Personne
    		Info("PERSONNE EN COURS : "+LISTE_Personne[i]..ValeurMémorisée)
     
    		// Si la personne dans la liste n'est pas dans le fichier on l'ajoute
    		SI LISTE_Personne[i]..ValeurMémorisée = REQ_ModificationFiche_Personne.IDPersonne ALORS
    			SORTIR
    		SINON	
    			FicheRaf_Personne.IDFicheRaf = IDFicheEnCours
    			FicheRaf_Personne.IDPersonne = LISTE_Personne[i]..ValeurMémorisée
    			HAjoute(FicheRaf_Personne)
    		FIN
    	FIN		
    	HLitSuivant(REQ_ModificationFiche_Personne)
    FIN

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 428
    Par défaut
    Bonjour,
    Je ne vois pas l'intérêt d'avoir deux boucles imbriquées.
    Il suffit de parcourir la liste, et pour chaque ligne de chercher dans la base si l'enregistrement existe déjà.

    Tatayo.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 46
    Par défaut
    Oui mais s'il n'existe pas je souhaite l'ajouter. Donc dans ma condition j'ai fait s'il n'existe pas l'ajouter sauf que ma requête ne sera positionnée que sur un seul enregistrement à ce momment là. Je souhaiterais que pour CHAQUE valeur de la liste TOUS les résultats de ma requête soientt parcourus. Cela n'est pas le cas, je passe à côté de quelque chose d'évident ?

  7. #7
    Membre Expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 915
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 915
    Par défaut
    Désolé j'avais mal compris la demande.
    tatayo a entièrement raison.

    En gros tu parcours ta liste.
    Tu ajoute un booléen indiquant que l'élément est présent ou pas.
    Puis lors du parcours de ton fichier tu met ton booléen à vrai si trouver.
    Puis à la fin du parcours de ton fichier si pas trouvé alors tu l'ajoute sinon tu passe à la ligne suivante de ta liste.

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 428
    Par défaut
    Si la liste ne contient pas des milliers de noms, on peut faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    POUR TOUTE LIGNE DE LISTE_Personne
        // Recherche dans la base, via une requête par exemple
        SI PAS trouve ALORS
            // Ajout dans la base
        FIN
    FIN
    Tatayo.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 46
    Par défaut
    EDIT : hfiltre() devrait m'aider
    Tout d'abord merci de votre rapidité, à partir de vos réponses j'ai fait ceci,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Parcours de toutes les personnes de la liste 
    POUR TOUTE LIGNE i DE LISTE_Personne
    	Info("PERSONNE EN COURS : "+LISTE_Personne[i]..ValeurMémorisée)		
    	// On cherche si la personne dans la liste est dans le fichier
    	HLitRecherchePremier(FicheRaf_Personne,IDPersonne,LISTE_Personne[i]..ValeurMémorisée)
    	// Si elle n'y est pas on l'ajoute
    	SI HTrouve() = Faux
    		FicheRaf_Personne.IDFicheRaf = IDFicheEnCours
    		FicheRaf_Personne.IDPersonne = LISTE_Personne[i]..ValeurMémorisée
    		HAjoute(FicheRaf_Personne)		
    	FIN
    FIN

    cela fonctionne bien le soucis c'est que je parcours tout le fichier alors que je voudrais parcourir en fonction de mon IDFicheRaf. Je n'ai vu que l'on pouvait ajouter un paramètre à la fonction hlitrecherchepremier() ou hlitrecherche().


    Ici ce n'est pas trop gênant mais dans la suite j'ai deux listes :

    - une contenant des machines ayant un problème
    - l'autre contenant les machines ayant le même problème à résoudre (si la machine n'est plus dans cette liste c'est que le problème est résolu)

    j'ai donc ajouté dans mon fichier de relation un booléen "Resolu" que je mets à 0 si ma machine est présente dans la seconde liste et à 1 si elle n'y est pas. Ma question comment puis-je passer des paramètres lors de ma recherche dans un fichier ?

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

Discussions similaires

  1. Problème Gestion Liste et fichiers txt
    Par Freud44 dans le forum Général Java
    Réponses: 2
    Dernier message: 26/08/2008, 21h10
  2. FTP Problème avec commons net récuperation de la liste fichier
    Par reverse_engineer dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 05/08/2008, 15h58
  3. problème sur listing des fichiers
    Par lenoil dans le forum Langage
    Réponses: 3
    Dernier message: 04/04/2007, 09h04
  4. [C#] Problème de sauvegarde fichier .jpeg et liste d'icone
    Par Dimitri_87 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/01/2007, 23h20
  5. Problème pour liste répertoires/fichiers
    Par pymouse dans le forum C
    Réponses: 1
    Dernier message: 15/12/2006, 11h45

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