1. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

WD Requête SQL windev

Discussion dans 'Windev' créé par Barou, Nov 13, 2020.

  1. Barou

    Barou New Member

    Inscrit:
    Sept 16, 2018
    Messages:
    18
    J'aime reçus:
    0
    Bonjour très chers amis, je travaille sous windev 24, et je viens de créer une requête SQL à l'initialisation de la Table, et la requête est paramétré avec la fonction "LIKE" pour la recherche partout dans le fichier ou si vous voulez la Fonction "Contient". Ce que j'aimerai faire à partir de ces paramètre pointé mon champ Sai_Recherche la dessus, comme le cas de TableActiveFiltre. Depuis un bon moment cette histoire me fait souffrir. Merci donc pour votre aide que j'ai tant espéré.

    Voici mon code :

    MaRequeteSQL est une chaîne=[
    SELECT
    PRODUITS.IDPRODUITS AS IDPRODUITS,
    PRODUITS.Refernce AS Refernce,
    PRODUITS.NomProduit AS NomProduit,
    PRODUITS.QteEnStock AS QteEnStock,
    PRODUITS.QteMin AS QteMin,
    PRODUITS.PrixVente AS PrixVente,
    PRODUITS.PrixAchat AS PrixAchat
    FROM
    PRODUITS
    WHERE
    PRODUITS.Refernce LIKE %{ProduitSearch}%
    OR PRODUITS.NomProduit LIKE %{ProduitSearch}%
    OR PRODUITS.QteEnStock LIKE %{ProduitSearch}%
    OR PRODUITS.QteMin LIKE %{ProduitSearch}%
    OR PRODUITS.PrixVente LIKE %{ProduitSearch}%
    OR PRODUITS.PrixAchat LIKE %{ProduitSearch}%
    ]
    DonneesAffiches est une Source de Données
    HExécuteRequêteSQL(DonneesAffiches,hRequêteDéfaut,MaRequeteSQL)

    POUR TOUT DonneesAffiches
    TableAjouteLigne(TABLE_LISTE_PRODUITS,DonneesAffiches.IDPRODUITS,
    DonneesAffiches.NomProduit,
    DonneesAffiches.Refernce,
    DonneesAffiches.QteEnStock,
    DonneesAffiches.QteMin,
    DonneesAffiches.PrixVente,
    DonneesAffiches.PrixAchat)
    FIN
     
  2. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    595
    J'aime reçus:
    328
    Bonjour,
    Il est logique que ta requête ne renvoie pas le résultat souhaité
    1-Tu appelles HExécuteRequêteSQL avec une syntaxe de HExécuteRequête
    2-Jamais tu ne précises le paramètre

    Solution 1 (avec HExécuteRequêteSQL)
    Code (Windev):

    sCodeRequête est chaine                                //Code de la requête
    sParam est chaine                                            //Paramètre
    sdRechercheProduit est source de donnée //Requête

    sCodeRequête=[
    SELECT
    PRODUITS.IDPRODUITS AS IDPRODUITS,
    PRODUITS.Refernce AS Refernce,
    PRODUITS.NomProduit AS NomProduit,
    PRODUITS.QteEnStock AS QteEnStock,
    PRODUITS.QteMin AS QteMin,
    PRODUITS.PrixVente AS PrixVente,
    PRODUITS.PrixAchat AS PrixAchat
    FROM
    PRODUITS
    WHERE
    PRODUITS.Refernce LIKE %1
    OR PRODUITS.NomProduit LIKE %1
    OR PRODUITS.QteEnStock LIKE %1
    OR PRODUITS.QteMin LIKE %1
    OR PRODUITS.PrixVente LIKE %1
    OR PRODUITS.PrixAchat LIKE %1

    ]

    //On construit le paramètre
    sParam=

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ("%%1%",SAI_Recherche)
    //On construit la requête
    sCodeRequête =

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (sCodeRequête,sParam)

    HExecuteRequêteSQL(sdRechecheProduit,hReqêteDéfaut,sCodeRequête)
    ...
    CAS ERREUR
    //Traitement des erreurs
     
    Solution 2 (avec HExécuteRequête) depuis la V 23
    Code (Windev):

    REQ_RechercheProduit est Requête SQL=[
    SELECT
    PRODUITS.IDPRODUITS AS IDPRODUITS,
    PRODUITS.Refernce AS Refernce,
    PRODUITS.NomProduit AS NomProduit,
    PRODUITS.QteEnStock AS QteEnStock,
    PRODUITS.QteMin AS QteMin,
    PRODUITS.PrixVente AS PrixVente,
    PRODUITS.PrixAchat AS PrixAchat
    FROM
    PRODUITS
    WHERE
    PRODUITS.Refernce LIKE %{ProduitSearch}%
    OR PRODUITS.NomProduit LIKE %{ProduitSearch}%
    OR PRODUITS.QteEnStock LIKE %{ProduitSearch}%
    OR PRODUITS.QteMin LIKE %{ProduitSearch}%
    OR PRODUITS.PrixVente LIKE %{ProduitSearch}%
    OR PRODUITS.PrixAchat LIKE %{ProduitSearch}%

    ]
    REQ_RechercheProduit.ProduitSearch=SAI_Recherche

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (REQ_RechercheProduit)
    ...
    CAS ERREUR
    //Traitement des erreurs
     
    Solution 3
    Créer une requête (e.g. REQ_RechercheProduit) dans le requêteur.
    Baser le champ table (TABLE_Résultat) sur cette requête.
    Le code de la fonction de recherche devient
    Code (Windev):

    REQ_RechercheProduit.ProduitSearch=SAI_RechercheProduit

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (TABLE_Résultat,taReExécuteRequête)

    CAS ERREUR
    //Traitement des erreurs

     
     
    popoy apprécie ceci.
  3. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    595
    J'aime reçus:
    328
    Une petite remarque concernant la différence entre HExécuteRequête et HExécuteRequêteSQL.
    HExécuteRequête est destinée à exécuter une requête (youpi on n'avait pas deviné) issue du requêteur ou d'une variable de type requête. Lorsque cette requête nécessite un paramètre, il suffit d'affecter la valeur de ce paramètre à la requête.
    HexécuteRequêteSQL nécessite que la code de la requête soit déjà construit avec la valeur que prend le paramètre.
    Si tu passe en mode pas à pas tu peux voir dans le mouchard que, avant l'exécution de HExécuteRequêteSQL (après aussi d'ailleurs, mais cela ne nous intéresse pas,) la valeur de sCodeRequête vaut (si SAI_Recherche="toto") :
    Code (Windev):
    SELECT
    PRODUITS.IDPRODUITS AS IDPRODUITS,
    PRODUITS.Refernce AS Refernce,
    PRODUITS.NomProduit AS NomProduit,
    PRODUITS.QteEnStock AS QteEnStock,
    PRODUITS.QteMin AS QteMin,
    PRODUITS.PrixVente AS PrixVente,
    PRODUITS.PrixAchat AS PrixAchat
    FROM
    PRODUITS
    WHERE
    PRODUITS.Refernce LIKE %toto%
    OR PRODUITS.NomProduit LIKE %toto%
    OR PRODUITS.QteEnStock LIKE %toto%
    OR PRODUITS.QteMin LIKE %toto%
    OR PRODUITS.PrixVente LIKE %toto%
    OR PRODUITS.PrixAchat LIKE %toto%
    Remarques
    1-Avec HExécuteRequêteSQL, Il est fort possible que tu doives mettre ton paramètre entre 2 simples quote (') cf

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    2-% et ' risquent d'être mal interprétés par windev il vaut mieux les remplacer par leur valeur ASCII 37 et 39
    l'affectation de sParam devient alors :
    Code (Windev):

    sParam=

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ("%1%2%3%2%1",

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (39),

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (37),SAI_Recherche)
     
    3-J'ai de gros doutes quant à l'utilité de
    Code (Windev):

    OR PRODUITS.QteEnStock LIKE %toto%
    OR PRODUITS.QteMin LIKE %toto%
    OR PRODUITS.PrixVente LIKE %toto%
    OR PRODUITS.PrixAchat LIKE %toto%
     
    en effet les quantité et les prix sont des numériques (entiers et monétaires) que tu vas comparer à une chaine
    3-1 il y a 99.9% de chance que cela soit converti en 0 (il faut alors supprimer les ' et inclure un autre paramètre)
    3-2 quand bien même cela fonctionnerait,
    RODUITS.QteEnStock LIKE %10% te renverrait 210, 10, 103
     
    Gemini1961 et Fouedusa aiment ça.
  4. Barou

    Barou New Member

    Inscrit:
    Sept 16, 2018
    Messages:
    18
    J'aime reçus:
    0
    Merci beaucoup à vous tous pour vos réponse, elles m'ont permis d'apprendre plus Mais jusqu'à présent j'ai des erreurs, l'interprétation des requêtes SQL avec windev semble vraiment difficile, sinon le but est de trouver les résultats provenant de n'importe quelle colonne de la table. J'ai essayer avec l'accès directe au Fichier, cela marche bien, mais avec un volume important de données, je doute que ça puisse ralentir l'application en question. C'est d'ailleurs pourquoi, j'ai donc opter pour le code SQL, et je sais toujours pas si c'est celle-ci le plus rapide, c'était juste une supposition. Encore Merci à vous, et j'ai toujours besoin de vous...
     
  5. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    595
    J'aime reçus:
    328

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    j'ai donc opter pour le code SQL
    Cliquez pour agrandir...
    Dans les 2 cas c'est du SQL. Si tu travailles avec une base HFSQL C/S, les performances sont meilleures avec HExecuteRequête. windev n'a plus besoin d'interpréter la chaîne de code

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    l'accès directe au Fichier
    Cliquez pour agrandir...
    Si tu parles de procédures itératives en effet l'utilisation de requête est nettement plus performante en plus on respecte CODD (l'accès au données est fait en bloc)
     

Partager cette page

Chargement...