DataTable и сортировка в два ряда - PullRequest
1 голос
/ 27 апреля 2020

Итак, босс приходит ко мне и говорит: «Я хочу, чтобы значение каждого агента и проекта было в одной строке, а среднее значение всех остальных операторов - в следующей строке, чтобы я мог легко видеть, выше ли он или ниже среднего. "

таблица выглядит так:

dt.Columns.Add("AGENT", GetType(String))
        dt.Columns.Add("PROJECT", GetType(String))
        dt.Columns.Add("Sales", GetType(Integer))
        dt.Columns.Add("Declines", GetType(Integer))
        dt.Columns.Add("Margin", GetType(Integer))

Хорошо, все хорошо. Одна строка в таблице данных - это агент и проект. Следующая строка является средним значением всех других агентов и проекта следующим образом:

строка 1: Джон Смит, ProjectName, (другие значения столбца)

строка 2: Джон Смит, ProjectName & " СРЕДНЕГО / ВСЕГО ", (другие значения столбца)

Имя проекта удалено в отчете SSRS в строке СРЕДНЕЕ / ВСЕГО из-за ограниченного пространства на листе бумаги, на котором он напечатан.

Я делаю сортировку с помощью нашего стандартного способа сортировки данных.

Dim dataView As New DataView(dt1)
        dataView.Sort = "AGENT,PROJECT"
        dt1 = dataView.ToTable
        Return dt1

Но теперь у босса появилось новое требование. Он хочет иметь возможность сортировки по другим столбцам в таблице, но хранить две строки (агент / проект и агент / проект AVERAGE / TOTAL) вместе. Поэтому, по сути, он хочет иметь возможность сортировать не по одной строке, а по двум строкам вместе, но значением сортировки может быть «AGENT, Margin». Очевидно, чтобы сохранить две строки вместе, я должен найти способ сортировки значения Project тоже.

Так что я озадачен и был бы признателен за любые ваши мысли. C# идеи также приветствуются. LINQ в порядке, но он должен стать датированным.

1 Ответ

1 голос
/ 28 апреля 2020

так что вы создаете две таблицы. Один со значениями строки, один со средними значениями. L oop через значения строки, а затем еще раз l oop внутри этого l oop, чтобы соответствовать именам проектов. Это взломать, но это сработало.

If SortValue = "Default" Then
            dt1.Merge(dt)
            Dim dataView As New DataView(dt1)
            dataView.Sort = "AGENT,PROJECT"
            dt1 = dataView.ToTable
        Else
            Dim dataView As New DataView(dt)
            dataView.Sort = SortValue
            dt = dataView.ToTable
            Dim dtCopy As New DataTable
            dtCopy = dt.Clone

            For Each row As DataRow In dt.Rows
                dtCopy.ImportRow(row)
                For i = 0 To dt1.Rows.Count - 1
                    If dt1.Rows(i).Item("PROJECT").ToString.Replace(" AVERAGE/TOTAL", "") = row.Item("PROJECT") And dt1.Rows(i).Item("AGENT") = row.Item("AGENT") Then
                        dtCopy.Rows.Add(dt1.Rows(i).Item("AGENT"), dt1.Rows(i).Item("PROJECT"), dt1.Rows(i).Item("SALES"), dt1.Rows(i).Item("Declines"), dt1.Rows(i).Item("Margin"))
                    End If
                Next
            Next
            dt1 = dtCopy
        End If
...