Разработка программно-информационного ядра системы
Содержание этого раздела отражает результаты разработки программно-информационного ядра системы, в состав которого входит база данных и программные модули.
Создание программных модулей следует начинать со структуры представления данных в системе, которую в полной мере отображает физическая модель данных.
Представить физическую модель данных, указав имя файла, структуру файла и содержимое полей. Указать справочники, которые должны быть заполнены перед установкой программного компонента, указать временные файлы, например таблицы поиска, отчётные таблицы.
После того как вы спроектировали БД на бумаге, ее можно создать в интерактивном режиме, используя диалоговые средства Visual FoxPro или команду CREATE DATABASE. Если вы разрабатываете пользовательское приложение, обязательно создавайте БД, используя Project Manager.
В Project Manager выберите вкладку Data, затем в списке пункт Database. Нажмите кнопку New. Откроется Конструктор БД, который показан на рис. 6 на этом же рисунке вы найдете необходимые пояснения для работы с ним.
Рис.6
Вновь созданная БД пуста и не содержит никаких таблиц и других объектов.
В таблице 3 приведены команды и функции, которые вы можете использовать для программного управления БД и их объектами.
Таблица 3
ADATDBASE() | CREATE VIEW | MODIFY CONNECTION |
ADBOBJECTS() | DBC() | MODIFY DATABASE |
ADD TABLE | DBGETPROP() | MODIFY PROCEDURE |
ALTER TABLE | DBSETPROP() | MODIFY STRUCTURE |
APPEND PROCEDURES | DELETE CONNECTION | MODIFY VIEW |
CLOSE DATABASE | DELETE DATABASE | OPEN DATABASE |
COPY PROCEDURES | DELETE VIEW | PACK DATABASE |
CREATE MODIFY | DISPLAY DATABASE | REMOVE TABLE |
CREATE DATABASE | INDBC() | SET DATABASE |
CREATE SQL VIEW | LIST DATABASE | VALIDATE DATABASE |
CREATE TABLE |
При создании БД не забудьте, что важной особенностью Visual FoxPro является то обстоятельство, что каждая таблица может существовать в одном из двух состояний: либо в виде свободной таблицы, представляющей собой файл DBF, не ассоциированный ни с одной из БД, либо в виде таблицы БД – файла DBF, включенного в какую-либо БД. При этом, если таблица включена в БД, то она не можетбыть включена ни в какую другую БД. Для таблиц, ассоциированных с БД, можно установить ряд свойств, которыми не могут обладать свободные таблицы. Это такие свойства, как триггеры, правила на уровне полей и записей и постоянные отношения между таблицами.
Вы можете включить таблицы в БД, создав их внутри открытой БД или добавив туда уже существующие таблицы.
Как добавить существующую таблицу в БД? В Project Manager выберите пункт Tables из вкладки All или Data, затем выполните команду Add. Программным путем то же самое можно сделать, выполнив следующие команды:
OPEN DATABASE auto_store && открывается БД
&& AUTO_STORE
ADD TABLE salesman && в нее добавляется таблица SALESMAN
Чтобы сделать таблицу частью БД, необходимо явно включить ее в БД. Изменение структуры свободной таблицы не вносит ее автоматически в БД, даже если сделать это при открытой БД с помощью команды MODIFY STRUCTURE.
Не забудьте, что вы можете ассоциировать таблицу только с одной БД. Если данные из какой-то таблицы необходимо использовать в нескольких БД, для исключения дублирования информации наиболее простой путь – не включать эту таблицу ни в какую БД, а оставить ее свободной. Данные из существующего файла DBF можно использовать, не включая его в БД. В то же время не представляет труда использовать информацию и из таблицы, расположенной в другой БД.
Как получить доступ к таблице из другой БД? Создайте в БД представление, включающее нужную таблицу. Или получите доступ к таблице с помощью команды USE и разделительного символа «!». Символ «!» надо использовать для ссылки на таблицу из другой, не текущей, БД. Например, если вы хотите просмотреть таблицу Salesman из БД Auto_Store, выполните следующие команды.
USE Auto_Store! Salesman
BROWSE
Когда вы добавляете таблицу в БД, Visual FoxPro изменяет заголовок файла таблицы, включая туда информацию о пути и имени файла БД. Этот путь и имя файла БД называются обратной связью, поскольку эта информация связывает таблицу с владеющей ею БД. Процесс удаления таблицы из БД не только удаляет ссылку на таблицу и ассоциированную с ней информацию из словаря БД Visual FoxPro, но и изменяет обратную связь, чтобы отметить таблицу как свободную.
Вы можете удалить таблицу из БД интерактивно или с помощью команды REMOVE TABLE. При удалении таблицы из БД вы можете и физически удалить файл таблицы с диска. В Project Manager выберите имя таблицы и нажмите кнопку Remove. Если вы работаете в Конструкторе БД, выделите имя таблицы и выберите команду Remove из меню Database. Последовательность действий по удалению таблицы Salesman из БД Auto_Store программным путем показана в следующем примере:
OPEN DATABASE Auto_Store
REMOVE TABLE Salesman
Удаление таблицы из БД автоматически не удаляет файл таблицы. Если вы хотите одновременно удалить таблицу из БД и DBF-файл с диска, включите опцию DELETE в команду REMOVE TABLE.
Удалить БД с диска можно с помощью Project Manager или командой DELETE DATABASE.
Для удаления БД с диска всегда используйте один из вышеуказанных методов. Удаление БД с помощью диспетчера проектов или по команде DELETE DATABASE автоматически обновляет обратные связи в файлах таблиц БД. Если вы удалите БД с помощью какой-нибудь утилиты работы с файлами, то в таблицах, принадлежащих БД, останутся ссылки на уже несуществующую БД, и вы не сможете их использовать.
Команда DELETE DATABASE не удаляет файлы таблиц с диска, а только помечает их как свободные. Если вы хотите одновременно с БД удалить и файлы таблиц, включите опцию DELETE DATABASE в команду DELETE DATABASE.
В приложении Visual FoxPro можно использовать несколько БД одновременно. Для этого либо одновременно откройте все требуемые вам БД, либо сошлитесь на таблицы в закрытых БД, как это было показано ранее. Если одновременно открыто несколько БД, вы можете установить текущую БД и выбирать таблицы из нее без указания конкретной ссылки.
Как открыть несколько БД? В Project Manager выделите имя БД и нажмите кнопку Modify или Open, в зависимости от вашей цели. Или последовательно используйте команду OPEN DATABASE.
Когда вы открываете новую БД, старые не закрываются. Все уже открытые БД так и остаются открытыми, а последняя открытая БД становится текущей.
Все таблицы и другие объекты, которые вы создаете, автоматически становятся частью текущей БД. Команды и функции, такие как ADD TABLE и DBC(), манипулирующие с открытыми БД, оперируются с текущей БД.
Вы можете объявить текущей любую из открытых БД с помощью раскрывающего списка на стандартной панели инструментов Visual FoxPro или командой.
В следующем примере открываются три БД, первая объявляется текущей, и ее имя отображается на экране с помощью функции DBC():
OPEN DATABASE Auto_Store
OPEN DATABASE Connect_Data
OPEN DATABASE Count_Data
SET DATABASE TO Auto_Store
? DBC ()
В Visual FoxPro одна или несколько БД открываются автоматически при выполнении запроса или формы, в которых используются несколько БД. Для того чтобы не потерять управление в программе, явно объявите текущую БД.
Как выбрать таблицу из текущей БД? Выполните команду USE со знаком вопроса «?». В диалоговом окне Use выберите нужную таблицу. Если вам нужна таблица, не входящая в открытую БД, в диалоговом окне Use выберите опцию Other.
Закрыть БД можно в Project Manager или командой CLOSE DATABASE. В Project Manager выделите имя БД и выберите команду Close. В следующем примере закрывается БД Auto_Store:
SET DATABASE TO Auto_Store
CLOSE DATABASE
Оба указанных способа закрывают БД автоматически. Еще один способ закрыть БД и другие открытые объекты – включить предложение ALL в команду CLOSE.
Выполнение команды CLOSE DATABASE в окне Command не приведет к закрытию БД, если она была открыта одним из следующих способов:
· в Project Manager в расширенном режиме просмотра содержимого БД;
· формой, запущенной в собственной Data Session.
В этих случаях БД остается открытой до тех пор, пока она не будет закрыта в Project Manager или пока не будет закрыта соответствующая форма.
В Visual FoxPro текущая БД используется в качестве первичной области видимости для именованных объектов типа таблиц. Когда БД открыта, любые запрашиваемые объекты типа таблиц, представлений, связей ищутся сначала в текущей БД. Если объект не найден, поиск продолжается в пути по умолчанию.
Например, если таблица Model ассоциирована с БД Auto_Store, приведенные ниже команды всегда найдут таблицу Model в БД.
OPEN DATABASE Auto_Store
ADD TABLE C:\MYPROJECT\MODEL.DBF
USE Model
В следующем примере поиск таблицы Body производится в текущей БД: USE Body
Если таблица Body не принадлежит текущей БД, ее поиск вне БД будет происходить в пути по умолчанию.
Всегда можно указать полный путь к файлу таблицы, чтобы открывать ее вне зависимости от ее принадлежности к какой-либо БД, например, если вас не устраивают изменения в местонахождении таблиц. Однако ссылки на таблицу только по ее имени могут значительно повысить производительность приложения, поскольку в Visual FoxPro доступ к именам таблиц из БД осуществляется гораздо эффективней, чем по полному пути файла.
Когда вы создаете БД, Visual FoxPro создает и открывает для использования файл с именем БД и расширением DBC (DataBaseContainer). В этом файле хранится вся информация о БД, включая имена файлов и объектов, ассоциированных с ней. Сами объекты верхнего уровня типа таблиц или полей в файле DBC не хранятся. Хранятся только пути к файлам таблиц.
Для того чтобы увидеть структуру БД, вы можете пролистать файл БД, посмотреть схему, проверить БД и даже расширить файл DBC.
Схема БД – это визуальное представление структур таблиц и установленных отношений между ними. Схема открытой БД отображается в окне Конструктора БД.
Конструктор БД является концептуальным представлением схемы БД, однако вам может потребоваться просмотреть содержимое файла БД непосредственно. Можно сделать это, выполнив команду USE для файла DBC неоткрытой БД. В следующем примере открывается окно просмотра, куда выводится содержимое файла БД Auto_Store в табличном виде.
CLOSE DATABASE Auto_Store
USE AUTO_STORE.DBC EXCLUSIVE
BROWSE
Не используйте команду BROWSE для модификации файла БД, если вы не знакомы со структурой файла DBC. Любая ошибка при изменении файла DBC может разрушить БД и привести к потере информации.
В каждом файле DBC имеется поле примечаний с именем User, в котором вы можете хранить собственную информацию о каждой записи БД. Вы можете также расширить файл DBC, добавив туда поля, чтобы удовлетворить свои собственные потребности разработчика. Для изменения структуры файла DBC вы должны открыть его для монопольного использования.
Как добавить поле к файлу DBC?
1. Откройте файл DBC для монопольного доступа командой USE.
2. Выполните команду MODIFY STRUCTURE.
При добавлении нового поля в файл БД начинайте имя этого поля с символов «U_» для обозначения поля пользователя. Это поможет вам избежать конфликтов с любыми возможными изменениями структуры файла DBC.
Не изменяйте системные поля в файле DBC. Любые такие изменения могут нарушить целостность БД.
Вы можете проверить целостность БД с помощью команды VALIDATE DATABASE.
В следующем примере файл БД Auto_Store проверяется на целостность:
OPEN DATABASE Auto_Store EXCLUSIVE
VALIDATE DATABASE.
Проверка БД гарантирует, что строки файла БД хранят правильные метаданные о базе.
При разработке пользовательского интерфейса желательно применять однотипные экранные формы и подсказки. Однако помните, что чрезмерная загруженность плоскости экрана различными рода подсказками или экранными элементами приводит к обратному результату, а именно к снижению производительности труда пользователя.
Разработку программного приложения начнем с систематизации данных о способах создания новой формы в Visual FoxPro. Таких способов достаточно много:
· Использование Мастера форм. Это эффективный способ создания простых форм или «заготовок» для более сложных форм.
· Выбор команды New из меню File главного меню Visual FoxPro. В открывшемся диалоговом окне New необходимо щелкнуть на кнопке Form.
· Выполнение команды CREATE FORM.
· В Project Manager выделение пункта Form и выбор New.
Независимо от выбранного способа загружается Конструктор формы, окно которого с основными визуальными инструментами представлено на рис.7. При этом в главном меню Visual FoxPro появляется меню Form, с помощью которого можно выполнить следующие действия:
· New property — позволяет добавить свое свойство для создаваемой формы.
· New method — позволяет добавить свой метод для создаваемой формы.
· Edit Property/Method — позволяет удалить добавленные свойства и методы из описания формы или изменить комментарий.
· Include File — позволяет определить файл, содержащий директивы компилятора.
· Create Form Set — создает набор форм — объект, который будетявляться контейнером по отношению к нескольким формам и панелям инструментов.
· Remove Form Set — удаляет набор форм, если он создан.
· Add New Form — позволяет добавить форму в набор форм.
· Remove Form — удаляет форму из набора форм.
· Quick Form — запускает Построитель формы (Form Builder), c помощью которого можно быстро создать простую форму для работы с данными из одной таблицы и в последующем использовать как заготовку в Конструкторе формы. Построитель формы представляет собой упрощенную версию Мастера формы.
· Run Form — запускает разрабатываемую форму.
Для ускорения разработки формы служат несколько панелей инструментов.
Панель инструментов Form Designer предназначена для быстрого перехода илизапуска различных элементов Конструктора формы. Она появляется автоматически при запуске Конструктора формы. Назначение кнопок на этой панели описано на рис. 4.
Рис. 7
Панель инструментов Layout предназначена для быстрого изменения расположения объектов на завершающем этапе создания формы. Перед выполнением какого-либо действия предварительно нужно выбрать объект или группу объектов, удерживая клавишуShift и щелкая на них мышкой. Операции выравнивания, которые выполняются относительно группы объектов, за образец берут самый большой размер.
Панель инструментов Form Controls позволяет включать в разрабатываемую или проектируемую форму тот или иной элемент управления.
Перед тем как вы начнете разрабатывать формы для своего приложения, не поленитесь заглянуть в диалоговое окно Options меню Tools (рис.8). Выберите вкладку Forms и установите на ней требуемые значения для расположенных там параметров. Для облегчения расположения элементов управления на форме включите вывод координатной сетки. Наиболее удобный шаг координатной сетки — от 6 до 10. В качестве единицы измерения установите пикселы — Pixels. В опции Maximum Design Area установите разрешение 640 х 480, — это означает, что разработанная вами форма наверняка поместится на экране, имеющем стандартное разрешение VGA.
Рис. 8
Нужные значения свойств можно установить в окне Properties: «All», «Data», «Methods», «Layout», «Other». Элементы окна Properties показаны на рис.9.
Вкладка «All» содержит все элементы, включенные в остальные разделы окна. Убедимся с помощью окна Properties, что форма имеет следующие свойства:
AutoCenter = .Т. — определяем автоматическое центрирование объекта Form;
BackColor = RGB(176,176,176) — задаем цвет фона;
Caption = Прием заказов — задаем текст, отображаемый в названии объекта;
Closable = .F. — ликвидируем возможность закрытия объекта Form, двойным щелчком кнопки управляющего меню, или выбора в этом меню команды Close;
Height = 300 — задаем ширину объекта на экране;
Icon = "c:\mybook\sample\netl3.ico" — задаем значок, который отображается на этапе выполнения для объекта Form при его свертывании;
MaxButton = .F. — ликвидируем доступ к кнопке Maximize;
MinButton = .F. — ликвидируем доступ к кнопке Minimize;
ShowTips = .Т. — определяем возможность вывода подсказки для элементов управления заданного объекта;
Width = 540 — задаем ширину объекта.
Рис.9
Следующим этапом мы включаем необходимые элементы управления, такие как Label, Text Box, Command Button, Combo Box, Shape, и определяем уже для вновь созданных элементов их свойства.
Для управления работой формы создадим специальный элемент управления. Скорее всего, мы будем использовать его и в других формах. В этом случае самым лучшим решением будет создание нового класса mygo на базе класса Container (контейнера). После этого мы сможем легко включить в нашу форму собственный объект mygo1, который основан на базе класса mygo. Прервем ненадолго описание процесса создания формы, чтобы уделить необходимое внимание новому классу.
При создании классов в Конструкторе класса необходимо определить базовый класс для нового класса и задать имя библиотеки, в которую этот класс будет записан. Для создания класса необходимо выбрать команду New из меню File главного меню Visual FoxPro. В открывшемся диалоговом окне New щелкаем на кнопке выбора Class и нажимаем кнопку New File. В окне New Class вводим имя класса (Class Name), выбираем имя класса, на котором будет основан создаваемый класс (Based On), и имя библиотеки (Store In), в которой будет храниться новый класс. Либо в Project Manager выбрать вкладку Classes и нажать кнопку New (рис. 10).
Рис.10
Имя нашего класса mygo, базовый класс Container и имя библиотеки, в которую будет включен класс, — Roub.vcx.
Вы можете включать в форму объекты своего класса прямо из панели инструментов Form Controls, если предварительно зарегистрируете класс.
Зарегистрировать библиотеку классов в Конструкторе формы можно следующим образом:
1. Нажмите кнопку View Classes панели инструментов Form Controls.
2. В открывшемся меню выберите команду Add.
3. В диалоговом окне Open укажите библиотеку классов и нажмите кнопку Open.
Класс mygo содержит кнопки для перемещения указателя записи на первую запись таблицы, на предыдущую запись таблицы, на следующую запись таблицы, на последнюю запись таблицы, а также кнопки поиска, добавления новой записи, удаления текущей записи, сохранения изменений, отмены изменений и кнопку выхода из формы. В таблице 4 приведены имена элементов управления в классе mygo и значения свойства ToolTipText для каждого объекта.
Таблица 4
Объект | Значение |
Com 1 | Первая запись |
Com 2 | Назад |
Com 3 | Поиск |
Com 4 | Вперед |
Com 5 | Последняя запись |
Com 6 | Добавить |
Com 7 | Удалить |
Com 8 | Сохранить |
Com 9 | Отменить |
Com 10 | Выход из формы |
Добавляем последовательно два новых метода для нашего класса, my_show_s_u и myrefresh, выбрав в меню Form команду New Method.
В код метода my_show_s_u запишем следующие строчки:
ThisForm.mygol.Com8.Enabled = .F.
ThisForm.mygol.Com9.Enabled = .F.
MyUpdate = 0
IF Del_ = 0
ThisForm.mygol.Myrefresh
ELSE
Del_ = 0
ENDIF
В код метода myrefresh запишем:
ThisForm.Textl.Refresh
ThisForm.Text2.Refresh
ThisForm.Text3.Refresh
ThisForm.Text4.Refresh
ThisForm.Refresh_list
В код события Click для кнопки Com1 запишем:
GO TOP
ThisForm.mygol.Com1.Enabled=.F.
ThisForm.mygol.Com2.Enabled=.F.
ThisForm.mygol.Com4.Enabled=.T.
ThisForm.mygol.Com5.Enabled=.T.
ThisForm.mygol.MyRefresh
В код события Click для кнопки Com2 запишем:
IF BOF()=.F.
SKIP -1
ThisForm.mygol.Com4.Enabled=.T.
ThisForm.mygol.Com5.Enabled=.T.
ELSE
ThisForm.mygol.Com1.Enabled=.F.
ThisForm.mygol.Com2.Enabled=.F.
GO TOP
ENDIF
ThisForm.mygol.MyRefresh
В код события Click для кнопки СоmЗ запишем:
DO FORM Find_ord.scx
В код события Click для кнопки Соm4 запишем:
IF EOF()=.F.
ThisForm.mygol.Coml.Enabled=.T.
This Form.mygol.Com2.Enabled=.T.
SKIP 1
IF EOF()=.T.
ThisForm.mygol.Com4.Enabled=.F. ThisForm.mygol.Com5.Enabled=.F.
GO BOTTOM
ENDIF
ELSE
ThisForm.mygol.Com4.Enabled=.F.
This Form.mygol.Com5.Enabled=.F.
GO BOTTOM
ENDIF
ThisForm.mygol.MyRefresh
В код события Click для кнопки Com5 запишем:
GO BOTTOM
ThisForm. mygol .Com1. Enabled= .Т.
ThisForm.mygol.Com2.Enabled=.T.
ThisForm.mygol.Com4.Enabled=.F.
This Form.mygol.Com5.Enabled=.F.
This Form.mygol.MyRefresh
В код события Click для кнопки Соm6 запишем:
INSERT INTO order_view (key_salman, key_customer, key_model) ;
VALUES (order_view.key_salman, order_view.key_customer, order_view.key_model)
MyUpdate=l
ThisForm.mygol.Com8.Enabled=.Т.
ThisForm.mygol.Com9.Enabled=.Т.
ThisForm.Textl.Visible=.F.
This Form.mygol.MyRefresh
В код события Click для кнопки Соm7 запишем:
Answer_d = MESSAGEBOX("Удалить данную запись?",4+32+256, "Вопрос")
IF Answer_d=6
DELETE
Del_=1
SKIP 1
IF EOF ()=.T.
GO BOTTOM
ENDIF
MyUpdate=l
ThisForm.mygol.Com8.Enabled=.T.
This Form.mygol.Com9.Enabled=.Т.
This Form.mygol.MyRefresh
ENDIF
В код события Click для кнопки Com8 запишем:
=TABLEUPDATE (.Т.,.Т.)
This Form.mygol.My_Show_s_u
В код события Click для кнопки Com9 запишем:
=TABLEREVERT (.Т.)
ThisForm.mygol.My_Show_s_u
В код события Click для кнопки Com 10 запишем:
IF MyUpdate=l
Answer_s_u = MESSAGEBOX("Сохранить изменения?",4+32"Вопрос")
DO CASE
CASE Answer_s_u=6 &&Да
=TABLEUPDATE (.Т.,.Т.)
CASE Answer_s_u=7 &&Нет
=TABLEREVERT (.Т.)
ENDCASE
ThisForm.mygol.My_Show_s_u
ENDIF
ThisForm.Release
В разделе следует:
· описать используемые методы программирования в выбранной среде;
· проанализировав технологическую цепочку обработки информации и поставленные задачи, разработать алгоритм программы;
· представить структуру модулей приложения, которые обычно объединяются через главное меню.
Основное назначение меню заключается в том, чтобы дать возможность пользователю получить легкий доступ ко всем элементам прикладной программы. Следовательно, меню должно отображать не функциональную схему вашей программы и сложные взаимосвязи между ее блоками, а соответствовать логике работы пользователя. При разработке меню следует придерживаться следующих принципов:
· заголовок меню должен включать максимально ясную информацию о его назначении. Старайтесь использовать общеупотребительные термины, не используйте легкозабываемые сокращения;
· структура меню должна соответствовать частоте выполнения тех или иных действий, логической последовательности их выполнения или, в крайнем случае, хотя бы алфавитному порядку. В то же время, если ваше меню насчитывает более 8 команд, алфавитный порядок их расположения может оказаться наиболее эффективным;
· старайтесь выделять функционально связанные группы команд с помощью разделителей;
· избегайте чрезмерно длинных списков команд в меню, делите такие списки на подменю по функциональным признакам. Во всяком случае, категорически избегайте создавать в меню списки команд, не умещающиеся на экране;
· для часто используемых команд в меню определяйте горячие клавиши. Это позволит пользователю выполнять такие команды, не отрывая рук от клавиатуры.
Для разработкименю в Visual FoxPro проще всего использовать Конструктор меню (Menu Designer). С помощью Конструктора меню можно не только разрабатывать меню для пользовательского приложения, но и настраивать меню Visual FoxPro для наиболее эффективной работы программиста.
Для выполнения каких-либо действий при выборе пользователем команд меню необходимо в колонке Result для каждой команды меню назначить команду Visual FoxPro, функцию или процедуру. Для назначения команды Visual FoxPro в столбце Result выберите пункт Command и наберите соответствующую команду текстовом поле справа. Например, DO Log_user. Если указанная в этой команде процедура находится в блоке Cleanup Конструктора меню (о нем мы расскажем чуть позднее), то команду следует записать в виде: DO Log_user IN Main, где — Main это имя файла меню.
Для задания при выборе команды меню выполнения какой-либо процедуры, в случае, когда меню не имеет подменю, необходимо в колонке Result выбрать пункт Procedure. Щелкнуть на кнопке Create и в появившемся окне поместить необходимый код.
В ряде случаев с помощью команд меню могут выполняться какие-то сходные для всех команд этого меню действия, не требующие написания большого объема кода. В этом случае мы можем задать при выборе команды меню выполнение одной процедуры для меню, имеющего подменю. Для этого все команды меню должны в колонке Result иметь пункт Ваг#, который не предусматривает привязки к команде какого-то действия. В списке Menu Level выберем соответствующий уровень меню. Из меню View Visual FoxPro выберем команду Menu Options, после чего на экране появится одноименное диалоговое окно. Нажмем кнопку Edit и наберем код в соответствии с приведенным ниже шаблоном:
<Код, выполняемый при выборе любой из команд>
DO CASE
CASE BAR () = 1
<Код, выполняемый для первой команды в меню>
CASE BAR () = 2
< Код, выполняемый для второй команды в меню>
. . .
ENDCASE
Функция ВАR() возвращает номер выбранной команды меню. Вы можете при необходимости присвоить свои номера командам меню, использовав поле справа от колонки Result.
Общие установки для системы меню можно выполнить, выбрав из меню View Visual FoxPro команду General Options. После появления диалогового окна с таким же названием, приведенного на рис.11, можно написать программный код, который будет выполняться перед расположением меню на экране, выбрав поле проверки Setup. Процедуры, которые вы используете для выполнения команд меню, и действия, которые необходимо выполнить после исчезновения меню с экрана, можно записать, выбрав поле проверки Cleanup. С помощью группы кнопок выбора Location можно задать условия расположения меню после его запуска:
· кнопка Replace — заменяет существующую систему меню.
· кнопка Append — добавляет данное меню к существующей системе.
· кнопка Before — располагает меню перед указанным в появляющемся справа списке меню.
· кнопка After — располагает меню после указанного в появляющемся справа списке меню.После запуска пользовательского меню вернуться к главному меню Visual FoxPro можно с помощью команды SET SYSMENU TO DEFAULT.
Если ваша пользовательская программа будет работать в виде самостоятельного модуля (ЕХЕ-файл) и вы планируете использовать меню в качестве главной программы вашего приложения, поместите команду READ EVENTS в блоке процедур Cleanup, а для команды меню, обеспечивающей прекращение работы приложения, задайте команду CLEAR EVENTS.
Рис.11
В разделе следует указать методику разработки приложения по каждому модулю. Привести описание обработчиков событий, которые наиболее часто встречаются в приложении.
Желательно использовать объектно-ориентированный метод программирования с SQL-запросами (использование множества таблиц в одном запросе).
Соединение таблиц
Предположим, нужно установить связь между продавцами (Salespeople) и покупателями (Customers) в соответствии с местом их проживания, чтобы получить все возможные комбинации продавцов и покупателей из одного города. Для этого необходимо взять продавца из таблицы Salespeople и выполнить по таблице Customes поиск всех покупателей, имеющих то же значение в столбце city. Это можно сделать, введя следующую команду:
SELECT Customers.cname, Salespeople.sname, Salespeople.city;
FROM Salespeople, Customers;
WHERE Salespeople.city = Customers.city
Операция соединения таблиц посредством ссылочной целостности
Эта операция применяется для использования связей, встроенных в базу данных. В предыдущем примере связь между таблицами была установлена с помощью операции соединения. Но эти таблицы уже связаны по значениям полем snum. Такая связь называется состоянием ссылочной целостности. Стандартное применение операции соединения состоит в извлечении данных в терминах этой связи. Чтобы показать соответствие имен покупателей именам продавцов, обслуживающих этих покупателей, используется следующий запрос:
SELECT Customers. cname, Salespeople. Sname;
FROM Customers, Salespeople;
WHERE Salespeople.sname = Customers.sname
Эквисоединение и другие виды соединений
Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением.
SELECT sname, cname
FROM Salespeople, Customers
WHERE sname < cname
AND rating < 200;
Команда генерирует все комбинации имен продавцов и покупателей так, что первые предшествуют последним в алфавитном порядке, а последние имеют рейтинг меньше чем 200.
Соединение более чем двух таблиц
Можно конструировать запросы путем соединения более чем двух таблиц.
Предположим, нужно найти все заявки покупателей, не находящихся в том же
городе, что и их продавец. Для этого потребуется связать все три рассматриваемые таблицы:
SELECT sname, cname, Orders.cnam, Orders.sname;
FROM Salespeople, Customers, Orders;
WHERE Customers.city <> Salespeople.city;
AND Orders.cname = Customers.cname AND Orders.sname = Salespeople.sname
Вложение запросов
Необходимо извлечь все заказы из таблицы Orders, учитывая данные таблицы Salespeople.
SELECT *;
FROM Orders WHERE sname =;
(SELECT sname;
FROM Salespeople;
WHERE sname = ‘Ivanov’)
В результате выбранной оказывается единственная строка с sname = 1004. Однако вместо простого вывода этого значения SQL подставляет его в предикат основного запроса вместо самого подзапроса, теперь предикат читается следующим образом:
WHERE sname = 1004
Затем основной запрос выполняется как обычный, и его результат точно такой же. Подзапрос должен выбирать один и только один столбец, а тип данных этого столбца должен соответствовать типу значения, указанному в предикате. Часто выбранное поле и это значение имеют одно и то же имя (в данном случае, sname).
DISTINCT с подзапросами
В некоторых случаях можно использовать DISTINCT для гарантии получения единственного значения в результате выполнения подзапроса. Предположим, нужно найти все заказы (orders), с которыми работает продавец, обслуживающий покупателя Levin (cname = 2001). Вот один из вариантов решения этой задачи:
SELECT *;
FROM Orders;
WHERE sname=;
(SELECT DISTINCT sname FROM Orders WHERE cname = 2001)