0

Visual Studio を使用して非常に基本的な SSRS レポートをセットアップしています。私が設定したパラメータには、今のところ「空白値を許可する」、「null値を許可する」、「複数の値を許可する」はありませんが、運が悪いので使用してみました。空白の値を許可し、null の値を許可しても、まったく機能していないようです。

プレビューでは、「パラメータ 'xxxx' の値を選択してください。

メインのデータセット クエリで、"column = @column" と "column IN @column" クエリをいじってみました。また、Googleを検索し、追加のデータセットクエリを「列がnullでないテーブルから個別の列を選択する」に設定しました。また、クエリでUNIONを使用してみました。ここでは、オプションとして「NULL」を選択するオプションが提供されますが、 null にはすべてが含まれているわけではないので、結果は何も得られません....

回避策や、単一のパラメーターを取得して、すべてを選択するように設定する必要がないオプションを取得する方法を知っている人はいますか?

どんな助けでも大歓迎です!皆さん、ありがとうございました!

-EDIT これは、クエリとして私が持っているものです "SELECT DOCDATE, DOCID, CUSTNMBR, CUSTNAME, DOCAMNT FROM SOP30200 WHERE (DOCDATE BETWEEN @Fromdate AND @Todate) GROUP BY DOCDATE, DOCID, CUSTNMBR, CUSTNAME, DOCAMNT HAVING (CUSTNMBR = @Custnmbr OR @Custnmbr IS NULL) AND (DOCID IN (@DocID) OR @DocID IS NULL)" しかし、まだ docID セクションを空白にすることはできません。上記のこと、私はまだあなたの下の例からSPまたは何かが必要ですか?

4

1 に答える 1

2

allow null 値を設定することで、データセットが次のように見えることを示しています。

CREATE PROCEDURE myRSStoredProcedure
 @MyParameter varchar(50)=NULL
 --more code
 SELECT * FROM MyTable WHERE (MyField=@MyParameter OR @MyParameter IS NULL)

END

つまり、NULL は有効な値であり、ストアド プロシージャのどこかで参照されWHERE (MyField=@MyParameter OR @MyParameter IS NULL)ています。これが値または NULL に対して処理する部分に注意してください。を含めOR @MyParameter IS NULLないでWHERE MyField=@MyParameter、RS に対処していないことを考慮して、RS が "Allow Nulls" をどのように期待するかだけです。

複数の値を許可する場合、これは複数の選択を許可する Reporting Services の唯一の指標です。データセット (ストアド プロシージャ) でカンマ区切り値を処理する必要があります。次のように言うことはできません。

SELECT * FROM MyTable WHERE ID IN (@MyParam)

そのようには機能しません。これを修正する方法として、CSV リストを受け取り、整数のテーブルを返すテーブル値関数を作成する必要があります。以下に例を示します。

CREATE Function [dbo].[CsvToInt] ( @Array varchar(1000)) 
returns @IntTable table 
    (IntValue int)
--Parse comma seperated value parameters
--To be used in SELECT blah WHERE blah IN (...)
--This function returns int, but may be modified to return any datatype
AS
begin

    declare @separator char(1)
    set @separator = ','

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ','

    while patindex('%,%' , @array) <> 0 
    begin

      select @separator_position =  patindex('%,%' , @array)
      select @array_value = left(@array, @separator_position - 1)

        Insert @IntTable
        Values (Cast(@array_value as int))

      select @array = stuff(@array, 1, @separator_position, '')
    end

    return
end

最後に、空の選択とは対照的に「すべて」のデータを含める巧妙な方法は、2 つのデータセットを作成することです。最初のデータセットは、たとえば次の顧客のパラメータです。

SELECT
  1 As SortOrder
  CustomerID,
  Customer
FROM
  MyCustomers
UNION ALL
SELECT
  0 As SortOrder
  0 As CustomerID,
  'All' As Customer
ORDER BY
  SortOrder,
  Customer

これにより、上部に All という単語を持つすべての顧客が一覧表示されます (SortOrder に注意してください)。次に、RS レポート パラメータで、デフォルト値を 0 (CustomerID を使用しているAll場合) または (実際の顧客名を使用している場合) として指定できます。レポート データセットは次のようになります。

CREATE PROCEDURE rsp_MainReport
@CustomerID int = 0  --this could also be @CustomerID varchar(50)='All'
--more code
SELECT Blah FROM MyTable WHERE (CustomerID = @CustomerID OR @CustomerID=0) 
--or you could of done WHERE (Customer = @Customer OR @Customer='All')

私があなたのために行った例を投稿します。パラメータデータセットは次のとおりです。

SELECT 
                    1 as SortOrder,
                    FacilityID,
                    Facility
                FROM
                    Facility
                UNION ALL
                SELECT
                    0 as SortOrder,
                    0 as FacilityID,
                    'All' as Facility
                ORDER BY 
                    SortOrder,
                    Facility

次の結果が得られます。

ここに画像の説明を入力

次に、それをメイン データセット (レポートのデータセット) で使用できます。

CREATE PROCEDURE rsp_QuikFixStats_ByFacilityCategory
    -- Add the parameters for the stored procedure here
    @FacilityID bigint=0,
    @StartDate datetime=NULL,
    @EndDate datetime=NULL

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT 
        f.Facility,
        c.Category, 
        COUNT(t.TicketID) AS TotalNumberOfTickets,
        SUM(CASE WHEN ClosedDate IS NULL AND TargetDate IS NOT NULL THEN 1 ELSE 0 END) AS TotalNumberOfOpenTickets,
        SUM(CASE WHEN ClosedDate IS NOT NULL THEN 1 ELSE 0 END) AS TotalNumberOfClosedTickets,
        SUM(CASE WHEN TargetDate IS NULL AND ClosedDate IS NULL THEN 1 ELSE 0 END) AS TotalNumberOfWaitForTickets,
        SUM(CASE WHEN TargetDate IS NOT NULL AND ClosedDate IS NULL AND TargetDate < GetDate() THEN 1 ELSE 0 END) AS TotalNumberOfOverdueTickets
    FROM 
        Ticket t
    INNER JOIN
        Facility f
    ON
        f.FacilityID = t.FacilityID
    INNER JOIN
        Category c
    ON
        c.CategoryID = t.CategoryID
    WHERE 
        (f.Inactive=0)
        AND (f.FacilityID = @FacilityID OR @FacilityID=0)
        AND (t.OpenDate >= @StartDate OR @StartDate IS NULL)
        AND (t.OpenDate <= @EndDate OR @EndDate IS NULL)
    GROUP BY
        f.Facility,
        c.Category
    ORDER BY
        f.Facility,
        COUNT(t.TicketID) DESC,
        c.Category      
END
GO

レポート パラメータは次のようになります。

ここに画像の説明を入力

于 2012-09-19T19:51:51.160 に答える