VB.NET/Access - проверьте, меньше ли первое значение каждой строки, чем указанное c, а затем добавьте текст в каждую соответствующую строку в таблице данных. - PullRequest
0 голосов
/ 07 марта 2020

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

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

  • Желтый пояс 12 классов
  • Оранжевый пояс 48 классов
  • Зеленый пояс 64 класса
  • Фиолетовый Пояс 144 Классов
  • Иккю 96 Классов
  • Никю 96 Классов
  • Санкю 96 Классов
  • Шодан 192 Классов

Datagridview's

Вот код ....

 ' RUN QUERY
    Access.ExecQuery("SELECT COUNT(StudentID) as TotalClasses, FirstName, LastName FROM Attend GROUP BY FirstName, LastName")

    ' REPORT & ABORT ON ERRORS
    If NoErrors(True) = False Then End



    Access.DBDT.Columns.Add("PromotionStatus", GetType(System.String))

    For Each row As DataRow In Access.DBDT.Rows
        For i = 0 To Access.DBDT.Rows.Count - 1
            If (row.Field(Of Integer)(0)) > 12 Then

                Access.DBDT.Rows(i)("PromotionStatus") = "Eligible for Yellow Belt"

            End If
        Next



    Next


    ' FILL DATAGRID
    dgvTestDue.DataSource = Access.DBDT

@ JayV Я попробовал код, который вы разместили, и он отлично работал для тех, у кого более 12 классов. Затем я попытался использовать это для обработки остального времени в соответствии с требованиями класса / класса, и он проигнорировал все после первого If и не обработал ни одного из ElseIf.

Вот то, что я пробовал, но не не работает ....

 If (row.Field(Of Integer)("TotalClasses")) > 12 Then
            row("PromotionStatus") = "Eligible for Yellow Belt"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 48 Then
            row("PromotionStatus") = "Eligible for Yellow Belt"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 108 Then
            row("PromotionStatus") = "Eligible for Green Belt"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 252 Then
            row("PromotionStatus") = "Eligible for Purple Belt"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 348 Then
            row("PromotionStatus") = "Eligible for Ikkyu"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 444 Then
            row("PromotionStatus") = "Eligible for Nikyu"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 540 Then
            row("PromotionStatus") = "Eligible for Sankyu"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 636 Then
            row("PromotionStatus") = "Eligible for Shodan"
        ElseIf (row.Field(Of Integer)("TotalClasses")) > 780 Then
            row("PromotionStatus") = "Eligible for Nidan"
        End If

и это был единственный способ заставить его работать. Есть ли более простой / более эффективный способ и почему ElseIf не сработал?

  If (row.Field(Of Integer)("TotalClasses")) > 12 Then
            row("PromotionStatus") = "Eligible for Yellow Belt"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 48 Then
            row("PromotionStatus") = "Eligible for Orange Belt"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 108 Then
            row("PromotionStatus") = "Eligible for Green Belt"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 252 Then
            row("PromotionStatus") = "Eligible for Purple Belt"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 348 Then
            row("PromotionStatus") = "Eligible for Ikkyu"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 444 Then
            row("PromotionStatus") = "Eligible for Nikyu"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 540 Then
            row("PromotionStatus") = "Eligible for Sankyu"
        End If

        If (row.Field(Of Integer)("TotalClasses")) > 636 Then
            row("PromotionStatus") = "Eligible for Shodan"
        End If

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

1 Ответ

0 голосов
/ 07 марта 2020

Вы дважды просматриваете список студентов. Один раз с

For Each row As DataRow In Access.DBDT.Rows

и второй раз с

For i = 0 To Access.DBDT.Rows.Count - 1

, и окончательное назначение Право будет основано на последнем ученике в списке (Макс Харрис).

Использование этого должно решить проблему

For Each row As DataRow In Access.DBDT.Rows
    If (row.Field(Of Integer)("TotalClasses")) > 12 Then
        row("PromotionStatus") = "Eligible for Yellow Belt"
    End If
Next

Как правило, лучше использовать имена столбцов, а не числа, так как порядок может измениться.

РЕДАКТИРОВАТЬ после дополнительного:

При проверке групп чисел необходимо проверять верхнюю и нижнюю границы в каждом операторе If (или ElseIf).

Пример:

Dim totalClasses As Integer = row.Field(Of Integer)("TotalClasses")
If totalClasses > 12 AndAlso totalClasses <= 48 Then
    row("PromotionStatus") = "Eligible for Yellow Belt"
ElseIf totalClasses > 48 AndAlso totalClasses <= 108 Then
    row("PromotionStatus") = "Eligible for Orange Belt"
ElseIf totalClasses > 108 AndAlso totalClasses <= 252 Then
    row("PromotionStatus") = "Eligible for Green Belt"
ElseIf totalClasses > 252 AndAlso totalClasses <= 348 Then
    row("PromotionStatus") = "Eligible for Purple Belt"
ElseIf totalClasses > 348 AndAlso totalClasses <= 444 Then
    row("PromotionStatus") = "Eligible for Ikkyu"
ElseIf totalClasses > 444 AndAlso totalClasses <= 540 Then
    row("PromotionStatus") = "Eligible for Nikyu"
ElseIf totalClasses > 540 AndAlso totalClasses <= 636 Then
    row("PromotionStatus") = "Eligible for Sankyu"
ElseIf totalClasses > 636 Then
    row("PromotionStatus") = "Eligible for Shodan"
End If

Что было В вашем коде произошло то, что первая проверка If прошла, поэтому остальные случаи не проверялись. Это ошибка Logi c в вашем коде, а не ошибка синтаксиса.

...