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 :

Transformer un bout de code en requete [WD14]


Sujet :

WinDev

  1. #1
    Membre du Club Avatar de nanox
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 61
    Points
    61
    Par défaut Transformer un bout de code en requete
    bonjour à tous,

    je travaille actuellement sur un systeme d'alerte :

    a l'ouverture de mon programme, je fais une recherche pour tous les enregistrements d'un fichier et compare une rubrique date avec la date du jour.
    Si cette difference est comprise entre 0 et 30 j'affiche une alerte sur ma fenêtre.
    Code de la fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HLitPremier(FICHIER)
    TANTQUE PAS HEnDehors(FICHIER)
        SI DateDifférence(DateDuJour(),FICHIER.DATE) >= 0 ET DateDifférence(DateDuJour(),FICHIER.DATE < 30 ALORS
    	Alerte..Visible=Vrai
        FIN
        HLitSuivant(PARTEN)
    FIN
    Ca fonctionne bien à un soucis près: le traitement est excessivement long.
    On m'a conseillé de créer une requete SQL mais mahleuresement je ne m'y connais pas trop.
    Est-il possible de créer ce genre de requête:
    Compter tous les enregistrements d'un fichier dont la diffenrence entre la date de l'enregistrement et la date du jour est comprise entre deux valeurs.

    D'avance merci.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Utilise l'éditeur de requete pour créer ta requête, il est très simple et intuitif

  3. #3
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Créez une requête dans WinDev de type SQL, collez le code suivant, puis faites un clic droit sur le code et demandez une rétro analyse pour arriver à une requête éditeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TOP 1
    	FICHIER.DATE
    FROM
    	FICHIER
    WHERE
    	FICHIER.DATE BETWEEN {DateMoins29} AND {Date}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dDate est une Date = DateSys()
     
    MaRequête.Date = dDate
    dDate -= 29
    MaRequête.DateMoins29 = dDate
    SI HExecuteRequête(MaRequête) ALORS
    	SI HLitPremier(MaRequête) ALORS
    		Alerte..Visible = Vrai
    	FIN
    FIN

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par nanox Voir le message
    Compter tous les enregistrements d'un fichier dont la diffenrence entre la date de l'enregistrement et la date du jour est comprise entre deux valeurs.
    Moi je retournerais le problème.
    Faire une requête qui compte le nombre de lignes entre deux dates c'est très simple à faire. Il suffit ensuite de passer les deux dates en paramètre.
    Code de la requête : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(ID) AS Nb
    FROM FICHIER
    WHERE DATE BETWEEN {DateDebut} AND {DateFin}

    Ensuite, exécute la requête, le champ Nb te renvoie bien le nombre d'enregistrements entre les deux dates.

  5. #5
    Membre du Club Avatar de nanox
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Merci pour vos conseils

    Je me suis un peu inspiré de vos deux exemples et j'ai résolu mon problème.

    code sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
    	 WL.DateDifférence( WL.DateDuJour(), FICHIER.DATE) AS DateDif
    FROM 
    	FICHIER
    WHERE 
    	 WL.SansEspace(FICHIER.DATE) <> '' (certains enregistrements n'ont pas de date)
    code de la fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    HExécuteRequête(MaRequete)
    HLitPremier(MaRequete)
    TANTQUE PAS HEnDehors(MaRequete)	
               SI MaRequete.DateDif>0 ET MaRequete.DateDif<=31 ALORS
    	  Alerte..Visible=Vrai
    	  HLitDernier(MaRequete)
               FIN
    HLitSuivant(MaRequete)
    FIN
    Et je sors de ma recherche dès qu'un élement est trouvé, contrairement à mon ancien code.Le traitement est vraiment plus rapide.
    Encore merci pour votre aide.

  6. #6
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    1. Si ce code est le code complet, pourquoi parcourir tous les enregs si c'est pour faire 1 action : Alerte..Visible = Vrai ?
    2. Il est inutile de faire calculer un DateDifference à chaque enreg alors que vous pouvez calculer les dates min et max une seule fois
    3. Si un jour on vous demande de passer à mysql ou autre, votre code marchera-t-il avec ce DateDifference ?
    4. L'utilisation de DateDifference au lieu d'un intervalle empêche le moteur SQL de trouver une optimisation basée sur un index sur la date. Sur une grosse table ça peut coûter cher.
    5. En plus ça vous fait rajouter un test : Date <> ''
    6. Le HLitDernier est inutile. En revanche HAnnuleDéclaration ne serait pas du luxe.
    7. Connaissez-vous la syntaxe POUR TOUT ? Ça remplace HLitPremier/HLitSuivant.
    8. Connaissez-vous cette syntaxe : SI 0 <= DateDiff <= 30 ALORS ...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    J'ajouterai même : Si le code ne traite qu'une ligne, pourquoi ne pas limiter la requête à cette seule ligne ?
    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
     
    dDebut est une date = datedujour
    dFin est une date = DateDuJour
    sSQL = [
    SELECT TOP 1 Date
    FROM Fichier
    WHERE Date BETWEEN '%1' AND '%2'
    ]
    dDebut..Jour -= 31
    dFin..Jour += 31
     
    SI PAS HexecuteRequeteSQL(sdVerif, hRequeteDefaut, chaineConstruit(sSQL, dDebut, dFin) ALORS
        Erreur(Herreurinfo())    //traiter l'erreur mieux que ça...
    SINON
        Alerte..Visible = HNbEnr(sdVerif) > 0
        HAnnuleDeclaration(sdVerif)    //
    FIN
    à compléter, il manque par exemple des déclarations, mais ce code n'est pas compliqué, il faut apprendre un peu le SQL et suivre le manuel d'auto-formation, c'est tout.

  8. #8
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Tout à fait, un peu comme dans ma 1ère réponse

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

Discussions similaires

  1. la sauvegarde des bouts de code ?
    Par blackhorus dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/10/2005, 13h34
  2. [XML][XSL] déplacer bout de code XML
    Par majanissa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 14/09/2005, 17h17
  3. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  4. bout de code à dechifrer svp
    Par bball dans le forum C
    Réponses: 32
    Dernier message: 20/01/2005, 23h23

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