SSRS Visual Basic代码仅适用于Reporting Services

问题描述 投票:0回答:1

我做了一个解析器,使用Visual Basic代码对文本中的数字进行四舍五入。但是数字四舍五入仅在SSRS中有效,下载时无效(请参见平均xxx

enter image description here

enter image description here

这是我的VB代码:

Public Function RoundAllNumbers(inputText As String) As String
    Dim result = inputText
    Dim patterns = {New PatternType With {.Pattern = "Current Usage (-?\d+\.\d+) is negative", .Template = "Current Usage {0} is negative", .Precision = 2},
                    New PatternType With {.Pattern = "Current Usage, (-?\d+\.\d+) KWH", .Template = "Current Usage, {0} KWH", .Precision = 2},
                    New PatternType With {.Pattern = "Budget of (-?\d+\.\d+) KWH", .Template = "Budget of {0} KWH", .Precision = 2},
                    New PatternType With {.Pattern = "usage of (-?\d+\.\d+)", .Template = "usage of {0}", .Precision = 2},
                    New PatternType With {.Pattern = "average of (-?\d+\.\d+)", .Template = "average of {0}", .Precision = 0},
                    New PatternType With {.Pattern = "Current demand (-?\d+\.\d+)", .Template = "Current demand {0}", .Precision = 0},
                    New PatternType With {.Pattern = "demand of (-?\d+\.\d+)", .Template = "demand of {0}", .Precision = 0},
                    New PatternType With {.Pattern = "usage amount of (-?\d+\.\d+)", .Template = "usage amount of {0}", .Precision = 2}}

    Dim formulaPattern = New PatternType With {.Pattern = "Usage \/ \(Demand \* Service hours\) \* (-?\d+\.?\d*) = (-?\d+\.?\d*) kWh \/ \((-?\d+\.?\d*) kW \* (-?\d+) Hours\)", .Template = "Usage / (Demand * Service hours) * {0} = {1} kWh / ({2} kW * {3} Hours)"}
    Dim stdDeviation = New PatternType With {.Pattern = "standard deviation(\s-?\d\s\*)?\s(-?\d+\.\d+)", .Template = "standard deviation {0}{1}", .Precision = 0}

    For Each pattern As PatternType In patterns
        result = ProcessPattern(result, pattern)
    Next

    result = ProcessFormulaPattern(result, formulaPattern)
    Return ProcessstdDeviationPattern(result, stdDeviation)
End Function

Private Function ProcessstdDeviationPattern(inputText As String, pattern As PatternType) As String
    Dim r = New System.Text.RegularExpressions.Regex(pattern.Pattern)
    Dim match = r.Match(inputText)
    Dim inputToRoundedDict = New System.Collections.Generic.Dictionary(Of String, String)()

    While match.Success
        Dim inputSnippet = match.Groups(0).ToString()
        inputSnippet = System.Text.RegularExpressions.Regex.Replace(inputSnippet, "\*", "\*")

        If Not inputToRoundedDict.ContainsKey(inputSnippet) Then
            Dim parsedDouble = Double.Parse(match.Groups(2).ToString())
            Dim roundedDouble = Math.Round(parsedDouble, pattern.Precision)
            Dim roundedSnippet = String.Format(pattern.Template, {match.Groups(1).ToString(), roundedDouble})
            inputToRoundedDict.Add(inputSnippet, roundedSnippet)
        End If

        match = match.NextMatch()
    End While

    Dim result As String = inputText

    For Each kvp As System.Collections.Generic.KeyValuePair(Of String, String) In inputToRoundedDict
        result = System.Text.RegularExpressions.Regex.Replace(result, kvp.Key, kvp.Value)
    Next

    Return result

End Function

Private Function ProcessFormulaPattern(inputText As String, pattern As PatternType) As String
    Dim r = New System.Text.RegularExpressions.Regex(pattern.Pattern)
    Dim match = r.Match(inputText)
    Dim inputToRoundedDict = New System.Collections.Generic.Dictionary(Of String, String)()

    While match.Success
        Dim inputSnippet = match.Groups(0).ToString()
        inputSnippet = System.Text.RegularExpressions.Regex.Replace(inputSnippet, "\*", "\*")
        inputSnippet = System.Text.RegularExpressions.Regex.Replace(inputSnippet, "\(", "\(")
        inputSnippet = System.Text.RegularExpressions.Regex.Replace(inputSnippet, "\)", "\)")
        inputSnippet = System.Text.RegularExpressions.Regex.Replace(inputSnippet, "\/", "\/")

        If Not inputToRoundedDict.ContainsKey(inputSnippet) Then
            Dim parsedUsage = Double.Parse(match.Groups(2).ToString())
            Dim parsedDemand = Double.Parse(match.Groups(3).ToString())
            Dim roundedUsage = Math.Round(parsedUsage, 2)
            Dim roundedDemand = Math.Round(parsedDemand, 0)
            Dim roundedSnippet = String.Format(pattern.Template, {match.Groups(1).ToString(), roundedUsage, roundedDemand, match.Groups(4).ToString()})

            inputToRoundedDict.Add(inputSnippet, roundedSnippet)
        End If

        match = match.NextMatch()
    End While

    Dim result As String = inputText

    For Each kvp As System.Collections.Generic.KeyValuePair(Of String, String) In inputToRoundedDict
        result = System.Text.RegularExpressions.Regex.Replace(result, kvp.Key, kvp.Value)
    Next

    Return result

End Function

Class PatternType
    Public Pattern As String
    Public Template As String
    Public Precision As Integer
End Class

Private Function ProcessPattern(inputText As String, pattern As PatternType) As String
    Dim r = New System.Text.RegularExpressions.Regex(pattern.Pattern)
    Dim match = r.Match(inputText)
    Dim inputToRoundedDict = New System.Collections.Generic.Dictionary(Of String, String)()

    While match.Success
        Dim inputSnippet = match.Groups(0).ToString()

        If Not inputToRoundedDict.ContainsKey(inputSnippet) Then
            Dim parsedDouble = Double.Parse(match.Groups(1).ToString())
            Dim roundedDouble = Math.Round(parsedDouble, pattern.Precision)
            Dim roundedSnippet = String.Format(pattern.Template, roundedDouble)
            inputToRoundedDict.Add(inputSnippet, roundedSnippet)
        End If

        match = match.NextMatch()
    End While

    Dim result As String = inputText

    For Each kvp As System.Collections.Generic.KeyValuePair(Of String, String) In inputToRoundedDict
        result = System.Text.RegularExpressions.Regex.Replace(result, kvp.Key, kvp.Value)
    Next

    Return result

End Function

也许发生问题是因为我在代码中使用了类。尽管我没有在Internet上的SSRS中发现VB的任何限制

仅当在SSRS上查看报告时,代码才能唤醒的原因是什么?我之前在此报告中有四舍五入的代码,并且可以正常工作。但是在我更新后,它仅在一个地方起作用。

vb.net reporting-services ssrs-2012
1个回答
0
投票

您的VB代码最有可能使用服务器上未启用的权限。要使此工作有效,您必须深入研究服务器设置并确切确定涉及哪些权限。根据我的经验,这很难实施和维护。

一种替代方法是将此代码转换为数据库中的存储过程。这样,它将在您部署报表时继续起作用。

© www.soinside.com 2019 - 2024. All rights reserved.