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 :

Bug sur un bout de code [WD17]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut Bug sur un bout de code
    Je possède un fichier élément avec les rubriques:

    (idélément,el_noeud,el_codif,el_codif_prec)
    le fichier possède des données comme suit(pour les deux dernières colonnes:
    el_codif el_codif_prec
    100A01 100000
    100000 000000
    101000 100000
    102N01 102000
    102N02 102N01
    102N03 102N02
    102P01 102N01
    102Q01 102P01
    102R01 102Q01
    102S01 102R01
    102000 101000
    103A01 103000
    103000 102000
    104A01 104000
    104B01 104A01
    104N01 104000
    104N02 104N01
    104N03 104N02
    104N04 104N03
    104P01 104N01

    en fait l'objectif est que: si il y a un élément en double sur la dernière colonne,cette valeur est recherchée dans la première colonne , si elle est trouvé,le el_noeud correspondant prend la valeur 1.

    J'ai ainsi implémenté ce bout de code après avoir créé une table fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    POUR i=1 _A_ TableOccurrence(TABLE_Elément)
    	POUR j=i+1 _A_ TableOccurrence(TABLE_Elément)
    		SI TABLE_Elément.COL_EL_codif_prec[i]=TABLE_Elément.COL_EL_codif_prec[j] ALORS
    			HLitRecherche(Elément,Elément.IDElément,TABLE_Elément.COL_EL_codif_prec[i])
    			SI HTrouve(Elément) ALORS
    				TABLE_Elément.COL_EL_noeud=1
    			FIN
    		FIN
    		HModifie(Elément)
    	FIN
    FIN
    Mais c'est comme si il y a une boucle infinie.J'ai à peine 2000 enregistrements.
    Quelqu'un a une piste?

  2. #2
    Membre chevronné Avatar de jimmypage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 314
    Par défaut
    Salut,

    Vu la boucle et le 2000 enregistrements, ca me paraît logique que ça prenne du temps ...

    avec 2000 enregistrements tu va passer (1999+1998+1997+...+1)= très beaucoup de fois dans ta boucle. Sachant qu'en plus tu fais un HlitRecherche (qui prends lui aussi son temps), au final ca peut faire beaucoup !

    A mon avis ce code est à optimiser !!

  3. #3
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut
    Citation Envoyé par jimmypage Voir le message
    Salut,

    Vu la boucle et le 2000 enregistrements, ca me paraît logique que ça prenne du temps ...

    avec 2000 enregistrements tu va passer (1999+1998+1997+...+1)= très beaucoup de fois dans ta boucle. Sachant qu'en plus tu fais un HlitRecherche (qui prends lui aussi son temps), au final ca peut faire beaucoup !

    A mon avis ce code est à optimiser !!
    T'as une piste pour l'optimisation?

    cordialement

  4. #4
    Expert confirmé
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 567
    Par défaut
    Ajoute une jauge pour voir quand ça part en cacahuete...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     jmax est entier = TableOccurrence(TABLE_Elément)
    POUR i=1 _A_ TableOccurrence(TABLE_Elément)
    	POUR j=i+1 _A_ TableOccurrence(TABLE_Elément)
    		SI TABLE_Elément.COL_EL_codif_prec[i]=TABLE_Elément.COL_EL_codif_prec[j] ALORS
    			HLitRecherche(Elément,Elément.IDElément,TABLE_Elément.COL_EL_codif_prec[i])
    			SI HTrouve(Elément) ALORS
    				TABLE_Elément.COL_EL_noeud=1
    			FIN
    		FIN
    		HModifie(Elément)
                        jauge(j, jmax,numeriqueverchaine(i) + " / " + numeriqueverchaine(j))	
         FIN
    FIN
    Ca ralentira un peu à cause de l'affichage mais ça te permettra de savoir pour quel "i" il y a problème...

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 402
    Par défaut
    Bonjour,

    Le HModifie(..), je le positionnerai ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    POUR i=1 _A_ TableOccurrence(TABLE_Elément)
    	POUR j=i+1 _A_ TableOccurrence(TABLE_Elément)
    		SI TABLE_Elément.COL_EL_codif_prec[i]=TABLE_Elément.COL_EL_codif_prec[j] ALORS
    			HLitRecherche(Elément,Elément.IDElément,TABLE_Elément.COL_EL_codif_prec[i])
    			SI HTrouve(Elément) ALORS
    				TABLE_Elément.COL_EL_noeud=1
    		                HModifie(Elément)		
                            FIN
    		FIN
    	FIN
    FIN
    Il me semble que ça soit plus raisonnable, dans le sens où je ne sais pas quel résultat cela a, si après un premier passage de modification, le HModifie(..) va rester sur l'enregistrement modifié et le modifiera à chaque tour de boucle ?

  6. #6
    Membre émérite Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Par défaut
    Bonjour,

    Si tes données proviennent d'un fichier, tu dois pouvoir faire une requête pour trouver les valeurs multiples.
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select el_codif_prec , count(*) as nb from MonFic having nb >1 group by el_codif_prec
    Tu recherche ensuite les valeurs dans ton fichier Elément en parcourant ta requête.

  7. #7
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut
    salut christophe,
    je comprends bien ta proposition.Mais si tu relis mon premier poste, il est question de rechercher des doublon sur la colonne el_codif_prec.Si le doublon est trouvé, on recherche cette valeur dans l'avant dernière colonne el_codif.Si on la trouve,on affecte la valeur 1 au booléen el_noeud du même enregistrement en cours.

    Car si je crée une vue ou la requête dont tu parles comment faire après le lien avec l'enregistrement en cours dans le fichier pour modifier le booléen?

    cordialement

  8. #8
    Membre émérite Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Par défaut
    Désolé mais tu dis :
    en fait l'objectif est que: si il y a un élément en double sur la dernière colonne,cette valeur est recherchée dans la première colonne , si elle est trouvé,le el_noeud correspondant prend la valeur 1.
    Je ne vois pas l’intérêt d'un code de type :
    pour i = 1 a
    pour j = i+1 a
    dans le cas présent.

    Est ce que el_codif est unique ?
    Comment est triée ta table?

  9. #9
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Si la formulation du départ est juste :
    en fait l'objectif est que: si il y a un élément en double sur la dernière colonne,cette valeur est recherchée dans la première colonne , si elle est trouvé,le el_noeud correspondant prend la valeur 1.
    alors la proposition de wimbish me parait tout a fait adapté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select el_codif_prec , count(*) as nb from MonFic having nb >1 group by el_codif_prec
    on recherche d'abord les doubles sur la dernière colonne (avec la requête) et ensuite on parcours le résultat de cette requête en effectuant la recherche sur la 1ière colonne et on marque à 1.

  10. #10
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut
    Bonjour,
    après reflexion sur vos propositions,j'ai créé cette requête:
    Req_traitement_noeud:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	Elément.EL_codif_prec AS EL_codif_prec,	
    	COUNT(*) AS nbr_doublon
     
    FROM  Elément
     
    WHERE Elément.EL_codif_prec<>''   //pour éliminer certaines données vides
     
    GROUP BY 
    	Elément.EL_codif_prec
    HAVING 
    	COUNT(*) > 1;
    puis j'ai implémenté ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Initialise la requête
    SI PAS HExécuteRequête(REQ_traitement_noeud) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // lecture du premier enregistrement de la requête
    HLitPremier(REQ_traitement_noeud)
    TANTQUE PAS HEnDehors()
    	// Traitement sur l'enregistrement de la requête
    	HLitRecherchePremier(Elément,Elément.IDElément,REQ_traitement_noeud.EL_codif_prec)
    	TANTQUE HTrouve(Elément)
    		Elément.EL_noeud=1
                        hmodifie(élément)
    		HLitSuivant(Elément)
    	FIN
     
    	HLitSuivant(REQ_traitement_noeud)
    FIN
    Mais je n'ai pas en l'état, les changements escomptés.

  11. #11
    Membre très actif Avatar de PaulNero
    Homme Profil pro
    DBA Senior Oracle and SQL SERVER
    Inscrit en
    Octobre 2010
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Inde

    Informations professionnelles :
    Activité : DBA Senior Oracle and SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 416
    Par défaut
    Après plusieurs tractations intellectuelles,j'ai enfin trouvé le petit truc qui bloquait.

    il suffisait dans hlitrecherche de mettre Elément.El_codif en lieu et place de Elément.IdElément.

    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	Elément.EL_codif_prec AS EL_codif_prec,	
    	COUNT(*) AS nbr_doublon
     
    FROM  Elément
     
    WHERE Elément.EL_codif_prec<>''   //pour éliminer certaines données vides
     
    GROUP BY 
    	Elément.EL_codif_prec
    HAVING 
    	COUNT(*) > 1;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SI PAS HExécuteRequête(REQ_traitement_noeud) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    FIN
    // lecture du premier enregistrement de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    HLitPremier(REQ_traitement_noeud)
    TANTQUE PAS HEnDehors()
    	// Traitement sur l'enregistrement de la requête
    	HLitRecherchePremier(Elément,Elément.El_codif,REQ_traitement_noeud.EL_codif_prec)
    	TANTQUE HTrouve(Elément)
    		Elément.EL_noeud=1
                        hmodifie(élément)
    		HLitSuivant(Elément)
    	FIN
    
    	HLitSuivant(REQ_traitement_noeud)
    FIN

    merci pour l'ensemble des interventions,merci aussi particulièrement à WIMbish le premier à proposer la requête qui m'a conduit au résultat.

    Paulnero

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

Discussions similaires

  1. un coup de main sur un bout de code
    Par namstou3 dans le forum Flex
    Réponses: 2
    Dernier message: 01/07/2008, 06h27
  2. Eclaircissements sur un bout de code
    Par namstou3 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/09/2007, 20h47
  3. Infos sur ce bout de code vb
    Par Freud44 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 05/09/2007, 14h46
  4. explication sur un bout de code
    Par poporiding dans le forum C++
    Réponses: 2
    Dernier message: 27/06/2006, 18h04
  5. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51

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