2009-03-03 136 views
8

我有一個報告服務(SQL 2008)報告與兩個日期/時間參數 - begindate和enddate。我需要限制enddate與begindate相同的月份和年份。這似乎應該是一件容易的事情,但我無法弄清楚。報告服務參數約束

目前,我正在檢查傳遞給存儲過程的參數,並在兩個日期時間參數不在相同的月份和年份中時引發錯誤。我正在尋找一種更完美的方式來完成這一點。

回答

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)) 

如果你只是想通知的用戶,你可以把用適當的格式(紅色大字體)和消息有關日期不正確的參數範圍內的一些隱藏的文本框中。在隱藏式設置

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

而且,你既可以行動與自定義代碼結合在一起:

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 

然後,在參數值表達式:

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

在tbDateParameterMessage文本框的Value屬性:

= Code.DateMessage 

,並在隱蔽屬性表達式:

= String.IsNullOrEmpty(Code.DateMessage) 

編輯 但是,如果你想停止運行報告,使用自定義代碼:

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 2009-03-03 15:47:35

0

我使用隱藏的文本框的想法,因爲它比讓報告崩潰更好。我希望完成的是強制用戶在執行報告之前更改其參數。

順便說一句,語法沒有工作。我用這個代替:

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

感謝coldice這個想法。

+0

是的,我暫時沒有SSRS和VB IDE :)。結帳答案更新。 – 2009-03-03 20:03:04

1

通常,在SSRS報告中使用Msgbox函數時會出現部署問題。它們在我們的開發機器上運行良好,但在實際部署時可能很難實現。這裏有一對夫婦的說明鏈接的問題:

From MSDN

From SQLDev

我的解決方案是一個非常簡單的實現,其中報告被停止,但它只是顯示出與顯示的消息報告錯誤用戶從報表查看器。

  1. 創建一個新的文本/字符串參數(我把它叫做CheckDateRange)
  2. 允許空值,使其隱藏
  3. 可選值=無
  4. 高級=使用默認值
  5. 默認值=指定值 - 在Value中,使用函數按鈕並使用以下代碼:= CODE.CheckDateParameters(Parameters!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上不起作用。我相信這是一個Windows功能,因此無法在渲染的網頁上使用。