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 :

Plusieurs tables liées à une même requête dans une seule fenêtre [WD14]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut Plusieurs tables liées à une même requête dans une seule fenêtre
    Bonjour,

    J'ai un souci avec la fenêtre principale de mon application.
    Celle-ci contient 5 onglets correspondats chacun à un état de commande (toutes, en cours, envoyée, reçue, supprimée).
    Ces onglets contiennent tous une table et chaque table est liée à la requête qui suit :

    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
    SELECT 
    	Commande.IDCommande AS IDCommande,	
    	Commande.dateCommande AS dateCommande,	
    	EtatCommande.libelle AS libelle_Et,	
    	Commande.dateReception AS dateReception,	
    	TypeCarte.libelle AS libelle,	
    	COUNT(Carte.IDCarte) AS Comptage_1
    FROM 
    	EtatCommande INNER JOIN Commande ON Commande.IDEtatCommande	=	EtatCommande.IDEtatCommande,	
    	Commande LEFT OUTER JOIN Carte ON Carte.IDCommande	=	Commande.IDCommande,	
    	TypeCarte INNER JOIN Commande ON Commande.IDTypeCarte	=	TypeCarte.IDTypeCarte
    WHERE 
    	(
    	EtatCommande.libelle LIKE %{Param1}%
    )
    GROUP BY 
    	Commande.IDCommande,	
    	Commande.dateCommande,	
    	EtatCommande.libelle,	
    	Commande.dateReception,	
    	TypeCarte.libelle
    ORDER BY 
    	IDCommande DESC,	
    	dateCommande DESC
    Le paramètre est l'état de la commande correspondant à l'onglet dans lequel on se trouve.

    A chaque initialisation des tables, la seule ligne de commande est un "MaSource.param1 = <etat de la commande>"

    Le problème, c'est que lorsque le lance mon application, toutes les tables n'affichent que le contenu de la table des commandes supprimées (une ligne correspondant à la seule commande supprimée). Cette table est dans le dernier onglet, je ne sais pas si ça a un quelconque rapport.

    J'ai essayé en actualisant mes tables avec des TableAffiche(table, taInit) à l'initialisation de ma fenêtre. Les tables affichent bien chacune leur contenu mais si je sélectionne une ligne, celle-ci se transforme en la seule ligne de ma table de commandes supprimées.

    Voyez-vous où est le problème et comment le résoudre ?

    Merci d'avance,

    Aenur.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Tu es passé à côté d'une spécificité d'HyperFile.

    Si j'ai bien compris...
    Tu voudrais afficher un jeu de données différents dans chacun des "champs table fichier".
    Chacun de ces jeux de données serait produit par l'exécution d'une unique requête paramétrée, le paramètre étant différent selon le jeu de données.

    Mais ça ne fonctionne pas comme ça avec HyperFile.
    D'abord, il faut savoir un certain nombre de choses.


    Requête et Fichier HyperFile

    Un contexte HyperFile donne accès à des "Fichiers HyperFile" qui lui ont été déclarés de diverses manières (via l'analyse, une description de fichier, la déclaration d'une requête...).

    Une requête n'est pas un "Fichier HyperFile", elle est connue dans l'application mais pas dans le contexte HyperFile.
    Lorsqu'une requête est déclarée/exécutée au moyen de la fonction HExécuteRequête(), un "Fichier HyperFile" est déclaré.
    Attention, ce n'est pas un fichier physique, mais c'est un jeu de données qui résulte de l'exécution de la requête.

    Un point important est qu'un "fichier HyperFile" doit posséder un nom logique.
    Pour un "fichier HyperFile" créé à partir d'une requête, le nom logique EST le nom de la requête.

    Si tu exécutes n fois la fonction HExécuteRequête() pour la même requête, en fait tu recrées à chaque fois le même "Fichier HyperFile".


    Champ Table Fichier basé sur une requête

    Un champ table fichier affiche les données d'un "Fichier HyperFile" déclaré dans le contexte HyperFile de sa fenêtre.
    Si le champ table fichier est basé sur une requête, cette requête sera automatiquement utilisée pour déclarer un "fichier HyperFile" .

    A l'affichage d'un champ table fichier basé sur une requête, la fonction HExécuteRequête() est automatiquement appelée.
    Cette fonction agit dans le contexte HyperFile associé à la fenêtre.
    Elle déclare un nouveau nom logique (un "fichier HyperFile") associé au jeu de données provenant de l'exécution de la requête.

    Si tu as 5 tables basées sur la même requête, alors tu exécutes 5 fois la fonction HExécuteRequête() mais il n'y a qu'un "Fichier HyperFile" qui est recréé à chaque fois.
    Donc, les 5 tables affichent le même jeu de données.


    Quelles solutions...

    (1) Utiliser une requête sans paramètre et appliquer le mécanisme du parcours de table et de filtre propre à chacune des tables.

    Tu peux aussi, par programmation, définir ton propre parcours "filtré".

    Par exemple, dans ton cas:
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sParcoursEnCours est une chaîne
     
    sParcoursEnCours = HFiltre(REQ_Commandes, "libelle_Et ] 'en cours'")
    TBL_CommandesEnCours..RubriqueParcourue = sParcoursEnCours
    (2) Utiliser des requêtes paramétrées intégrées dans chacune des tables.
    Mais ce n'est pas très pratique en cas de modification à répercuter sur les 5 tables.

    (3) Pour chaque champ table, définir une sources de données Alias de la requête paramétrée.
    C'est assez technique et compliqué , donc pour l'instant je ne détaille pas cette solution.



    Ouf... fin de la lecture...

    En espérant que tu auras tout compris.
    _

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    J'ai quasiment tout compris, un grand merci pour ta réponse très détaillée

    J'ai pensé au HFiltre, mais le problème c'est que je dois réutiliser un autre HFiltre (ou plutôt un HFiltreComprisEntre) pour une recherche de commandes entre 2 dates.
    Pour les autres recherches, j'ai fait un TableActiveFiltre (recherche par type, par n° de commande) sur une colonne de la table.

    Cependant, pour afficher les commandes commandées entre 2 dates choisies par l'utilisateur, je fait un HFiltreComprisEntre(REQ_Commande, REQ_Commande.dateCommande, SAI_Date1, hSéparateurBorne, SAI_Date2) car je n'ai pas trouvé comment appliquer 2 TableActiveFiltre en même temps sur une table.

    Une autre solution pourrait être de créer une requête par table sinon, je ne sais pas si il y a une solution plus simple...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    Citation Envoyé par Aenur56 Voir le message
    J'ai pensé au HFiltre, mais le problème c'est que je dois réutiliser un autre HFiltre (ou plutôt un HFiltreComprisEntre) pour une recherche de commandes entre 2 dates.
    La fonction HFiltre() propose 2 syntaxes.
    http://doc.pcsoft.fr/fr-FR/?HFiltre

    La syntaxe «Filtre construit avec une condition» est vraiment très pratique.
    Cette syntaxe permet de construire un filtre à partir d'une expression conditionnelle, et sans avoir besoin de désigner une clé de parcours.
    L'expression conditionnelle peut faire intervenir toutes sortes d'opérateurs de comparaison, des opérateurs logiques (et, ou, pas) ainsi que des parenthèses pour contrôler l'ordre d'évaluation des opérateurs.
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sFiltre est une chaîne
    sCondition est une chaîne = "libelle_Et ] '%1' et dateCommande>=%2 et dateCommande<=%3"
     
    sCondition = ChaîneConstruit(sCondition, "en cours", SAI_Date1, SAI_Date2)
    sFiltre=HFiltre(REQ_Commande, sCondition)

    Citation Envoyé par Aenur56 Voir le message

    Une autre solution pourrait être de créer une requête par table sinon, je ne sais pas si il y a une solution plus simple...
    Oui, comme je te l'ai dit dans mon message précédent, tu peux utiliser des requêtes intégrées dans les champs tables.
    Avec une requête intégrée, tu es sûr que le "Fichier HyperFile" obtenu à partir de la requête est "unique" et dédié à ce champ table.
    _

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Merci pour ces détails, je n'avais jamais pensé utiliser HFiltre() de cette manière. Quand j'y avais pensé, je ne voyais que la synthaxe <Résultat> = HFiltre(<Nom du fichier> , <Nom de la clé de parcours> , <Borne minimale> [, <Borne maximale> [, <Condition de sélection>]]).
    Au vu de l'absence de Condition de Sélection du type "compris entre", j'avais laissé tombé cette solution.

    Au final j'ai créé une requête par table mais je pense que la solution du HFiltre que tu as soumis me sera bien utile par la suite, encore merci

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

Discussions similaires

  1. [MySQL] Extraire plusieurs champs d'une table dans une même requête
    Par la_chouette dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/11/2012, 11h11
  2. Réponses: 5
    Dernier message: 27/03/2012, 17h02
  3. Réponses: 4
    Dernier message: 07/01/2010, 12h27
  4. Plusieurs count() dans une même requête
    Par DarkaMaul dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/11/2009, 17h20
  5. faire plusieur count dans une même requète
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/04/2008, 10h04

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