|
|
|
| как проверить содержится ли значние поля1 в combobox1?
(combobox формируется по запросу - значения могут менятся) | |
|
| |
|
|
|
| пример:
Используется таблица для combobox - "PRODUCTS_STOREMAN_TBL"
' Поиск в таблице "PRODUCTS_STOREMAN_TBL" уже загруженного заказа STR_ORDER_NUMBER
Dim db As Database
Dim RST As Recordset
Dim STR_ORDER_NUMBER as string
' присвоим переменной - значение поля
STR_ORDER_NUMBER = Me!Поле1
Set db = CurrentDb
Set RST = db.OpenRecordset("PRODUCTS_STOREMAN_TBL", dbOpenDynaset)
If Not RST.EOF Or Not RST.BOF Then
RST.MoveLast
RST.MoveFirst
End If
If RST.RecordCount <> 0 Then
'Поиск первой записи, удовлетворяющей критерию отбора
RST.MoveFirst
RST.FindFirst "[ORDER_NUMBER] = '" & STR_ORDER_NUMBER & "'"' для строкового значения
If RST.NoMatch = False Then Msgbox "Есть такое!" ' найдено
End If
RST.Close
db.Close
Set db = Nothing
Set RST = Nothing
|
| |
|
| |
|
|
|
|
Dim rst As DAO.Recordset
With Me.cmb1
Set rst = .Recordset
If rst Is Nothing Then
.SetFocus
.Dropdown
Set rst = .Recordset
End If
End With
With rst
.FindFirst .Fields(1).Name & "='" & Me.txt1 & "'" 'ищем во втором столбце источника комбобокса значение-строку
If Not .NoMatch Then
MsgBox "Есть :)"
Else
MsgBox "Нету :("
End If
End With
Set rst = Nothing
|
| |
|
| |
|
31 Кб. |
|
| Еще вариант. Без использования наборов записей. Используя источник данных комбобокса, заполняем данными временную таблицу. И функцией dcount проверяем, есть ли там искомое значение.
Private Sub CheckButton_Click()
DoCmd.RunSQL "DELETE Table1Draft.* FROM Table1Draft"
DoCmd.RunSQL "INSERT INTO Table1Draft " & Me.ValueList.RowSource
If DCount("TextField", "Table1Draft", "TextField='" & Nz(Me.SearchText, "") & "'") > 0 Then
MsgBox "Значение найдено!", vbInformation
Else
MsgBox "Совпадений нет!", vbInformation
End If
End Sub
|
| |
|
| |
|
|
|
| Круто, если так дальше пойдёт следующий вариант будээ в 3 строки.
======================
Жаль афтору пофигу. | |
|
| |
|
|
|
| >>следующий вариант будээ в 3 строки.
Количество строк в данном случае далеко не главное.
В первом варианте происходит ненужное(повторное) считывание данных с диска. (1 тормоз)
Во втором варианте повторного считывания нет, используется рекордсет самого списка. (0 тормозов)
В третьем варианте удаление данных, чтение + запись данных, чтение данных с диска (4 тормоза)
Кроме того, в 1 и 3 вариантах значение ищется не в наборе данных списка, а в источнике этого набора,
что не есть правильно, так как в источнике к этому времени данные уже могут измениться,
например другой пользователь добавил, изменил или удалил что-то.
А автор просил найти именно в наборе данных списка комбобокса.
Правда и 2 вариант не безгрешен.
Я там забыл (как всегда) заполнить рекордсет перед поиском. :) | |
|
| |
|
|
|
| А зачем это надо? Подозреваю для обработки ошибки типа "нет в списке". Но для этого есть событие "отсутствие в списке". ИМХО. | |
|
| |
|
|
|
|
|
Я там забыл (как всегда) заполнить рекордсет перед поиском. :)
|
И не надо
With Me.cmb1
If .Recordset Is Nothing Then
.SetFocus
.Dropdown
Else
.Requery
End If
End With
With Me.cmb1.Recordset
.FindFirst .Fields(1).Name & " Like '*" & Me.txt1 & "*'"
If Not .NoMatch Then
MsgBox "Есть :) " & .Fields(1)
Else
MsgBox "Нету :("
End If
End With
|
| |
|
| |
|
|
|
|
Вот реквери то и не надо, ибо это опять чтение данных с диска. :)
Надо мовеласт-мовефист перед финдом на случай первого вызова. | |
|
| |