|
Программирование >> Проектирование интерфейса пользователя
Конкретные задачи были выбраны, можно сказать, почти случайно, они носят достаточно общий характер и удобны с методической точки зрения. Предлагаем вам примеры удачных решений, которые допускают повторное применение в ваших будущих реальных проектах. Созданиетаблицы Первый уровень абстракции в общей модели управления информацией - база данных, а второй, весьма важный, - таблица. База данных состоит из одной или более таблиц. В некоторых ситуациях возникает задача динамического создания и удаления таблицы средствами прикладной программы в течение одного сеанса ее работы. В Access 2002, наряду с VBA, поддерживается и язык структурированных запросов к базе данных (Structured Query Language - SQL) (подробнее см. главу 16-й час. Применение языка SQL ). На данном этапе вам достаточно знать, что для создания таблицы он вполне пригоден. (Конечно, при необходимости построения таблицы вовсе не обязательно обращаться именно к средствам языка SQL.) Подобный код удобно оформить в виде процедуры и передавать ей в качестве аргумента наименование таблицы, которую требуется создать. Просмотрите текст листинга 8.5. Листинг 8.5. Пример процедуры построения таблицы в базе данных 2: 3: 4: 5: Sub As String) Dim SQLAs String Используется команда CREATE table SQL SQL = CREATE TABLE & TableName & (TotalSales Double); Call CurrentDb.Execute ( SQL ) End Sub I Ну как - неплохо, не правда ли? Хотя до универсальности здесь далековато (любая создаваемая таблица будет содержать одно и то же единственное поле, TotalSales типа Double), некоторая гибкость все-таки обеспечивается: динамически строится таблица с именем, которое задается в качестве аргумента процедуры. Если вы будете придерживаться подобного подхода, то сократите объем кода программы, самое меньшее, на треть. Пример дает пищу для размышлений и простор для дальнейшего творчества. Впрочем, простота простоте рознь. Решения должны быть конструктивными и целесообразными. Листинг 8.5 демонстрирует пример того уровня сложности, который допустим в функциях и процедурах. Воспринимайте отдельные выражения кода как атомы, а функции -как молекулы. Все мыслимые сущности физического мира состоят из иерархии атомов и молекул. Ваша программа сможет достичь степени сложности физического мира, если вы, ее создатель, будете последовательно и продуманно строить ее из маленьких кирпичиков отдельных выражений, процедур и функций. Импорт текста из файла В составе класса Application имеется вложенный клас md. Объект типа Application позволяет ссылаться на приложение Access как таковое. Он содержит инструменты управления Access. DoCmd (его следует воспринимать как интерфейс к средствам Access) - весьма серьезный объект, насчитывающий множество свойств методов, среди которых имеются функции импорта содержимого текстовых файлов. Новый термин Свойство - это переменная или объект определенного класса, щийся в составе класса более высокого уровня иерархии. находя- Процедура импорта содержимого текстовых файлов носит название ferText. Ниже приведен синтаксис ее вызова. Call DoCmd.TransferText( [ТипПреобразования] [, ИмяСпецифи-кации], ИмяТаблицы, ИмяФайла [, ФлагЗаголовков] [, ИмяТабли-▲ цынтмь] [, КодоваяСтраница] ) Поскольку метод TransferText принадлежит классу этот факт необходимо явно оговаривать, используя при вызове процедуры префикс DoCmd с последующим символом точки. В качестве необязательного аргумента ТипПреобразования допустимо указывать одно из предопределенных значений (по умолчанию система устанавливает признак ас Import Delim - импорт текста с разделителями). Аргумент ИмяС-пецификации также необязателен. Параметры ТипПреобразования и ИмяСпецифика-ции находят применение в случае импорта текста более сложной структуры. Аргументы ИмяТаблицы (наименование таблицы-получателя информации) и ИмяФайла (название файла-источника) обязательны. Остальные параметры - ФлагЗаголовков, имятаблицынтмъ И КодоваяСтраница - разрешается не задавать. (Исчерпывающие сведения о назначении, способах и примерах использования всех аргументов процедуры DoCmd.TransferText вы найдете в файлах оперативной справочной системы Microsoft Visual Basic.) Поведение многих процедур и функций стандартных классов Access VBA существенно зависит от значений передаваемых им параметров и их количества. Зачастую имеет смысл заключать вызов стандартного метода VBA в тело пользовательской функции, чтобы упростить и прояснить интерфейс. Рассматривая частную задачу импорта текста с разделителями, удобно определить новую функцию с меньшим числом аргументов и дополнительными средствами контроля. Рассмотрим пример простого текстового файла, содержащего разделенные запятыми имена, фамилии и почтовые адреса группы людей (листинг 8.6). Листинг 8.6. Пример текстового файла с разделителями Имя, Фамилия, Адрес Email Paul, Kimmel, Paul Kimmel@hotmail.com Robert, Dearman, Robert.Dearman@jnli.com Robert, Golieb, RobertGolieb@hotmail.com Набор строк, приведенный в листинге 8.6, - это, по существу, уже готовая таблица. Если ее содержимое необходимо импортировать в таблицу базы данных, процедура DoCmd.TransferText придется весьма кстати. Листинг 8.7 отображает код пользовательской процедуры, упрощающей задачу импорта простого текста с разделителями. Листинг 8.7. Пример процедуры импорта текста с разделителями Su tFile( ByVal FileName As String, ByVal TabieName As String ) Const HASFIELDNAMES = True If (FiieExists( FiieName Then Caii DoCmd.TransferText (acImportDelim, , FileName, HASFIELDNAMES) Else MsgBox Файл & FiieName & не найден! End If End Sub 2: 3: 4 J 5: 6: 7: 8: 10:Function FiieFxists (ByVai FiieName As 11: FiieFxists = Len(Dir(FileName)) > 0 12:End Funotion TableName, String) As Boolean Определение дополнительной процедуры, охватывающей вызов метода DoCmd.TransferText, позволяет расширить возможности кода (скажем, в нашем примере добавлены строки, анализирующие наличие файла с заданн1м именем) и скрыть те аспекты интерфейса TransferText, которые в данном случае просто не нужн1. Поиск записи В своей личной профессиональной практике я часто сталкивался цами кода, буквально перенасыщенного предложениями на языке SQL. Подобные программы, к сожалению, очень трудно воспринимать и тем более исправлять. Как и в пре-д1дущем примере, м1 постараемся скрыть особенности интерфейса SQL внутри тела разработанной нами функции. Листинг 8.8 содержит код функции, в которой предложение на яз1ке SQL используется для поиска записи в таблице CONTACTS (считайте, что с помощью процедуры листинга 8.7 м1 уже ее заполнили) по заданному значению фамилии корреспондента. Листинг 8.8. Пример функции поиска записи в таблице 1: Function ntact ( ByVa Name As String : As String 2: Dim DeoordSet As New AdoDB.RecordSet 3 : Dim SQL As String 4: SQD = SFDFCT [FirstName] + + [LastName] As & 5: [Contact Name] From CONTACTS WHFDF [DastName] = & 6 : DastName & 7: Cal et.Open (SQL, CurrentProj ect. Connection, dbOpenDynami с) 8: dSet.BOF An et.EOF) = False) Then 9: FindContact = Contact Name ) 10 Flse 11 FindContact = Запись не найдена! 12 End If 13 RecordSet.Close 14 Set RecordSet = Nothing 15 End Function
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |