4

さて、これは楽しいものであり、私がこれまで読んだことの一部であり、SSRS のデフォルト値を処理するデフォルトの動作のためにこれを行うことができないと主張する人もいます。しかし、私はかなり遠くまで到達したので、最後まで到達できるかどうか興味があります.

問題: 私がやりたいのは、ユーザーに「今月」、「先月」などのステートメント間で PRE DEFINED を取得させることです...これにより、その文字列参照の DateTime が変数に入力されますが、ユーザーはそれを変更できます後で、親文字列に基づいて更新するか、ユーザーが SINGLE DATETIME PARAMETER で別の文字列を選択できるようにする必要があります。

まず、何が機能し、何が機能しないかを見てみましょう。

I. データセットをこれにバインドします。省略形は次のようになります。

select 
'Today' as Description
,   DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) BegDt
union
select 
    'ThisMonth'
,   Dateadd(month, Datediff(month, 0, getdate()), 0) 

Ⅱ.次に、「DatesPeriod」というパラメーターを設定し、「クエリから値を取得」を選択するときに、パラメーターのフィールドとラベルとして「説明」を追加します。ユーザーはドロップダウンから「Today」または「ThisMonth」を選択できるようになりました。

III. ここで、別のデータセットをセットアップし、「DatesSelected」というラベルを付けます。説明のために、単純にして、パート I のデータセットをネストするだけで、where 句をリストします。基本的に、同じデータセットを再度使用していますが、一度に 1 つの行を強制的に返します。

select *
from 
    (
    select 
        'Today' as Description
    ,   DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) BegDt
    union
    select 
        'ThisMonth'
    ,   Dateadd(month, Datediff(month, 0, getdate()), 0) 
    ) as x
where x.Description = @DatesPeriod

IV. 「Start」という別のパラメーターを定義します。これは DateTime であり、上記のデータセットからその値とデフォルト値を取得します。ユーザーが最初のテキスト変数を変更すると、依存する DateTime 変数も変更されます。テキストの選択を基本的に datetime 変数にバインドしました。これは、スコープが説明の使用可能なデフォルト値のみに制限されています。これにより、スコープが 1 つに制限され、デフォルトが強制的に渡されます。

V. それだけでは十分ではありません。ユーザーが FREE DATE RANGES を自由に選択できるようにしたいと考えています。現在のセットアップでは、スコープが AVAILABLE VALUES によって制限されているため、この日付ピッカーの使用は許可されません。ただし、オンデマンドで更新される datetime 変数にテキストを渡すには、これを行う必要があります (最初だけでなく、レポートの実行中に変更された場合)。そこで、別の DateTime パラメータを作成して「UserStart」と呼び、デフォルトを「[@Start]」にして、「Start」からの依存関係としてデフォルト値を取得します。

Ⅵ.ここで「Choice」というテスト データセットを作成して、データが希望どおりに表示されていることを視覚的に確認します。

 Select isnull(@UserStart, @Start) as Choice

VII. テーブル オブジェクトを作成してレポートに配置し、上記の 1 つのセルに配置して、ユーザーが既定の「開始」値を (SSRS によって提供されるカレンダー表示から) 独自の選択で上書きすると、画面。

したがって、この時点ではすべてが注意を払って機能します。エンド ユーザーが既定のセットを選択するか、独自のセットを選択できるようにするには、両方の日時パラメーターを表示する必要があります。2 番目のパラメーター 'Start' を非表示にしようとすると、レポートが実行される最初の時間のみにデフォルトが設定され、最初のパラメーターが変更されるたびにそれが必要になります。表示されている場合は問題なく動作しますが、機能的には、ユーザーが同じである 2 つのレポート パラメーターを表示することは望ましくありません。「開始」パラメーターを返すためのカスタム コードを試して、さらに別のデータセットを作成しましたが、SSRS は、デフォルトの更新または選択したい ANY DATE に柔軟に対応できないように作られていることがわかっています。パラメーターを更新して、別の変数から画面上で更新したい場合は、それを伝える必要があります。利用可能な値とデフォルト値が変更されました。ただし、これによりカレンダーオプションが削除されるため、パラメーターを別のパラメーターに渡す必要があります。ただし、2 番目のパラメーターを非表示にすると、値が渡されません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

Microsoft Connectによると、既定のパラメーターを更新しない機能は「仕様による」ものです。

「説明したように、これはバグではありません。選択した値が有効な値リストに含まれていない限り、後続のパラメーターのデフォルト値を再評価しません。現在の値がユーザーによって明確に要求されたかどうかはわかりません。または、デフォルトのためにそこにあります.何らかのプロパティを介してこの動作を制御できるようにすることもできますが、現在は設計どおりに機能しています." - マイクロソフト

推奨される回避策:

しばらくこれで遊んでいますが、私が見ることができる唯一の解決策は、ユーザーがレポートを使用する方法を変更することです。

クエリによって計算された日付を表示する代わりに、UserStartそれをオーバーライド日付として使用し、null 値を受け入れて null をデフォルト値として設定できるようにします。次に、クエリで次のようなものを使用します。

where Table.DateStart < isnull(@UserStart, @Start)

これにより、ユーザーDatePeriodはレポートを実行するか、独自のカスタム日付範囲で更新するかを選択できます。

サンプル:

ssrsサンプル

于 2013-07-26T15:53:21.867 に答える
0

多くの調査の後、上記は解決策への最終的な手がかりを提供しました。いくつかの手順がありますが、ユーザーは定義済みの日付範囲を選択したり、独自の日付を入力したりできます。

  1. テキスト パラメータ「DateRange」を追加します。AvailableValues を次のように設定します。

日付を選択:選択してください

今年:今年

昨年:昨年

すべて:すべて

DefaultValues を None に設定

  1. 次のようにストアド プロシージャ「GetDateRangeFromDesc」を作成します。

CREATE PROCEDURE [dbo].[GetDateRangeFromDesc]

@範囲 varchar(50)

なので

始める

NOCOUNT をオンに設定します。

SELECT
    CASE 
WHEN @Range = 'Choose' THEN NULL
WHEN @Range = 'ThisYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
WHEN @Range = 'LastYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()) - 1, 0)
WHEN @Range = 'All' THEN Convert(DATE, '1/1/1900') END AS Date1,
CASE
WHEN @Range = 'Choose' THEN NULL
WHEN @Range = 'ThisYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, 0)
WHEN @Range = 'LastYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
WHEN @Range = 'All' THEN Convert(DATE, '12/31/2099') END AS Date2

END
GO
  1. データセット「DateRangeValues」を追加します

ストアド プロシージャ「GetDateRangeFRomDesc」を選択します。

フィールドは Date1 と Date2 である必要があります

パラメータは @Range:[@DateRange] である必要があります

  1. 日付/時刻パラメーター「StartDate」を追加します。AvailableValues と DefaultValues を次のように設定します。

クエリから値を取得します。データセット: DateRangeValues; 値/ラベル フィールド: Date1

  1. 日付/時刻パラメーター「EndDate」を追加します。AvailableValues と DefaultValues を次のように設定します。

クエリから値を取得します。データセット: DateRangeValues; 値/ラベル フィールド: Date2

レポートを実行すると、ストアド プロシージャで決定されたとおりに開始日と終了日が入力されます。sp に必要な数の日付範囲を追加します。ユーザーが独自の値を入力できるように、NULL を返す選択肢を用意するだけです。

** 申し訳ありませんが、完全にテストする前に投稿しました。[選択] を選択して日付を入力すると、すべてが更新され、日付が消えます。:) 誰かがこれを機能させる最後のピースを追加できるかもしれません。

別の更新: これ、DateRange パラメーターが、更新を引き起こす最後のパラメーターの後にある場合に機能します!!

于 2015-04-17T19:14:24.857 に答える