2012-05-21 6 views
0

Access 2010에서 동적 통과 쿼리를 사용하여 백 엔드 데이터베이스에서 레코드를 하나 이상 검색합니다. 많은 시행 착오 끝에 적합한 레코드를 검색하고 OnLoad 이벤트 중에 데이터 시트 형식의 언 바운드 텍스트 상자에 할당 할 수있는 적절한 코드를 표절했습니다. 남은 유일한 문제는 여러 레코드를 표시하는 것입니다. 각 레코드의 필드 내용이 폼의 텍스트 상자 컨트롤에 저장된 이전 값을 덮어 씁니다. 그래서 어디서나 볼 수있을 것으로 예상되면 데이터 시트에 표시된 단일 레코드로 끝납니다 1에서 10까지.Access 2010 : 데이터 시트의 언 바운드 컨트롤에 여러 레코드 내용 표시

나는 그것이 간단한 해결책이라고 확신한다. 누군가 내게 그것을 지적하시기 바랍니다 수 있습니까?

Private Sub Form_Load() 
    Dim sqlString As String 
    sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections" 
    If Not IsNull(Me.OpenArgs) Then 
     sqlString = sqlString & " where " & OpenArgs 
    End If 

    Dim cnn As New ADODB.Connection 
    Dim cmd As New ADODB.Command 
    Dim rst As ADODB.Recordset 

    'Define and open connection 
    cnn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite" 
    cnn.Open 

    'Define ADO command 
    cmd.ActiveConnection = cnn 
    cmd.CommandText = sqlString 

    'Populate and enumerate through recordset 
    Set rst = cmd.Execute 
    If rst.EOF Then 
     MsgBox "Nothing found...", vbInformation + vbOKOnly 
     Exit Sub 
    Else 
     Do While Not rst.EOF 
      '// I'm guessing the problem is with my control assignments, here. 
      Me.cntl_Receiver_ID.Value = rst("Receiver_ID") 
      Me.cntl_Transmitter_ID.Value = rst("Transmitter_ID") 
      Me.cntl_UTC_Date.Value = rst("UTC_Date") 
      Me.cntl_Local_Date.Value = rst("Local_Date") 
      Debug.Print {Show me the four control values} 
      rst.MoveNext 
     Loop 
    End If 

End Sub 

건배! 나는 데이터 시트보기에서 폼을 믿지 않는

답변

0

DUHdley는 언 바운드 형태로 사용할 수 있습니다. 그러나 폼 레코드 집합으로 ADO 레코드 집합을 사용할 수 있습니다.

Set Me.Recordset = rst 

그런 다음 양식이 닫힐 때까지 rst 변수를 닫지 않도록주의하십시오.

다른 대안은 메모리 내에서 조작되고 연결이 끊어진 ADO 레코드 집합을 사용하는 것입니다. 기본적으로 새 레코드 세트를 만들고 기존 레코드 세트와 일치하도록 필드를 추가 한 다음 모든 레코드를 새 레코드 세트로 옮깁니다. 하지만 이미 유효하고 채워진 ADO 레코드 집합이있는 경우에는 실제로이 작업을 수행하지 않는 것이 좋습니다.

언 바운드 형식으로 여러 레코드를 표시하고 싶다면 GridView, ListView, TreeView 또는 MSFlexGrid와 같은 ActiveX 컨트롤을 사용해야 할 것입니다. 가장 숙련되고 전문적인 액세스 개발자가 가능한 한 ActiveX 컨트롤을 사용하지 않는 것으로 나타났습니다. 사용하는 경우, 그들은 일반적으로 TreeView 및 ListView 만 제한합니다. 어떤 ActiveX 컨트롤을 사용하더라도 문제가 발생할 수있는 모든 문제를 해결할 가치가 있기 때문입니다.

DAO와 ADO의 차이점에 대해 살펴 보시기 바랍니다. http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO

0

다른 포럼의 독자는 HK1이 제기 한 것과 비슷한 해결책, 즉 Set Me.Recordset = rst을 지적했습니다. 그것은 원래의 문제를 해결했지만 다른 것을 만들었습니다.

처음에 언 바운드 형식에서 네 개의 텍스트 상자 컨트롤을 다시 바인딩 한 다음 http://msdn.microsoft.com/en-us/library/ff835419.aspx의 샘플을 사용하여 코드를 크게 수정했습니다. 수정 된 코드는 다음과 같습니다 (내 파라미터 세트에 지정된대로)

Private Sub Form_Load() 
    Dim sqlString As String 
    sqlString = "SELECT Transmitter_ID, Receiver_ID, UTC_Date, Local_Date from Detections" 
    If Not IsNull(Me.OpenArgs) Then 
     sqlString = sqlString & " where " & OpenArgs 
    End If 

    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    'Define and open connection 
    Set cn = New ADODB.Connection 
    cn.ConnectionString = "DRIVER={SQLite3 ODBC Driver};Database=z:\EWAMP\EWAMP_be_dev.sqlite;" 
    cn.Open 

    'Create an instance of the ADO Recordset class, 
    'and set its properties 
    Set rs = New ADODB.Recordset 
    With rs 
     Set .ActiveConnection = cn 
     .Source = sqlString 
     '// .LockType = adLockOptimistic 
     .LockType = adLockReadOnly 
     .CursorType = adOpenKeyset 
     '// .CursorType = adOpenStatic 
     .Open 
    End With 

    'Set the form's Recordset property to the ADO recordset 
    Set Me.Recordset = rs 

    Set cn = Nothing 
    Set rs = Nothing 
End Sub 

양식은 이제 적어도 256K 행까지, 네 개의 레코드를 반환하기위한 네 개의 행을 표시 스무 레코드 20 행합니다. 작은 문제는 4 개 이상의 레코드에서 "마지막 행"탐색 버튼 (> |)을 누르면 로컬 커서가 하나 이상의 중간 행에 포커스를 설정하고 컨트롤의 속성 시트가 ​​활발하게 새로 고쳐집니다 (초당 여러 번). 화면에 표시 할 수있는 것보다 많은 양식 행이있는 경우 마지막 행으로 이동하거나 커서를 이동할 수 없습니다. 마치 레코드 세트가 지속적으로 업데이트되고있는 것과 같습니다.

위에서 볼 수 있듯이 RecordSet LockType 및 CursorType 속성 (adOpenDynamic 및 adOpenForwardOnly 등 두 가지 모두 Set Me.Recordset 문에서 런타임 오류가 발생 함)을 사용했습니다. adLockOptimistic과 AdLockReadOnly 사이에서 LockType을 전환하고 adOpenKeyset과 adOpenStatic 사이의 CursorType은 검색 성능 (현저하게 빠름!) 또는 새로 고침 빈도 (더 빨라지지만 불행하게도)가 없습니다.

아마도 "탐지"테이블에 sqlString이 "선택"하는 레코드가 ~ 4M 개의 레코드라는 것을 언급 할 가치가 있습니다. 쿼리가 항상 폼에 전달 된 필터/WhereClause/OpenArgs 매개 변수에 관계없이 클라이언트에 전체 4M 레코드를 반환했기 때문에이 테이블의 통과 쿼리에 바인딩 된 데이터 소스가있는 폼을 사용하려는 이전 시도에서 좌절감을 나타 냈습니다. . 위에 표시된 솔루션은 연결을 닫을 수만 있다면 (내가 시도한) 또는 한 번 호출 한 후에 RecordSet을 중지 할 수 있으면 완벽 할 것입니다.