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 :

Création de requêtes dynamiques


Sujet :

WinDev

  1. #1
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut Création de requêtes dynamiques
    Bonjour à tous,

    J'ai une fenêtre de recherche avec 7 critères de recherche possibles.
    Les critères sont :
    - Le numéro de produit.
    - Le nom du client.
    - Le numéro de téléphone du client.
    - Le GSM du client.
    - Le distributeur du produit.
    - Le code postal du client.
    - La ville du client.

    Ma requête ne doit remonter que des informations du client, voici la requête générale que j'utilise:
    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
    SELECT DISTINCT
    	T_clients.T_clients_ID, 
    	T_clients.T_clients_RS,
    	T_clients.T_clients_responsable,
    	T_clients.T_clients_prenom
    FROM 
    	T_clients LEFT OUTER JOIN T_villes ON T_villes.T_villes_ID = T_clients.T_clients_numVille,	
    	T_produits LEFT OUTER JOIN T_clients ON T_clients.T_clients_ID = T_produits.T_produits_numClient,	
    	T_produits INNER JOIN T_distributeurs ON T_distributeurs.T_distributeurs_ID = T_produits.T_produits_numDistributeur
    WHERE 
    	T_clients.T_clients_responsable LIKE '%'
    	AND	T_clients.T_clients_tel LIKE '%'
    	AND	T_clients.T_clients_GSM1 LIKE '%'
    	AND	T_villes.T_villes_cp LIKE '%'
    	AND	T_villes.T_villes_ID LIKE  '%'
    	AND	T_distributeurs.T_distributeurs_ID LIKE  '%'
    	AND T_produits.T_produits_num LIKE 'R2036'
    Comme vous le constatez il y a 4 tables jointes. Ces jointures me provoquent, selon les recherches, des ralentissements importants.

    Pour éviter ces ralentissements et toutes les jointures je souhaite mettre en place une requête en fonction de chacun des critères recherche, soit 7 requêtes.

    Mais ma question est :
    Comment faire pour les recherche multi-critères ? peut-on créer une requête de façon dynamique en fonction des critères de recherche ?
    Exemple :
    Si je veux faire une recherche sur tous les clients commençant par "D" dans le département "66" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT
    	T_clients.T_clients_ID, 
    	T_clients.T_clients_RS,
    	T_clients.T_clients_responsable,
    	T_clients.T_clients_prenom
    FROM 
    	T_clients LEFT OUTER JOIN T_villes ON T_villes.T_villes_ID = T_clients.T_clients_numVille
    WHERE 
    	T_clients.T_clients_responsable LIKE 'D%'
    	AND	T_villes.T_villes_cp LIKE '66%'
    Je n'ai pas besoin d'avoir la table "t_distributeurs" et de la table "T_produits". Le fait de les retirer me fait gagner beaucoup de temps lors de l'exécution de la requête.

    Merci à tous pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Tu peux construire dynamiquement le code SQL de la requête dans une chaine de caractères, en fonction des critères sélectionnés, puis lancer celle-ci avec SqlExec() ou hExecuteRequeteSQL().

    Tatayo.

  3. #3
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Oui c'est ce que je fais actuellement.

    Mais mon gros soucis est que je ne sais pas trop comment la créer, à part de mettre plein de "SI".

    SI ce champs est vide et SI celui-ci est plein alors ...

    Et cela pour tous les champs et toutes les combinaisons possibles.

    Merci.

  4. #4
    Membre habitué Avatar de GCASPIC10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 247
    Points : 144
    Points
    144
    Par défaut
    Bonjour Thierry

    J'ai aussi un problème similaire au tien :

    Ma table mémoire contient via une requête, un extrait de fichier

    J'exécute ma requête avec au préalable le passage :
    - param1, paramètre fixe servant à filtrer le résultat et obtenir un partiel de ce fichier.
    - param2, un deuxième paramètre qui permettrait d'affiner cette extrait à ne prendre en considération que si une certaine variable globale à une valeur bien définie.

    Dans ce cas, il me faut peut être constituer une rubrique calculée qui suivant la condition (variable globale) activera le param2. Mais comment intégrer cette variable dans cette requête ?

    Une requête (dans l'esprit) dynamique, me permettrait elle de résoudre ce problème ?

    Je cherche aussi une réponse dans les aides et forum

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Citation Envoyé par thierrybatlle Voir le message
    Oui c'est ce que je fais actuellement.

    Mais mon gros soucis est que je ne sais pas trop comment la créer, à part de mettre plein de "SI".

    SI ce champs est vide et SI celui-ci est plein alors ...

    Et cela pour tous les champs et toutes les combinaisons possibles.

    Merci.
    C'est la seule solution.

  6. #6
    Membre averti
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Points : 435
    Points
    435
    Par défaut Pas clair...
    Es-tu sûr que ta jointure est efficace?
    Perso j'aurais fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ch est une chaine ="SELECT	DISTINCT T_clients.T_clients_ID, 
    	T_clients.T_clients_RS,
    	T_clients.T_clients_responsable,
    	T_clients.T_clients_prenom
    FROM T_clients 
    LEFT JOIN T_villes ON T_villes.T_villes_ID = T_clients.T_clients_numVille
    LEFT JOIN T_Produits on T_Produits.T_Produits_numClient=T_clients.T_clients_ID
    LEFT JOIN T_distributeurs ON T_distributeurs.T_distributeurs_ID = T_produits.T_produits_numDistributeur
    WHERE "+ cWHERE // variable suivant les critères
    Pour limiter les SI...ALORS, tu peux peut-être faire un tableau de correspondance entre les critères et les fichiers necessaires autres que T_Clients.
    Lorsqu'un critère demande un fichier supplémentaire, tu testes si il est déjà dans la variable cJOIN par ex., sinon tu l'ajoutes.
    Attention aux jointures à tiroir: si on ne demande que le distributeur, il faut aussi le fichier produits s'il n'y est pas déjà...

    Bonne chance...

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/01/2012, 21h55
  2. [EF]Création Requête Dynamique
    Par Idredeguerre dans le forum Linq
    Réponses: 3
    Dernier message: 23/06/2009, 11h49
  3. Création d'une requête dynamique
    Par chris81 dans le forum Linq
    Réponses: 0
    Dernier message: 14/01/2009, 17h33
  4. Réponses: 3
    Dernier message: 04/08/2008, 15h35
  5. Réponses: 1
    Dernier message: 01/08/2008, 17h25

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