Программный поиск элементов управления Access Listbox на основе записи в текстовом поле - PullRequest
1 голос
/ 17 мая 2009

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

if (Me.textbox.text = значение в списке) тогда и т.д ...

Проблема в том, что каждый пример, который я видел до сих пор, ищет только значения списка в числовом или индексе, например listbox.selected (0). Поскольку текстовое поле принимает строковые значения, а не числовые значения, код должен приравнивать запись текстового поля к элементу в списке. Мне удалось добавить число в текстовое поле поиска и найти элемент списка таким образом, но это нецелесообразно, поскольку мои конечные пользователи будут знать только значения. В общем, мне было интересно, знает ли кто-нибудь, как программно искать в списке конкретное значение, равное значению, введенному в текстовом поле.

Спасибо,

DFM

1 Ответ

0 голосов
/ 17 мая 2009

Есть несколько способов сделать это, например:

Function CheckForItem(strItem, ListB As ListBox) As Boolean
Dim rs As DAO.Recordset
Dim db As Database
Dim tdf As TableDef

  Set db = CurrentDb

  CheckForItem = False

  Select Case ListB.RowSourceType
      Case "Value List"
          CheckForItem = InStr(ListB.RowSource, strItem) > 0

      Case "Table/Query"
          Set rs = db.OpenRecordset(ListB.RowSource)

          For i = 0 To rs.Fields.Count - 1
              strList = strList & " & "","" & " & rs.Fields(i).Name
          Next

          rs.FindFirst "Instr(" & Mid(strList, 10) & ",'" & strItem & "')>0"

          If Not rs.EOF Then CheckForItem = True

      Case "Field List"

          Set tdf = db.TableDefs(ListB.RowSource)

          For Each itm In tdf.Fields
              If itm.Name = strItem Then CheckForItem = True
          Next

  End Select

End Function

От: http://wiki.lessthandot.com/index.php/Listbox:_Does_an_Item_Exist

Тем не менее, я подозреваю, что вы, возможно, подходите к проблеме с неправильной стороны, множественные скрытые элементы управления редко бывают хорошей идеей, и может быть лучше объяснить ваши потребности более полно.

РЕДАКТИРОВАТЬ Комментарий

Этот пример не быстрый, но довольно простой.

Sub SearchTables(strFind As String)
''Reference: Microsoft DAO x.x Object Library
Dim db As Database
Dim tdf As TableDef
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Dim strSQL As String
Dim strMessage As String

Set db = CurrentDb

For Each tdf In db.TableDefs

    strFieldList = ""

    For Each fld In tdf.Fields
        strFieldList = strFieldList & " & [" & fld.Name & "]"
    Next

    strSQL = "SELECT * FROM [" & tdf.Name & "] " _
    & "WHERE Instr(" & Mid(strFieldList, 4) & ",'" & strFind & "') > 0"

    Set rs = CurrentDb.OpenRecordset(strSQL)

    If Not rs.EOF Then
        rs.MoveLast '' Populate recordset, a little slower
        strMessage = strMessage & vbCrLf & tdf.Name & " : " & rs.RecordCount
    End If
Next

MsgBox "Found in - " & vbCrLf & IIf(strMessage = vbNullString, "None", strMessage)
End Sub
...