2009-03-03 13 views
8

私は、begindateとenddateという2つの日付/時刻パラメータを持つレポートサービス(SQL 2008)レポートを用意しています。私は終わりを同じ年と同じ年に強制する必要があります。これは簡単なことだと思われますが、私はそれを理解できません。Reporting Servicesパラメータの制約

現時点では、2つの日時パラメータが同じ月と年にない場合、ストアドプロシージャに渡されるパラメータをチェックしてエラーを発生させています。私はこれを達成するよりエレガントな方法を探しています。

答えて

6

パラメータ式でEndDateの値を確認できます。値が正しくない場合は、StartDate + 1 Monthに設定します。以下のような
何か:あなただけのユーザーに通知したい場合は

= IIF(DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) = 0, Parameters!EndDate.Value, AddDate(DateInterval.Month, 1, Parameters!StartDate.Value)) 

、あなたは日付パラメータ不正確な範囲について適切なフォーマット(赤ビッグフォント)とメッセージを持ついくつかの隠しテキストボックスを配置することができます。 tbDateParameterMessageテキストボックスのValueプロパティで

= Code.ValidateDate(Parameters!StartDate.Value, Parameters!EndDate.Value) 

:パラメータ値式に、

Public DateMessage As String 

Public Function ValidateDate(StartDate As DateTime, EndDate As DateTime) As DateTime 
    Dim ResultDate As DateTime 
    If (DateDiff(DateInterval.Month, StartDate, EndDate) <> 0) Then 
    ResultDate = AddDate(DateInterval.Month, 1, StartDate) 
    DateMessage = String.Format("End Date parameter value {0} 
     was out of range and was changed to {1}", EndDate, ResultDate) 
    Else 
    ResultDate = EndDate 
    End If 
End Function 

その後:隠された式では、カスタムコードで両方のアクションを組み合わせることができ、

= (DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) <> 0) 

も設定します。

= Code.DateMessage 

と隠しプロパティ式中:

= String.IsNullOrEmpty(Code.DateMessage) 

EDIT しかし、あなたが実行してレポートを停止したい場合は、このカスタムコードを使用します

Public Function CheckDate(SDate as Date, EDate as Date) as Integer 
    Dim msg as String 
    msg = "" 
    If (SDate > EDate) Then 
     msg="Start Date should not be later than End Date" 
    End If 
    If msg <> "" Then 
     MsgBox(msg, 16, "Parameter Validation Error") 
     Err.Raise(6,Report) 'Raise an overflow 
    End If 
End Function 

それはSQLServerCentral forumから取られていますが。

+0

私はそれについて考えましたが、問題はユーザーが日付が調整されたことに気付かないことがあることです。私がしたいことは、日付が同じ月になければならないというダイアログを表示するようなものです。 – jhale

0

私は隠れたテキストボックスのアイデアを使用しました。これは、レポートをクラッシュさせるよりも優れていたからです。私が達成しようとしていたのは、レポートを実行する前にユーザーがパラメータを前もって変更するように強制することでした。

ところで、構文は機能しませんでした。私はこれを代わりに使用しました:

= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value) 

アイデアのためのcoldice。

+0

ええ、私はSSRSとVB IDEなしで一時的です:)。チェックアウトの回答の更新。 –

+0

btw開始日= 12/29/2008と終了日= 01/01/2009の場合、年次チェックはどうですか? –

1

非常に多くの場合、SSRSレポートでMsgbox関数を使用する際に展開の問題があります。私たちの開発マシンではうまく動作しますが、実際に展開したときに作業するのは難しいかもしれません。ここでの問題を説明するリンクのカップルです:

From MSDN

From SQLDev

私のソリューションは、レポートが停止した非常に単純な実装だったが、それは単にに表示されるメッセージとレポートのエラーを示しますユーザーをレポートビューアから削除します。

  1. =ブランク値を許可すると値=なし
  2. 高度=デフォルト値を使用
  3. デフォルト値も隠し
  4. を利用できるよう
  5. (私はCheckDateRangeそれを呼ばれる)新しいテキスト/文字列パラメータを作成します。 = CODE.CheckDateParameters(パラメータ!BeginDate.Value、Parameters!EndDate.Value) - 確認された日付のパラメータ名がBeginDateとEndDateであることを確認してください。
  6. 最後に、レポートコードの次のコードスニペットを入力します。空想

    Function CheckDateParameters(StartDate as Date, EndDate as Date) as Integer 
    Dim msg as String 
    msg = "" 
    If (StartDate > EndDate) Then 
        msg="Start Date should not be later than End Date" 
        Err.Raise(22000, "VBCore.Utility", msg) 
    End If 
    End Function 
    

何もしていますが、必要なものを実現しています。

幸運を祈る!

0
>  Public Function CheckDate(SDate as Date, EDate as Date) as Integer Dim msg as String 
>  msg = "" 
>  If (SDate > EDate) Then msg="Start Date should not be later than End Date" 
>  End If 
>  If msg <> "" Then MsgBox(msg, 16, "Parameter Validation Error") Err.Raise(6,Report)     'Raise an overflow 
>  End If End Function 

変更を加えない限り、MsgBox()関数はSSRSでは機能しません。 SSRS 2010では動作しません。私はそれがウィンドウ関数だと考えていますので、レンダリングされたWebページでは使用できません。

関連する問題