1

我有一個SSRS報告,其中包含有關我公司發佈的發票的信息,例如金額,日期,付款金額等。我在SSRS 2008(不是R2)中使用Visual Studio 2008環境。我的問題與使用表達式編輯器格式化報告有關。目前,如果發票的金額到期(列)超過0.01(未清發票),則發票將被格式化爲銀質。我們還會發放貸項(負數),這些數額幾乎總是以前發票的負數。SSRS表達式編輯器無法識別嵌入代碼功能

因此,具有發放信用的發票仍然會顯示爲白銀,因爲它的金額應該> 0.01。但是,如果這張發票上有信用卡,它實際上並不出衆,應該是白色的。例如,如果發票是$ 100.00,並且($ 100.00)之後存在信用,則應將原始發票的背景顏色切換爲白色。

下面是代碼解釋的地方。我認爲這可以通過報表中的自定義VB代碼實現,但似乎SSRS中的表達式編輯器無法識別我的函數,因爲它顯示「無法識別的標識符」。我搜索了一下,我遇到的大部分主題都表示它會顯示,但實際上無論如何工作。嗯,我敢肯定,它不工作,因爲我把這個作爲我的表達,並得到全白細胞某列:

=IIF(Fields!Amount_Due.Value > 0.01, IIF(Code.HasCredit(Fields!Amount_Due.Value) = True, "Blue", "Silver"), "Red")

的HasCredit功能如下。

Function HasCredit(ByVal currentAmt as Double) As Boolean 

Dim i as Integer 
Dim amt as Double 
Dim amts as System.Collections.ArrayList = New System.Collections.ArrayList() 
Dim negativeAmt as Double 
Dim retValue as Boolean = "False" 

i = 0 

For i = 1 to Report.Parameters!Test.Count() 
    amt = Report.Parameters!Test.Value(i) 
    amts.Add(amt) 
Next 

negativeAmt = currentAmt * -1 

If amts.Contains(negativeAmt) Then 
    retValue = "True" 
End If 

Return retValue 
End Function 

當這兩個部分運行時,我得到此列的所有單元格的白色背景。我在網上閱讀了一些說只有共享函數可以工作的東西,但是我發現了多個其他示例,顯示了沒有共享的函數。當我將它分享時,由於Report.Parameters!Test.Count()行,它給了我:BC30369 Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.。我的想法是使用http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/a7d59224-0ee5-491e-883b-2e5fcb3edeab的Report.Parameters。

所以要重申,我基本上試圖做的是獲得此列中每個單元格的值到一個集合中,並且對於任何兩個金額(其中一個金額具有負等值),請給它一個白色背景而不是銀。

回答

2

在SSRS 2008 R2中,即使您引用了有效的自定義代碼方法,表達式編輯器仍可能會警告標識符無效。這並不總是意味着它是無效的。即使發出警告,我的功能仍然有效。

+0

我有與SSRS 2012相同的問題,我也找不到修復程序。但是,正如保羅所說,即使自定義代碼工作正常,它仍然在表達式編輯器中標記爲紅色。 – Alicia 2017-09-22 08:44:12

0

經過多一點研究,我想出瞭如何解決這個問題。我基本上不得不添加一個帶有= Join()函數的文本框,以便列中的所有值都放在這個文本框中;然後引用自定義代碼中的文本框,並在表達式編輯器中使用布爾值。下面的詳細說明。

1)將多值參數添加到報告(右鍵單擊參數,添加參數)。將其命名,選擇允許多個值,爲參數可見性選擇隱藏。對於可用值選項卡,選擇從查詢中獲取值。指向您的數據集,並將「值」字段設置爲您希望參數檢查的列。對我而言,這是我的金額到期專欄。標籤字段無關緊要,可以留空。在默認值選項卡中,執行相同操作,確保將值字段設置爲與以前相同的列。在高級下,選擇從不刷新。

2)在您的報告上創建一個新的文本框。可能想要命名它,例如txtColumnValues。編輯表達式並將其放入:=Join(Parameters!YourParameter.Value, ",")這將從您在參數中指定的列中獲取所有字段值,每個字段值都用逗號分隔。

3)編輯您的報告的自定義代碼並使VB函數(如布爾)來檢查文本框。例如這裏是我的代碼。

Public Function HasCredit(Amt as Double, ri as ReportItems) as Boolean 

Dim retValue as Boolean = False 

If Amt > 0.00 AndAlso ri!txtAmounts.Value.Contains(Amt*-1) Then 
    retValue = True 
End If 

Return retValue 
End Function 

4)最後去爲你想改變你田間的表達式編輯器。在我的例子,我想改變背景顏色,如果當前場中的其他領域(我的文本框)的人有一個負相等的,所以我的代碼是這樣的:

=IIF(Fields!Balance.Value > 0.01 AND Code.HasCredit(Fields!Balance.Value, ReportItems) = False, "Silver", "White")

我不得不採取單獨從3或4頁的信息,把它們放在一起,並希望他們工作......大約一個星期後他們做了......我想這都是關於持久性。如果您需要任何進一步的幫助,請讓我知道。