2014-06-06 4 views
0

며칠 후 좌절감으로 해결을 위해이 문제를 제시하기로했습니다. 무수한 포럼과 도움 사이트를 통해 유사한 문제를 제기하지 않았습니다. 다음은 MS Access 2003의 FindFirst 메서드의 문제점에 대해 자세히 설명합니다.MS Access 2003 findfirst 메서드가 Load() 이벤트 형태로 작동하지 않습니다.

테이블 및 양식 : 참조 정보 무결성 및 계단식 업데이트를 사용하는 일대 다 관계로 서비스 정보 테이블 각 고객에 대한 하나의 서비스 세부 정보). 검색 양식을 사용하면 '고객'및 '서비스 제공 업체'(테이블 서비스 세부 정보의 필드)를 선택하여 메인 폼/하위 폼을 열어 '고객'과 관련된 서비스 데이터를 입력 할 수 있습니다 (텍스트 문자열)를 기준으로합니다. '고객'당 둘 이상의 '서비스 제공 업체'가있을 수 있습니다 (즉, 각 서비스 세부 항목에는 동일한 '고객'에 대해 서로 다른 '서비스 제공 업체'가있을 수 있음).

목표 : 기본 서식 (하위 쿼리 모두 선택 쿼리를 기반으로 함)은 지정된 레코드/하위 레코드로 열어야합니다.

현재 양식 : 검색 양식이 아닌 기본 양식의 콤보 상자에서 FindFirst 메서드 (마법사로 만든 콤보 상자)를 사용하여 적절한 '서비스 공급자'를 선택할 수 있습니다. 이것은 작동하지만 의도 한 것은 아닙니다. '서비스 제공 업체'기준은 초기에 검색 양식에서 선택되어 주 양식 (현재는 전역 변수)으로 전달되므로 주 양식의 콤보 상자 선택이 중복되어 사용자에게 혼동을 줄 수 있습니다 잘못된 서비스 세부 정보를 입력하십시오).

문제점 : 콤보 상자의 AfterUpdate() 이벤트에서 코드를 복사하여 기본 폼의 Load() 이벤트로 복사하는 것이 적절할 것이라고 가정했지만 오류가없고 아무 것도 수행하지 않고 첫 번째 사용 가능한 서비스 세부 정보 '서비스 제공자'를 기준으로 선택한 레코드 대신 기록하십시오.

테스트 : 선택한 '서비스 제공 업체'에 대한 기준 값을 확인하기 위해 메시지 상자를 삽입했는데 기본 폼의 Load() 이벤트에 삽입 된 FindFirst 메서드 안팎에서 모두 괜찮은 것으로 보입니다. 나는 DLookup(), DoCmd.Findrecord를 시도하고 검색 폼에서 전달 된 조건으로 콤보 상자의 기본값을 설정했지만 여전히 검색 양식에서 선택된 것 대신 첫 번째 '서비스 공급자'레코드 만 표시됩니다. .

코드 :

Dim rs As Object 

    Set rs = Me.Recordset.Clone 
    rs.FindFirst "[Service Provider] = '" & [g_serviceProvider] & "'" 
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark 

이이 오류를 생성하지 않으며, 디버그 모드에서 마우스로 g_serviceProvider 변수 유혹하는 올바른 문자열 값을 보여줍니다. 이 코드는 콤보 상자의 AfterUpdate() 이벤트에서 완벽하게 작동하지만 값이 실제로 전달 된 경우에도 폼의 Load() 이벤트에 삽입 할 때 아무 작업도 수행하지 않습니다 (메시지 상자를 사용하여 실행).

왜 이것이 콤보 상자에서만 작동하지만 폼의 Load() 이벤트에서는 작동하지 않습니다. 나는 문제가 폼의 레코드 소스 (select query)에 있다고 생각합니다. 콤보 상자의 레코드 소스는 폼과 같은 쿼리를 기반으로 SELECT 식을 사용합니다. Load() 이벤트 내에서 FindFirst 메서드를 사용하여 레코드 원본을 코딩하면 오류가 발생하므로 작업 할 관련 예제를 찾을 수 없으므로 아무런 성공을 거두지 못했습니다. 어떤 아이디어? 미리 감사드립니다.

+0

어둠 속에서 그냥 쐈지만 어쩌면 형태가 아직 묶이지 않았을까요? rs가 EOF에 있으면 코드가 아무 것도하지 않습니다. 아마도 Debug.Print 또는 메시지 상자를 사용하여 디버깅을위한 실제 사례를 처리 할 수 ​​있습니다. AfterUpdate()가 발생하기 전까지는 아마도 그때까지 묶여 있으므로 제대로 작동합니다. – VBlades

+0

어쩌면 OnCurrent? 이벤트 체인에서 양식이 바인딩되어야하므로 충분히 늦어야합니다. 그냥 생각. – VBlades

+0

양식의 레코드 소스가 쿼리입니다. 각 조건에 걸쳐 배치 된 메시지 상자는 EOF 조건을 확인하지 않았고 책갈피도 제대로 작동하는 것 같습니다. 흥미롭게도 코드를 기본 폼의 'Current'이벤트에 붙여 넣으면 실제로 "지정된 레코드로 이동할 수 없습니다"라는 오류가 발생합니다. 그래도 제안을 주셔서 감사합니다! – user3716557

답변

0

좋아, 마침내 알아 냈어. 실제 문제는 양식을 특정 레코드로 열 때 Current() 이벤트를 여러 번로드하는 형식이었습니다. 이것은 기존 레코드가 표시되는 거의 모든 양식에서 발생했습니다. 그것은 MS Access 2003의 형식을 열고 레코드를 선택하는 형식의 아티팩트 인 것 같습니다 (최신 버전에 대해서는 알지 못하지만이 문제와 관련된 여러 게시물을 읽었습니다).

폼이 열릴 때 Current() 이벤트가 실행되는 횟수를 사용하여 주위에 더러운 작업이 있습니다. 빈 레코드 소스 (테이블)로 입력을 받아 들일 준비가 된 "처녀"양식의 경우 Current() 만 하나의 시간을 실행합니다. 기존 레코드가 있지만 새 레코드를 입력 할 수있는 양식이 비어있는 경우 Current()는 을 두 번으로 실행합니다. 폼을 채워야하는 이미 존재하는 레코드를 표시 할 때 컨트롤 (컨트롤과 함께로드)을 통해 코딩하지 않고 코딩을 통해 선택을 수행하기에 충분한 모든 데이터가로드되기 전에 Current()는 세 번을 실행합니다. 하위 양식 현재()는 상위 양식보다 한 번 더 실행되는 것 같습니다.

이벤트가 발생했는지 여부와 횟수를 확인하려면 폼의 VBA 코드로 의심되는 블록에 간단한 메시지 상자를 삽입하십시오.

기본 폼의 Current() 이벤트 블록에 코딩 된 간단한 카운터를 생성하여 문제를 해결했습니다.