2017-04-19 4 views
0

여러 하위 양식이있는 탭 형식을 사용하는 SQL Server에 대한 액세스 클라이언트가 있습니다. 기본적으로 제품은 기본 폼에서 선택되고 탭은 다른 관련 테이블에 저장된 제품의 다른 속성 (옵션, 색, 눈 등)을 편집/삽입 할 수있는 권한을 부여합니다. 각 하위 양식은 자체 레코드 소스를 사용하지만 제품 번호의 기본 양식과 동기화됩니다.MS Access 여러 개의 OnCurrent 발동 탭 형식

그래서 "where"절에서 제품 번호를 사용하는 쿼리의 데이터를 채우려는 "Options"라고 부르는 하위 ​​폼에 콤보 상자가 있습니다. 그게 내가해야 할 일이야. 내가 어떻게했는지 RowSource를 SQL 문자열과 동일하게 설정하기 위해 Options 하위 형식의 OnCurrent 이벤트를 사용했습니다. 그래도 작동하지만 OnCurrent 이벤트는 Options 하위 폼에 포커스가 있는지 여부에 관계없이 기본 폼에서 새 제품을 선택할 때마다 발생합니다. Options가 포커스를 얻으면 다시 시작됩니다. 그런 다음 옵션에서 데이터 시트 레이아웃을 사용하기 때문에 레코드 원본을 변경하지 않아도 선택한 모든 레코드에 대해 실행됩니다.

비록 작동하지만 불필요한 많은 데이터가 매우 (아주) 원격 SQL Server에 전달됩니다. 그래서, 거기에 전체 하위 폼, 이상적으로 그냥 한 번만, 및 하위 폼 내의 각 레코드에 대해 작동하는 사용할 다른 이벤트가 있습니까? 나는 Got Focus를 시도했지만 결코 해고 된 적이 없다. 그리고 신제품을 선택하면 열기 및로드 이벤트가 발생하지 않습니다 (당연히). 또는 옵션 하위 레코드 소스를 설정해야하는 또 다른 곳이 있습니까?

다음은 이벤트 코드입니다 : 어떤 도움

Private Sub Form_Current() 
    Dim sql As String 
    sql = "SELECT O.[OptionID], O.[Caption] FROM ProductOptions AS O WHERE o.[OptionTypeID] in (1,2,8,9) AND o.ProductNumber = " 
    sql = sql & "'" & Nz(Forms![products main form]!ProductNumber, "99test") & "'" 
    oidSelect1.RowSource = sql 
End Sub 

감사합니다. 짐

+0

그래서 내레이션에 명시된대로 RecordSource가 아닌 콤보 상자의 RowSource를 설정하고 있습니까? 왜 코드를 사용하여 콤보 상자의 RowSource를 설정합니까? 왜 그냥 RowSource 속성에서 SQL 문을 누른 다음 콤보 상자 GotFocus 이벤트 코드에서 RowSource의 Requery를 수행합니까? – June7

+0

흠, 필터 (where 절)는 현재 편집중인 각 제품에 대해 변경되므로 동적으로 설정해야합니다. 그리고 선택한 각 레코드에 대해 콤보 상자 재구성을 위해 GotFocus를 사용하지 않을 것입니까? (그리드보기이므로 각 행에 콤보 상자가 복제됩니다.) – user3091705

+0

콤보 상자 RowSource SQL 문 WHERE 절은 ProductNumber에 대한 참조를 가지므로 동적입니다. Seth의 대답은 콤보 상자 GotFocus 이벤트를 사용하여 쿼리를 트리거하는 것을 제외하고는이 행을 따른 것입니다.그는 주요 형태에 대한 의존성에 대해 좋은 지적을합니다. 일반적으로 기본 및 종속 콤보 박스는 동일한 형식입니다. 또한 별칭 값을 표시하는 조회가 포함 된 콤보 상자는 연속 또는 데이터 시트 양식에 적합하지 않습니다. – June7

답변

0

나는이 작업을 수행 할 수있는 적절한 방법이 동적으로 콤보 상자의 행 원본을 변경하지 않는 것입니다 생각합니다. 대신 쿼리 디자이너를 사용하여 rowsource를 쿼리로 설정하고 샘플 코드에 표시된 것과 같이 "기본 폼"의 값을 쿼리에서 읽도록하십시오. Forms! [products main form]! ProductNumber.

그런 다음 MAIN FORMs AfterUpdate 이벤트를 사용하여 콤보 상자의 새로 고침을 트리거합니다. 그것은 MainForm! MySubForm.Form ("mycombobox")과 같은 것입니다. (문법이 정확하지 않을 수 있습니다 ... 내 액세스 구문이 녹슬습니다.)

나는 내 자신의 대답을 좋아하지 않습니다. 그 이유는 하위 폼과 부모 사이의 종속성을 하드 코딩하고 있기 때문입니다. 다른 곳에서는 해당 하위 양식을 절대로 사용하지 않는 것이 좋습니다. 이 문제를 해결하기 위해 Access 개발자는 기본 폼의 업데이트 이후 이벤트에서 설정 한 텍스트 상자가있는 숨겨진 폼을 사용합니다. 그런 다음이 양식에 대해 만든 숨겨진 양식의 텍스트 상자를 참조하도록 쿼리가 업데이트됩니다.

다른 방법도 있습니다 (예 : 공용 기능). 하지만 미안하지만 그건 당신이 요구 한 것이 아닙니다. 내 첫 번째 방법이 효과가있다. 하지만 처음에는 리팩토링해야 할 하위 폼을 다시 사용해야하고 숨겨진 폼 솔루션이 잘 작동합니다.

관련 문제