2011-12-30 46 views
2

我有一個程序下面,似乎並沒有做我想做的事情。一般來說,僞代碼是:輸入英里數(miles.text),點擊按鈕,檢查:是否輸入的里程等於或小於數據庫里程半徑(​​milestotextbox)?如果是這樣,則獲取與該半徑相對應的滿載率(truckloadratetext)並將其顯示在稱爲「rate」(rate.text)的文本框中,如果不是,則繼續查看,直到EOF。我已經展示了下面的代碼。它讓我輸入里程數,但不會檢查並顯示結果。做直到EOF循環與記錄在VB 2010

該表中的數據是這樣的:

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 
+3

「EOF」在哪裏設置? – 2011-12-30 20:20:24

+2

更重要的問題......爲什麼你循環表而不是使用SQL? – nycdan 2011-12-30 20:41:40

+0

@ nycdan:試圖使用SQL查詢生成器,但它不會執行此操作,因爲我需要使用搜索找到的編號進行進一步計算。我想我需要用SQL練習。試圖學習更多的VB。 – Shawn 2011-12-31 02:24:43

回答

0

對不起,在這裏回答這個問題的延遲,我想感謝所有回答的人,尤其是Tim。

總之,當用戶想要搜索數據集並將用戶輸入的值與某種索引(在我的情況下,如果輸入的里程小於或等於某個邊界值)進行比較並獲取(!謝謝添)對應的記錄滿足這個標準,即作品中的解決方案是:

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的條件。

我原來的想法是使用搜索,直到EOF和這種方法效果更好。

再次感謝我一直對爲其他用戶總結這一點延誤表示歉意。

1

我既不知道你在哪裏設置變量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 follwoing返回大於/等於比@MileAge -parameter最近TRUCKLOADRATE

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

向DataAdapapter添加一個查詢,該查詢返回單個值並具有有意義的名稱,如getTruckloadRateByMileAge。然後就是這麼簡單:

Dim loadRate = DirectCast(daTest.getTruckloadRateByMileAge(mileAge), Decimal) 
+0

@Kyralessa:當你運行程序並輸入里程時,(a)點擊按鈕不會在rate.text文本框中產生答案,並且(b)程序剛掛斷。 – Shawn 2011-12-31 02:19:39

+0

@ John Saunders:我的代碼顯示了在按鈕單擊事件之後直到EOF之前的Do ...這是我第一次嘗試它,因爲我無法構建一個我想要的SQL查詢。 :/ – Shawn 2011-12-31 02:22:20

+0

謝謝......第一個是最接近我嘗試做的事情的味道,關於EOF的事情,我看到了許多DO LOOP示例,告訴人們循環到文件結尾,所以我認爲這是做到這一點的方法。我會嘗試這種方法,並希望對所有回答的人表示感謝。我正在學習有關VB 2010的更多信息,它肯定與我在20年前在大學時所瞭解的結構化編程不同。 ;) – Shawn 2011-12-31 02:29:44