2009-03-03 84 views
8

Tengo un informe de servicios de informes (SQL 2008) con dos parámetros de Fecha/Hora - begindate y enddate. Necesito restringir enddate al mismo mes y año que begindate. Parece que debería ser algo fácil de hacer, pero no puedo resolverlo.Constricción de parámetros de Reporting Services

Actualmente, estoy verificando los parámetros pasados ​​al procedimiento almacenado y generando un error si los dos parámetros de fecha y hora no están en el mismo mes y año. Estoy buscando una forma más elegante de lograr esto.

Respuesta

6

Puede verificar el valor EndDate en la expresión del parámetro, y si es incorrecto, configúrelo en StartDate + 1 Month.
Algo así como:

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

Si lo que desea notificar al usuario, se puede colocar algún cuadro de texto oculto con el formato apropiado (rojo grande de la fuente) y el mensaje acerca de los parámetros de rango fecha incorrecta. En la expresión Oculto configurar

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

Además, puede combinar ambas acciones con código personalizado:

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 

Luego, en expresión de valor de parámetro:

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

en propiedad Value de tbDateParameterMessage cuadro de texto:

= Code.DateMessage 

Y en la expresión propiedad Hidden:

= String.IsNullOrEmpty(Code.DateMessage) 

EDITAR Pero si desea detener informe de ejecución, utilice el código personalizado:

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 

Ha tomado de SQLServerCentral forum.

+0

Pensé en eso, pero el problema es que el usuario podría no darse cuenta de que se ajustó la fecha. Lo que me gustaría hacer es algo así como mostrar un cuadro de diálogo diciéndoles que las fechas deben estar en el mismo mes. – jhale

0

Utilicé la idea de cuadro de texto oculto porque era mejor que dejar que fallara el informe. Lo que esperaba lograr era obligar al usuario a cambiar sus parámetros por adelantado antes de que se ejecutara el informe.

Por cierto, la sintaxis no funcionó. Usé esto en su lugar:

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

Gracias, Coldice por la idea.

+0

Sí, soy temporal sin SSRS y VB IDE :). Actualización de respuesta de pago. –

+0

Y, por cierto, ¿qué pasa con el año verificar si la fecha de inicio = 29/12/2008 y la fecha de finalización = 01/01/2009? –

1

Muy a menudo, hay problemas de implementación con el uso de la función Msgbox en un informe SSRS. Funcionan bien en nuestras máquinas de desarrollo, pero puede ser difícil trabajar cuando se implementan. Aquí hay un par de enlaces que explican los problemas:

From MSDN

From SQLDev

Mi solución fue una aplicación muy simplista en que se detuvo el informe, sino que simplemente muestra un error de informe con el mensaje que se muestra a la usuario del visor de informes.

  1. Crear un nuevo parámetro de texto/string (Me llamaron CheckDateRange)
  2. Permitir valores en blanco y hacerlo Ocultos
  3. Valores Disponibles = ninguno
  4. avanzadas = Usar valores por defecto
  5. Los valores por defecto = especificar valores: en Valor, use el botón de función y use lo siguiente: = CODE.CheckDateParameters (Parámetros! BeginDate.Value, Parameters! EndDate.Value) - tenga en cuenta que puede ver mis nombres de parámetros para las fechas marcadas son BeginDate y EndDate
  6. Por último, para el código de reporte de entrar en el siguiente fragmento de código:

    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 
    

nada especial, pero cumple lo que necesita.

¡Buena suerte!

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 

A menos que hayan hecho cambios en la función MsgBox() no funcionará en SSRS. No funciona en SSRS 2010. Creo que es una función de Windows, por lo que no se puede usar en una página web renderizada.

Cuestiones relacionadas