SSRS-valeur vide

j'ai un paramètre @Destinataire dans les SSRS qui ont une liste de valeurs plus une chaîne vide

enter image description here

j'ai créé une requête qui-je définir comme valeurs disponibles, ce qui me donne la liste déroulante

SELECT code_name FROM tableA UNION ALL SELECT ''

quand j'exécute les rapports avec la chaîne vide, je n'ai aucun résultat

enter image description here

j'ai essayé de définir le paramètre comme une zone de texte et il ne fait rien trop

Pourtant, lors de l'exécution de la requête sql que j'utilise pour exécuter ce rapport, les choses vont bien car j'ai toutes mes lignes récupérées (voir requête ci-dessous)

DECLARE @DateCmt DATE = '05/09/2015',
        @DateFin DATE = '05/09/2016',
        @Restriction INT = 1,
        @Destinataire VARCHAR(5) = ''
        --
        ;

--SELECT @DateCmt,@DateFin

 SELECT DISTINCT 
CFE_EDI.IU_LIASSE
,CFE_EDI.ETAT
,CFE_EDI.DATHRMAJ -- nouveau
,CFE_EDI.ESP_APPLI
,CFE_EDI.NOM_RS
,PARTENAIRES.LIBEL
,PARTENAIRES.CODE_INSEE
,CFE_EDI.DATHR_ENV -- nouveau
,CFE_EDI.DATHR_MEF -- nouveau
,CFE_EDI.DATHR_PRE -- nouveau
,CFE_EDI.DATHR_OUV -- nouveau
--,CFE_EDI.DATEHR_DEPOT-- mettre l'heure
,CFE_EDI.GESTDEL
--,CFE_SERVICE_DEST.IU_DEST
--,CFE_SERVICE.IU_LIASSE
,CASE WHEN CFE_EDI.ETAT = 'MEF' THEN 'En Attente le'
     WHEN CFE_EDI.ETAT = 'PRE' THEN 'Préparé le' 
     WHEN CFE_EDI.ETAT = 'ENV' THEN 'Envoyé le'
     WHEN CFE_EDI.ETAT = 'OUV' THEN 'Réceptionné le'
     WHEN CFE_EDI.ETAT = 'NRM' THEN 'Non remis le'
     WHEN CFE_EDI.ETAT = 'NAQ' THEN 'Non acquitté le'
     END AS ChampEtat
,CASE WHEN CFE_EDI.ETAT = 'OUV' THEN 'Date d''envoi : ' + CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103)
END AS Date_Envoi,
CASE 
WHEN CFE_EDI.ETAT='MEF' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,103) 
WHEN CFE_EDI.ETAT='PRE' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,103) 
WHEN CFE_EDI.ETAT='ENV' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103) 
WHEN CFE_EDI.ETAT='OUV' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,103) 
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,103) END AS DateMaj ,
CASE
WHEN CFE_EDI.ETAT='MEF' then CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,108) 
WHEN CFE_EDI.ETAT='PRE' then CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,108) 
WHEN CFE_EDI.ETAT='ENV' then CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,108) 
WHEN CFE_EDI.ETAT='OUV' then CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,108)
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,108) END AS HeureMaj,
PARTENAIRES.LIBEL + '(' + CFE_EDI.CODE_INSEE + ')' AS LibelDestinataire
--,CASE WHEN @Restriction = 1 THEN '1'
--     WHEN @Restriction = 0 THEN '0' END AS Restriction
,CASE WHEN @DateCmt != @DateFin AND @DateCmt <  @DateFin THEN 'Diffusion Xml du ' + CONVERT(VARCHAR,(@DateCmt),103) + ' au ' + CONVERT(VARCHAR,(@DateFin),103) ELSE 
'Diffusion EDI Xml du ' + CONVERT(VARCHAR,@DateCmt,103) END AS Plage_Diffusion
-- INTO 
 FROM   
 (PARTENAIRES 
 INNER JOIN dbo.CFE_EDI ON PARTENAIRES.CODE_INSEE = CFE_EDI.CODE_INSEE) 
INNER JOIN dbo.CFE_SERVICE ON CFE_EDI.IU_LIASSE = CFE_SERVICE.IU_LIASSE
INNER JOIN dbo.CFE_SERVICE_DEST ON (PARTENAIRES.IU_PART = CFE_SERVICE_DEST.IU_PART_CFE)
WHERE 
case when @Restriction = 1
              then case when CFE_EDI.ETAT in('ENV','OUV') then 1 else 0 end
           when @Restriction = 0
              then case when CFE_EDI.ETAT not in('ENV','OUV') then 1 else 0 end
           else case when CFE_EDI.ETAT <> '' then 1 else 0 end
       end = 1
AND 
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
    AND    CASE --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''
           --THEN CASE 
           WHEN @Destinataire != '' AND (@Destinataire) IS NOT NULL
              THEN CASE WHEN CFE_EDI.CODE_INSEE = @Destinataire THEN 1 ELSE 0 END
           ELSE CASE WHEN CFE_EDI.CODE_INSEE = PARTENAIRES.CODE_INSEE 
                    AND cfe_edi.dathrmaj > @DateCmt AND cfe_edi.dathrmaj < @DateFin 
                    AND CFE_EDI.GESTDEL = '1' THEN 1 ELSE 0 END  
           END = 1

la première question serait de savoir s'il y a moyen de configurer le paramètre sans utiliser mon truc stupide.

la deuxième question est pourquoi la requête avec paramètre avec une chaîne vide fait l'affaire et une fois que vous utilisez SSRS, rien.

Merci d'avance pour votre aider

mise à Jour j'ai essayé de mettre le WHEN LEN(@Destinataire) > 0@Destinataire = '' mais pas de chance sur ce coup.

mise à Jour 2 mon but est maintenant d'avoir une solution qui va récupérer toutes les données, au cas où le @Destinataire est égal à " ou NULL. Cependant, en y réfléchissant, cette solution équivaut à avoir toutes les valeurs peuplées dans @Destinataire. D'une manière ou d'une autre, je dirais.

mise à jour finale j'ai recréé tout de scratch et oh! la magie, le regroupement ou l'option tout fonctionnait comme souhaité. Je ne sais toujours pas ce qui n'allait pas, mais je suis d'accord avec les résultats. Merci beaucoup pour votre aide et votre soutien.

10
demandé sur Andy K 2016-09-09 17:06:10

3 réponses

en regardant votre requête et où vous passez @Destinataire vous devriez être capable de passer une valeur nulle selon la clause où et obtenir le même effet que passer"

 CASE --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''
       --THEN CASE 
       WHEN @Destinataire != '' AND (@Destinataire) IS NOT NULL
          THEN CASE WHEN CFE_EDI.CODE_INSEE = @Destinataire THEN 1 ELSE 0 END
       ELSE CASE WHEN CFE_EDI.CODE_INSEE = PARTENAIRES.CODE_INSEE 
                AND cfe_edi.dathrmaj > @DateCmt AND cfe_edi.dathrmaj < @DateFin 
                AND CFE_EDI.GESTDEL = '1' THEN 1 ELSE 0 END  
       END = 1

je vais essayer de définir ce paramétreur particulier pour autoriser les nulls dans le rapport ssrs qui peut être trouvé comme une case à cocher dans votre fenêtre de paramétrage des paramètres.

4
répondu Zi0n1 2016-09-09 15:13:05

il y a une option hybride, où vous pouvez garder votre paramètre visible tel que vous l'avez, mais ensuite utiliser un paramètre caché en cascade pour faire référence dans la requête. Donc si vous avez vraiment des problèmes avec la formulation de votre requête avec des valeurs vides ou nulles comme paramètre, cela va fonctionner autour de cela. Voici les étapes:

  • créer un nouvel ensemble de données.

un petit hic, vous devez vous assurer que la modification de la sélection ajoute toujours une nouvelle valeur à forcez un rafraîchissement du paramètre en cascade, mais c'est facile à faire:

SELECT code_name FROM tableA WHERE @Destinataire='' OR @Destinataire=code_name
--Dummy value needed to force update of parameter value in some cases:
UNION SELECT 'zz' + @Destinataire AS code_name
  • définir un nouveau paramètre,@MultiDestataire. Lui permettre d'accepter les valeurs multiples et utiliser les nouvelles données disponibles et les valeurs par défaut. Réglez sa visibilité sur Hidden.

exécuter le rapport avant de cacher le nouveau paramètre montre comment cela fonctionne:

Parameter Behavior

  • éditer la requête pour utiliser le nouveau paramètre multivalue dans son WHERE l'article.

A partir de maintenant, ceci modifie simplement la requête pour utiliser le IN déclaration, qui devrait ressembler à ceci:

CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...

Tenter cela peut être une étape intermédiaire si vous avez un autre problème dans la requête qui est responsable des résultats inattendus, comme vous devrait être en mesure de tester une valeur vide.

3
répondu bitnine 2016-09-14 19:22:32

Ceci est juste mes deux cents, en gros vous avez deux options ici.

paramètre à valeurs multiples Option

Définissez votre paramètre à permet de multivalues, utilisez le même ensemble de données dans Available values et Default values propriétés. Ainsi, lorsque votre utilisateur ne sélectionne aucune valeur, le paramètre sera rempli avec toutes les valeurs. Sinon, votre paramètre ne sera rempli que par les valeurs sélectionnées par vos utilisateurs.

Dans ce cas, vous aurez à utilisez IN opérateur puisque votre paramètre représente des valeurs multiples sélectionnées ou non par votre utilisateur.

...
WHERE CFE_EDI.CODE_INSEE IN (@Destinataire)
...

quand vous utilisez Default values propriété toutes les valeurs de liste déroulantes sont sélectionnées par défaut et votre rapport s'exécute sans aucun filtre appliqué (au moins si votre utilisateur ne sélectionne aucune valeur ou valeurs).

enter image description here

en plus, je voudrais éviter d'utiliser '' (blanc), il n'est pas informatif et votre utilisateur pourrait penser qu'il s'agit type d'erreur ou de votre paramètre n'a pas été remplis correctement.

Pourquoi utiliser une seule valeur quand vous voulez afficher des données de plus d'une valeur (dans votre cas tous)?

Seule la valeur de l'Option (Pas de sens de l'OMI)

pour cela fonctionne, vous devez configurer votre paramètre Allow blank value ("") et Allow null value. Votre requête devrait ressembler à ceci:

WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire

dans votre requête je pense que cela pourrait être quelque chose comme ceci:

WHERE  CASE 
         WHEN @Restriction = 1 THEN 
           CASE 
             WHEN cfe_edi.etat IN( 'ENV', 'OUV' ) THEN 1 
             ELSE 0 
           END 
         WHEN @Restriction = 0 THEN 
           CASE 
             WHEN cfe_edi.etat NOT IN( 'ENV', 'OUV' ) THEN 1 
             ELSE 0 
           END 
         ELSE 
           CASE 
             WHEN cfe_edi.etat <> '' THEN 1 
             ELSE 0 
           END 
       END = 1 
       AND cfe_edi.code_insee IS NOT NULL 
       AND cfe_edi.code_insee != '' 
       AND ( CASE 
               --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''  
               --THEN CASE   
               WHEN ( @Destinataire = '' 
                       OR @Destinataire IS NULL ) 
                    AND cfe_edi.code_insee = partenaires.code_insee
                    AND cfe_edi.dathrmaj > @DateCmt 
                    AND cfe_edi.dathrmaj < @DateFin 
                    AND cfe_edi.gestdel = '1' THEN 1 
               ELSE 0 
             END = 1 
              OR cfe_edi.code_insee = @Destinataire )  

tenir compte également de cette évaluation AND cfe_edi.code_insee = partenaires.code_insee, est-il nécessaire, même si votre JOIN l'opérateur est forcé de respecter la condition? INNER JOIN dbo.CFE_EDI ON PARTENAIRES.CODE_INSEE = CFE_EDI.CODE_INSEE

Une troisième option pourrait être d'utiliser un paramètre caché pour nettoyer l' null et '' option de l'utilisateur de produire un paramètre rempli avec toutes les valeurs. Essayez les options ci-dessus avant de vous impliquer dans l'approche des paramètres cachés/internes.

Laissez-moi savoir si cela aide.

1
répondu alejandro zuleta 2016-09-13 13:11:23