Domanda

Ho un rapporto sui servizi di reporting (SQL 2008) con due parametri Data / Ora: begindate e enddate. Ho bisogno di vincolare enddate allo stesso mese e anno come begindate. Sembra che dovrebbe essere una cosa facile da fare, ma non riesco a capirlo.

Attualmente, sto verificando i parametri passati alla procedura memorizzata e generando un errore se i due parametri datetime non sono nello stesso mese e anno. Sto cercando un modo più elegante per raggiungere questo obiettivo.

È stato utile?

Soluzione

È possibile controllare il valore EndDate nell'espressione dei parametri e, se non è corretto, impostarlo su StartDate + 1 mese.
Qualcosa del tipo:

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

Se vuoi solo avvisare l'utente, puoi inserire una casella di testo nascosta con una formattazione appropriata (carattere grande rosso) e un messaggio sui parametri della data intervallo errato. Nel set di espressioni nascoste

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

Inoltre, puoi combinare entrambe le azioni con un codice personalizzato:

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

Quindi, nell'espressione Valore parametro:

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

Nella proprietà Value della casella di testo tbDateParameterMessage:

= Code.DateMessage

E nell'espressione di proprietà nascosta:

= String.IsNullOrEmpty(Code.DateMessage)

Modifica Ma se vuoi interrompere l'esecuzione dei rapporti, usa questo codice personalizzato:

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

È tratto dal SQLServerCentral forum .

Altri suggerimenti

Molto spesso, ci sono problemi di distribuzione con l'uso della funzione Msgbox in un report SSRS. Funzionano perfettamente con le nostre macchine di sviluppo, ma può essere difficile farlo funzionare se effettivamente implementato. Ecco un paio di link che spiegano i problemi:

Da MSDN

Da SQLDev

La mia soluzione è stata un'implementazione MOLTO semplicistica in cui il report è stato interrotto, ma mostra semplicemente un errore di report con il messaggio visualizzato all'utente dal visualizzatore di report.

  1. Crea un nuovo parametro text / string (l'ho chiamato CheckDateRange)
  2. Consenti valori vuoti e rendilo nascosto
  3. Valori disponibili = nessuno
  4. Avanzate = Usa valori predefiniti
  5. Valori predefiniti = specifica valori - in Valore, utilizza il pulsante funzione e utilizza quanto segue: = CODE.CheckDateParameters (Parameters! BeginDate.Value, Parameters! EndDate.Value) - nota che puoi vedere i miei nomi dei parametri per il segno di spunta le date sono BeginDate e EndDate
  6. Infine, per il codice del rapporto inserisci il seguente frammento di codice:

    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
    

Niente di speciale, ma realizza ciò di cui hai bisogno.

Buona fortuna!

Ho usato l'idea della casella di testo nascosta perché era meglio che lasciare il rapporto in crash. Quello che speravo di realizzare era costringere l'utente a modificare i parametri prima che il rapporto fosse eseguito.

A proposito, la sintassi non ha funzionato. Ho usato questo invece:

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

Grazie coldice per l'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 meno che non abbiano apportato modifiche, la funzione MsgBox () non funzionerà su SSRS. Non funziona su SSRS 2010. Credo che sia una funzione di Windows, quindi non può essere utilizzata su una pagina web renderizzata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top