Как заполнить ComboBox с Recordset, использующим VBA

Ищите библиотеку javascript для обработки загрузки этих файлов на стороне клиента. Я наткнулся на пример javascript и php . Dojo также предлагает загрузку файла s3 на стороне клиента.

8
задан Community 20 August 2015 в 04:40
поделиться

4 ответа

Я обнаружил уловку ... для свойства rowSourceType элемента управления combobox необходимо установить значение «Table / List». Дисплей теперь в порядке, но у меня возникла другая проблема с памятью. Поскольку я использую эти наборы записей ADO в своих формах, использование памяти Access увеличивается каждый раз, когда я просматриваю форму. Память не освобождается ни при остановке просмотра, ни при закрытии формы, что делает MS Access нестабильным и регулярно зависает. Я открою вопрос, если не смогу решить эту проблему

3
ответ дан 5 December 2019 в 11:26
поделиться

Элемент управления "поле со списком" не имеет свойства набора записей. У него есть свойство RowSource, но Access ожидает, что там будет строка SQL.

Вы можете изменить RowSourceType на имя определяемой пользователем функции «обратного вызова». Доступ к справке предоставит вам дополнительную информацию, включая образец кода, если вы укажете RowSourceType и нажмете F1. Я использую этот тип функции, когда хочу предоставить пользователям список доступных отчетов, букв дисков или других данных, которые недоступны с помощью запроса SQL.

Я не понимаю, что вы имеете в виду, говоря в третьем абзаце с в отношении использования данных непосредственно со стороны сервера. Вернее, я не понимаю, в чем проблема со стандартными запросами.

0
ответ дан 5 December 2019 в 11:26
поделиться

Как было сказано, вы должны получить RowSourceType в «Таблица / Список» (или «Таблица / Запрос», если на французском языке), чтобы результаты запроса отображались в поле со списком.

Проблемы с памятью возникают из-за открытия набора записей (rsPersonne) без его закрытия. Вы должны закрыть их при закрытии / выгрузке формы (но опять же, у вас могут возникнуть проблемы с областью действия, поскольку набор записей объявлен в функции, а не в форме).

Вы также можете попытаться создать и сохранить запрос с помощью встроенного в Access -в создателе запросов и вставьте тот же запрос в RowSource вашего поля со списком. Таким образом запрос проверяется и компилируется в Access.

5
ответ дан 5 December 2019 в 11:26
поделиться

хороший метод с использованием свойства Recordset, спасибо за подсказку!

Патрик, метод, который вы показали на своей странице, имеет большой недостаток (я тоже пробовал это самостоятельно): список значений может быть только 32 КБ, если вы превысите этот предел, функция выдаст ошибку. У метода обратного вызова есть большой недостаток: он очень медленный и вызывается один раз для каждой записи, что делает его непригодным для использования в более длинном списке. Использование метода набора записей работает очень хорошо. Мне это было нужно, потому что моя строка SQL была длиннее 32 КБ (много значений индекса для WHERE ID IN (x, x, x, x, x ...)).

Вот простая функция, которая использует эту идею для установки набор записей в поле со списком:

' Fills a combobox with the result of a recordset.
'
' Works with any length of recordset results (up to 10000 in ADP)
' Useful if strSQL is longer than 32767 characters
'
' Author: Christian Coppes
' Date: 16.09.2009
'
Public Sub fnADOComboboxSetRS(cmb As ComboBox, strSQL As String)
    Dim rs As ADODB.Recordset
    Dim lngCount As Long

   On Error GoTo fnADOComboboxSetRS_Error

    Set rs = fnADOSelectCommon(strSQL, adLockReadOnly, adOpenForwardOnly)

    If Not rs Is Nothing Then
        If Not (rs.EOF And rs.BOF) Then
            Set cmb.Recordset = rs
            ' enforces the combobox to load completely
            lngCount = cmb.ListCount
        End If
    End If

fnADOComboboxSetRS_Exit:
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then rs.Close
        Set rs = Nothing
    End If
    Exit Sub

fnADOComboboxSetRS_Error:
    Select Case Err
        Case Else
            fnErr "modODBC->fnADOComboboxSetRS", True
            Resume fnADOComboboxSetRS_Exit
    End Select
End Sub

(Функция fnADOSelectCommon открывает набор записей ADO и возвращает его. Функция fnErr показывает окно сообщения с ошибкой, если она была.)

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

В событии выгрузки формы вы можете дополнительно использовать «Set rs = Me.Comboboxname.Recordset» а затем закройте его. Это не обязательно в отношении памяти,

2
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: