none
Filtrage de données et Expression de DataColumn RRS feed

  • Question

  • Bonjour,

    J'ai un petit problème avec l'utilisation des Expression dans les DataColumn.
    Voilà, j'ai utilisé les assistants pour créer rapidement une connexion et un DataSet sur la base Access Northwind.
    Dans mon DataSet je prends les tables Produit et Catégorie liées par une relation "CategoriesProducts".

    J'ajoute à la DataTable Categories une colonne "ProductCount" destinée à afficher le nombre de produits dans la catégorie.
    Je place donc dans la propriété expression l'expression suivante : Count(Child(CategoriesProducts).ProductID).

    Les deux DataTable sont alimentés avec un select * sur les tables de la base.

    Le hic c'est que, quand je filtre les enregistrement de la DataTable Produits le Count ne change jamais dans catégorie.
    J'ai filtré par tous les moyens que j'ai trouvé, c'est à dire via le BindingSource, via un DataView, un DataViewManager mais rien n'y fait la valeur de bouge jamais, elle n'est pas recalculée.

    Par exemple : J'ai relié ProductBindingSource et CategorieBindingSource à un DataViewManager au lieu de les brancher directement au DataSet.
    J'ai filtré les enregistrement de la table product via le DataViewManger avec ceci :

    dtvmComptoir.DataViewSettings("Products").RowFilter = "SupplierID = 1"
    
    


    Et bien rien n'y fait le Count ne tient pas compte du filtre appliqué à Products, pourtant j'ai moins de produits dans chaque catégorie.
    Pourtant je prends aussi les catégorie dans le DataViewManager.

    J'ai l'impression que la valeur du Count est calculée lors du remplissage du DataSet (qui est fait avec des Select *) et qu'ensuite la valeur n'est plus mise à jour...
    La seule solution pour faire bouger le Count serait donc de refaire le Select de la table products en incluant le filtre à la requête SQL.
    Sinon on pourrait avoir deux DataSet, un complet et un alimenté avec des extractions faites sur le premier... mais c'est vraiment laid.

    je me trompe ?

    Cordialement
    Mael

    mardi 28 juillet 2009 10:18

Réponses

  • Bonjour,
    J'ai aussi essayé ça et apparemment la solution est de refaire le Select en incluant la filtre dans la requête.
    Le filtre actionne seulement sur le BindingSource, mais les produits sont toujours les mêmes dans le DataSet (n'importe le filtre), et la colonne ProductsCount est définie sur le DataSet.
    Cordialement,
    Marius

    mardi 4 août 2009 16:53

Toutes les réponses

  • Bonjour,
    J'ai aussi essayé ça et apparemment la solution est de refaire le Select en incluant la filtre dans la requête.
    Le filtre actionne seulement sur le BindingSource, mais les produits sont toujours les mêmes dans le DataSet (n'importe le filtre), et la colonne ProductsCount est définie sur le DataSet.
    Cordialement,
    Marius

    mardi 4 août 2009 16:53
  • Oui la seule "feinte" que j'ai trouvé c'est de travailler avec une DataTable de plus qui me sert de tampon.
    Je met le resultat du Select * From Product dans la table tampon.
    Ensuite lorsque j'applique un filtre je fais un TableTampon.Select(Filtre) et j'alimente la table Product bindée du DataSet avec un Table.ImportRow (en prenant soins de la vider juste avant).

    Coté SQL c'est royal parce que je ne fait qu'une seule requête sur la base, par contre coté code c'est un peu moin reluisant car pour que les valeur de Count misent à jour "remontent" jusqu'au datagridview il faut faire un ResetBinding sur le bindingSource de la table Categorie.

    Cordialement
    Mael

    jeudi 13 août 2009 18:21