2009-06-01 9 views
0

Je suis à la recherche d'un moyen de «meilleure pratique» pour résoudre ce scénario commun. Je pense que la question est mieux posée avec un exemple. Supposons ce qui suit:Reporting Services/Prise en charge du filtrage robuste

  • Le but est d'écrire un rapport de «résumé de commande» qui affiche une liste d'ordres basée sur divers critères de filtrage.
    • Exemple: L'utilisateur veut faire rapport sur toutes les commandes créées entre X et Y date
    • Exemple: L'utilisateur veut faire rapport sur toutes les commandes avec le statut de « ouvert »
    • Exemple: L'utilisateur veut rapport sur toutes les commandes générées par un autre utilisateur XYZ
    • Exemple: L'utilisateur veut faire rapport sur toutes les commandes entre 1000 $ et 10000
  • $

    Ces rapports seront lancés probablement de différentes pages, mais peut-être il pourrait y avoir un ' advan la page de recherche ced » qui leur permet de vérifier/filtres de décocher et définir les paramètres

  • Je veux utiliser le traitement à distance pour générer le rapport

Création d'un seul rapport avec tous ces filtres mis en œuvre par l'intermédiaire des paramètres de rapport et signaler les filtres devient lourd et non maintenable très rapidement. Cela m'amène à croire que je devrais créer une seule procédure stockée qui accepte toutes les valeurs de filtre possibles (et une valeur NULL si le jeu de résultats ne doit pas être filtré par le paramètre).

Êtes-vous d'accord avec cette évaluation?

Si tel est le cas, je ne suis pas un expert TSQL et j'aimerais avoir des conseils généraux sur la façon d'implémenter cette procédure stockée. Jusqu'à présent, je fais comme ceci:

  1. créer une variable de table orderID @resultset
  2. Populate @resultset initialement par le premier filtre (i choisi date de début et d'arrêt)
  3. Pour chaque filtre:
    • Si le filtre est défini, créer une table @tempresultset variable et insérer tous les enregistrements de @resultset WHERE (filtre est applicable)
    • Supprimer de @resultset, insérer dans @resultset sélectionnez orderid de @tempresultset
  4. retour le @resultset après tous les filtres ont été appliqués

Ce juste ne se sent pas droit/efficace ... Y at-il une meilleure façon d'aborder ce sujet?

D'autres suggestions ou conseils sur la façon d'aborder ce problème général seraient grandement appréciés. Je me sens un peu perdu sur la bonne façon de mettre en œuvre cette solution à ce qui semble être un problème très commun.

Répondre

0

Après quelques recherches, j'ai trouvé un bon moyen de mettre en œuvre ces filtres en option dans une seule instruction select dans une procédure stockée:

Il ressemble à quelque chose comme:

SELECT ordernumber FROM orders 
--Filter #1 - based on Parameter #1 
WHERE (@param1 IS NULL) OR (somefield = @param1) 
--Filter #2 - based on Parameter #2 
AND WHERE (@param2 IS NULL) or (somefield2 = @param2) 
--Filter #3 - based on Parameter #3 
AND WHERE (@param3 IS NULL) or (somefield3 = @param3) 
Questions connexes