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

SSRS Discussion :

[SSRS][2k5] Procédure stockée dans SSRS


Sujet :

SSRS

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut [SSRS][2k5] Procédure stockée dans SSRS
    Bonjour,

    J'ai une question à propos du nombre de datasets d'une solution. Pour résumer, j'ai :

    - Un Dataset Evénements qui contient des événements (identifiant événements + propriétés diverses des événements).
    - Un Dataset Ressources qui contient des ressources associées à des évéments (identifiant événements + propriétés des ressources).
    - Un Dataset d'Activités qui contient des activités associées à des événements (identifiant événements + propriétés des activités).
    - Un Dataset de Personnes qui contient des personnes associées à des événements (identifiant événements + propriétés des personnes).

    J'ai plusieurs datasets avec l'identifiant de l'événement en commun dans chaque dataset. Puis-je créer un tableau qui m'affiche tous les événements ainsi que toutes les ressources pour une personne choisie ?

    2e question ; pourrais-je faire ces requêtes en une seule ? Sachant qu'il y a un truc un peu particulier. J'ai une table liée à l'événement dans laquelle j'ai un champ "code" qui, s'il vaut DAT, associe la date de l'événement dans un champ "valeur", s'il vaut DEB, j'ai l'heure de début dans "valeur", s'il vaut FIN, j'ai l'heure de fin dans "valeur", ...

    Autrement dit, chaque requête est basée sur une valeur du champ "code". Pour la requête sur les ressources par exemple, je filtre sur "code=RES". Pour les activités, je filtre sur "code=ACTIVITE".

    Pourrais-je faire une seule requête dans laquelle j'aurais "code IN (RES, ACTIVITE, ...)" ? J'ai essayé et ma requête ne fonctionne pas.

    Merci de votre aide, n'hésitez pas à me demander des précisions.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Salut,

    Pour ta première question, ta réponse est non. Tu ne peux mélanger des éléments provenant de différents datasets dans un seul et même objet (à l'exception des fonction renvoyant des valeurs scarlaires comme sum(), first(), ...).

    Tu as, je pense, 2 possibilités:

    1) tu gardes tes différents datasets et tu crées un "master" report contenant un ou plusieurs sub reports (en fonction du layout que tu désires). Ce master report contiendra une liste qui groupera tes records sur l'identifiant d'un événement et contiendra le ou les sub report. Ensuite, chaque sub report affichera les données qui le concerne (soit ressource, personne, ...).

    2) tu trouves un moyen de réécrire ta query (ou une fonction ou store proc) qui te permettra d'avoir toutes les données dans un seul et même dataset.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Salut,

    Merci pour tes réponses. Pour la réponse à la première question, je m'en était douté, j'ai eu sous les yeux un rapport qui utilisait par défaut un "first" et je trouvais ça douteux...

    Pour l'histoire de regroupement de mes données, si je suis ta possibilité numéro 1, je pourrais afficher toutes mes informations pour un événement donné (puisque l'id de l'evénement apparait dans tous mes datasets). Or ce que j'ai besoin moi, c'est d'afficher toutes mes informations pour une personne donnée.

    Pour les procédures stockées, honnêtement je n'y connais pas grand chose et les modèles que j'ai sous les yeux sont imbuvables... De plus si je pouvais éviter les procédures stockées... ça serait bien étant donné que le tout premier rapport que je dois réaliser est un rapport en théorie tout simple. Alors j'imagine pas pour les suivants...

    En revanche j'imaginais une autre possibilité : voici le type de table que j'ai :
    id_evenement code valeur
    2 AUT 9
    2 DAT 20080225
    2 DEB 1030
    2 FIN 1115
    2 RES 103

    Voici la table que j'aimerais créer :
    id_evenement AUT DAT DEB FIN RES
    2 9 20080225 1030 1115 103

    En gros, transformer ma colonne code en liste de champs et mettre ma colonne valeur dans les nouveaux champs créés. Y a-t-il un moyen simple pour mettre ça en oeuvre ? Si je peux faire ça, je pourrais alors créer une seule requête simple (j'aurais une grosse table bien lourde mais au moins, ça fonctionnera).

    Merci d'avance

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Si tu es en sql server 2005, regardes tu coté des opérateurs "pivot" et "unpivot" (je ne sais jamais lequel fait quoi... mais je pense que le unpivot devrait être le bon).

    Ces opérateurs font typiquement ce genre de choses...

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Une idée?
    J'ai jeté un oeil à pivot/unpivot, je connaissais l'existence mais avais oublié le nom. En revanche le principe n'est pas bien clair... une petite aide sur le sql permettant de transformer les tables que j'ai mises en exemple ?

    TABLE 1 (non pivotée)
    id_evenement code valeur
    2 AUT 9
    2 DAT 20080225
    2 DEB 1030
    2 FIN 1115
    2 RES 103

    TABLE 2 (après pivotage)
    id_evenement AUT DAT DEB FIN RES
    2 9 20080225 1030 1115 103

  6. #6
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Il y a une très bonne démonstration sur ce blog :
    Pivot et Unpivot

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Y a qu'à remplacer "CUR" et "RES" par tes codes (et compléter la liste).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_evenement, [CUR], [RES] from (select id_evenement, code, valeur from table1) as table_source pivot (sum(valeur) for code in ([CUR], [RES])) as pivot_table

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Je dois être stupide je n'y arrive pas et je ne comprends pas ton bout de code. C'est quoi les tables table1, table_source et pivot_table ?

    Le mieux que j'arrive a sortir est :

    Msg 325, Level 15, State 1, Line 8
    Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

    Ca sent le paté en plus je sens que ça ne va pas être dynamique et que mes CUR, RES, DEB ou n'importe quoi d'autres seront fixes.... s'il y en a d'autres qui apparaissent (je ne sais pas si c'est possible mais admettons), ils ne se mettront pas à jour automatiquement... Pas moyen de pivoter une table sans avoir à saisir le nom de toutes mes colonnes ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    "table1" est à remplacer par le nom de table à pivoter. "table_source" et "table_pivot" sont des renommage et tu n'as pas à t'en préocuper ou les changer (sauf si tu le souhaite vraiment mais cela ne changera rien).

    Malheureusement, je ne pense pas que qu'il soit possible de rendre dynamique les valeurs à pivoter (tes valeurs de code quoi). Et donc, si un code est rajouté, il faudra également modifier ta query.

    Pour être certain de cela, tu pourrais peut-être poster une question sur le forum sql server...

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Merci psychokwax, c'est bien ce que je pensais, ça va pas être vraiment pratique Je crois que je vais laisser tomber les pivots grrr.

    Du coup, je vais entrer un (tout petit) peu dans le détail de ce que je veux faire, peut-être y a t'il une autre solution que je ne vois pas. Je reprends depuis le début (je vais essayer de simplifier au maximum).

    Par rapport à SSRS, j'ai 4 datasets du même type à lier entre eux pour n'en faire qu'un seul dans le but de pouvoir mettre toutes les infos dans un tableau sans se poser de questions.

    On va se baser sur 2 datasets seulement car si ça marche pour 2, ça marchera pour 4.

    Pour le lien événement <=> ressources : dataset 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM  table1 INNER JOIN
             table2 ON table1.id_evenement = table2.id_evenement INNER JOIN
             table3 ON table2.id_ressources = table3.id_ressources
    WHERE  (table2.code = 'RES')
    Pour le lien événement <=> personnes : dataset 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM  table1 INNER JOIN
             table2 ON table1.id_evenement = table2.id_evenement INNER JOIN
             table4 ON table2.id_personnes = table4.id_personnes
    WHERE  (table2.code = 'OBL')
    Je voudrais ne faire qu'une seule requête avec les deux... sachant que dans un cas mon table2.code vaut une valeur et dans l'autre cas il vaut une autre valeur. Au final je ne voudrais qu'une seule grosse table dans laquelle j'ai toutes toutes toutes mes infos, avec évidemment, certaines cases à NULL (par exemple si je me retrouve avec des colonnes Ressources et Personnes, et que mon événément ne mobilise pas de ressources, ma colonne ressource sera à NULL)...

    Aïe je sais pas si c'est clair. Dites moi et surtout... au secours! Merci

  11. #11
    Membre éclairé
    Avatar de Reskibil
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 815
    Points
    815
    Par défaut
    Bonjour,

    Je pense que tu aurais du préciser dès le début que tes datasets étaient en SQL et non en MDX.

    Je suppose que la condition RES ne s'applique qu'aux ressources et OBL qu'aux personnes (il ne faut pas de personnes avec le code RES ni de ressources avec le code OBL ?).

    Autre question, dans le * de tes select, est-ce que tu prends les mêmes champs dans les 2 datasets ou bien ce sont des champs différents ? (un UNION ALL entre les 2 datasets éventuellement ?)

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Salut

    Désolée d'avoir omis la précision... je ne sais pas ce qu'est 'MDX' et donc oui mes datasets sont construits en SQL.

    En effet, ma condition RES ne s'applique qu'aux ressources et OBL ne s'applique qu'aux personnes, enfin de toute façon, pour la condition RES, tu ne trouveras jamais d'utilisateur. Le code RES ou OBL définit le type d'information qu'on trouve dans une colonne "valeur", si c'est RES, on aura l'identifiant de ressource dans "valeur", si c'est OBL, on aura l'identifiant de personne dans "valeur". Attention, un id personne et un id ressource peuvent être égaux mais ne doivent être reliés qu'avec la bonne condition RES ou OBL.

    Pour faire simple : non, il ne faut pas de personnes avec le code RES ni de ressources avec le code OBL.

    Pour ta seconde question, je prends des champs différents dans mes deux datasets. J'en ai en commun mais j'en ai aussi qui proviennent d'une table spécifique aux ressources ou aux personnes...

    Ca t'aide?

  13. #13
    Membre éclairé
    Avatar de Reskibil
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 815
    Points
    815
    Par défaut
    Le MDX est le language de requetage des cubes qui est souvent à la base des datasets de SSRS.

    Pour ton problème, j'avais pensé à un UNION ALL sur tes 2 requetes (ou plus) mais je suis pas sûr finalement que ca pourrait résoudre ton problème.

    Sinon, au pire, tu peux faire des vues que tu relies entre elles. Chacune de tes requêtes est une vue et tu fais une vue globale dans laquelle tu selectionne le tout. Et dans le dataset de ton cube, tu n'as plus qu'à faire un SELECT * sur ta vue avec éventuellement des conditions sur les champs présents.

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    ALLELUIA j'ai peut être trouvé ma solution.

    Dans ma base j'ai découvert l'existence d'une vue qui me fournit peut être un début de réponse (je suis confiante!!).

    Cette vue crée des alias de ma table centrale, un alias par code. Tous ces alias appelés DAT, DEB, FIN, RES, OBL (= valeurs de mes codes) sont reliés à ma table globale ou j'ai une colonne avec tous les codes des propriétés.

    Du coup, je pourrais peut être bien relier chaque alias avec les tables qui correspondent (une table X avec des infos sur mes ressources RES, je relie les deux, une table Y avec des infos sur mes users OBL, je les relie ensemble, etc).

    Je ne sais pas si je suis claire, mais ça peut marcher ça non ?

    EDIT : bon voila j'ai un doute en fait... pour les propriétés communes (par exemple, la date de l'événement, l'heure de début et l'heure de fin sont obligatoires), pas de souci. En revanche, j'en reviens toujours au même problème, pour les ressources par exemple, on peut avoit des événements qui en ont, et d'autres qui n'en ont pas. Et là c'est problématique car "l'intersection" de tout fait que rien n'est retourné...

    Edit 2 : une procédure stockée qui crée une table temporaire ? Avec requête1 insert into requête 2 insert into requête 3 etc. ? Je ne connais pas les procédures stockées mais je crois que je vais devoir connaître

Discussions similaires

  1. [SSRS][2k5]Tableau/Matrice dans une liste.
    Par haigwepa dans le forum SSRS
    Réponses: 7
    Dernier message: 28/01/2009, 11h02
  2. Réponses: 3
    Dernier message: 17/07/2008, 15h07
  3. Réponses: 2
    Dernier message: 30/06/2008, 18h58
  4. [SSRS][2k5] Me.Value dans un rapport
    Par Reskibil dans le forum SSRS
    Réponses: 7
    Dernier message: 20/03/2008, 17h41

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