Попытка заполнить ComboBox в Access ContinuousForm (разные наборы записей для каждой строки), вызвав функцию из ControlSource в конструкторе - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь заполнить поле со списком в непрерывной форме, вызвав функцию в поле «Источник управления» на вкладке данных в конструкторе «Комбо Кокс». У каждого поля со списком в каждой строке будет свой набор записей, основанный на различных параметрах, которые передаются в каждом вызове функции.

Проблема в том, что это не заполнение полей со списком.

В конструкторе :

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

The Property Sheet, Data tab

Функция:

(Примечание. Я закомментировал тип возвращаемого значения в определении функции, поскольку с помощью этого кажется, что он даже не выполняет функцию !? (не отключает точку останова в теле функции))

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]));

У меня есть следующие ссылки:

VBA References

Я использую Windows 7 Enterprise, MS Access 2010

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...