2014-12-11 9 views
5

Quando si distribuisce un report SSRS genera il seguente errore:C'è un errore sulla linea 58 del codice personalizzato: [BC30201] Espressione previsto

There is an error on line 58 of custom code: [BC30201] Expression expected

Tuttavia, la relazione funziona bene su modalità di anteprima e visualizza il campo correttamente.

Il segmento di codice personalizzato qui è anche scritto e testato in studio visivo.

Ecco il codice personalizzato:

If (evaluationDate.Day = 31) Then '* affected line 
    returnValue.Append(String.Format("{0}{1:dd.MM}{2}", _ 
     If(index = 2, " und ", String.Empty), _ 
     New DateTime(evaluationDate.Year, evaluationDate.Month, lastDayOfMonthDictionary(evaluationDate.Month)), _ 
     If(index = 2, ".", String.Empty))) 

End If 

Come si può vedere, il problema è da un blocco IF..THEN. evaluationDate è di tipo DateTime e il valore è uguale all'argomento DateTime startdate o sei mesi prima di startDate - che è un argomento datetime nella firma della funzione.

Non riesco a vedere cosa c'è di sbagliato in questo e ho bisogno di sapere cosa posso fare per risolvere questo problema. Qualche idea?

+0

6 mesi avanti è giugno (che ha 30 giorni), quindi istintivamente mi fisserei su quel numero magico 31 giorni lì per iniziare il debug con. Non sono sicuro se sia questa la causa principale. –

+0

Rimuovere '()' attorno all'istruzione? 'Se evaluationDate.Day = 31 Then' –

+0

@VisualVincent l'ho provato. L'errore è diventato 'definizione non valida'. @NathanTuggy, l'ho scritto e testato in Visual Studio, quando la data era il 31 dicembre in "inizio" e sono stati aggiunti 6 mesi, la data di valutazione era il 30 giugno - che non causava problemi. come ho detto, questo errore si verifica solo durante la distribuzione. in Anteprima, funziona correttamente – Eon

risposta

6

La conclusione: SSRS ha un modo malvagio di gestire i ternari, anche se è completamente in attesa del codice VB nel segmento di codice personalizzato.

Questo errore che avevo ricevuto era errato e indicava anche la linea sbagliata - era la linea proprio sotto quella contrassegnata nella domanda.

Notate l'utilizzo di ternari: If(index = 2, " und ", String.Empty) - SSRS tenta di eseguire il Se-ternario (come si farebbe dichiararla in VB.NET) come un blocco If..Then - e perché nessuno Then viene trovato, e ci sono più argomenti da virgole separati, questo confonde SSRS e quindi esso stampa Expression Expected

il modo per risolvere questo problema è il modo tradizionale SSRS Expressional

'Instead of this: 
If(index = 2, " und ", String.Empty) 

'Use This: 
IIf(index = 2, " und ", String.Empty) 

questo dovrebbe comunque consentire di visualizzare in anteprima il codice (anche il normale If si permesso di anteprima, ma si rompe dur ing deploy)

+0

Upvoted. Sono seccato perché sono appena stato morso da questo: non posso usare l'operatore IIF perché ho bisogno di cortocircuitare, ma non ho scelta perché l'SSRS fa schifo. Sospiro. Immagino che non puoi vincerli tutti, eh? –

+1

@ jedd.ahyoung Il codice personalizzato di un report può gestire semplicemente VB.NET vecchio, quindi perché non scrivere un metodo di supporto invece di utilizzare istruzioni if ​​vecchia scuola (che supporta il cortocircuito) e fare riferimento a tali helper nel proprio toolbox espressioni con ' ... &! Code.methodName (argomento) & ... ' – Eon

+0

Grazie ragazzi, questo mi ha fatto risparmiare tempo. – Saxophonist

Problemi correlati