【问题标题】:SSRS distinct lookupset functionSSRS 不同的查找集函数
【发布时间】:2015-01-18 18:42:51
【问题描述】:

我正在使用Join(Lookupset) 来查找返回序列号的唯一组值。这是我的功能:

Join(LookupSet(Fields!itemId.Value & Fields!UseByDate.Value & Fields!rackId.Value
    , Fields!itemId.Value & Fields!UseByDate.Value & Fields!rackId.Value
    , Fields!CustomerSeqNo.Value
    , "PickingList"), ",")

问题在于某些商品有多个交易。我想删除重复项。

我找到了一个博客 http://blogs.msdn.com/b/bobmeyers/archive/2012/06/18/creating-short-lists-using-the-lookupset-function.aspx,但无法让 SSRS 报表生成器引用 Linq 程序集。我的问题是

我怎样才能只显示唯一值?

【问题讨论】:

    标签: reporting-services ssrs-2008-r2 ssrs-grouping


    【解决方案1】:

    如果你和我一样,你也希望元素按频率排序(降序)。

    为此,我创建了以下 VisualBasic 代码

    Public Shared Function RemoveDuplicates(dataset As Object()) As String()
        Dim unique As New System.Collections.Generic.List(Of String)
        Dim frequency As New System.Collections.Generic.List(Of Integer)
        For i As Integer = 0 To dataset.Length - 1
            Dim index As Integer = -1
            For j As Integer = 0 To unique.Count - 1
                If dataset(i).Equals(unique(j)) Then
                    index = j
                    Exit For
                End If
            Next
            If index < 0 Then
              unique.Add(dataset(i))
              frequency.Add(1)
            Else
                frequency(index) += 1
            End If
        Next
        Dim uniqueArray As [String]() = unique.ToArray()
        Array.Sort(frequency.ToArray(), uniqueArray)
        Array.Reverse(uniqueArray)
        return uniqueArray
    End Function
    

    这是基于其他人的答案,其中 SSRS 表达式如下

    Join(Code.RemoveDuplicates(LookupSet(...)),",")

    注意:我在大约一个小时内学会了 VisualBasic 来解决这个问题,所以我的算法可能不是最有效的。

    【讨论】:

      【解决方案2】:

      我喜欢 pwilcox 的想法,所以我写了这个过滤掉 null 和空白值的想法。

      Public Function JoinDistinct(arr As Object(), delimiter As String) As String
      
          System.Array.Sort(arr)
          Dim result As String = String.Empty
          Dim lastvalue As String = String.Empty
          For i As Integer = 0 To arr.Length - 1
              If Not arr(i) Is Nothing And arr(i) <> lastvalue And arr(i) <> String.Empty Then
                  If result = String.Empty Then
                      result = arr(i)
                  Else
                      result = result + delimiter + arr(i)
                  End If
              End If
              lastvalue = arr(i)
          Next
          Return result
      End Function
      

      用法:

      =Code.JoinDistinct(LookupSet(...), ",")
      

      【讨论】:

        【解决方案3】:

        我同意@user3697615 最好的报告代码。但是,我更喜欢将它直接构建成一个字符串:

        public shared function JoinDistinct(
          dups as object(),
          delimiter as string
        ) as string
        
          dim result as string = ""
          system.array.sort(dups)
        
          for i as integer = 0 to dups.length - 1
            if i <> 0 then result += delimiter
            if i = 0 orElse dups(i) <> dups(i-1) then result += dups(i)
          next i
        
          return result
        
        end function
        

        这样,我们在调用中消除了一个嵌套函数:

        =Code.JoinDistinct(LookupSet(...), ",")
        

        【讨论】:

          【解决方案4】:

          您不需要 Linq,但您仍然需要自定义代码(在 BIDS 中转到报告 -> 报告属性 -> 代码)

          你可以在这里放一个 RemoveDuplicates 函数,像这样:

          Public Shared Function RemoveDuplicates(m_Array As Object()) As String()
          
              System.Array.Sort(m_Array)
              Dim k As Integer = 0
              For i As Integer = 0 To m_Array.Length - 1
                  If i > 0 AndAlso m_Array(i).Equals(m_Array(i - 1)) Then
                      Continue For
                  End If
                  m_Array(k) = m_Array(i)
                  k += 1
              Next
          
              Dim unique As [String]() = New [String](k - 1) {}
          
              System.Array.Copy(m_Array, 0, unique, 0, k)
          
              Return unique
          
          End Function
          

          在您的加入中使用它:

          Join(Code.RemoveDuplicates(LookupSet(...)),",")
          

          【讨论】:

          • 感谢@user3697615 它在我的情况下工作并解决了一个大问题。
          猜你喜欢
          • 1970-01-01
          • 2016-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多