Вопросы | ms-access

Поле со списком Rebind Access

Вопрос

Lisa Norwich | 2394 просмотров | рейтинг: 1

У меня есть форма Access 2007, которую можно найти с помощью комбинированного списка. Когда я добавляю новую запись, мне нужно обновить выпадающий список, чтобы включить только что добавленный элемент. Я предполагаю, что что-то должно быть сделано в событии AfterInsert формы, но я не могу понять, что. Как я могу заново связать комбинированный список после вставки, чтобы новый элемент появился в списке?



Ответы

David-W-Fenton

+ 0 -
Я предполагаю, что ваш комбинированный список - это элемент управления в форме, а не элемент управления комбинированного списка в панели команд. Этот комбинированный список имеет свойство, называемое rowource, которое может быть либо списком значений (муж; жена; сын; девушка), либо инструкцией SQL SELECT (SELECT ratioDescription FROM Table_relationType). Я также предполагаю, что ваш набор записей формы имеет какое-то отношение к вашему набору записей combobox. Что вам нужно сделать, это после того, как ваш набор записей формы будет должным образом обновлен (я думаю, событие afterUpdate), чтобы повторно инициализировать свойство rowource элемента управления combobox если источник данных является инструкцией SQL:
 myComboBoxControl.recordsource = _
    "SELECT relationDescription FROM Table_relationType"
 

или если это список значений
 myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"
 

Но в целом я нахожу ваш запрос очень странным. Есть ли у вас рефлексивные (родитель-дочерние) отношения на вашем столе?  


Chris OC

+ 1 -
Самый простой способ - гарантировать, что комбинированный список всегда актуален, - просто запросить комбинированный список, как только он получит фокус. Даже если набор записей затем обновляется где-то еще, ваш комбинированный список всегда актуален. Достаточно простого TheCombobox.Requery в событии OnFocus.  


Philippe Grondier

+ 0 -
Запрашивает поле со списком в форме после события обновления и события удаления. Ваше поле со списком будет обновляться всякий раз, когда пользователь вносит изменения в набор записей, будь то новая запись, изменение или удаление. Если пользователи не должны вносить изменения других пользователей, как только они будут внесены, не запрашивайте поле со списком каждый раз, когда он получает фокус, потому что не только пользователю придется ждать (что заметно при больших наборах записей), но и не нужно, если набор записей не изменился. Но если это так, вся форма должна быть запрошена, как только кто-нибудь другой внесет изменения, а не только поле со списком. Это был бы очень необычный сценарий. После обновления:
 Private Sub Form_AfterUpdate()
    On Error GoTo Proc_Err

    Me.cboSearch.Requery

    Exit Sub
Proc_Err:
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear
End Sub
 

После удаления:
 Private Sub Form_Delete(Cancel As Integer)
    On Error GoTo Proc_Err

    Me.cboSearch.Requery

    Exit Sub
Proc_Err:
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
    Err.Clear
End Sub
 




David-W-Fenton

+ 0 -
Здесь есть два возможных ответа: используйте событие AfterInsert формы для запроса поля со списком (а также событие OnDeleteConfirm). Этого будет достаточно, если в поле со списком не отображаются данные, которые пользователь может обновить, и которые должны быть обновлены, если базовая запись обновлена. если обновления данных должны быть отражены в поле со списком, то имеет смысл добавить запрос в события AfterUpdate элементов управления, которые используются для редактирования данных, отображаемых в поле со списком. Например, если в вашем поле со списком перечислены имена людей в таблице, вы захотите использовать метод # 2, а в событии AfterUpdate для Me! TxtFirstName и Me! TxtLastName запросите поле со списком. Поскольку вы выполняете одну и ту же операцию в четырех местах, вам нужно написать подпрограмму для выполнения запроса. Итак, саб будет выглядеть примерно так:
   Private Sub RequerySearchCombo()
    If Me.Dirty Then Me.Dirty = False
    Me!MyCombo.Requery
  End Sub
 

Причина, по которой вы должны выполнять запрос только при наличии обновления данных, отображаемых в поле со списком, заключается в том, что если вы заполняете поле со списком со списком всей таблицы, запрос может занять очень много времени, если вы есть десятки из тысяч записей. Другой альтернативой, которая сохраняет все запросы, будет наличие пустого источника строк для поля со списком, заполнение его только после ввода 1 или 2 символов и фильтрация результатов, отображаемых в списке, на основе введенных символов. Для этого вы должны использовать событие OnChange поля со списком:
 Private Sub MyCombo_Change()
  Dim strSQL As String

  If Len(Me!MyCombo.Text) = 2 Then
     strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable "
     strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*"
     Me!MyCombo.Rowsource = strSQL
  End If
End Sub
 

Приведенный выше код предполагает, что вы ищете имя человека в поле со списком LastName, FirstName. Есть еще одна важная оговорка: если вы ищете форму, связанную с полной таблицей (или оператором SQL, который возвращает все записи в таблице), и используете навигацию по закладкам для поиска записей, этот метод не очень хорошо масштабируется, так как требует тянуть весь индекс для искомых полей через провод. В случае моего воображаемого комбинированного окна выше, вы будете использовать FindFirst, чтобы перейти к записи с соответствующим значением MyID, так что это индекс для MyID, который должен быть извлечен (хотя только столько страниц индекса, сколько необходимо для удовлетворения поиск на самом деле будет тянуть). Это не проблема для таблиц с несколькими тысячами записей, но за пределами 15-20 КБ это может стать узким местом в сети. В этом случае вместо навигации по закладке вы будете использовать поле со списком, чтобы отфильтровать результирующий набор до одной записи. Это, конечно, чрезвычайно эффективно, независимо от того, используете ли вы серверную часть Jet или серверную часть. Очень желательно начать внедрять такие виды эффективности в ваше приложение как можно скорее. Если вы сделаете это, это значительно упростит переход на серверную часть сервера или сделает его довольно безболезненным, если вы достигнете критической точки с массой новых данных, что делает старый метод слишком неэффективным, чтобы быть удобным для пользователя.


Теги

ms-access