|
Программирование >> Проектирование интерфейса пользователя
Поиск записей Обычно операции над данными подразумевают задание группы или подмножества записей. Создавая отчет, вводя команды модификации или удаления данных, вы, как правило, предполагаете воздействовать на определенную часть информации. Поэтому для начала рекомендуем изучить приемы сужения набора данных. Существует два основных способа поиска записей, к которым впоследствии будет применена конкретная команда: вы можете создать и применить запрос Access, построить символьную строку, содержащую выражение на языке SQL, открыть объект набора данных (скажем, таблицу) и использовать циклическую VBA-процедуру, позволяющую отобрать нужные записи. Команда SQL выполняется сервером базы данных (т.е. чаще всего другим - мощным - компьютером), поэтому производительность прикладной программы в этом случае окажется, вероятно, более высокой. Впрочем, код на языке VBA нередко демонстрирует завидную гибкость. Поэтому наилучший выбор - разумное сочетание обоих подходов. Предварительное создание запроса значительно упрощает код. Если же вся работа по поиску записей возлагается на код существенно вырастает в раз- мерах и усложняется. Хотя о внешнем кода, как правило, приходится заботиться во вторую очередь, при прочих равных условиях они способны сыграть немалую роль. Неряшливый и запутанный код исправлять и сопровождать, разумеется, значительно труднее и накладнее. Ниже мы рассмотрим оба способа поиска строк данных. Главное - определить подмножество записей, подлежащих обработке; все остальные операции более просты. Поиск в таблице При поиске записей в таблице ее имя используется в качестве источника данных. Решение, целиком реализованное средствами VBA, является более гибким. В листинге 15.5 представлены способы поиска записей, удовлетворяющих заданным критериям. Листинг .5. Пример поиска записей в наборе данных средствами процедуры на языке VBA 3 4: 5 6: 8: 9: 10 11 12 13 14 15 16 17 18 19 20 Sub Test () Call FindRecords ( LAST NAME End Sub Merchant ) Function OpenConnection( ) As ADODB.Connection Const Provider = Provider=Microsoft.Jet.OLEDB.4.0; Const DataSouroe = Data Source=C:\Data\Hourl5.mdb Set OpenConnection = New ADODB.Connection Caii OpenConnection.Open( Provider & DataSouroe, End Function ;Sub FindRecords{ ByVal SearchFieldName As String, : ByVal FindVaiue As String ) Dim Connection As On Error GoTo Finally Set Connection = OpenConnection 22 : 23: 24: 25: 26: 27: 28: 29 : 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42 : 43 : 44: 45: Di MrdSet As New ADODB. Recordset Cal et.Open( MUSIC , Connection, adOpenDynamic, adLockOptimistic ) RecordSet.MoveFirst Do While Not RecordSet.EOF If (RecordSet! SearchFieldName ) = FindValue) Then Debug.Print RecordSet( TITLE ) End If RecordSet.MoveNext Loop RecordSet.Close Connection.Close Finally: If (Err.Number<> 0) Then Call MsgBox ( Err. Description ,] Err.Clear End If Set RecordSet = Nothing Set Connection = Nothing End Sub В строке 41 листинга 15.5 вызывается метод Clear объекта Err. Используется этот метод не всегда. Объект Err очищается при достижении конца процедуры обработки ошибки, выполнении команд Exit Function, Exit Sub, Exit Property, одной из команд Resume или следующего оператора On Error. Можно использовать команду lear, чтобы не держать в памяти информацию о том, когда очищается данный объект. il Строки 1-3 содержат тестовую процедуру, единственное назначение ко-I торой состоит в вызове функции FindRecord, реализующей основной алгоритм поиска. Подобные простые процедуры весьма удобны при последовательной отладке программы. Когда процесс тестирования завершен, такие процедуры можно просто удалить. Существуют специальные директивы компилятора, предназначенные для удаления вспомогательного кода (см. главу 17-й час. Отладка кода ). В строках 5-14 представлена отдельная функция, выполняющая задачу создания объекта соединения и его открытия. Обратите внимание, что функция возвращает значение типа ADODB. Connection. Строки демонстрируют текст процедуры поиска. В строке 18 объявляется пе- ременная типа Connection - обратите внимание, что в данном случае служебное слово New не задается, поскольку задача непосредственного создания объекта соединения с выделением ему необходимого фрагмента памяти возложена на функцию OpenConnec-tion. В строке 19 устанавливается обработчик, в случае возникновения ошибки передающий управление на метку FINALLY. Впрочем, код, следующий за меткой, выполняется всегда - не только в случае ошибки. Строка 20 устанавливает объект соединения -напомним, в операциях присваивания объектов используется служебное слово Set. Строка 24 выполняет открытие набора данных, задаваемого таблицей MUSIC. Команда строки 26 перемещает указатель к первой записи набора. Строки 27-33 содержат конструкцию цикла, позволяющего итеративно просмотреть все записи таблицы. Суть алгоритма поиска заключена в условном выражении строки 28. Если искомая запись найдена, часть ее содержимого отображается в окне Immediate. Обратим особое внимание на использование методов MoveFirst (строка 26) и MoveNext (строка 32). Без этих двух строк кода цикл либо никогда не выполнится, либо, начавшись, не будет завершен. В строках 35-45 находятся команды закрытия объектов, очистки памяти и отображения информации об ошибке, если таковая произошла. Поиск с использованием запроса Преимущество использования запроса состоит в том, что он способен возвращать наборы данных, содержащие информацию сразу из нескольких таблиц. С помощью запроса легко выполняется предварительная фильтрация полей и записей набора данных. Чтобы продемонстрировать применение запроса, внесем в код листинга 15.5 небольшие изменения. Представим запрос с помощью именованной символьной константы. Листинг 15.6 содержит только ту часть текста листинга 15.5, которая подверглась изменениям. Листинг 15.6. Фрагмент листинга 15.5, измененный в связи с использованием запроса ieldName & 22 : Dim SQL As String 23: SQL = SELECT * EROM MUSIC WHERE 24: & FindVaiue & 25: Dim RecordSet As New ADODB.Recordset 26: Caii RecordSet.Open( SQL, Connection, adOpenDynamic, 27: adLockOptimistic ) 28: RecordSet.MoveFirst 29: Do While Not RecordSet.EOF 30: Debug.Print RecordSet( SearchEieidName ) 31: RecordSet.MoveNext 32: Loop Анализ Обратите внимание на появление новой символьной переменной SQL. Запрос, представленный в строке 23, собран из нескольких литеральных констант, соединенн1х с содержимым аргументов SearchFieldName (наименование поля таблицы MUSIC, по которому осуществляется поиск) и Find-Value (искомое значение, хранящееся в этом поле). В строке 26 процедуры Open в качестве параметра источника данных передается уже не имя таблицы, а название переменной, содержащей текст запроса на языке SQL. Поскольку запрос сам по себе предусматривает фильтрацию записей посредством предложения WHERE, необходимость использования условного выражения в теле цикла отпадает. Предложение WHERE команды SELECT языка SQL способно содержать любое число аргументов в формате Опе- ратор Значение, где в качестве оператора используются операторы сравнения (скажем, =), а тип значения должен совпадать с типом поля (символьные значения заключаются в одинарные кавычки). Аргументы-предикаты склеиваются посредством логических операторов AND, oR и других, при необходимости их заключают в круглые скобки. Синтаксис предложения WHERE в упрощенной форме описывается следующим образом. . . . WHERE ИмяПоля Оператор Значение [AND or ИмяПоля Оператор Значение ...j
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |