首页 > 解决方案 > 尝试通过从设计器中的 ControlSource 调用函数来填充 Access ContinuousForm 中的 ComboBox(每行不同的记录集)

问题描述

我试图通过调用 Combo Cox 设计器中数据选项卡的控制源字段中的函数来填充连续表单上的组合框。根据传递给每个函数调用的不同参数,每行上的每个组合框都将具有不同的记录集。

问题是它没有填充组合框。

在设计器中:

=LaterRevisions([DocumentCode],[LadRevision],[LadId])

属性表,数据选项卡

功能:

(注意我已经在函数定义中注释掉了返回类型,因为它甚至没有执行函数!?(不会在函数体中触发断点))

Public Function LaterRevisions (DocumentCode As String, LadRevision As String, LadId As Integer) 'As ADODB.Recordset
On Error GoTo ErrHandler

Dim Record As Variant
Dim dbs As Object
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim qdf As QueryDef
Dim sql As String

Set dbs = CurrentDb()

Set qdf = dbs.QueryDefs("qryLaterRevisionsByRow")
sql = qdf.sql
Set cmd = New ADODB.Command

  With cmd
    .ActiveConnection = CurrentProject.Connection
    .CommandText = sql

    With .Parameters("DocumentCode")
      .Type = adVarChar
      .Value = DocumentCode
    End With

    With .Parameters("LadRevision")
      .Type = adVarChar
      .Value = LadRevision
    End With

    With .Parameters("LadId")
      .Type = adInteger
      .Value = LadId
    End With

  End With

  cmd.Execute

  Set rs = New ADODB.Recordset
  With rs
    .CursorLocation = adUseServer
    .Open cmd, , adOpenForwardOnly, adLockReadOnly
  End With

  If Not rs.BOF And Not rs.EOF Then
    Debug.Print rs.RecordCount ' does get records
    'Set Me.[cboLatestrevision].Recordset = rs ' will set this recordset (but sets all rows to the same in continuous form)
    Set LaterRevisions = rs ' function returns individual recordset for each row, but doesn't populate the combo
  End If

ExitHandler:
    Exit Function

ErrHandler:
    ' handle error
    Resume ExitHandler
End Function

尽管在单步执行代码时,它清楚地显示了正在填充的记录集,并且当从 Form_Load 事件调用函数时,它填充了一个记录集(因此该函数返回一个)(参见下面的测试代码),它不会填充 Combo盒子。

Private Sub Form_Load()
Dim myVar As ADODB.Recordset
Set myVar = LaterRevisions("XXX", "YYY", 999)

For myI = 1 To myVar.RecordCount
  Debug.Print myVar.Fields("LatestRevision") ' prints correct values
  myVar.MoveNext
Next myI
End Sub

保存的查询(qryLaterRevisionsByRow):

PARAMETERS DocumentCode Text ( 255 ), LadRevision Text ( 255 ), LadId Long;
SELECT tblLaterRevisions.LatestRevision
FROM tblLaterRevisions
WHERE (((tblLaterRevisions.LatestRevision)>[LadRevision]) AND ((tblLaterRevisions.DocumentCode)=[DocumentCode]) AND ((tblLaterRevisions.LadId)=[LadId]));

我有这些参考资料:

VBA 参考

我正在使用 Windows 7 企业版,MS Access 2010

标签: vbams-accesscomboboxms-access-2010adodb

解决方案


推荐阅读