Pergunta

Eu tenho um serviço de relatórios (SQL 2008) relatório com dois Data / Hora parâmetros - BeginDate e enddate. Eu preciso restringir enddate com o mesmo mês e ano como BeginDate. Isso parece que deve ser uma coisa fácil de fazer, mas eu não consigo entender.

Atualmente, estou verificando os parâmetros passados ??para o procedimento armazenado e criar um erro se os dois parâmetros de data e hora não estão no mesmo mês e ano. Eu estou procurando uma maneira mais elegante de fazer isso.

Foi útil?

Solução

Você pode verificar o valor EndDate na expressão de parâmetro, e se é incorreto, configurá-lo para StartDate + 1 mês.
Algo como:

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

Se você quiser apenas notificar o usuário, você pode colocar alguns caixa de texto oculto com a formatação apropriada (grande fonte vermelha) e mensagem sobre parâmetros de data gama incorreto. Em conjunto expressão Invisível

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

Além disso, você pode combinar as duas ações com 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

Então, em expressão de valor do parâmetro:

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

Em Valor de propriedade de tbDateParameterMessage caixa de texto:

= Code.DateMessage

E, em expressão de propriedade oculta:

= String.IsNullOrEmpty(Code.DateMessage)

Editar Mas se você quiser parar de relatório em execução, 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

É retirado SQLServerCentral fórum .

Outras dicas

Muitas vezes, há problemas de implantação com o uso da função Msgbox em um relatório do SSRS. Eles trabalham muito bem em nossas máquinas de desenvolvimento, mas pode ser difícil conseguir trabalhar quando realmente implantado. Aqui estão alguns links que explicam os problemas:

De MSDN

De SQLDev

Minha solução foi uma implementação muito simplista, onde o relatório foi parado, mas ele simplesmente mostra um erro de relatório com a mensagem exibida para o usuário do visualizador de relatórios.

  1. Crie um novo parâmetro de texto / string (Chamei-CheckDateRange)
  2. Permitir valores em branco e torná-lo oculto
  3. Valores Disponíveis = none
  4. Avançadas = usar os valores padrão
  5. Os valores padrão = especificar valores - em valor, use o botão de função e usar o seguinte: = CODE.CheckDateParameters (! Parâmetros BeginDate.Value, Parâmetros EndDate.Value) - note que você pode ver as minhas nomes paramter para o verificado datas são BeginDate e EndDate
  6. Finalmente, para o código de relatório digite o seguinte trecho 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
    

fantasia Nada, mas realiza o que você precisa.

Boa sorte!

Eu usei a ideia caixa de texto oculto porque era melhor do que deixar o acidente relatório. O que eu estava esperando para realizar era forçar o usuário a mudar seus parâmetros na frente antes de o relatório executado.

BTW, a sintaxe não funcionou. Eu usei isso em vez disso:

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

Graças ColdIce para a idéia.

>     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 função de mudanças menos que eles fizeram MsgBox () não funcionará no SSRS. Ele não funciona no SSRS 2010. Eu acredito que é uma função do Windows, portanto, não pode ser usado em uma página web renderizada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top