![]() |
К форме, созданной на лабораторной работе №1, добавить кнопки “Сортировка”, “Выборка” и текстовое окно, в котором будут задаваться параметры выборки.
1. Сделать сортировку по возрастанию или по убыванию для любого выбранного Вами поля.
2. Сделать выборку для любого поля. Параметры выборки задавайте в текстовом поле.
Если Вы хотите выбирать записи по указанному шаблону, то используйте предикат Like:
Data1.RecordSource = "SELECT * FROM Publishers WHERE [Name] Like '" & Text1.Text & "*'"
Однако, оператор Like может сыграть с вами злую шутку. Если, например, у Вас имеется поле (допустим, счетчик, значение которого со временем возрастает), например, "Код магазина", то со временем оно увеличится и будет содержать числа от 1 до 200, тогда при задании в текстовом окне кода 1 в конечном результате у вас отобразятся все записи у которых "Код магазина" = 11, 12, 13, 14, 15, 16, 17, 18, 19, и начиная с 100 по 199, т.к. "*" в операторе Like будет позволять делать выбор любого количества символов после обязательной цифры 1. Также будет и со строковыми полями: если поле будет содержать слова - артель, арт, артиллерия, то при выборе слова "арт" в конечном результате у вас отобразятся все записи, которые содержат в себе первые три буквы - "арт".
Теперь вы наверно видите, что не удобно вручную вводить какой-то текст для выборки (во-первых, он должен быть перед глазами, во-вторых, при вводе возможно ошибиться). Чтобы избежать этого неудобства сделаем так, чтобы записи выбранного вами поля появлялись в списке (например, ComboBox или ListBox) и для выбора на запрос можно было бы выбрать запись оттуда.
Для этого добавим в форму элемент ComboBox и еще одну кнопку, при нажатии на которую в список ComboBox будут добавляться записи из поля “Name” (в единственном экземпляре). В процедуре Command3_Click() указываем источник записей, из которого будем добавлять их в список ComboBox:
Data1.RecordSource = "SELECT DISTINCT [Name] FROM Publishers" (не забудьте после этой команды обновить базу).
А потом в цикле добавляем в список данные из поля Name:
Do While Not Data1.Recordset.EOF
Combo1.AddItem Data1.Recordset.Fields("Name")
Data1.Recordset.MoveNext
Loop
![]() |
Элемент Data1 можно сделать невидимым (в его свойствах установить visible false).
После того, как список добавлен в ComboBox, выбираем интересующую нас запись и нажимаем Enter. Чтобы работала эта часть программы, в процедуре обработки нажатия кнопки Private Sub Combo1_KeyPress(KeyAscii As Integer) надо проверить нажата ли клавиша «Enter»:
If KeyAscii = 13 Then
и если да, то сделать выборку только тех записей, которые соответствуют Combo1.Text:
Data1.RecordSource = "SELECT * FROM Publishers WHERE [Name] = '" & Combo1.Text & "' "
после этого, как всегда, обновить базу:
Data1.Refresh
Однако, программа была бы более универсальна, если бы мы не привязывались к одному полю для выборки, а могли выбирать сначала поле, а потом уже запись в этом поле. Например, для той же таблицы Publishers из базы Biblio.mdb сначала выбрать поле ("Name", "City", "State", или какое-то другое), а в выбранном поле уже выбирать запись.
Чтобы преобразовать программу:
1. Добавим в форму элемент ListBox (хотя можете поставить еще один ComboBox), в котором будет список полей таблицы.
2. В процедуру обработки «клика» кнопки «Выборка» будем заносить в список ListBox имена полей из таблицы "Publishers" (кнопку можно назвать как-то по-другому, например «Вывод в таблицу», т.к. она будет осуществлять не только выборку, но и вывод в таблицу Grid всех записей из таблицы "Publishers", а так же и добавление полей в список ListBox)
Dim i As Integer
Data1.RecordSource = "Publishers"
Data1.Refresh
List1.Clear
For i = 0 To Data1.Recordset.Fields.Count - 1
List1.AddItem Data1.Recordset.Fields(i).Name
Next
3. В разделе декларации переменных объявите переменную iListIndex Option Explicit:
Dim iListIndex As Integer
Эта переменная будет принимать значения индекса выбранной вами в ListBox записи (имя поля в таблице).
Кстати, всегда в разделе декларации устанавливайте Option Explicit. Это предотвратит вас от ошибок связанных с недекларированными переменными.
4. В процедуру Form_Load() вставьте код инициализации переменной iListIndex
Private Sub Form_Load()
iListIndex = -1
End Sub
5. В процедуру List1_Click() вставьте следующий код:
Private Sub List1_Click()
iListIndex = List1.ListIndex
End Sub
5. Вместо кнопки «Выбрать из списка» сделаем кнопку «Зафиксируйте выбранное поле», при нажатии на которую в список ComboBox будут добавляться записи из поля, выбранного в списке ListBox. Для неё вставьте следующий код:
If iListIndex <> -1 Then 'когда еще не осуществлен выбор необходимой вам записи в
ListBox (имя поля в таблице)
'Конструкция If...Then....End If предотвратит вас от появления ошибки при нажатии на эту кнопку.
Data1.RecordSource = "SELECT DISTINCT [" & List1.List(List1.ListIndex) & "] FROM Publishers"
Data1.Refresh
Combo1.Clear
Do While Not Data2.Recordset.EOF
Combo1.AddItem Data1.Recordset.Fields(List1.List(iListIndex))
Data1.Recordset.MoveNext
Loop
End If
End Sub
Окончательный вариант формы:
![]() |