|
Программирование >> Разработка пользовательского интерфейса
не связанным ни с каким полем - для него будет отсутствовать понятие текущее поле . Следовательно, флажок нужно сделать недоступным, так как его значение используется для дальнейшего поиска: Public Sub PoiskSub() DoCmd.OpenForm Поиск Select Case lastcntr.ControlType Case 109, 106, 110, 111 If Not IsNull(lastcntr.ControlSource) Then Forms![Поиск].[Flag3] = True Else Forms![Поиск].[Flag2] = False Forms![поиск].[Flag3] = False End If Case Else Forms![Поиск].[Flag2] = False Forms![поиск].[Flag3] = False End Select End Sub Таким образом мы передали в процедуру обработки события Click последний активный элемент и последнюю активную форму как параметры и при этом выяснили, был ли последний активный элемент управления связанным или нет. Для поиска мы используем методы из серии Find объекта RecordSet и метод FindRecord объекта DoCmd. Набор данных для формы мы создаем с помощью свойства RecordSource. Это может быть таблица, запрос или выражение SQL. С помощью свойства RecordsetClone мы получаем ссылку на объект Recordset, указанный в свойстве RecordSource. Если источник данных для формы AUTOMOBILE PASSENGER CAR - таблица с тем же именем, то с помощью свойства RecordsetClone формы мы ссылаемся на объект, который создается с помощью следующей конструкции: Dim myDb As DataBase, rst As Recordset Set Mydb = dbEngine.Workspaces(0).Databases(0) Set rst = MyDb.OpenRecordset( AUTOMOBIL PASSENGER CAR , dbOpenDynaset) Учтите, что объект Recordset функционирует сам по себе, то есть перемещение с помощью методов серии Move и Find не влияет на текущую отображаемую в форме запись. С целью синхронизации перемещения необходимо использовать свойство Bookmark, которое определяет текущую запись. Для этого свойство Bookmark формы сохраняют в переменной строкового типа, а потом присваивают это значение свойству Bookmark объекта Recordset, на который ссылаются с помощью свойства RecordsetClone формы. В коде кнопки Поиск формы AUTOMOBIL PASSENGER CAR имеется следующая строчка: mybook=LastForm.Bookmark В коде кнопки Найти для формы ПОИСК свойство Bookmark устанавливается следующим образом: LastForm.RecordsetClone.Bookmark=mybook После поиска, если он удачен, значение свойства Bookmark объекта Recordset присваивается свойству Bookmark формы. Как вы помните, весь этот процесс мы затеяли для того, чтобы выводить свое собственное сообщение при неудачном поиске. При этом мы рассмотрели вопросы взаимодействия формы с объектами доступа к данным (DAO). Как правило, скорость работы в Access понижается с увеличением числа записей в таблице, что, впрочем, происходит и во многих других приложениях. Для того чтобы снизить негативные последствия этого явления, в Access предлагается использовать развитую систему фильтров. Фильтры можно устанавливать при работе с формой с помощью меню, макрокоманд или методов объекта DoCmd в программном коде. Например, используя опцию Фильтр по выделенному , вы можете, последовательно выделяя поля, устанавливать достаточно сложные фильтры. Последовательность действий выглядит следующим образом: 1. Открытие формы. 2. Выделение любого поля или части поля. 3. Выполнение команды Фильтр по выделенному из меню Записи или нажатие кнопки с тем же названием на панели инструментов Режим Формы. 4. Повторение вышеприведенной последовательности действий с другими полями. Можно открыть форму в режиме Форма с установленным фильтром . Это делается с помощью макрокоманды OpenForm или с помощью метода OpenForm объекта DoCmd: DoCmd.OpenForm automobile passenger car , key model = 1 Кроме того, вы можете установить источником данных для формы параметрический запрос, который позволяет значительно уменьшить количество записей, обрабатываемых в текущем сеансе работы формы. При работе с объектами DAO можно динамически изменять размер выборки, тем самым значительно ускоряя доступ к нужным вам данным. В качестве примера приведем две процедуры. Одна ищет запись в неотфильтрованном наборе данных, другая использует фильтр. Процедура поиска в неотфильтрованном наборе данных: Public Sub findexp() *** В данной процедуре ищется запись, и в окне отладки *** выводится время поиска в секундах *** Вы можете подставить свою таблицу *** и свои поля *** При этом имеет смысл экспериментировать *** на таблице с количеством записей более 1000, *** либо использовать WINAPI для фиксирования времени *** поиска Dim myDb As DATABASE Dim myRst As Recordset Dim t1 As Double Dim t2 As Double Set myDb = DBEngine.Workspaces(0).Databases(0) *** Можете подставить имя вашей таблицы здесь Set myRst = myDb.OpenRecordset( first , dbOpenDynaset) t1 = Now() *** Соответственно поле и критерий поиска *** тоже необходимо подставить свои myRst.FindFirst first like Чф* t2 = Now() If Not myRst.NoMatch Then Debug.Print myRst!First, myRst!Third Else Debug.Print Пролет End If *** Здесь можете использовать свою *** функцию для форматирования вывода времени поиска Debug.Print DateDiff( s , t1, t2) End Sub Поиск в отфильтрованном наборе данных: Public Sub findexpFilt() Dim myDb As DATABASE Dim myRst As Recordset, NmyRst As Recordset Dim t1 As Double Dim t2 As Double Dim i As Long Set myDb = DBEngine.Workspaces(0).Databases(0) Set myRst = myDb.OpenRecordset( first , dbOpenDynaset) myRst.Filter = third >> 56700 and third << 58000 Set NmyRst = myRst.OpenRecordset() t1 = Now() NmyRst.FindFirst first like Чф* t2 = Now() If Not NmyRst.NoMatch Then Debug.Print NmyRst!First, NmyRst!Third Else Debug.Print Пролет End If Debug.Print DateDiff( s , t1, t2) End Sub 7.2. Создание SQL-запросов Как уже было отмечено, всем, кто хочет работать с базами данных, необходимо знать язык SQL, который, по сути, стал стандартом для работы с базами данных. В этом параграфе вы узнаете: сферы наиболее эффективного применения языка SQL при разработке систем обработки данных; основные виды запросов, которые могут быть составлены для работы с данными; назначение основных составляющих элементов команд SQL; особенности составления команд SQL в рассматриваемых средствах разработки. К сожалению (а может быть наоборот), рынок программного обеспечения развивается не по принципам единого планирования. Каждый продукт, который использует SQL, применяет его диалект, как правило, отличающийся от ANSI-стандарта этого языка. Обидно, - иначе бы мы могли одинаково обращаться к данным любого продукта, используя одинаковые языковые конструкции. Но в принципе, все еще может быть, а пока приходится довольствоваться тем, что есть. А есть масса приложений для разработки баз данных, которые при этом данные хранят в своем формате, как правило, секрета не представляющем, и все без исключения соревнуются друг с другом в как можно большем количестве отличий от общепринятых стандартов ANSI SQL. Однако общаться программам с данными чужих форматов необходимо, и существет несколько путей для этого общения. Перечислим некоторые из них. Вы покупаете продукт, который поддерживает несколько форматов. Или - создаете продукт, который поддерживает несколько форматов. Есть прекрасные примеры: Lotus Approach, Microsoft Access, продукты фирмы Borland Dbase и Paradox читают форматы друг друга. Но почти наверняка вы не найдете приложения, которое поддерживает все форматы. А на практике работать с данными иного формата приходится очень часто. Даже если вы очень упорно будете избегать встречи с другими форматами, она все равно когда-нибудь произойдет. Бесспорно, можно воспользоваться следующим способом для работы с внешними форматами, но он таит свои сюрпризы. Вы используете операции экспорта или импорта. Опять же необязательно, что у вас будут в наличии все необходимые конверторы. Но все же допустим, что они есть. Вы импортировали данные. Отредактировали. Сколько вы поставите на то, что изменения отразились в исходных данных, то есть в файле, где они хранятся в родном формате? Готовы с вами поспорить на любую сумму. Можно, конечно, провести обратную операцию и экспортировать отредактированные данные в исходный формат. Но, согласитесь, что это очень непродуктивный путь для редактирования одной записи в базе данных, где их 100000, а ведь очень часто их бывает много больше. Кроме этого, вам становятся недоступными все триггеры, бизнес-правила и хранимые процедуры для данных внешнего формата, если они, конечно, используются. Способ, который звучит наиболее современно и который делает вас поистине всесильным, но оставляющий все же место для всевозможных придирок по отношению к себе. Это, само собой разумеется, - OLE 2.0. А в OLE 2.0 нас больше всего интересует его составная часть OLE Automation. Термин, который редко переводится, и мы тоже не возьмемся за это. Придирки здесь могут возникнуть со стороны консервативных любителей DOS. Дело в том, что технологию OLE Automation невозможно реализовать в рамках этой операционной оболочки. Позволим себе лирическое отступление. Вам наверняка придется слышать патетические высказывания, изрекаемые достаточно образованными людьми. Они будут гласить, что на их программах работают сотрудники, которым надо только стучать по клавиатуре. Или что наращивание мощности техники для обработки информации - это от лукавого. Не слушайте их. Нам нужны различные, мощные, еще мощнее, самые мощные средства обработки данных. При этом неважно, где вы работаете. Это может быть ЖЭК, банк, спортклуб. Каждый грамм информации имеет право на существование, даже количество бензина, которое вы сегодня израсходовали, отлучившись на служебной машине к вашей любовнице. Не слушайте их, приземленных противников прогресса, которым легче обслуживать свои любительские творения, чем осваивать новые вершины самой нужной профессии современности - специалиста по обработке информации. Бесспорно, на смену
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |