【问题标题】:SSRS Visual Basic code works only on Reporting servicesSSRS Visual Basic 代码仅适用于报告服务
【发布时间】:2020-02-26 08:45:15
【问题描述】:

我制作了一个解析器,它使用 Visual Basic 代码对文本中的数字进行舍入。但数字四舍五入仅适用于 SSRS,下载时不起作用(查看 xxx 的平均值

这是我的 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

可能出现问题是因为我在代码中使用了类。虽然我在网上没有发现 SSRS 中的 VB 有任何限制

只有在 SSRS 上查看报告时代码才起作用的原因是什么?我之前在此报告中有四舍五入代码,它有效。但在我更新后,它只能在一个地方工作。

【问题讨论】:

  • 为什么在基础报表查询中将数字四舍五入而不是四舍五入?

标签: vb.net reporting-services ssrs-2012


【解决方案1】:

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

另一种方法是将此代码转换为数据库中的存储过程。这样,当您部署报告时,它将继续工作。

【讨论】:

    【解决方案2】:

    配置中的原因。 ssrs 服务器 url 在 web.config 中配置,当我的代码版本部署到 QA 环境时,web.config 中的 ssrs 服务器链接 设置为 Staging 报告代码未更新的环境

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多