Я пытаюсь заполнить поле со списком в непрерывной форме, вызвав функцию в поле «Источник управления» на вкладке данных в конструкторе «Комбо Кокс». У каждого поля со списком в каждой строке будет свой набор записей, основанный на различных параметрах, которые передаются в каждом вызове функции.
Проблема в том, что это не заполнение полей со списком.
В конструкторе :
=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 она заполняет набор записей (следовательно, функция возвращает один) (см. тестовый код ниже), она не заполняет поле со списком.
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]));
У меня есть следующие ссылки:
Я использую Windows 7 Enterprise, MS Access 2010