2009-03-03 8 views
8

Ich verfüge über einen Berichtsservice (SQL 2008) -Bericht mit zwei Datum/Uhrzeit-Parametern - Startdatum und Enddatum. Ich muss das Enddatum auf den gleichen Monat und das gleiche Jahr beschränken wie das Begin. Das scheint so zu sein, als ob es eine leichte Sache wäre, aber ich kann es nicht herausfinden.Reporting Services-Parametereinschränkung

Derzeit überprüfe ich die Parameter, die an die gespeicherte Prozedur übergeben werden, und verursache einen Fehler, wenn die beiden Datetime-Parameter nicht im selben Monat und Jahr liegen. Ich suche nach einer eleganteren Art, dies zu erreichen.

Antwort

6

Sie können den EndDate-Wert in Parameterausdruck überprüfen, und wenn es falsch ist, legen Sie es auf StartDate + 1 Monat fest.
Etwas wie:

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

Wenn Sie Benutzer nur benachrichtigen möchten, können Sie einige versteckte Textfeld mit den entsprechenden Formatierungen (rote große Schrift) und Meldung über Datum Parameter falsche Bereich platzieren. In versteckten Ausdruck gesetzt

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

Auch Sie beide Aktionen mit benutzerdefinierten Code kombinieren können:

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 

Dann in Parameterwert Ausdruck:

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

in Value-Eigenschaft tbDateParameterMessage Textbox:

= Code.DateMessage 

Und in Hidden-Eigenschaft Ausdruck:

= String.IsNullOrEmpty(Code.DateMessage) 

EDIT Aber wenn Sie stoppen Bericht ausführen möchten, verwenden Sie diesen benutzerdefinierten Code:

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 

Aus SQLServerCentral forum genommen wird.

+0

Ich dachte darüber nach, aber das Problem ist, dass der Benutzer nicht bemerkt, dass das Datum angepasst wurde. Was ich tun möchte, ist etwas wie einen Dialog anzuzeigen, der ihnen sagt, dass die Daten im selben Monat sein müssen. – jhale

0

Ich habe die versteckte Textbox Idee verwendet, weil es besser war, als den Bericht abstürzen zu lassen. Was ich zu erreichen hoffte, war, den Benutzer zu zwingen, seine Parameter im Vorfeld zu ändern, bevor der Bericht ausgeführt wurde.

BTW, die Syntax hat nicht funktioniert. Ich benutzte dieses stattdessen:

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

Danke coldice für die Idee.

+0

Ja, ich bin vorübergehend ohne SSRS und VB IDE :). Aktualisierung der Checkout-Antwort –

+0

Und was ist mit Jahresüberprüfung, wenn Startdatum = 29.12.2008 und Enddatum = 01.01.2009? –

1

Sehr häufig gibt es Bereitstellungsprobleme mit der Msgbox-Funktion in einem SSRS-Bericht. Sie funktionieren gut auf unseren Entwicklungsmaschinen, aber es kann schwierig sein, wenn sie tatsächlich eingesetzt werden. Hier sind ein paar Links zu erklären die Themen:

From MSDN

From SQLDev

Meine Lösung eine sehr einfache Implementierung war, wo der Bericht gestoppt wurde, aber es zeigt einfach einen Bericht Fehler mit der Meldung an den angezeigten Benutzer aus der Berichtsanzeige.

  1. Erstellen Sie einen neuen Text/String-Parameter (ich es CheckDateRange genannt)
  2. Blank-Werte zulassen und machen es versteckte
  3. Verfügbare Werte = none
  4. Erweiterte = Standardwerte verwenden
  5. Standardwerte = Geben Sie Werte ein - verwenden Sie in Value die Funktionsschaltfläche, und verwenden Sie Folgendes: = CODE.CheckDateParameters (Parameter! BeginDate.Value, Parameter! EndDate.Value) - Beachten Sie, dass meine Parameternamen für die geprüften Daten BeginDate und EndDate
  6. sind
  7. schließlich für den Bericht Code geben Sie den folgenden Code-Schnipsel:

    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 
    

Nichts Besonderes, aber vollbringt, was Sie brauchen.

Viel Glück!

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 

Wenn sie keine Änderungen vorgenommen haben, funktioniert die MsgBox() - Funktion nicht auf SSRS. Es funktioniert nicht auf SSRS 2010. Ich glaube, es ist eine Windows-Funktion, so kann nicht auf einer gerenderten Webseite verwendet werden.