Делай до EOF цикл с записями в VB 2010 - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть программа ниже, которая, кажется, не делает то, что я хочу, чтобы она делала. В общем случае псевдокод выглядит следующим образом: введите количество миль (miles.text), нажмите кнопку и проверьте: равен ли введенный пробег или меньше, чем радиус пробега (milestotextbox) в базе данных? Если это так, возьмите скорость загрузки грузовика, которая соответствует этому радиусу (truckloadratetext), и отобразите ее в текстовом поле с именем «rate» (rate.text), а если нет, продолжайте поиск до EOF. Я показал код ниже. Это позволяет мне ввести пробег, но не проверяет и не отображает результат.

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

ID  MILESTO TRUCKLOADRATE
1    50        200
2    100       300
3    200       700
4    300       800

Так что, если кто-то вводит пробег, например, 10, я хочу, чтобы он брал стоимость погрузки в 200 долларов. Если кто-то введет 250, скорость будет 800. Я сейчас не слишком зациклен на том, что происходит, если пробег выходит за пределы допустимого диапазона. Просто пытаюсь понять, почему механика чего-то подобного не работает. Я впервые использую записи с командой LOOP, поэтому я стараюсь, чтобы это было просто с моей программой.

Что я могу делать не так? Заранее спасибо и надеюсь, что всем удачного Нового Года!

Public Class Form1

    Private Property EOF As Boolean

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the '_test_2DataSet.test' table. You can move, or remove it, as needed.
        Me.TestTableAdapter.Fill(Me._test_2DataSet.test)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Do Until EOF()
            If Val(MilestoTextBox.Text) <= Val(Miles.Text) Then
                rate.Text = TruckloadTextBox.Text
            End If
        Loop
    End Sub
End Class

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

Я не знаю, где вы устанавливаете переменную EOF, и я не понимаю ее назначение. Взгляните на следующий пример, который показывает, как зациклить все строки таблицы данных (ORDER BY MILESTO ASC), чтобы найти ближайшее значение, превышающее заданное значение:

Dim mileAge = Int32.Parse(Miles.Text) 
Dim rate = 0
For Each row In _test_2DataSet.test
    If mileAge <= row.MILESTO Then
        rate = row.TRUCKLOADRATE
        Exit For
    End If
Next
If rate <> 0 Then
    TxtRate.Text = rate.ToString
End If

Если вы не можете заказать по MILESTO изначально или просто хотите увидеть другой подход, который не является запросом к базе данных, попробуйте этот подход LINQ-To-DataSet :

rate = (From r In _test_2DataSet.test Order By r.MILESTO
        Where mileAge <= r.MILESTO
        Select r.TRUCKLOADRATE).FirstOrDefault

Если вы хотите запросить базу данных, следующий SQL возвращает ближайший TRUCKLOADRATE, который больше / равен параметру @MileAge:

SELECT     TOP (1) TRUCKLOADRATE
FROM         Test
WHERE     (MILESTO >= @MileAge)
ORDER BY MILESTO - @MileAge

Добавьте запрос в ваш DataAdapapter, который возвращает одно значение и имеет значимое имя, например getTruckloadRateByMileAge. Тогда это так просто:

Dim loadRate = DirectCast(daTest.getTruckloadRateByMileAge(mileAge), Decimal)
0 голосов
/ 05 января 2012

Извините за задержку с ответом на вопрос здесь, и я хочу поблагодарить всех, кто ответил, особенно Тим.

Таким образом, когда пользователь хочет выполнить поиск в наборе данных и сравнить введенное пользователем значение с каким-либо индексом (в моем случае, если введенное расстояние меньше или равно некоторому граничному значению), иполучить соответствующую запись, которая удовлетворяет этим критериям, решение, которое работает (спасибо, Тим!):

Dim mileAge = Int32.Parse(Miles.Text) 
Dim rate = 0
For Each row In _test_2DataSet.test
    If mileAge <= row.MILESTO Then
        rate = row.TRUCKLOADRATE
        Exit For
    End If
Next
If rate <> 0 Then
    TxtRate.Text = rate.ToString
End If

В этом примере пробег преобразуется в значение, которое можно использовать для сравнения со столбцом внабор данных под названием MILESTO, который является радиусом в милю, который соответствует цене для перевозки товаров, называемой TRUCKLOADRATE.Программа выполняет итерацию по каждой строке в наборе данных, пока не будет выполнено условие, что пробег <= row.MILESTO.</p>

Моя первоначальная мысль заключалась в использовании поиска до EOF, и этот метод работает лучше.

Спасибо всем снова и снова за мои извинения за задержку в подведении итогов для других пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...