2014-08-27 2 views
0

그래서 내 데이터베이스에는 누군가가 대출 목적으로 가지고있는 "목적"을 모두 나열한 접합점 테이블이 있습니다. 코드는 값을 숫자 형식으로 보여줄 때만 효과가 있었지만 두 번째 루프에서는 두 번째 테이블에서 목적의 실제 이름을 검색 할 때 문제가 발생했습니다. 올바른 번호을 표시하지만 유감스럽게도 텍스트는 적용 가능한 모든 목적을 표시하는 대신 해당 횟수만큼 처음 발견 된 목적을 반복합니다. 여기 VBA를 사용하여 ID로 이름 변환

나는 코드를 사용하고 있습니다 :

Private Sub cmdMsgBox_Click() 

Dim DB As Database 
Dim tblOpp2LP As Recordset 
Dim tblLoanPurpose As Recordset 
Dim ctlFindRecord As Control 
Dim lngHoldOpportunityID As Variant 
Dim intRecordCount As Integer 
Dim valTestBox As String 
Dim valLP As String 
Dim valName As String 

Set DB = CurrentDb 
Set tblInputOpp2LP = DB.OpenRecordset("Opp2LP") 

Set tblLoanPurpose = DB.OpenRecordset("LoanPurpose") 
Set ctlFindRecord = Me.ctlFindRecord 


lngHoldOpportunityID = CLng(ctlFindRecord) 
valTestBox = "" 

On Error GoTo ErrorHandling_Err: 

tblInputOpp2LP.FindFirst "[OpportunityID] = " & lngHoldOpportunityID 

If tblInputOpp2LP.NoMatch Then 
    MsgBox "No Matching Record Found" 
    Exit Sub 
Else 
Do Until tblInputOpp2LP.EOF 
    If lngHoldOpportunityID = tblInputOpp2LP![OpportunityID] Then 
     valLP = tblInputOpp2LP![LPID] 
     intCounter = intCounter + 1 

     Do Until tblLoanPurpose.EOF 
      If valLP = tblLoanPurpose![LPID] Then 
       valName = tblLoanPurpose![Name] 
      End If 
      tblLoanPurpose.MoveNext 
     Loop 

     If valTestBox = "" Then 
      valTestBox = valName 
     Else 
      valTestBox = valTestBox & ", " & valName 
     End If 
    End If 

    tblInputOpp2LP.MoveNext 
Loop 

txtMsgbox = valTestBox 

End If 

ErrorHandling_Exit: 
    Exit Sub 

ErrorHandling_Err: 
    MsgBox Err.Description & " - " & Err.Number 
    Resume ErrorHandling_Exit 
End Sub 

생각을? 미리 감사드립니다!

답변

0

알았습니다.

내가 알아야 할 것은 두 번째 루프에 "exit do"를 추가해야한다는 것입니다.

아래 코드 예를 참조하십시오.

Private Sub cmdMsgBox_Click() 

Dim DB As Database 
Dim tblOpp2LP As Recordset 
Dim tblLoanPurpose As Recordset 
Dim ctlFindRecord As Control 
Dim lngHoldOpportunityID As Variant 
Dim intRecordCount As Integer 
Dim valTestBox As String 
Dim valLP As String 
Dim valName As String 

Set DB = CurrentDb 
Set tblInputOpp2LP = DB.OpenRecordset("Opp2LP") 

Set tblLoanPurpose = DB.OpenRecordset("LoanPurpose") 
Set ctlFindRecord = Me.ctlFindRecord 


lngHoldOpportunityID = CLng(ctlFindRecord) 
valTestBox = "" 

On Error GoTo ErrorHandling_Err: 

tblInputOpp2LP.FindFirst "[OpportunityID] = " & lngHoldOpportunityID 

If tblInputOpp2LP.NoMatch Then 
    MsgBox "No Matching Record Found" 
    Exit Sub 
Else 
Do Until tblInputOpp2LP.EOF 
    If lngHoldOpportunityID = tblInputOpp2LP![OpportunityID] Then 
     valLP = tblInputOpp2LP![LPID] 
     intCounter = intCounter + 1 

     Do Until tblLoanPurpose.EOF 
      If valLP = tblLoanPurpose![LPID] Then 
       valName = tblLoanPurpose![Name] 
       exit do 
      End If 
      tblLoanPurpose.MoveNext 
     Loop 

     If valTestBox = "" Then 
      valTestBox = valName 
     Else 
      valTestBox = valTestBox & ", " & valName 
     End If 
    End If 

    tblInputOpp2LP.MoveNext 
Loop 

txtMsgbox = valTestBox 

End If 

ErrorHandling_Exit: 
    Exit Sub 

ErrorHandling_Err: 
    MsgBox Err.Description & " - " & Err.Number 
    Resume ErrorHandling_Exit 
End Sub 
+0

대단원! 몇 줄에 전체 지점을 다시 작성하라고 제안하고 싶습니다. 다음과 같은 방법으로 레코드 세트를 열 수 있습니다. Set tblLoanPurpose = DB.OpenRecordset ("SELECT * FROM LoanPurpose WHERE LPID ="& valLP ") 그런 다음 모든 추가 일치 및 ifs 대신 반복합니다. – ashareef

+0

잘 모르겠습니다. 이해 했어. 이것은 더 적은 데이터를 통해 파싱한다는 점에서 확실히 더 효율적이지만, 여전히 루프가 필요하지는 않은 것 같습니다. 내가 입력 한 내용의 다른 버전을 제출하고 그것이 의미하는 바의 예를 제출하면, 그것이 기꺼이 올바른 대답으로 표시됩니다. – LarrySteeze

+0

그래서 코드에 다른 문제가 발생했습니다. 가끔씩은 처음이자 두 번째 등을 사용하는 대신에 반복적으로 발견되는 마지막 대출 목적을 반복하는 것처럼 보입니다. 올바른 값이 아닌 정확한 횟수만큼 반복되는 것으로 보입니다. 생각? 그것은 때로는 올바르게 작동하지만 항상 그런 것은 저에게 이상합니다. – LarrySteeze

관련 문제