Pregunta

Tengo un informe de servicios de informes (SQL 2008) con dos parámetros de fecha / hora: inicio y fecha de finalización. Necesito restringir la fecha de vencimiento al mismo mes y año en que se encuentra. Esto parece que debería ser algo fácil de hacer, pero no puedo resolverlo.

Actualmente, estoy comprobando los parámetros pasados ??al procedimiento almacenado y estoy 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.

¿Fue útil?

Solución

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

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

Si solo desea notificar al usuario, puede colocar un cuadro de texto oculto con el formato adecuado (fuente grande roja) y enviar un mensaje sobre el intervalo de parámetros de fecha incorrecta. En conjunto de expresiones ocultas

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

Además, puede combinar ambas acciones con un 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 la expresión del valor del parámetro:

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

En la propiedad Value del cuadro de texto tbDateParameterMessage:

= Code.DateMessage

Y en expresión de propiedad oculta:

= String.IsNullOrEmpty(Code.DateMessage)

EDIT Pero si desea detener la ejecución del informe, use este 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

Se tomó de foro SQLServerCentral .

Otros consejos

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 pueden ser difíciles de trabajar cuando se implementan. Aquí hay un par de enlaces que explican los problemas:

From MSDN

De SQLDev

Mi solución fue una implementación MUY simplista en la que se detuvo el informe, pero simplemente muestra un error de informe con el mensaje que se muestra al usuario desde el visor de informes.

  1. Crear un nuevo parámetro de texto / cadena (lo llamé CheckDateRange)
  2. Permitir valores en blanco y hacer que esté oculto
  3. Valores disponibles = ninguno
  4. Avanzado = Usar valores predeterminados
  5. Valores predeterminados = 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 los nombres de mis parámetros para las fechas son BeginDate y EndDate
  6. Finalmente, para el código de informe, ingrese 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 logra lo que necesitas.

¡Buena suerte!

Utilicé la idea del cuadro de texto oculto porque era mejor que dejar que el informe fallara. 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ó. Utilicé 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.

>     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 realizado cambios, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top