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 :

lenteur excessive de l'execution de mon code!


Sujet :

WinDev

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut lenteur excessive de l'execution de mon code!
    bonjour,

    Mon code s'execute avec lenteuuuuuuuuuuuur pfffff.
    alors comment y remedier et pourquoi il est super lent?
    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
    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
    bRes est un booléen
    i est un entier
    i= 0
    sSql est une chaîne
    reqUpdate est une Source de Données
    reqTest est une Source de Données
    sSql="select id,proprio_adr1,proprio_adr2 from Bien where (bien_adresse2='' or bien_adresse2 is NULL) and (proprio_adr2 <>'' and proprio_adr2 is not NULL)"
    BTN_majAdr..Etat=Grisé
    Info(sSql)
    SI HExécuteRequêteSQL(reqTest,hModifieFichier,sSql) ALORS
    	Info("coucou")
    	HLitPremier(reqTest)
    	Info("salut")	
    	TANTQUE PAS HEnDehors(reqTest)
    		//info(reqTest.id)
    		// Traitement de l'enregistrement
    		sSql = "Update Bien SET bien_adresse1='"+ToFormat("",reqTest.proprio_adr1) +"' ,bien_adresse2='"+ToFormat("",reqTest.proprio_adr2) +"' where id="+reqTest.id
    		Info(sSql)
    		SI PAS HExécuteRequêteSQL(reqUpdate,hModifieFichier,sSql) ALORS
    			Erreur("Erreur Hyper File : " + HErreur())
    			Trace(sSql)
    		FIN
    		HLitSuivant(reqTest)
    		i +=1
    	FIN
    	//HFerme(reqUpdate)
    	//HAnnuleDéclaration(reqUpdate)
    	//HFerme(reqTest)
    	//HAnnuleDéclaration(reqTest)
    SINON
    	Erreur("Erreur Hyper File : " + HErreur())	
    FIN
    SI i > 0 ALORS
    	CBM_message = i + " Fichier(s) modifié(s)"
    SINON
    	Info("pas d'enregistrements à modifier")
    FIN
    BTN_majAdr..Etat=Actif
    la lenteur se traduit sur le code en vert

    par ailleurs, je voulais savoir si
    -HFerme(reqUpdate)
    -HAnnuleDéclaration(reqUpdate)
    doit se placer plutot dnas la boucle ou a la fin du code...?

    et pour
    //HFerme(reqTest)
    //HAnnuleDéclaration(reqTest)
    ils doivent etre utilisés du moment que HExécuteRequêteSQL est executé , meme si celui ci ne ramene pas d'enregistrement?

    nath

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 28
    Par défaut
    bonjour,
    as tu essayé cette requete directement au niveau du requeteur HF?
    toutes les conditions de ta requetes sont elles bien necessaires?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (bien_adresse2='' or bien_adresse2 is NULL) and (proprio_adr2 <>'' and proprio_adr2 is not NULL)
    la premiere requete vient juste lire le fichier donc deja tu peux enlever le hmodifiefichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SI HExécuteRequêteSQL(reqTest,hModifieFichier,sSql) ALORS
    Le hlitpremier rexecute la requete par defaut, il faudrait préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitPremier(reqTest, hSansrafraichir)
    comme cela la requete ne sera plus re_executée.
    Cela devrait déjà améliorer pas mal les choses !
    tiens nous au courant !

    voila!
    @+++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    c'est toujours la cata...
    ma table compte 25 000 enregistrement, c'est peut etre ca?
    j'ai fait ma requete avec l'editeur de requete de WD, mais cela ne change pas vraiment grd chose...beuh...

    sinon pour ma derniere question sur les hferme, une reponse?

    thanks!

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 28
    Par défaut
    les hferme n'ont pas d'incidences sur la rapidité d'execution de ta requete.
    Perso je place cela en fin de proccedure.
    et puis 25000 enreg, c'est pas la mère a boire.

    en combien de temps ta requete s'execute ?

    Par contre il est curieux que tu n'obtienne aucune amélioration vu que ta requete s'execute déja 2 fois :
    1 fois avec le hexexecuterequetesql
    1 fois avec le hlitpremier.
    en ayant mis le param Hsansrafraichir tu n'executes plus qu'1 fois...

    as tu demandé une optimasation de ta requete?
    peut être que la base n'a pas les clés necessaires
    @+++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    45 seconde... c'est enorme, non?
    et liberation de ressource(HAnnuleDéclaration) n'ont pas , non plus, d'incidence
    sur la rapidité d'execution du code de mon boutton?

    j'ai fait l'optimisatisation de requete, et il m'a suggere de mettre une cle avec doublon sur "proprio_adr2", je ne suis pas tres d'accord avec lui, si il y'a cle avec doublon a ajouter, il me semble plutot que ce serait sur "bien_adresse2"...

    la plupart du temps ce champs est renseigné, mais il peut arriver qu'il soit vide et dans ce cas, on veut mettre la valeur de "proprio_adr2", c'est pour cela que j'effectue ce traitement...

    et il m'a suggérer de faire une cle composite avec "bien_adresse2" et "proprio_adr2". mais je pense que cela vaut pas vraiment la peine d'ajouter une composite pour un traitement qui va etre effectué max, une fois par jour, non?

    Il me semble effectivement que 22 000 enregistrements soient pas vraiment bcp...


    peut etre qu'il ya eu une amelioration, mais bon, j'ai pas fait trop attention la differnece car 45 sc semble long, comme 1mn30..

  6. #6
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    488
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 488
    Par défaut
    N'hésite pas à utiliser les threads si jamais ton code est bloquant pour l'utilisateur... A manipuler avec précaution mais parfois très pratique

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    les threads, quesako?

  8. #8
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    488
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 488
    Par défaut
    En gros, le programme execute le code en arrière tache. Je te conseille de regarder l'aide en ligne.

    Par exemple, tu peux faire un thread de remplissage de tableau.
    Tu remplis le tableau en arrière tache, et pendant ce temps l'utilisateur peut parcourir les lignes du tableau déja remplies.

    C'est un exemple assez basique, l'aide en ligne devrait être assez précise là dessus je crois.

    Pour donner un exemple plus précis, dans ma boite, actuellement, chaque utilisateur a une messagerie interne assez conséquente. Elle est chargée entièrement au début du programme. Comme elle est conséquente, et bien pour ne pas bloquer l'utilisateur, le tout est rempli par un thread. L'utilisateur peut donc utiliser le reste du programme pendant que les messages chargent.


    Citation Envoyé par L'aide en ligne
    Une application est en cours d'exécution. Cette application s'exécute dans un thread principal.

    A tout moment, cette application peut lancer un thread secondaire : ce thread s'exécute en parallèle de l'application. Ce thread correspond à une procédure (locale ou globale) de l'application.

    Ce thread secondaire va s'exécuter en parallèle de l'application principale. Il est possible de réaliser dans ce thread tous les traitements réalisables en tâche de fond : réception des e-mails,

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    ah oui...j'en ai deja entendu parler...

    mais je m'interroge tout de meme de pourquoi cela prend autant de temps?

    je rappelle 25000 enregistrements(pas la mer a boire, comme disait berVes), et une centaine de champs dans ma table:
    la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSql="select id,proprio_adr1,proprio_adr2 from Bien where (bien_adresse2='' or bien_adresse2 is NULL) and (proprio_adr2 <>'' and proprio_adr2 is not NULL)"
    c'est normal que ma requete prenne envrion 45 secondes a s'executé?
    j'ai ajouté une clef priamaire avec doublon sur bien_adresse2 ....

  10. #10
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    488
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 488
    Par défaut
    Peut être qu'en réduisant les conditions, mais en les traitant ensuite dans le code, aiderait à gagner du temps...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSql="select id,proprio_adr1,proprio_adr2 from Bien where (bien_adresse2='' or bien_adresse2 is NULL) and (proprio_adr2 <>'' and proprio_adr2 is not NULL)"
    Ca me semble plutot pas mal optimisé, comme requête... Peut être est ce du à des problèmes de réseau ou de machine, que sais je... En sélectionnant tous les champs, tu ne gagnerais pas du temps ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSql="select * from Bien where (bien_adresse2='' or bien_adresse2 is NULL) and (proprio_adr2 <>'' and proprio_adr2 is not NULL)"
    Parfois, windev est plus lent quand on choisi certains champs... (j'ai déja vu ce cas de figure, sans que je comprenne vraiment pourquoi)

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    finalement j'ai modifié ma requete ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSql="select id,proprio_adr1,proprio_adr2 from Bien where bien_adresse2='' or bien_adresse2 is NULL
    et j'ai testé si mon champs porprio_adr2 etait nul ou vide dans mon code:
    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
    SI HExécuteRequête(REQ_MAJAdresse)
    	HLitPremier(REQ_MAJAdresse,hSansRafraîchir)	
    	TANTQUE PAS HEnDehors(REQ_MAJAdresse)
    		// Traitement de l'enregistrement
    		IF REQ_MAJAdresse.proprio_adr2 <> "" ET REQ_MAJAdresse.proprio_adr2 <> Null ALORS
    			sSql = "Update Bien SET bien_adresse1='"+ToFormat("",REQ_MAJAdresse.proprio_adr1) +"' ,bien_adresse2='"+ToFormat("",REQ_MAJAdresse.proprio_adr2) +"' where id="+REQ_MAJAdresse.id
    			//info(sSQL)
    			SI PAS HExécuteRequêteSQL(reqUpdate,hModifieFichier,sSql) ALORS
    				Erreur("Erreur Hyper File : " + HErreur())
    				Trace(sSql)
    			FIN
    			i +=1
    		FIN
    		HLitSuivant(REQ_MAJAdresse)
     
    	FIN
     
    SINON
    	Erreur("Erreur Hyper File : " + HErreur())	
    FIN
    ainsi l'execution de mon code est quasi immediate...

    merci a tous pour votre aide

    ps @kuranes : il faut tjours préférer selectionner seul les colonnes dont on a besoin plutot qu'un select *, au niveau de l'optimisation c'est mieux

  12. #12
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    488
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 488
    Par défaut
    Citation Envoyé par nath-0-0
    ps @kuranes : il faut tjours préférer selectionner seul les colonnes dont on a besoin plutot qu'un select *, au niveau de l'optimisation c'est mieux
    Je sais. En général il faut. Mais dans deux ou trois cas particulier, ça s'est avéré plus efficace, j'ignore pourquoi. Windev est plein de surprises...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 551
    Par défaut
    comme quoi l'informatique regorge de mystères....


  14. #14
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 28
    Par défaut
    salut,
    personnellement, j'ai quelques doutes....

    une requete avec un select * .....hum.... au niveau rapidité si ma table contient 30 colonnes, je prefere faire select c1,c2,c3... surtout si j'ai besoin que de travailler sur ces 3 colonnes...
    je pense qu'en terme de rapidité, y'a pas photos !
    ce que me confirme du reste l'analyseur de perfs...
    Maintenant, j'utilise Oracle et SqlServeur...
    Peut-etre que HF est plus "tolérant" ?

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

Discussions similaires

  1. probleme d'execution de mon code à cause d'un renvoie de variable.
    Par yorukaze dans le forum Général Python
    Réponses: 2
    Dernier message: 01/03/2008, 16h36
  2. Réponses: 3
    Dernier message: 31/07/2006, 16h07
  3. [VBA-E] Aide pour éxécuter mon code en cliquant sur un bouton dans excel.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 53
    Dernier message: 29/05/2006, 14h47
  4. [FLASH MX2004] Rien ne se passe qd j'execute mon code
    Par adilou1981 dans le forum Flash
    Réponses: 2
    Dernier message: 28/07/2005, 00h31
  5. [Exécutable]puis je creer un executable a partir de mon code ?
    Par youpileouf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/06/2005, 10h15

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