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 Challenge: Un rapport bien costaud vol1


Sujet :

SSRS

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut SSRS Challenge: Un rapport bien costaud vol1
    Bonjour,

    Je débute avec reporting services et j'ai déjà un rapport assez compliqué à faire que je ne sais pas trop comment faire donc j'ouvre ce sujet en espérant de trouver quelqu'un qui pourrai m'aider.

    Problème:

    Table "Laminage" contient (ID_OF, DateLam)
    Table "Message" contient (ID_OF, DateMsg, Message )

    Il faut sortir le message en fonction des deux dates.

    Les données:

    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
    
    LAMINAGE :
    
    ID_OF        DateLam
    ------       ----------------
    123          25/09/2013 18:14:25
    
    
    MESSAGE :
    
    ID_OF        DateMsg                        Message
    ------       ----------------             ---------------
    123          25/09/2013 15:21:34        testmessage1;E1;tst1
    123          25/09/2013 16:51:16        testmessage1;E2;tst1
    123          25/09/2013 18:13:42        testmessage1;E3;tst1
    123          25/09/2013 25:36:22        testmessage1;E4;tst1

    Rapport doit être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ID_OF        DateLam                     Message
    ------       -------------------        ---------
    123          25/09/2013 18:14:25         E3
    Donc je prend une date de la table "LAMINAGE", je récupère la date la plus proche à cette dernière. Et je récupère le message. Par contre le message, je le split et récupère seulement celui du milieu.

    Comment faire avec Reporting Services?


    PS (ce que j'ai fait):

    J'ai créé un dataset pour LAMINAGE (DS_LAMINAGE). Qui ramène les données de la table LAMINAGE (ID_OF, DateLam). J'ai ajouté ces données dans mon rapport sous form de tableau.

    J'ai créer un autre dataset pour MESSAGE (DS_MESSAGE) qui ramène les données de message.

    J'ai ajouté une troisième colonne dans mon rapport et j'ai essayé d'ajouter une expression qui ira chercher le message en fonction de la date du Laminage du dataset DS_MESSAGE en utilisant l'expression Lookset

    En gros j'ai :

    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
     
     
    ID_OF        DateLam                     Message
    ------       -------------------        ---------
    123          25/09/2013 18:14:25         <expr>
     
    <expr> : 
    =IIF(Fields!ID_OF.Value Is Nothing,
    "nothing",
    Join(
    	LookupSet(
    	Int(Fields!ID_OF.Value), 
    	Int(Fields!ID_OF.Value), 
    	Fields!DateMsg.Value, 
    	"DS_MESSAGE")
    ,",")
    )
    Mais ca marche pas

    Voila le challenge

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Pourquoi est ce que tu t’embêtes ? Une seule requête et un seul dataset sont nécessaires

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut
    Merci pour ta réponse. Et comment ferais-tu cela avec une seule requête?

    Actuellement je l'ai résolut en ajoutant du code VB

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Un truc comme ca :

    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
    ;WITH CTE
    AS
    (
     SELECT ROW_NUMBER() OVER (PARTITION BY l.ID_OF ORDER BY case when l.DateLam <m.DateMsg then datediff(SECOND, l.DateLam, m.DateMsg) else  datediff(SECOND, m.DateMsg, l.DateLam) end) AS num
    	, l.ID_OF
    	, l.DateLam
    	, m.Message
    from LAMINAGE l
    	inner join MESSAGE m on l.ID_OF = m.ID_OF
    )
    SELECT ID_OF
    	,DateLam
    	,SUBSTRING(MESSAGE, charindex ( ';', Message) + 1, len(message) - (charindex( ';', Message, charindex ( ';', Message) + 1) + 2) )
    FROM CTE
    WHERE num = 1;

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut


    Trop fort. Merci beaucoup. Je pense que je suis mauvaise en sql ^^ hehe. J'ai passé du temps à comprendre comment cela fonctionnait, mais ca marche nickel.

    Y'a une modification sur la même requête j'ai pas pu trouvé de solution. Si on modifie la question comme:

    LAMINAGE :

    DateLam
    ----------------
    25/09/2013 18:14:25
    25/09/2013 18:14:25
    25/09/2013 18:14:25


    MESSAGE :

    DateMsg Message
    ---------------- ---------------
    25/09/2013 15:21:34 testmessage1;E1;tst1
    25/09/2013 16:51:16 testmessage1;E2;tst1
    25/09/2013 18:13:42 testmessage1;E3;tst1
    25/09/2013 25:36:22 testmessage1;E4;tst1
    26/09/2013 25:36:22 testmessage1;E1;tst1
    27/09/2013 25:36:22 testmessage1;E2;tst1


    [/code]


    Maintenant je n'ai pas de jointure entre deux table car je viens de savoir que l'ID_OF de la table Message peut être vide. Donc la jointure tombe à l'eau. Du coup:
    Je prends une date de la table LAMINAGE
    Je cherche la date la plus proche à cette date là dans la table MESSAGE
    Et je sors le message

    En suivant ton instruction, j'ai essayé de bidouiller un truc pourris comme:


    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
     
    ;WITH CTE
    AS
    (
     SELECT 
     ROW_NUMBER() OVER (PARTITION BY l.ID_OF ORDER BY case when l.DateLam <m.DateMsg then datediff(SECOND, l.DateLam, m.DateMsg) else  datediff(SECOND, m.DateMsg, l.DateLam) end) AS num
    	, l.DateLam as dateLam
    	, m.Message
    FROM LAMINAGE l, MESSAGE m 
    )
    SELECT 
    	DateLam
    	,SUBSTRING(MESSAGE, charindex ( ';', Message) + 1, len(message) - (charindex( ';', Message, charindex ( ';', Message) + 1) + 2) )
    FROM LAMINAGE l, CTE c
    WHERE num = 1 and c.dateLam = l.DateLam;
    Mais marche pas. Il faut que je puisse passe la dateLam dans la table CTE comme paramètre qui puisse trouver, pour chaque DateLam, l’équipe qui correspond dans la table CTE

    moi je l'ai fait en ajoutant du code VB dans rapport avec 2 dataset. Mais bon c'est toujours plus intéressant de le faire avec sql je pense. La performance à tester.

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Je dois avouer que je n'ai pas vraiment compris ton besoin. Tu pourrais réexpliquer stp ?

    Sinon comment tu fais pour avoir un datetime comme ceci 25/09/2013 25:36:22 ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut
    HAHAAA A Oue dsl j'ai vraiment écrit n'importe quoi ^^ lol


    Bon, en gros on a deux table:

    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
    LAMINAGE :
    
    DateLam
    ----------------
    24/09/2013 18:14:25
    25/09/2013 09:14:25
    
    
    
    MESSAGE :
    
    DateMsg                        Message
     ----------------             ---------------
    24/09/2013 15:21:34        testmessage1;E1;tst1
    24/09/2013 16:51:16        testmessage1;E2;tst1
    24/09/2013 18:13:42        testmessage1;E3;tst1
    24/09/2013 21:51:16        testmessage1;E2;tst1
    25/09/2013 07:36:22        testmessage1;E4;tst1
    25/09/2013 08:36:22        testmessage1;E1;tst1
    25/09/2013 13:36:22        testmessage1;E2;tst1

    Il n'y a pas de jointure entre eux. Pour chaque "DateLame", je vais aller chercher la date la plus proche dans la table "Message" pour trouver le message.

    Il se peut que la table Message contient 1 million de date Du coup dans ce cas je vais juste ajouter +8h et -8h à la date "DateLame" dans la condition.

    La question c'est que je ne sais pas comment écrire cette requête

  8. #8
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    Est ce que ceci convient à ton besoin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ;WITH CTE
    AS
    (
     SELECT ROW_NUMBER() OVER (PARTITION BY l.DateLam ORDER BY case when l.DateLam <m.DateMsg then datediff(SECOND, l.DateLam, m.DateMsg) else  datediff(SECOND, m.DateMsg, l.DateLam) end) AS num
    	, l.DateLam
    	, m.Message
    FROM LAMINAGE l
    	CROSS JOIN MESSAGE m 
    )
    SELECT DateLam
    	,SUBSTRING(MESSAGE, charindex ( ';', Message) + 1, len(message) - (charindex( ';', Message, charindex ( ';', Message) + 1) + 2) )
    FROM CTE
    WHERE num = 1;
    Après pour le million de lignes, en indexant bien ça peut passer. Tout dépend si c'est une extraction unique ou si tu comptes balancer cette requête 1000 fois par seconde

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut





    Bravo et merci. Ca m'a beaucoup aidé et aussi aux autres qui ne maitrise pas sql je pense.

    J'en aurai plusieurs comme ca

    Suite de ce challage...vol2


    A bientôt

  10. #10
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Par défaut
    ah oui mais après je vais me faire payer si je dois tout faire ! Je t'ai mis sur la piste, maintenant à toi d'apprendre le t-sql pour devenir autonome

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 53
    Par défaut
    En bidouillant j'ai remarqué qu'au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ROW_NUMBER() OVER (
         PARTITION BY l.DateLam ORDER BY 
                 case when l.DateLam <m.DateMsg then datediff(SECOND, l.DateLam, m.DateMsg) 
                      else  datediff(SECOND, m.DateMsg, l.DateLam) end) AS num

    Je peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ROW_NUMBER() OVER (
         PARTITION BY l.DateLam ORDER BY ABS(datediff(SECOND, l.DateLam, m.DateMsg)) ) AS num

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

Discussions similaires

  1. SSRS Challenge: Un rapport bien costaud vol2
    Par jamboo dans le forum SSRS
    Réponses: 2
    Dernier message: 11/10/2013, 15h25
  2. Réponses: 4
    Dernier message: 03/10/2008, 13h37
  3. Réponses: 2
    Dernier message: 18/07/2008, 09h32
  4. [SSRS][2K5] Sous rapport et parametre
    Par geof dans le forum SSRS
    Réponses: 3
    Dernier message: 03/07/2008, 18h27
  5. [SSRS] Intégration de rapports RS et lien de navigation
    Par Jinroh77 dans le forum SharePoint
    Réponses: 2
    Dernier message: 26/05/2008, 17h54

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