VB.net перебирать записи в определенном порядке

#vb.net #loops

#vb.net #циклы

Вопрос:

У меня есть таблица данных, и она заполнена данными в определенном порядке. Как только данные будут в таблице, мне нужно выполнить некоторые вычисления для дополнительных полей, но мне нужно сделать это из нижней строки, если это имеет смысл?

На данный момент я пришел к следующему:

 For Each dr As DataRow In Me.DataSet1.MyDataTable()

        Dim parent_warehouse As String = dr("WH")
        Dim parent_product As String = dr("ProductCode")
        Dim new_material = 0
        Dim new_labour = 0
        Dim new_overhead = 0
        Dim new_outwork = 0
        Dim new_total = 0

        If isassembly(parent_warehouse, parent_product) Then
            If Not IsDBNull(dr("assy")) Then

                For Each dr1 As DataRow In Me.DataSet1.MyDataTable()
                    Dim assy = dr("assy")
                    If assy = parent_warehouse   parent_product Then
                        new_material = new_material   (dr1("material") * (dr1("UsageQuantity") / dr1("Wastage")))
                        new_labour = new_labour   (dr1("labour") * dr1("UsageQuantity"))
                        new_overhead = new_overhead   (dr1("overhead") * dr1("UsageQuantity"))
                        new_outwork = new_outwork   (dr1("outwork") * dr1("UsageQuantity"))
                        new_total = new_material   new_labour   new_overhead   new_outwork
                    End If
                Next
                dr("new_material") = new_material
                dr("new_labour") = new_labour
                dr("new_overhead") = new_overhead
                dr("new_outwork") = new_outwork
                dr("new_total") = new_total
            Else
                GoTo skip
            End If
        Else
            dr("new_material") = dr("material")
            dr("new_labour") = dr("labour")
            dr("new_overhead") = dr("overhead")
            dr("new_outwork") = dr("outwork")
            dr("new_total") = dr("total")
        End If
skip:
    Next
  

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что при циклическом просмотре записей он проходит по ним сверху вниз, где я хочу, чтобы он выполнялся снизу вверх, поскольку предполагается, что затраты будут нарастать от нижних продуктов вверх, чтобы их родительский продукт получал новую стоимость и делал это вплоть до верхнего элемента.

Комментарии:

1. Не используйте для каждого. Используйте цикл For в обратном порядке.

2. Я бы превратил это в переменную Me.DataSet1.MyDataTable() , такую как DataTable или DataRowCollection, а затем выполнял цикл в обратном направлении. Dim dt As DataTable = Me.DataSet1.MyDataTable() и затем For i as Integer = dt.Rows.Count - 1 to 0 Step -1

3. И вы также могли бы подумать о обработке некоторых из этих вычислений в SQL-запросе, чтобы сэкономить время. На данный момент вы просматриваете свой набор результатов два разных раза, и в зависимости от размера этого набора было бы намного эффективнее сделать это в запросе.

4. @JohnPete22 Я извлекаю необработанные данные из SQL и хочу выполнять вычисления в самом приложении, поскольку мы не хотим использовать вычислительные мощности SQL, если это имеет смысл, и вместо этого приложение загружается немного дольше. Кроме того, ваш первый комментарий был решением моей проблемы, цикл For работал в обратном направлении — вы хотите опубликовать его как ответ вместо комментария, чтобы я мог пометить его как ответ? Спасибо,

Ответ №1:

Обратный цикл будет вашим лучшим вариантом. Вы будете использовать цикл For с Step -1

 ' declare a variable for our DataTable
Dim dt As DataTable = Me.DataSet1.MyDataTable()

' we're setting our 'i' variable to the last row (account for 0-index)
' in a typical For Loop, the Step is  1, but we're specifying -1 to go backwards
For i as Integer = dt.Rows.Count - 1 to 0 Step -1
   ' execute logic
   ' something like CDec(dt.Rows(i).Item("DecimalColumn")) to convert decimal type
   ' CInt(), CStr(), CDate() are also very useful, Integer, String, and Date respectively
Next
  

Ответ №2:

Я думаю, вам нужно было бы отсортировать представление таблицы по умолчанию, а затем выполнить цикл просмотра по умолчанию.

 Me.DataSet1.MyDataTable.defaultview.sort = "material", "labor" 'etc.

For Each dr As DataRowView In Me.DataSet1.MyDataTable.defaultview
'...
  

* Отредактировано в соответствии с исправлением @jmcilhinney в комментариях. — Спасибо!

Комментарии:

1. Каждый элемент в DefaultView является DataRowView , а не a DataRow . Я думаю, что идея использования For цикла в обратном направлении все же лучше в данном конкретном случае.

2. Как упоминал @jmcilhinney, я использовал цикл For для обратного цикла, поскольку мне требуется, чтобы DataTable сортировал данные в порядке, отличном от того, который мне требуется для просмотра элементов в этом случае.