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 :

[WD10] comment exécuter une requete SQL en hyperfile ?


Sujet :

WinDev

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par klbsjpolp Voir le message
    Je n'ai pas dit d'enlever le HLitSuivant mais de le mettre à la fin de la boucle. Le HLitPremier positionne sur le premier enregistrement et le HLitSuivant avance jusqu'à la fin (HEnDehors = Vrai). Mais si tu n'as pas de résultat, tout de suite après le HLitPremier, HEnDehors retourne Vrai mais tu ne prends pas en compte cette éventualité. Ton code devrait donc ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SI HExécuteRequêteSQL(Req_dictionnaire_test,"SELECT * FROM dictionnaire_test WHERE dictionnaire_test.Rubrique2="+Saisie_valeur) _ET_ HLitPremier(Req_dictionnaire_test) ALORS
        TANTQUE PAS HEnDehors
            Trace(Req_dictionnaire_test.Rubrique1+"/"+Req_dictionnaire_test.Rubrique2+"/"+Req_dictionnaire_test.Rubrique3)
            HLitSuivant(Req_dictionnaire_test)
        FIN
    SINON
        Erreur(HErreurInfo)
    FIN
    ah oui, autant pour moi, j'avais mal compris (je l'avais mis apres la boucle au lieu de la fin de la boucle)

  2. #22
    Membre actif Avatar de peijnoob
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 279
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par klbsjpolp Voir le message
    Je ne croyais pas que cette syntaxe existait sur WD10.
    Ah pardon, dans mon élan d'optimisme je n'avais pas fait attention au numéro de version !

    En effet elle n'existait peut-être pas, mea culpa !

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par mogwai162 Voir le message
    Oui le Hlitsuivant est mal placé. De plus je te déconseille l'utilisation de * dans ta requête, il vaut mieux mettre uniquement les champs dont tu as rééllement besoin.

    La requête présente un interet double :

    1 - Elle permet généralement une économie d'I/Os
    2 - Elle permet de réduire la quantité de données transitant sur le réseau.
    honnetement, je sais que comme je l'ai codé ca marche, mais je ne comprends pas tout ce que j'écris ...
    et notamment le * je ne sais pas à quoi il sert
    donc si tu pouvais m'éclaircir sur ce pt

    apres, l'interet 2 dont tu parles, c'est uniquement valable si c'est une appli en réseau local ou internet non ?
    car moi c'est une requete uniquement sur une BDD sur le pc

    enfin, je sais pas si le * jouera un role ou pas, mais je souhaiterai par la suite complexifier la requete, et non plus faire une requete sur une seule rubrique mais sur plusieurs
    par exemple, il faut que à la fois la rubrique 1 soit égale à telle lettre, et la rubrique 2 à telle autre lettre
    je ne sais pas si dans ce cas, le * a tout son sens ou pas ...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 474
    Points : 814
    Points
    814
    Par défaut
    Le * de SELECT * signifie qu'on sélectionne toutes les rubriques présentes.

    Je pense que tu devrais faire un tour dans des cours SQL...

    Et tu peux utiliser les nomrubrique1 AS A, nomrubrique2 AS B, etc... pour attribuer à des lettres.

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par kuranes Voir le message
    Le * de SELECT * signifie qu'on sélectionne toutes les rubriques présentes.

    Je pense que tu devrais faire un tour dans des cours SQL...

    Et tu peux utiliser les nomrubrique1 AS A, nomrubrique2 AS B, etc... pour attribuer à des lettres.
    donc dans mon cas, si je souhaite au final faire une recherche sur plusieurs rubriques, il faut que je garde SELECT * non ?

    comment je dois faire pour le code alors pour faire une recherche sur plusieurs rubriques ?

    enfin , pour les cours SQL, bah je n'en n'ai malheureusement pas, j'apprends par moi meme à utiliser WD : c'est un hobby, et je ne travaille pas du tout dans ce secteur ^^

  6. #26
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Tout à fait c'est pour ça qu'il vaut mieux abandonner le * et preciser les noms de champs un par un en plyus ça rendra ton code plus lisible.

    Et bien, sûr si tu ne te sers pas du réseau tu ne pourras pas faire d'economie de bande passante...

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par mogwai162 Voir le message
    Tout à fait c'est pour ça qu'il vaut mieux abandonner le * et preciser les noms de champs un par un en plyus ça rendra ton code plus lisible.

    Et bien, sûr si tu ne te sers pas du réseau tu ne pourras pas faire d'economie de bande passante...
    ok, mais faudrait (encore) m'aider

    déjà, comment faudrait il coder sans le * ?

    et ensuite , comment fait on pour faire une recherche multicriteres ?

    actuellement j'ai par exemple ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(Req_dictionnaire_test,"SELECT * FROM dictionnaire_test WHERE dictionnaire_test.Lettre1='A')
    pour sélectionner dans mon dictionnaire les mots dont la 1ere lettre (Rubrique1 = Lettre1) est "A"

    et maintenant si j'enleve les "*" et que je veux faire une requete dans la BDD dictionnaire_test pour y trouver les mots dont la 1ere lettre (Rubrique1 = Lettre1) est "A" et 2eme lettre (Rubrique2 = Lettre2) est "S" : on code quoi ?

    merci

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 410
    Points : 513
    Points
    513
    Par défaut
    Salut,

    A la place de * tu met le nom de la rubrique qui apparaitra en résultat.

    Si par exemple tu as 5 rubriques nommées : Lettre1, Lettre2, Lettre3, Lettre4 et Lettre5 et que ce qui t'intéresse c'est d'avoir Lettre1, Lettre2 et Lettre3 uniquement alors t'as clause SELECT sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Lettre1, Lettre2, Lettre3 FROM ...
    A la place de *

    Pour une recherche multicritères tu utilisera un opérateur logique AND, OR, etc.

    dans ton exemple ça sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaineSQL est une chaine
    chaineSQL = "SELECT dictionnaire_test.Lettre1, dictionnaire_test.Lettre2 FROM dictionnaire_test WHERE dictionnaire_test.Lettre1='A' AND dictionnaire_test.Lettre2='S'"
    HExécuteRequêteSQL(Req_dictionnaire_test,chaineSQL)
    Ou bien avec l'opérateur OR selon se que tu veux obtenir

    Pour simplifier la lecture tu peux aussi utiliser des alias.

    N'oublie pas les contrôles d'erreur pour savoir si la requête s'exécute correctement.

    A+

  9. #29
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Ou mieux encore tu fais la requete sous l'editeur de requête... Cela te permettra de la construire plus facilement.

    De plus il faut savoir que si tu teste A et B et que tu passe null en paramètre a B, il te fera la sélection que sur les A.

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    ok merci basam, j'ai tout compris et mis en application

    par contre, je me demande si j'ai effectivement intérêt ou pas à enlever le *
    car en fait, j'en ai besoin pour faire d'autres requetes par la suite (apres qq traitements dans mon application)

    car apres avoir fait la requete sur les 2 premieres lettre de la BDD HF, il faut que je passe à des requetes sur les 3 premieres lettres

    donc ce que j'avais fait déjà (mais avec des fichiers txt comme BDD) c'est que j'avais effectué la requete sur la 3eme lettre, uniquement sur les résultats positifs de la premiere requete (cad sur les mots commencant bien par les 2 bonnes premieres lettres)

    d'où ma question
    :
    est ce que si je travaille avec des BDD HF qui a priori sont bcp plus rapides à traiter que des .txt, j'ai interet à faire ma seconde requete sur les résultats de la premiere, ou sur toute la BDD HF intiale ....

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    autre question

    je suis passé à la requete non plus sur un chiffre , mais sur une lettre :s
    et j'ai un pb :

    si je code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(Req_dictionnaire,"SELECT * FROM dictionnaire WHERE dictionnaire.Rubrique2='a'")
    ca marche

    par contre, si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(Req_dictionnaire,"SELECT * FROM dictionnaire WHERE dictionnaire.Rubrique2="+lettre_à_tester)
    lettre_à_tester est définie comme variable locale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lettre_à_tester est un caractère = "a"
    ca ne marche pas

    ni même dans le cas où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(Req_dictionnaire,"SELECT * FROM dictionnaire WHERE dictionnaire.Rubrique2="+saisie_lettre_à_tester)
    avec saisie_lettre_à_tester un champs de type = texte / masque de saisie = Lettres / Taille de saisie = 1 caractère

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    arf, j'ai trouvé, faut ajouter des ' entre le champs pour avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(Req_dictionnaire,"SELECT * FROM dictionnaire WHERE dictionnaire.Rubrique2='"+lettre_à_tester+"'")
    reste encore ma question en fin de page 2 qui est plus d'ordre général que ce que je viens de résoudre

  13. #33
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 410
    Points : 513
    Points
    513
    Par défaut
    Salut,

    Tu peux utiliser le résultat de la requête comme paramètre pour la deuxième, tu peux aussi traiter le résultat de la requête par du code WLangage, tout dépend de ce que tu veux faire.
    A+

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par basam95 Voir le message
    Salut,

    Tu peux utiliser le résultat de la requête comme paramètre pour la deuxième, tu peux aussi traiter le résultat de la requête par du code WLangage, tout dépend de ce que tu veux faire.
    A+
    Salut Basam

    "comme paramètre pour la deuxieme" cad comme nouvelle BDD sur laquelle faire la requete ?

    effectivement, je pense que ce serait mieux
    car j'ai réussi à faire ce que je voulais, mais je ne constate aucun gain de temps par rapport à avant (où je faisais une recherche dans un fichier txt)

    et en éliminant des lignes de code, je me rends compte que la requete SQL en elle meme est très rapide (requete SQL sur dictionnaire, et résultats de la requete dans Req_dictionnaire)
    mais ensuite, ce qui prend du temps, c'est que je transfere toutes les rubriques du résultat de la requete Req_dictionnaire vers une autre BDD HF (un .fic) que j'ai appelé dictionnaire_affiné, pour ensuite faire une nouvelle requete SQL sur dictionnaire_affiné
    et c'est ce transfert qui prend bcp de temps en fait :s

    j'ai l'impression de pas faire convenablement :s

  15. #35
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 120
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par lepirate Voir le message
    Salut Basam

    "comme paramètre pour la deuxieme" cad comme nouvelle BDD sur laquelle faire la requete ?

    effectivement, je pense que ce serait mieux
    car j'ai réussi à faire ce que je voulais, mais je ne constate aucun gain de temps par rapport à avant (où je faisais une recherche dans un fichier txt)

    et en éliminant des lignes de code, je me rends compte que la requete SQL en elle meme est très rapide (requete SQL sur dictionnaire, et résultats de la requete dans Req_dictionnaire)
    mais ensuite, ce qui prend du temps, c'est que je transfere toutes les rubriques du résultat de la requete Req_dictionnaire vers une autre BDD HF (un .fic) que j'ai appelé dictionnaire_affiné, pour ensuite faire une nouvelle requete SQL sur dictionnaire_affiné
    et c'est ce transfert qui prend bcp de temps en fait :s

    j'ai l'impression de pas faire convenablement :s
    arf oui lol
    ca marche effectivement :
    ce que je faisais de copier les résultats dans une autre BDD ne sert à rien :s
    je peux directement faire une seconde requete sur le résutlat de la premiere
    cool merci

    par contre, est ce que ca vaut le coup de faire la 2nde requete sur les résultats de la premiere ?
    dans mon idée, ca permet de réduire la BDD sur laquelle la 2nde requete est faite : on passe par exemple de 10 000 mots à screener dans la BDD initiale à 1 000 mots comme résultat de la premiere requete
    donc la seconde requete se fera sur les 1000 mots et ainsi de suite (puisque je vais faire jusqu'à 10 requetes successives pour les 10 lettres par exemple)

    mais est ce que ca vaut le coup de réduire ainsi la BDD hyperfile ? ou le systeme hyperfile est si performant que cane va rien changer ?

  16. #36
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    410
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 410
    Points : 513
    Points
    513
    Par défaut
    Salut,

    Tu peux faire dix requêtes mais si elles font toutes la même chose, une seule requête devrai suffire avec une boucle ou même des instructions WLangage, ce qui serait plus simple à mettre en œuvre compte tenu du fit qu'il existe de nombreuses instructions pour la gestion des chaines de caractères.
    A+

Discussions similaires

  1. comment exécuter une requete SQl
    Par bazzouz dans le forum JDBC
    Réponses: 4
    Dernier message: 05/09/2008, 16h13
  2. Réponses: 23
    Dernier message: 19/09/2006, 11h33
  3. [C#] Comment executer une requete sql y compris @@IDENTITY ?
    Par maitesn1 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 09/08/2006, 13h29
  4. Comment executer une requete sql delete dans une jsp ?
    Par DarkWark dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 24/05/2006, 16h59
  5. Réponses: 2
    Dernier message: 03/05/2004, 12h13

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