Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
16.03.2016
Размер:
20.6 Mб
Скачать

Часто задаваемый вопрос. Запуск других Windows-программ

Как мне открыть Word (или Excel, или Блокнот (Notepad) или танцевальную видеоигру Dance Dance Revolution)?

В язык Visual Basic включена функция shell, которая позволяет запускать другую про­грамму. Для применения функции Shell необходимо задать полный путь, указываю­щий на файл программы. Вот приведен пример запуска Windows-программы Калькуля­тор:

Shell "C:\Windows\calc.exe"

Когда вы применяете функцию shell, ОС Windows запускает запрошенную програм­му, а ваш код продолжает выполняться. Но у вашего программного кода нет реальной возможности взаимодействовать с программой. Вы не можете заставить ее сделать что-либо или выяснить, что она закрыта.

Shell кажется удобной функцией, но у нее есть существенная проблема. Для того чтобы использовать функцию Shell, нужно знать точное местонахождение программы. Вы не можете просто сказать: "Запусти Microsoft Word" или "Открой этот документ". Вместо этого вы должны глубоко зарыться в файловую систему жесткого диска, чтобы найти файл нужной программы (который обычно находится где-то в зоне вашего компьютера с именем Program Files). Хуже того, после того как вы заставили функцию Shell рабо­тать на вашем компьютере, нет никакой гарантии, что она заработает на какой-либо дру­гой машине — в конце концов, та же программа может быть установлена где-то совсем в другом месте.

И как с этим бороться? Можно воспользоваться гиперссылкой, которая запускает нуж­ную программу автоматически, если по ссылке щелкнуть кнопкой мыши. Но некоторые программы, включая других членов семейства Microsoft Office, предлагают лучший ва­риант. Они предоставляют собственные объекты, которыми можно манипулировать в коде на языке Visual Basic. Благодаря этим объектам можно применять эти программы, не беспокоясь об их местонахождении. Вы конечно же можете делать с ними гораздо больше, задавая различные свойства и вызывая разнообразные методы.

Можно заставить программу Word открыть документ, добавить в него некоторый текст, отправить 10 копий на принтер и затем завершить программу.

Объекты, реализующие этот процесс, не рассматриваются в данной книге, но далее при­веден очень простой пример, который запускает программу Word, выводит на экран ок­но программы и загружает в нее документ GothicWedding.doc:

Dim Word As Object

Set Word = CreateObject("Word.Application")

Word.Visible = True

Word.Documents.Open CurrentProject.Path & "\GothicWedding.doc"

Если эта технология заинтересовала вас, обратитесь к справочной системе программы Word, из нее можно узнать гораздо больше об объектной модели Word. Другой полез­ный ресурс — Microsoft's Office Developer Center (Центр разработчиков Microsoft Office) на Web-сайте http://msdn.microsoft.com/office.

Объект DoCmd

Объект DoCmd — единственный наиболее полезный объект в мире программирования Access. Он обеспечивает "покупку всего нужного в одном месте" для самых разнообразных задач, таких как открытие форм и отчетов, запуск других программ, поиск записей и выпол­нение макросов.

В отличие от виденных вами ранее объектов, у объекта DoCmd нет никаких свойств. Вме­сто этого он состоит из методов, выполняющих разные действия. Если нужно открыть фор­му с именем ProductCatalog, можно использовать метод OpenForm следующим образом:

DoCmd.OpenForm "ProductCatalog"

Как большинство методов объекта DoCmd, OpenForm может использовать несколько не­обязательных параметров. Visual Basic подскажет, отобразив список возможных параметров в процессе ввода имени метода. Далее показан пример, в котором пропущены второй и тре­тий параметры (обратите внимание на запятые без значений между ними), но задается фильтр в четвертом параметре и режим данных в пятом:

DoCmd.OpenForm "ProductCatalog", , ,"ID=5", acFormReadOnly

Эта команда открывает форму ProductCatalog, применяет фильтр для вывода на экран одной записи с ID (Код), равным 5, и использует режим "только чтение" для запрета каких-либо изменений.

Примечание

В данном примере используется константа acFormReadOnly. Константы — это числовые значения, которым присвоены более информативные имена. Таким образом вместо запомина­ния числа, обозначающего режим "только чтение", можно применять более осмысленную кон­станту acFormReadOnly. Всегда, когда встречается переменная, начинающаяся с ас или vb, и вы ее не создавали сами, знайте, что это константа. Конечно, для того чтобы пользоваться константами, нужно все-таки знать их имена, но в этом может помочь средство IntelliSense, как показано на рис. 17.8.

Рис. 17.8. Когда вы добираетесь до параметра режима данных, редактор Visual Basic выводит на экран список всех допустимых констант, которые можно использовать. Для того чтобы выяснить, что они означают (если это не очевидно), следует обратиться к справочной системе Access

Метод OpenForm может показаться знакомым, потому что вы уже видели такие же функции в макрокоманде ОткрытьФорму (OpenForm) (см. главу 15). В действительности все методы объекта DoCmd соотносятся с макрокомандами, которые вы изучали в главе15. В табл. 17.1 перечислены наиболее полезные методы.

Таблица 17.1. Полезные методы объекта DoCmd

Метод

Описание

ApplyFilter

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

Веер

Производит некоторый сигнал. Обычно используется для привле­чения внимания к возникшей проблеме

Close

Закрывает текущий объект БД (или конкретный объект, который задан)

CopyDatabaseFile

Предоставляет быстрый способ создания резервной копии БД

FindRecord, FindNext и GoToRecord

Предоставляет разные способы поиска нужной записи

Hourglass

Включает отображение указателя мыши в виде песочных часов (или выключает). Применяется для того, чтобы дать знать пользо­вателю о том, что выполняется требующая времени задача и сле­дует остыть

Таблица 17.1 (окончание)

Метод

Описание

OpenForm, OpenQuery, OpenReport и ОреnТаblе

Открывает соответствующий объект БД в нужном вам режиме пред­ставления с параметрами фильтрации и необязательными уточне­ниями. Как вы узнали в главе 15, можно применять макрокоманду ОткрытьОтчет (OpenReport) для печати отчетам команду От-крытьЗапрос (OpenQuery) для выполнения запроса на изменение

Printout

Предлагает один вариант печати данных из текущего объекта БД

Quit

Завершает работу программы Access

RunCommand

Замещающая команда, которая позволяет выполнить различные команды Access, представленные на ленте. Необходимо только задать правильную константу. В разд. "Управление выполнением заказов" далее в этой главе приведен пример, в котором про­граммист применяет метод RunCommand для немедленного со­хранения текущей записи

RunMacro

Выполняет макрос

RunSQL

Выполняет групповой SQL-оператор. Эту команду нельзя исполь­зовать для извлечения данных из вашей БД. Она позволяет вы­полнять команды, которые изменяют записи или таблицы

ShowAllRecords

Удаляет параметры текущего фильтра, поэтому можно увидеть все записи в таблице, форме, запросе или отчете

Преобразование макроса в VB-код

Если хотите узнать больше о языке Visual Basic и объекте DoCmd, можно взять существую­щий макрос и преобразовать его в чистый программный код, подпрограмму. Далее приведе­ны необходимые действия.

  1. В области переходов выберите макрос, который хотите использовать.

  2. Выберите на ленте Работа с базами данных Макрос Преобразовать макросы (Database Tools Macro Convert Macros to Visual Basic). Можно также преобразовать внедренный в форму макрос, открыв форму и выбрав на ленте Работа с базами данных Макрос Преобразовать макросы формы (Database ToolsMacroConvert Form's Macros to Visual Basic).

На экране появится окно с двумя параметрами для выбора (рис. 17.9).

Рис. 17.9. Вы увидите это окно, если попросите программу Access преобразовать макрос FindHayEater

3. Если хотите добавить базовую обработку ошибок, убедитесь в том, что флажок Добавить программу обработки ошибок (Add error handling to generated functions) установлен.

Немного обработки ошибок никогда не помешает.

4. Если хотите включить комментарии макроса в комментарии VB, убедитесь в том, что установлен флажок Добавить примечания макросов (Include macro comments).

Если вы потратили время на добавление пояснительного текста, стоит сохранить его.

5. Щелкните мышью кнопку Преобразовать (Convert).

Программа Access создаст новый модуль для преобразованного кода и даст ему имя, по­добное имени Преобразованный макрос-[ИмяВашегоМакроса] (Converted Macro-[YourMacroName]). Внутри модуля Access создаст функцию с именем как у вашего мак­роса. Если преобразуется группа макросов (см. разд. "Группы макросов" главы 15), Access вставит по одной подпрограмме для каждого макроса в группе.

После завершения процесса преобразования программа Access откроет ваш модуль в ре­дакторе Visual Basic, чтобы вы могли просмотреть код.

В следующем примере показан результат преобразования макроса из главы 15 (приведенного в разд. "Поиск записи" главы 15), который ищет определенный текст в табли­це AnimalTypes:

Function FindHayEater ( )

On Error GoTo FindHayEater_Err

DoCmd.OpenForm "AnimalTypes", acNormal, " ", " ", , acNormal

DoCmd.GoToControl "Diet"

DoCmd.FindRecord "=""hay""", acAnywhere, False, , _

False, acCurrent, False

FindHayEater_Exit : Exit Function

FindHayEater_Err:

MsgBox Error$

Resume FindHayEater_Exit End Function

Вы заметите, что в преобразованном коде интенсивно используется объект DoCmd — действительно почти в каждой строке кода встречается объект DoCmd. Сначала он применяется в методе OpenForm для открытия формы, затем — в методе GoToControl для перехода в поле Diet и, наконец, он ищет первую запись, в которой встречается текст "hay". Эта строка выглядит причудливо, поскольку в ней удваиваются знаки кавычек (""). В языке Visual Basic знаки кавычек имеют особый смысл (они показывают, где начинается и заканчивается текст). Если в текстовом фрагменте вы хотите на самом деле использовать кавычки, нужно поместить знаки кавычек дважды, одни за другими. Стрнно, но правильно.

Завершается код процедурой обработки ошибок, названной FindHayEater__Err, которая просто сообщает о проблеме в окне сообщения и затем завершает работу.

Примечание

Когда макрос преобразуется в программный код, программа Access всегда генерирует функ­цию, а не процедуру. Но функция не возвращает результат, т. к. этого не требуется. (По-видимому, Access действует таким образом, чтобы дать вам возможность позже воспользо­ваться возвращаемым результатом.)

Улучшение работы компании средствами Visual Basic

На протяжении последних 16 глав вы узнали и полюбили БД компании Boutique Fudge, которая представляет собой БД действительных продаж, отслеживающую данные о клиен­тах, товарах и заказах. Однако, несмотря на то, что в БД Boutique Fudge хранится вся необ­ходимая информация, она все еще не полностью интегрирована в повседневную деятель­ность компании. И прежде чем вы попытаетесь это исправить, следует понять, почему выигрыш столь мал.

Большинство людей, работающих в компаниях, подобных Boutique Fudge, не думают о таблицах и операциях над данными (таких как добавление, обновление и удаление записей). Они мыслят задачами, например, размещение заказа, доставка заказа и обработка жалобы клиента.

Многие задачи тесно связаны с операциями над данными и в этом случае у вас нет проблем. Задача "регистрация нового клиента" включает открытие таблицы Customers и последующее добавление новой записи. Следить за ней можно с помощью простой формы. Задача "размещение заказа" немного сложнее. Она включает добавление записей в несколько таблиц (таблицы Orders и OrderDetails) и использование данных из связанных таблиц (таблицы Products и Customers) для заполнения заказа. Можно создать обычную форму для выполне­ния этой работы, но она не будет действовать так, как хотели бы продавцы (рис. 17.10).

То же справедливо и в отношении задачи "доставка заказа". Этой задаче требуется не­сколько шагов — изменение статуса заказа, регистрация отправки заказа, обновления коли­чества единиц товара на складе. Вы можете интерпретировать эту задачу как несколько опе­раций над данными, но гораздо лучше создать единую форму, которая будет заботиться о процессе в целом.

Сейчас очень пригодится VB. С помощью подходящего программного кода вы сможете спроектировать интеллектуальную форму, которая будет соответствовать методам работы сотрудников компании. Интеллектуальная форма — это не просто способ добавления, редак­тирования и удаления записей в таблице — это средство, помогающее вести коммерческую деятельность. В следующих разделах вы увидите, как разрабатывать улучшенные формы с некоторыми программируемыми свойствами. К этим формам относятся следующие:

  • PlaceOrder позволяет создать новый заказ. Она действует в месте с подчиненной формой PlaceOrder_Subform, позволяющей включать отдельные товары в заказ;

  • AddProduct позволяет создать новый товар. Вы можете использовать ее непосредственно из формы PlaceOrder для вставки товара внутрь заказа;

ShipOrders позволяет обновить заказ сведениями о доставке. Она также работает с фор­мой ReviewOrderDetails для вывода на экран компонентов заказа.

Рис. 17.10. Эта форма позволяет добавлять записи в таблицы Orders и OrderDetails. Но ей не хватает нескольких украшений, которые пользователи рассчитывают увидеть на форме для заказа — например, автоматическое заполнение поля с ценой каждого товара, заказанного вами, вычисление промежуточных итогов по мере заполнения заказа и возможность добавить товар на лету

Проверить конечный результат можно с помощью загружаемых из Интернета БД, пред­назначенных для данной главы (см. разд. "Примеры" во введении).

Подсказка

Всегда хорошо называть форму в соответствии с выполняемой ею задачей (размещение зака­за, доставка заказа и т. д.), а не таблицей, которую она использует. Такой подход поможет вам запомнить, кто пользуется каждой формой, поэтому вы сможете приспособить ее для соответ­ствующей аудитории.

Хранение промежуточного итога

Лишь немногие клиенты настолько бесстрашны, чтобы поместить заказ без точных сведе­ний о его стоимости. В типичной форме для заказа в строке отображается стоимость каждо-

го элемента (за счет перемножения цены товара и его количества) и еще более важная ито­говая стоимость заказа (рис. 17.11).

Рис. 17.11. Форма PlaceOrder с промежуточными итогами и общим итогом

Примечание

Форма PlaceOrder также включает несколько уже знакомых вам тонкостей, например, разме­щение адресной информации клиента на отдельной вкладке, перенос автоматически генери­руемых полей (идентификационный номер заказа ID и дата заказа) в нижнюю часть окна, где они не будут никого отвлекать, и установка в их свойстве Блокировка (Locked) значения Да для запрета изменений. В свойстве формы Ввод данных (Data Entry) также установлено зна­чение Да, что позволяет начать создавать новый заказ сразу после открытия формы.

Код не нужен только для строчного итога. Действительно, эту проблему можно решить, добавив элемент управления Поле, использующий следующее выражение в подчиненной форме PlaceOrder_Subform:

=Quantity * Price

Это выражение действует, поскольку нужная информация (поля Price и Quantity) располагается на той же форме, что и вычисляемое поле. А вот общий итог получить не так легко.

Для пущей важности можно соединить это выражение с функцией Format, чтобы быть уверенным в том, что выводится нужное число десятичных знаков и символ валюты ($):

=Format (Quantity * Price, "Currency")

Для вычисления общей суммы необходимо использовать данные полей Quantity и Price в таблице OrderDetails. К сожалению, у формы PlaceOrder нет легкого способа получить эту информацию. Дело не только в том, что она находится где-то еще (на подчиненной фор­ме), но и в том, что она включает несколько отдельных записей. Даже если извлечь данные полей Quantity и Price из подчиненной формы, можно будет получить значения только для текущей записи, а не для всего списка заказанных товаров.

Для решения этой проблемы нужна специализированная функция Access, называемая статистической функцией по подмножеству или функцией обработки набора записей (domain function). Функция по подмножеству может обработать целую таблицу и вернуть одну порцию данных. Дополнительную информацию см. в следующем разделе.

Соседние файлы в папке Управление данными