Olaoluwa Ответов: 1

Как мне создать структуру заработной платы в приведенной ниже задаче пожалуйста


У меня есть следующие данные в моей таблице sql;

rank   grade_level   maximum_step   salary_base   salary_increment
A          15             1             5000.00          0.00
B          14             3             4500.00          205.00
C          13             7             3500.00          185.00


Я хочу написать vb.net код для чтения каждой строки и возвращает результат ниже:

rank    grade_level     step_1    step_2    step_3 ........ step_n
A          15           5000.00
B          14           4500.00   4705.00   4910.00 
C          13           3500.00   3685.00   3870.00   4055.00 .......

, где n=наибольшее значение в поле maximum_step, равное 7 в приведенном выше примере

Что я уже пробовал:

Private Sub btnRun_Click(sender As Object, e As EventArgs) Handles btnRun.Click
        Dim str As String
        Dim i As Integer
        str = "select rankCode, gl,maxStep,sBase,sInc,rBase,rInc from ifmis_rank "
        Dim com As New SqlCommand(str, cn)
        Dim rd As SqlDataReader
        lstVAudit.Items.Clear()
        cn.Open()
        With com
            rd = .ExecuteReader(CommandBehavior.CloseConnection)
            With rd
                While .Read
                    lst = New ListViewItem
lst.Text = CType(.Item(0), String)
                    lst.SubItems.Add(CType(.Item(1), String))
for i = 1 to ctype(.item(2),integer)
 lst.SubItems.Add(CType(.Item(3), Decimal))
next 1        
                    lstVAudit.Items.Add(lst)
                End While
            End With
        End With
    End Sub

OriginalGriff

И что же?
Что он делает такого, чего вы не ожидали, или не делает того, что вы сделали?

1 Ответов

Рейтинг:
12

Maciej Los

Если я правильно вас раскрою, вам придется рассчитать salary_base путем добавления salary_increment умножить на n пока n достигает maximum_step.

Предполагая, что ваши данные хранятся в DataTable объект...

'your code here till
rd = .ExecuteReader(CommandBehavior.CloseConnection)
'then
Dim dt As DataTable = New DataTable()
dt.Load(rd)

'get max of maximum_step
Dim maxstep = dt.AsEnumerable().Max(Function(x) x.Field(Of Integer)("maximum_step")) 

'create final DataTable
Dim finaldt As DataTable = New DataTable()
finaldt.Columns.Add(New DataColumn("rank", Type.GetType("System.String")))
finaldt.Columns.Add(New DataColumn("grade_level", Type.GetType("System.Int32")))
'add "step" columns
For i As Integer = 1 To maxstep
	finaldt.Columns.Add(New DataColumn("step_" & i, Type.GetType("System.Int32")))
Next

For Each r As DataRow In dt.Rows
	Dim destRow As DataRow = finaldt.NewRow()
	maxstep = r.Field(Of Integer)("maximum_step")
	destRow("rank") = r.Field(Of String)("rank")
	destRow("grade_level") = r.Field(Of Integer)("grade_level")
	For i As Integer = 1 To maxstep
		destRow("step_" & i) = r.Field(Of Double)("salary_base") + (r.Field(Of Double)("salary_increment") * i)
	Next
	finaldt.Rows.Add(destRow)
Next


Результат (finaldt содержание):
rank grade_level step_1 step_2 step_3 step_4 step_5 step_6 step_7
A    15          5000   null   null   null   null   null   null 
B    14          4705   4910   5115   null   null   null   null 
C    13          3685   3870   4055   4240   4425   4610   4795


Таким же образом вы можете создавать Элементы listviewitem[^].

[РЕДАКТИРОВАТЬ]
.NET 2. решение:
'get max  of maximum_step
Dim sortedRows = dt.Select("maximum_step>=0", "maximum_step DESC")
Dim maxstep As Integer = sortedRows.GetValue(0)("maximum_step")

'create final DataTable
Dim finaldt As DataTable = New DataTable()
finaldt.Columns.Add(New DataColumn("rank", Type.GetType("System.String")))
finaldt.Columns.Add(New DataColumn("grade_level", Type.GetType("System.Int32")))
'add "step" columns
For i As Integer = 1 To maxstep
    finaldt.Columns.Add(New DataColumn("step_" & i, Type.GetType("System.Int32")))
Next

For Each r As DataRow In dt.Rows
    Dim destRow As DataRow = finaldt.NewRow()
    maxstep = r("maximum_step")
    destRow("rank") = r("rank")
    destRow("grade_level") = r("grade_level")
    For i As Integer = 1 To maxstep
        destRow("step_" & i) = r("salary_base") + (r("salary_increment") * i)
    Next
    finaldt.Rows.Add(destRow)
Next


Olaoluwa

Спасибо Мацей, к сожалению, мой проект является модификацией существующего проекта, который я когда-то разработал с использованием .NET Framework 2.0, который имеет проблемы с этой строкой кода:

Dim maxstep = dt.Методом asenumerable().Макс(функция(х) х.Поля(целого)("maximum_step"))
подчеркивание AsEnumerable().

Также эта строка кода maxstep = r.Field(Of Integer)("maximum_step") выбрасывает и ошибку, подчеркивающую все экземпляры .Поле.

Могу ли я иметь аналогичное решение, совместимое с .NET Framework 2.0?

Извините, если я прошу слишком многого.

Maciej Los

Есть способ, чтобы использовать LINQ-запросы в пределах .Проектов net 2.0. Видеть:
C# в двух словах - LINQBridge[^]
Архив CodePlex[^]

Maciej Los

См. обновленный ответ. Я добавил решение .NET 2.0 (После части [EDIT]).

Olaoluwa

Большое спасибо, это работает.

Maciej Los

Всегда пожалуйста

Olaoluwa

Здравствуйте, мне нужна ваша помощь, пожалуйста!!!
ранг grade_level step_1 step_2 step_3 step_4 step_5 step_6 step_7
A 15 5000 null null null null null null
B 14 4705 4910 5115 null null null null
C 13 3685 3870 4055 4240 4425 4610 4795
Я хочу написать код, который вычитает 4705 из 5000 и поставит результат вместо 5000. Вычтите 3685 из 4705 и поставьте результат вместо 4705. То же самое и с другими колонками. Если результат отрицательный, он должен вернуть ноль.

То есть вычитаем снизу вверх и ставим результат сверху для всех значений, начиная с шага 1 - n, где n-максимальный шаг.

Мне нужно это решение, чтобы вычислить задолженность по продвижению. Спасибо за всю вашу помощь до сих пор.

Maciej Los

Пожалуйста, напишите еще один вопрос. Я не уверен, что смогу вам помочь.
Там много членов, которые могут вам помочь.

Olaoluwa

Спасибо, брат. Я буду делать именно это.

Olaoluwa

Я просто решаю его из sql, а не с помощью vb.net код;

выберите b.rankcode,b.gl,b.maxStep,b.sBase-a.sBase as sBase,b.sInc-a.как деше деше,б.rBase-а.rBase как rBase,б.РИНЦ-это.РИНЦ в РИНЦ
из таблице table_1 внутренний присоединиться таблице table_1 Б на.гл=б.ГЛ-1 приказ.гл алфавиту

Еще раз спасибо

Maciej Los

Отлично!

Овации,
Мацей