2009-09-04 3 views
0

두 개의 액세스 양식이 있습니다. frm_Main 및 frm_Sub은 주 양식의 선택 사항에 따라 조건부로 데이터가 표시됩니다. frm_Sub에 표시된 항목에 대해 select all function을 작성해야합니다. VBA에서는 frm_Sub에 현재 표시된 ID의 목록을 얻을 수있는 방법이 있습니까? 예를 들어VBA - 값 모음 액세스

, 나는이

me.controls("Svc_Tag_Dim_Tag_Num").value 

내가 frm_Sub의 행 중 하나에 대한 가치를 할 경우, 모든 값을 얻을 수있는 방법이 있나요?

어쩌면 다른 방식으로 물어볼 수 있습니다. VBA에서 특정 열의 모든 값을 가져올 수있는 방법이 목록보기로 표시되는 양식이 있습니까?

답변

1

또 다른 옵션은 하위 폼이 표시하는 레코드 집합의 PK를 연결하는 함수를 작성하는 것입니다. 주 양식이 회사이고 하위 양식에 직원 목록이 있다고 가정 해보십시오. 하위 폼 컨트롤의 LinkMasterFields 및 LinkChildFields 속성은 CompanyID (Company 테이블의 PK, Employees 테이블의 FK)가됩니다. 하위 폼에 표시 될 때 부모가 특정 회사의 기록에있을 때

따라서, 동일 레코드를 얻을 : 이제

Dim db As DAO.Database 
    Dim strSQL As String 
    Dim rst As DAO.Recordset 
    Dim strEmployeeIDList As String 

    Set db = CurrentDB 
    strSQL = "SELECT Employees.* FROM Employees WHERE CompanyID=" 
    strSQL = strSQL & Me!CompanyID & ";" 
    Set rs = db.OpenRecordset(strSQL) 
    If rs.RecordCount > 0 Then 
    With rs 
     .MoveFirst 
     Do Until .EOF 
     strEmployeeIDList = strEmployeeIDList & ", " & !CompanyID 
     .MoveNext 
     Loop 
    End With 
    strEmployeeIDList = Mid(strEmployeeIDList, 3) 
    End If 
    rs.Close 
    Set rs = Nothing 
    Set db = Nothing 

, 왜 대신하여 이미 통해 걷는이 작업을 수행 할 것 열린 레코드 세트 (즉, 하위 폼의 RecordsetClone)? 나도 몰라. 조회가 특정 양식/하위 양식에 연결되는 것을 원하지 않는 경우가있을 수 있습니다. 당신은 concatenates가 레코드 셋을 받아들이는 함수를 만들어서 위에서 언급 한 것처럼 선언 된 레코드 세트를 넘겨 주거나 서브 폼의 RecordsetClone을 전달할 수 있습니다. 이 경우 폼/하위 폼에 연결하지 않고 연결 함수를 사용할 수 있습니다.

1

만약 당신의 질문을 이해할 수있는 열 (x)를 사용하여 컨트롤의 ID 값을 액세스 할 수 있어야합니다. 여기서 x는 0에서 시작하는 컨트롤의 행 원본 열을 나타냅니다. 예를 들어 ID가 0 열 0 VBA는 숨겨져 있지만 VBA는 그것을 me.controls로 볼 수 있습니다. [ "Svc_Tag_Dim_Tag_Num"]. 열 (0).

는 같은 함수 뭔가 만들 수 폼의 클래스 모듈 외부에서 직접 하위 폼의 레코드 원본에 효율적으로 활용하려면 다음 작업이는 별도의 모듈에 포함된다

Public Function test_get_sub_form_record_set() As String 
    Dim dbs As Database 
    Dim rst As Recordset 
    Dim xcat As String 
    Set dbs = CurrentDb() 
    Set rst = [Forms]![Your Main Form Name]![Your Sub-form Name].[Form].RecordsetClone 
    If rst.RecordCount > 0 Then 
     rst.MoveFirst 
     xcat = rst!ID 
     rst.MoveNext 
     Do While Not rst.EOF 
      xcat = xcat & ", " & rst!ID 
     Loop 
    Else 
     xcat = "" 
    End If 
    test_get_sub_form_record_set = xcat 
    rst.Close 
    Set dbs = Nothing 
End Function 

를하고 연결된을 반환 전화했을 때 , 쉼표로 구분 된 ID 목록.

+0

Do While 루프 안에 MoveNext를 추가하십시오. 그렇지 않으면 ... 붐이 될 때까지 동일한 값을 반복해서 연결합니다! – HansUp

+0

또한 사용중인 레코드 세트가 이미 존재할 때 새 레코드 세트 포인터를 설정하기 위해 거의 보내지 않습니다. 위의 코드는 "WITH ME! SubForm.Form.RecordsetClone"을 사용하여 다시 작성할 수 있으며 작성한 레코드 세트 변수를 정리해야하는 등 많은 문제를 방지 할 수 있습니다. 위의 코드에서 닫지 않아야합니다. 하위 레코드의 RecordsetClone과 같이 닫을 수없는 레코드 세트에서 실제로 작동합니다. –