2011-12-30 2 views
2

아래 프로그램을 실행하고 싶지 않습니다. 일반적으로 의사 코드는 다음과 같습니다 : 마일 수 (mile.text)를 입력하고 버튼을 클릭하십시오 : 데이터베이스에 마일리지 반경 (milestotextbox) 이하로 입력 된 마일리지를 확인 하시겠습니까? 그렇다면 해당 반경에 해당하는 트럭 적재 속도 (truckloadratetext)를 잡고 "rate"(rate.text) 텍스트 상자에 표시하고 그렇지 않으면 EOF가 될 때까지 계속 찾으십시오. 아래 코드를 보았습니다. 마일리지를 입력 할 수는 있지만 결과를 확인하고 표시하지는 않습니다.VB 2010의 레코드가있는 EOF 루프가 발생할 때까지 수행

테이블의 데이터는 다음과 같습니다

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

그래서 누군가가 (10)와 같은 주행 거리를 입력하면, 나는 그것이 $ 200 봐서 속도를 먹고 싶어. 누군가 250을 입력하면 요금은 800이됩니다. 마일리지가 범위를 벗어나면 어떻게되는지에 대해 지금 당장 매달 리지 않습니다. 이런 식의 기계가 왜 작동하지 않는지 알아 내려고 노력합니다. LOOP 명령으로 레코드를 사용하는 것이 처음입니다. 따라서 프로그램에서 간단하게 유지하려고합니다.

내가 잘못 할 수 있습니까? 미리 감사 드리며 모든 새해가 되길 바랍니다! 당신이 EOF 변수를 설정하거나 나는 그것의 목적을 이해 할 내가 모르는 어느 쪽도

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'는 어디에 설정되어 있습니까? –

+2

더 중요한 질문 ... 왜 SQL을 사용하는 대신 테이블을 반복하고 있습니까? – nycdan

+0

@ nycdan : SQL 쿼리 빌더를 사용하려고했지만 검색 결과에서 더 많은 계산을해야하기 때문에이 작업을 수행하지 못했습니다. SQL로 연습해야한다고 생각합니다. 더 많은 VB 배우기. – Shawn

답변

0

죄송와 나는 특히, 팀 대답 모두에게 감사드립니다.

요약하면, 사용자가 데이터 세트를 검색하고 사용자 입력 값을 일종의 색인과 비교하려는 경우 (입력 한 주행 거리가 일부 경계 값보다 작거나 같은 경우) (! 당신에게 팀 감사합니다) 그 기준을 만족 기록, 작품 솔루션을 해당하는 것입니다 : 예에서

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

. 처음 MILESTO으로 주문할 수 없거나 단순히보고 싶다면

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 

: DataTable의 모든 행 (ORDER BY MILESTO ASC) 지정된 값보다 가장 가까운 큰 값을 찾는 방법에 루프를 보여줍니다 다음 예제에서보세요 데이터베이스 쿼리가 아닌 다른 접근 방식이 LINQ-To-DataSet 접근 방법을 시도 :

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

당신은 SQL이 @MileAge -parameter 같/큰 가장 가까운 TRUCKLOADRATE 반환 때라도, 데이터베이스를 조회 할 경우 :

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

단일 값을 반환하고 getTruckloadRateByMileAge과 같은 의미있는 이름을 갖는 쿼리를 DataAdapapter에 추가합니다. 그 다음은 간단합니다 : 여기에 질문에 대답 지연에 대한

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

@Kyralessa : 프로그램을 실행하고 마일리지를 입력하면 (a) 버튼을 클릭해도 rate.text 텍스트 상자에 응답이 나타나지 않으며 (b) 프로그램이 끊어집니다. – Shawn

+0

@ John Saunders : 내 코드는 버튼 클릭 이벤트 후 EOF까지 Do를 보여줍니다 ... 내가 원했던 SQL 쿼리를 작성할 수 없어 처음 시도했습니다. :/ – Shawn

+0

고맙습니다 ... 첫 번째는 내가하려고했던 것의 풍미에 가장 가깝습니다. 그리고 EOF에 관해서, 저는 사람들에게 파일의 끝까지 반복하도록 많은 DO LOOP 예제를 보았습니다. 그래서 저는 그 방법이라고 생각했습니다. 나는 그 접근 방식을 시도하고 대답 한 모든 사람들에게 감사하다고 말하고 싶습니다. 나는 VB 2010에 대해 더 많이 배우고 있으며 20 년 전에도 대학에서 알고 있었던 구조화 된 프로그래밍과는 틀리다. ;) – Shawn

관련 문제