2014-01-05 1 views
1

8 개의 다른 쿼리 결과를 하나의 쿼리로 다시 결합하려고합니다. 사용되는 모든 쿼리는 쿼리 쿼리 쿼리에 대한 쿼리입니다. 8 시리즈의 4 가지 쿼리는 그들이 플레이 한 골프 라운드 수에 따라 플레이어를 나눕니다. 각 시리즈의 마지막 쿼리는 각 플레이어의 정확한 핸디캡을 계산합니다.액세스 쿼리에서 VBA 함수 호출

내가하고있는 일은 내가 사용하고있는 코드로는 불가능할 수도 있습니다.

함수 코드는 다음과 같습니다

Function EHC(PlayerID As Long) As Long 

    Dim queT20 As Recordset 
    Dim que3to6 As Recordset 
    Dim que7or8 As Recordset 
    Dim que9or10 As Recordset 
    Dim que11or12 As Recordset 
    Dim que13or14 As Recordset 
    Dim que15or16 As Recordset 
    Dim que17or18 As Recordset 
    Dim que19or20 As Recordset 

    Set queT20 = CurrentDb.OpenRecordset("Top20Count") 
    queT20.FindFirst ("PlayerID =" & PlayerID) 
    If queT20![PlayerID] >= 19 Then 
     Set que19or20 = CurrentDb.OpenRecordset("P_19or20ExactHC") 
     que19or20.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que19or20.Exact_HC 
     que19or20.Close 
     Set que19or20 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que17or18 = CurrentDb.OpenRecordset("P_17or18ExactHC") 
     que17or18.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que17or18.Exact_HC 
     que17or18.Close 
     Set que17or18 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que15or16 = CurrentDb.OpenRecordset("P_15or16ExactHC") 
     que15or16.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que15or16.Exact_HC 
     que15or16.Close 
     Set que15or16 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que13or14 = CurrentDb.OpenRecordset("P_13or14ExactHC") 
     que13or14.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que13or14.Exact_HC 
     que13or14.Close 
     Set que13or14 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que11or12 = CurrentDb.OpenRecordset("P_11or12ExactHC") 
     que11or12.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que11or12.Exact_HC 
     que11or12.Close 
     Set que11or12 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que9or10 = CurrentDb.OpenRecordset("P_9or10ExactHC") 
     que9or10.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que9or10.Exact_HC 
     que9or10.Close 
     Set que9or10 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que7or8 = CurrentDb.OpenRecordset("P_7or8ExactHC") 
     que7or8.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que7or8.Exact_HC 
     que7or8.Close 
     Set que7or8 = Nothing 
    ElseIf queT20![PlayerID] >= 17 Then 
     Set que3to6 = CurrentDb.OpenRecordset("P_3to6ExactHC") 
     que3to6.FindFirst ("PlayerID =" & PlayerID) 
     ExactHC = que3to6.Exact_HC 
     que3to6.Close 
     Set que3to6 = Nothing 
    Else: ExactHC = 0 
    End If 
    queT20.Close 
    Set queT20 = Nothing 
End Function 

을하고 SQL 쿼리 문 :이 실행하려고하면

SELECT PlayerInfo.PlayerID, PlayerInfo.Display, EHC([PlayerInfo]![PlayerID]) AS ExactHandicap 
FROM ((((((((PlayerInfo INNER JOIN Top20Count ON PlayerInfo.PlayerID = Top20Count.PlayerID) 
    INNER JOIN P_3to6ExactHC ON PlayerInfo.PlayerID = P_3to6ExactHC.PlayerID) 
    INNER JOIN P_7or8ExactHC ON PlayerInfo.PlayerID = P_7or8ExactHC.PlayerID) 
    INNER JOIN P_9or10ExactHC ON PlayerInfo.PlayerID = P_9or10ExactHC.PlayerID) 
    INNER JOIN P_11or12ExactHC ON PlayerInfo.PlayerID = P_11or12ExactHC.PlayerID) 
    INNER JOIN P_13or14ExactHC ON PlayerInfo.PlayerID = P_13or14ExactHC.PlayerID) 
    INNER JOIN P_15or16ExactHC ON PlayerInfo.PlayerID = P_15or16ExactHC.PlayerID) 
    INNER JOIN P_17or18ExactHC ON PlayerInfo.PlayerID = P_17or18ExactHC.PlayerID) 
    INNER JOIN P_19or20ExactHC ON PlayerInfo.PlayerID = P_19or20ExactHC.PlayerID 
WHERE (((PlayerInfo.Display)=True)); 

내가 Undefined function 'EHC' in expression의 오류 메시지가 표시됩니다.

또한 함수 호출 대신 IIF 또는 SWITCH 문을 사용하여 동일한 쿼리를 시도했습니다.

나는 대략 MS Access 2010 Ranking Query comparing two columns for unique ranks에있는 기사에서 함수 호출에 대한 아이디어를 기반으로합니다.

내가이 문제를 해결하기 만하면 도움이 될 것입니다. 나는이 자체 부과 된 악몽을 마무리 짓기를 희망합니다.

답변

4

나는 여기에 몇 가지 문제를 참조하십시오

  1. 재 : "정의되지 않은 함수"오류가 - 당신의 기능은 표준 VBA 모듈에 있는지 확인하십시오.

  2. 모듈의 맨 위 부근에 Option Explicit 문이 포함되어 있는지 확인하십시오.

  3. 함수가 실제로 쿼리에 표시되는지 확인하십시오. 명시 적으로 Public Function으로 선언하는 것이 가장 좋습니다.

  4. 함수가 실제로 값을 반환하지 않습니다. 최종 End Function 문 바로 앞에 EHC = ExactHC을 할당해야합니다.

  5. 실제로 이러한 모든 내부 조인트가 필요한지 확인하려면 쿼리를 확인하십시오. 귀하의 EHC() 함수가 정확한 핸디캡 계산 과정에서 다른 쿼리로부터 필요한 정보를 가져올 것이므로 진심으로 의심 스럽습니다. 입력 고드위한

    vba1.png


vba2.png

+0

감사합니다. 'ExactHC = que19or20.Exact_HC' 줄에 '컴파일 오류 : 메소드 또는 데이터 멤버가 없습니다'라는 메시지가 나타납니다. 변수 'ExactHC'에 대한 dim 문을 추가했습니다. 내가 지적한 다른 것들을 고칠 때 하나도 존재하지 않는다는 것을 깨달았습니다. 이보고 된 쿼리에 대한 SQL 문은 P_19or20RforHC.PlayerID 에 의해 P_19or20RforHC 그룹에서 Exact_HC AS P_19or20RforHC.PlayerID, AS 평균 (P_19or20RforHC.PlayedTo) [평균], 라운드 ([평균] * 0.93,1)를 선택'이다 ORDER BY P_19or20RforHC.PlayerID;'. 어떤 아이디어? – Teamgilla

+0

나는 코드에 무엇이 잘못되었는지 정렬하고 조인에 대해 정확하다고 생각했습니다. 코드는'ExactHC = que19or20! [Exact_HC]'이어야합니다. 하지만 여전히 '정의되지 않은 함수'오류가 발생합니다. 이 과정을 진행하면서 나는 다른 코드를 생각해 냈지만 동일한 원리에 기초하여 계산을 처음부터 다시 할 수 있었지만 몇 초 후에 다시 재개하고 멈추지 않을 것입니다. 이 질문을 다른 질문으로 게시 할 수 있습니다. – Teamgilla