SSRS-valeur vide
j'ai un paramètre @Destinataire
dans les SSRS qui ont une liste de valeurs plus une chaîne vide
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
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.
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.
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:
- é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.
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).
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.