--<< Возврат к содержанию >>-- Назад

Немного об операторе 'LIKE'
источник и автор: ???

В этой статье я решили затронуть один из операторов SQL запроса – LIKE. Меня подтолкнуло на это следующее...

'Гуляя' по различным конференциям я не редко натыкался на вопрос – “как можно осуществлять поиск в текстовом поле базы данных по ключевому слову или по сочетанию букв и цифр, если они стоят в этом поле по середине или в конце ?”

Приблизительно во всех ответах ссылались на функцию VB InStr - InStr([start, ]string1, string2[, compare]).

Описывали какую-то переменную типа String . При помощи функции InStr узнавали позицию того слова или сочетания, которое ищут в базе данных, и если результат, возвращаемый InStr был не равен 0, значит такое слово или сочетание присутствовяло в базе данных.

Я предлагаю и в этом случае воспользоваться оператором LIKE. Возьмите базу данных Biblio, таблицу Publishers и раз уж вопрос касается SQL - запросов , я так же постараюсь обьяснить, как можно одновременно осуществлять поиск в базе с учетом того, что критери поиска передаются в SQL - запрос при помощи нескольких TextBox-ов, но совсем не обязательно, чтоб все они были заполнены. Пример в исходниках будет прилагаться, единственное что, так это проверьте правильность пути к базе данных Biblio.mdb на вашем компьютере.

Допустим, мы должны осуществлять поиск по полям Name и City таблицы Publishers и повторяюсь , что совсем не обязательно, одновременно по обеим.

Для этого поместим на форму два TextBox-са, в которые будет записываться критерии поиска, MSFlexGrid, для отображения информации и две кнопки - кнопку Поиска и Выхода.

Поместим следующий код в кнопку Поиск...

Private Sub Command1_Click()

'Описываем две переменные для поиска

Dim First As String, Second As String

в переменную First записываем ту часть запроса, которая связана с первым критерием, в переменную Second – которая связана со вторым.

First = " AND Name LIKE " & "'*" & Text1.Text & "*'"

If Text1.Text = Empty Then First = Empty

Second = " AND City LIKE " & "'*" & Text2.Text & "*'"

If Text2.Text = Empty Then Second = Empty

Data1.RecordSource = "select * from Publishers Where PubID<>" & "0" & First & Second

Data1.Refresh

End Sub

Как видно из записи оператор Like располагается таким образом , что абсолютно не имеет значения в какой части поиска находится слово или сочетание, а благодаря следующей строчке в случае, если нужно осуществлять поиск по второму критерию, та часть SQL - запроса, которая связана с первым критерием не выполняется

Немного слов о сортировке строк .

Иногда желательно информацию сортировать по фамилиям, иногда (как потребует оператор) по именам, датам рождения или приема на работу и т.д. Для этого существует некоторые методы сортировки. Самый простой способ с помощью запроса SQL. Посмотрим сортировку в базе данных типа *.mdb и таблицы DBGrid. Смотрите код для кнопки “Сортировка с SQL”: Private Sub CommSort_Click() On Error GoTo Neprav1 ‘при ошибки в программе переходим на метку frmvrem = Data1.Recordset.Fields(0).Name ‘чтобы не писать каждый раз имя колонки в таблице Data1.RecordSource = "Select * from Name ORDER BY " & frmvrem 'ИМЯ" Data1.Refresh Exit Sub Neprav1: MsgBox "Вы допустили ошибку, ищите!" ‘Этот текст по вашему усмотрению End Sub Конечно, вначале объявим в форме промежуточную переменную “frmvrem” и лучше объявить в модуле переменную - “Myfile”. Затем чтобы не писать каждый раз путь к базе данных Access типа “*.mdb” , находящейся в текущей папке (директории) в код Form1_Load вставим строки: Tek1direkt ‘вызов кода чтения из любого места программы путь к текущему директорию = Myfile Свойство AllowUpdate = False для таблицы DBGrid и установлено в окне свойств Properties. Это сделано с целью защиты записей в базе имен от случайного “неуклюжего “движения оператора. В приложении сделано все для программиста, чтобы уменьшить количество ручной установки свойств при отладки работы с базой данных, например: Form1.Data1.DatabaseName = Myfile & "\Name.mdb" ‘ укажем элементу Data1 на Form1 имя и путь к базе данных Form1.Data1.RecordSource = "Name" ‘укажем элементу Data1 на Form1 имя таблицы в базе данных Form1.Data1.Refresh 'объязательно, если открытa строку вызова сортировки с кода Form_Load Можно вставлять каждый раз все эти параметры Data1 в окне Properties, но как только мы сменим имя директория (а значит путь к базе), то все надо переделывать. А Файл “*.ехе” - вообще нельзя. Т.е. для снятия “вcякческих” проблем лучше делать как в предложенной схеме приложения. Правда тип базы данных (Access) для Data1 указан в Properties. Но существуют методы делать это программно – пока не привоже чтобы не загромождать этот пример. После предварительных установок вы меньше будете заботиться о базе. Один из советов применил и в имидже программы: Таблицу данных (имен) можно показать сразу отсортированную после запуска приложения и в разброс. Для этого имеется заремленная строка: ‘CommSort_Click 'это заремил для показа сортировки через кнопку. Если открыть 'эту строку, то при запуске программы на экране уже будет все отсортировано Маленькое украшение: Если установить свойству кнопки “Сортировка с SGL” свойство Style = 1-Graphikal, то можно, например, делать пометку выполнена сортировка (серый цвет) или не выполнена - (зеленый цвет): If CommSort.BackColor = &HFF00& Then CommSort.BackColor = &H8000000F Цифры цветов запоминать не надо – выставив в окне свойств Properties желаемый цвет, а затем выделив, копируются через “Ctrl + C”, вставить код цвета в строку кода - “Ctrl + V”. Копирование и вставка через строку главного меню не всегда срабатывает (заблокированио). В приложении добавлена “игра” цветов текстового окна Text9Box, поиск по первым вводимим буквам имени и контроль с блокировкой от вторичной записи имени!!! Вначале просмотрите как можно организовать некоторые задачи при работе с текстовым окном. Кроме игры цвета, в коде Private Sub Text9_KeyUp(KeyCode As Integer, Shift As Integer) организован одноаременно контроль методом поиска, вызвав код NamSear(), вводимого имени и его наличия в базе. Кроме того, при необходимости оставьте строки контроля положения кодировки клавиатуры Rus – Lat. Если кто предложит более существенный вариант контроля кодировки прошу подсказать мне или выставьте на сайт. For i = 1 To Len(Trim$(Namtekxt)) ‘ этот текст в окне разбираем по “косточкам” и проверяем кодировку miKeyS = Mid(Namtekxt, i, 1) If Asc(miKeyS) > 57 And Asc(miKeyS) < 129 Then Text9.BackColor = &HFF& Text9.Text = Left(Namtekxt, i) MsgBox "ПЕРЕВЕДИТЕ клавиатуру на русский шрифт - " & miKeyS & vbCrLf & "и не вводите цифры" Exit Sub End If Next i И так, если мы вводим имя, то курсор элемента управления базы имен переходит и остановиться на первом похожем имен. Для чего в переменной поиска searchvar & "*'" стоит звездочка. При ее отсутсиви поиск был бы только при полном совпадении вводимого имени и имени в базе. Продолжая ввод – курсор элемента Data1 перескочит далее. Если введенное имя в базе уже есть, то получим предупреждение об этом, а курсор базы станет на первое имя (т.е. на первую строку в базе!!!). Проверка и блокировка находится в коде Private Sub Text9_KeyPress(KeyAscii As Integer): 'если проверка на наличие такого имени положительна, то выход от записи: If Text9.Text = Namtekxt Then Exit Sub 'иначе продолжим процесс записи в базу … Если вводимого имени нет в базе или ошибка в тексте имени, окно станет серым. Если вы уверены в правильности введенного в текстовом окне имени для записи в базу, смело жать Enter + “Да”. Если по ошибке вы ввели имя с маленькой (прописной) буквы – не беда. Строка Data1.Recordset.Fields(0) = UCase(Left(Namtekxt, 1)) + Mid(Namtekxt, 2) выполнить за вас замену имя с заглавной буквы. Для этого и существует оператор Ucase(), а оператор Mid(Namtekxt, 2) – допишет остальные буквы имени прописью, начиная со 2-го знака до конца слова!!!

Открытие Базы Данных

После того как вы программно создали БД встает вопрос о том, как ее использовать. Естественно, вы же не будете создавать БД с помощью кода и работать с ней с помошью Access ! В данной, небольшой статье, я покажу на примере как можно будет открыть БД и считать данные из какой нибудь таблицы. Для того, чтобы всем было удобно, мы возьмем поставляемую с пакетом Visual Basic БД - Biblio.mdb. А тепрь приступим….

Откройте в VB новый проект, на зовите его как хотите, и незабудьте подключить библиотеку Microsoft DOA 3.51 Object Library в меню Project|References..

В раздел General Declaration поместите переменные которые позволят вам обращаться к объектам используемым для работы с БД.

Option Explicit

Dim WS As Workspace

Dim DB As Database

Dim RS As Recordset

Dim strDBPath As String

В процедуре Form_Load формы впишите код инициализирующий переменные.

strDBPath = "C:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb"

'Открываем рабочую область

Set WS = DBEngine.Workspaces(0)

'Открываем БД, где strDBPath – полный путь к БД (у вас он может быть чуть иным),

'False – означает, что мы открываем БД в режиме Exclusive (False),

'и для Read\Write (False)

Set DB = WS.OpenDatabase(strDBPath, False, False)

'Открываем таблицу Authors

Set RS = DB.OpenRecordset("Authors", dbOpenDynaset)

На форму поместите три метки (Lable) , три текстовых поля (TextBox) и кнопки (CommandButton). И опять в процедуре Form_Load впишем код для инициализации текстовых полей. Таким образом мы связываем таблицу Authors с нашей формой.

Text1.Text = RS("Au_ID")

Text2.Text = RS("Author")

Text3.Text = RS("Year Born")

Теперь для перемещения по записям нам необходимо в событие Command_Click каждой кнопки вписать свой код. Самый простой код будет у кнпок “Певую” и “Последнюю”.

Private Sub Command1_Click()

'Перемещаемся на первую запись в таблице

RS.MoveFirst

TextEmpty

End Sub

Private Sub Command4_Click()

'Перемещаемся на последнюю запись в таблице

RS.MoveLast

TextEmpty

End Sub

Чуть посложней у кнопок “Следуящая” и “Предыдущая” так, как приходится проверять дошли ли вы до конца таблицы или нет (также проверяем дошли ли до начала таблицы).

Private Sub Command2_Click()

'Перемещаемся на следующую запись в таблице

If RS.EOF = True Then

MsgBox "Вы находитесь на последней записи.", vbExclamation, Me.Caption

Exit Sub

Else

RS.MoveNext

TextEmpty

End If

End Sub

Private Sub Command3_Click()

'Перемещаемся на предыдущую запись в таблице

If RS.BOF = True Then

MsgBox "Вы находитесь на первой записи.", vbExclamation, Me.Caption

Exit Sub

Else

RS.MovePrevious

TextEmpty

End If

End Sub

Инициализацию текстовых полей проводим в отдельной процедуре.

Private Sub TextEmpty()

'Обнуляем все поля перед их заполнением

Text1.Text = Empty

Text2.Text = Empty

Text3.Text = Empty

Text1.Text = RS("Au_ID")

Text2.Text = RS("Author")

Text3.Text = RS("Year Born")

End Sub

По окончанию работы с формой необходимо закрыть Базу Данных, хотя это произойдет автоматически, когда вы выгрузите форму, но лучше поставить код в процедуру Unload.

Закрываем Базу Данных

RS.Close

DB.Close

WS.Close

Set RS = Nothing

Set DB = Nothing

Set WS = Nothing

На этом пока закончим.

--<< Возврат к содержанию >>-- Назад

Сайт создан в системе uCoz