#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
, а не aDataRow
. Я думаю, что идея использованияFor
цикла в обратном направлении все же лучше в данном конкретном случае.2. Как упоминал @jmcilhinney, я использовал цикл For для обратного цикла, поскольку мне требуется, чтобы DataTable сортировал данные в порядке, отличном от того, который мне требуется для просмотра элементов в этом случае.