2013-04-26 4 views
2

그래서 두 개의 매개 변수가있는 비교적 간단한 쿼리가 있습니다. 그 중 하나는 폼에서 long을 가져오고 하나의 테이블에서 하나의 필드에 해당 값이있는 레코드 만 선택합니다. (디자인 프로젝트 테이블이며 사용자가 프로젝트를 나열해야하는 디자이너를 선택합니다.)Access 2003 VBA : 쿼리를 직접 실행하면 작동하지만 코드에서 실행하면 런타임 오류 3061이 발생합니까?

양식을 연 다음 수동으로 쿼리를 열면 은 완벽하게으로 작동합니다. 쿼리 결과 목록 상자를 채우는 두 번째 폼이있는 경우 쿼리 결과와 동일한 레코드 집합을 설정하려고하면 "런타임 오류 '3061'이 (가) 실패합니다. 매개 변수가 너무 적습니다 예상되는"

매개 변수를 정적 정수 (예 : 3, 잘 작동합니다 (하지만 분명히 쓸모가 없습니다). 왜 VBA 코드로 인해 폼의 텍스트 필드에서 텍스트를 읽을 수 없습니까? 여기

SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID 
FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1 
WHERE ((([Project Request Log TABLE].Designer1)=[Forms]![frm_selectDesigner]![txtDesignerId]) AND (([Project Request Log TABLE].PercentComplete)<>1)) 
ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority; 

오류를 제공 VBA의 라인 :

여기 내 쿼리입니다

Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset) 

감사합니다.

편집 : 디자이너를 선택하는 양식에서 위 코드가 레코드 세트를 여는 두 번째 양식을 엽니 다. 원래 frm_selectDesigner는 닫히지 않았으며, 확인을 클릭해도 숨겨져 있지만 열려 있습니다.

편집 2 : 나는 라인

DoCmd.OpenQuery "qryDesignerProjectPrioritySet" 

을 포함하는 경우 쿼리가 열리고 올바른 결과가 있습니다. 바로 다음 줄이 위와 같이 해당 쿼리의 결과를 레코드 집합으로 할당하려고하면 3601 오류가 발생합니까? OpenRecordset 명령을 작성하는 방법에 오류가 있어야합니다.

+1

분명히하기 : 'frm_selectDesigner' 양식 *은 다른 양식에서 쿼리를 실행하는 동안 열려 있습니다. 맞습니까? –

+0

* 왜 VBA 코드는 Access 자체가 가능할 때 양식의 텍스트 필드에서 텍스트를 읽을 수 없습니까? * 아마도 VBA가 Access 이외의 컨텍스트에서 사용되기 때문일 수 있습니다. –

+0

[Project Request Log Table] .PercentComplete <> 1 – CarlF

답변

1

그건; 내가 왜 DoCmd.OpenQuery "qryDesignerProjectPrioritySet"이 작동하면 실패하는지 이해할 수 없습니다. OpenRecordset()을 시도 할 수있는 최소 절차로 어떤 일이 일어나는지보십시오.

새 표준 모듈로 다음 코드를 삽입하고 VB 편집기의 주 메뉴에서 디버그 -> 컴파일을 실행하십시오. 오류없이 컴파일한다고 가정하면 양식보기에서 frm_selectDesigner 양식을 열어 하위를 테스트하십시오. 컴파일되지 않으면 DAO 또는 ACEDAO에 대한 참조를 추가해야합니다. 이 컴파일하고 오류없이 실행하는 경우

Option Compare Database 
Option Explicit 

Public Sub test_OpenRecordset() 
Dim dbs As DAO.Database 
Dim rst_projects As DAO.Recordset 

Set dbs = CurrentDb 
Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset) 
rst_projects.Close 
Set rst_projects = Nothing 
Set dbs = Nothing 
End Sub 

, 당신은 객체 변수 선언과 할당 된 방법으로 차이를 발견 할 수 있는지 당신의 실패 코드와 그 코드를 비교합니다.

그 노력이 해결책으로 이어지지 않거나 test_OpenRecordset도 같은 오류를 발생시키는 경우 제안 할 수 있다고 생각되는 것은 HOW TO decompile and recompile입니다.

0

이 같은 코드의 매개 변수를 설정할 수 있습니다 (당신도, 쿼리를 설정/어둡게해야) : OpenRecordset() 간단한 기본 동작해야한다

... 
Dim prm As DAO.Parameter 
Set qdef = db.QueryDefs("qryName") 

'Evaluate and set the query's parameters. 
For Each prm In qdef.Parameters 
    prm.Value = Eval(prm.Name) 
Next prm 

Set rs = qdef.OpenRecordset 
... 
+0

"런타임 오류 '424 : Object required"오류로 "set qdef ..."행에서 실행이 중지됩니다. 이 코드에는 위와 같이 DoCmd.OpenQuery에서 올바르게 작동하는 쿼리의 복사 붙여 넣기 이름이 들어 있습니다. 감사. – CarlF

+0

OK, 나는 위의 코드를 실행하고 작동하도록했습니다. Debug.Print는 Forms! frm_selectDesigner! txtDesignerID 매개 변수가 3임을보고합니다. 누락 된 매개 변수에 대해 Access에서 불평하는 이유는 무엇입니까? 심지어 다른 매개 변수를 쿼리에서 완전히 제거하여 그것이 잘못되었다는 것을 확실히하지 않았습니다. VBA 자체가 매개 변수가 설정되었다고 말하면 누락되었다고 불평합니다! – CarlF

0

매우 만족스러운 대답은 아닙니다. 두렵습니다. 주위에 futz 대신, 나는 내 쿼리에서 SQL 코드를 사용하여 VBA 텍스트 필드를 읽으려고하는 대신 폼 라인을 기반으로 설정된 변수에 그냥 대체했습니다.내 마지막 코드는 다음과 같습니다

designerToPrioritize = Me.designerList.Column(2, Me.designerList.ListIndex + 1) 

    queryText = "SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID" 
    queryText = queryText & vbCrLf & "FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1" 
    queryText = queryText & vbCrLf & "WHERE ((([Project Request Log TABLE].Designer1)=" & **designerToPrioritize** & " AND (([Project Request Log TABLE].PercentComplete)<1)))" 
    queryText = queryText & vbCrLf & "ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;" 
'That should recreate my original query. Let's see how it works. 
     Set rst_projects = dbs.OpenRecordset(queryText, dbOpenDynaset) 

이 잘 작동, 그래서 그것을 할 수있는 다른 방법을 알아내는에 더 이상 노력을하지 않을거야. 아무도 다음 며칠간 훌륭한 답변을 게시하지 않으면이 질문에 답변 할 것입니다. 이 문제를 해결하는 데 도움을 주신 모든 분들께 감사드립니다.

0

코드에 쿼리 조건을 넣어 런타임 오류 '3061'을 관리했습니다. 코드가

SELECT * FROM tbl1 WHERE field1=[Forms]![form1]![txt1] 

:

Set dbs = CurrentDb 
Set rst = dbs.OpenRecordset("Query1") 

은 런타임 오류 '3061'을 촉발처럼 Query1을위한 SQL이었다. 나는 같이 쿼리 1 썼다 :

SELECT * FROM tbl1 

과에 코드를 변경 :

dim txt1 as string 
txt1=[Forms]![form1]![txt1]" 
Set dbs = CurrentDb 
Set rst = dbs.OpenRecordset("SELECT * FROM Query2 WHERE field1=" & txt1) 

과 괜찮 았는데.