47
Государственный комитет Российской Федерации по высшему образованию
Волгоградский государственный технический униве...
62 downloads
293 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
47
Государственный комитет Российской Федерации по высшему образованию
Волгоградский государственный технический университет Камышинский технологический институт
Е.Г.Крушель, О.М.Фролова
Система управления базами данных Visual FoxPro5.0 − от начальных навыков к профессиональной работе (Учебное пособие)
Камышин 1999
48
Крушель Е.Г, О.М. Фролова Система управления базами данных Visual FoxPro5.0 - от начальных навыков к профессиональной работе: Учеб.пособие / ВолгГТУ, КТИ, Камышин,1999. - с.109 Пособие предназначено для студентов, изучающих дисциплину “Системы управления базами данных”, а также для лиц, изучающих СУБД самостоятельно. Пособие содержит 2 части и приложение. Часть 1 посвящена изучению основ работы с СУБД “Visual FoxPro5.0” (создание и корректировка файлов базы данных, основные команды СУБД, главные приемы работы с базами - логическое удаление, фильтрация, индексирование), создание проектов и форм. Часть 2 посвящена изложению основ программирования в среде СУБД. Также пользователь ознакомится с элементами визуального программирования в среде Visual FoxPro5.0 (применительно к задачам создания форм отчетов), и некоторыми сервисными функциями, предоставляемыми Visual FoxPro5.0. Хотя описание приемов и техники программирования ведется путем сопоставления с другими языками процедурного программирования, знание этих языков не является обязательным. В данной части рассматривается много примеров, разбор которых помогает студенту быстро научиться составлять программы для СУБД самостоятельно. В конце каждой части приведены задания по самостоятельной разработке программных комплексов. В Приложении приведены варианты контрольных вопросов, семестровых и курсовых работ по дисциплине “Системы управления базами данных”. Предназначено для студентов технических и экономических специальностей, для преподавателей дисциплины “Системы управления базами данных” и для лиц, изучающих СУБД самостоятельно.
ВВЕДЕНИЕ Работа с данными является одним из наиболее массовых занятий специалистов в информационной сфере. Поэтому пакеты прикладных программ для ЭВМ, обслуживающих данные, относятся к числу самых популярных. К настоящему времени известны различные подходы к созданию систем управления базами данных (СУБД) (см. например, [13], [4], где описаны три основные разновидности СУБД - реляционные, иерархические и сетевые). Известно также [4], что для персональных ЭВМ, имеющих сравнительно небольшие ресурсы памяти и невысокое быстродействие, наибольшее распространение получили реляционные СУБД. Теоретические методы построения баз данных, изучение которых предусматривается программой подготовки студентов направления “Экономика и
49
менеджмент” с достаточной полнотой изложены в монографиях и учебных пособиях. В частности, основы реляционной алгебры, используемой при построении реляционных СУБД, подробно описаны во многих учебниках. В частности, основы реляционной алгебры, используемой для построения реляционных СУБД, подробно описаны в [13]. Поэтому вряд ли было бы оправдано написание еще одного пособия на эту тему. Однако изучение дисциплины “Системы управления базами данных” направлено также на освоение практических аспектов – техники работы с распространенными СУБД. Как показывает опыт преподавания данной дисциплины студентам и (в еще большей степени) трудности, которые встречают специалисты при самостоятельном изучении СУБД, имеется потребность в дополнениях к опубликованным материалам. Этой цели служит предлагаемое пособие. В отличие от фундаментальных (см., например, прекрасную книгу [13]) и от документации к программному обеспечению СУБД (типа [5]) читатель вводится в проблематику СУБД постепенно. Основные принципы и приемы работы с СУБД становятся понятными сразу же после прочтения начальных разделов. Читатель быстро сможет начать работу на ЭВМ и затем непрерывно совершенствоваться в технике построения баз данных и в программировании в среде СУБД по мере ознакомления с последующими, более сложными разделами. В качестве конкретной системы управления базами данных для освоения СУБД была взята Visual FoxPro 5.0, которая входит в семейство СУБД, развивающих общую идеологию баз данных dBASE, предложенную специалистами фирмы Ashton Tate. Visual FoxPro 5.0 относится к числу систем управления базами данных, реализующих наиболее распространенные (сегодня) принципы работы с базами данных и принципы программирования. Эти принципы позволяют создавать полезные программы для удобной работы пользователя с базами данных (привыкнем к термину пользовательский интерфейс – т.е. промежуточное звено от пользователя к ЭВМ). При этом создание программ становится доступным «непрограммирующим профессионалам» - т.е. специалистам в областях знаний, для которых расчеты на ЭВМ – не самоцель, а лишь средство для решения текущих задач. Главнейшими из этих принципов являются: 1. Концепция визуального программирования: Вы будете конструировать пользовательский интерфейс «на глаз», а средства обращения к ЭВМ будут создаваться не Вами, а внутренними средствами Visual FoxPro 5.0. Это избавит Вас от огромной работы. Если бы Вы спросили программиста, не пользующегося визуальными средствами, о соотношении затрат времени на создание пользовательского интерфейса и на программирование расчетной части задачи, то скорее всего услышали, что 80-90% времени уходит на «рутину», связанную с интерфейсом, 10-20% уходит на программирование расчетной части. Времени на получение удовольствия от использования программы не остается совсем. Именно экономия 80-90% времени (и последующее использование этого времени на моделирование, расчет различных вариантов и другую творческую работу с готовой программой) обеспечила повсеместное распространение средств визуального программирования. 2. Концепция программирования, управляемого событиями: Вы увидите, что программы, которые вы создадите, управляются Вашими действиями с помощью графических средств – «кнопок», линеек прокрутки, окон и т.д. Ваши действия с этими элементами – «нажатие» рисунка кнопки, «протаскивание» указателя на линейке просмотра и пр. – называются в Visual FoxPro 5.0 и других похожих средствах «событиями» (events), а соответствующая технология программирования – event – driven programming (программирование, управляемое событиями). 3. Концепция объектно-ориентированного программирования: Возможно, Вы с ней уже знакомы. Для тех, кому эта концепция неизвестна, опишем её так: как в обыденной жизни, так и в программировании объектом называется нечто, с чем
50
можно производить групповое действие, не расчленяя его – например, перемещать в пространстве (как автомобиль вместе с водителем и багажом), отражать в зеркале (как человека с окружающей обстановкой), давать имя (как городу в целом, без детализации улиц, домов парков) и т.д. В программировании эта концепция приводит к огромной экономии времени, поскольку позволяет копировать, перемещать, изменять размеры, цвет, шрифт сразу всем элементам, которые входят в объект. Вы уже встречались с концепцией объекта: вспомните, как Вы изменяли шрифт сразу в целом абзаце текста, подготавливаемого в среде редактора Microsoft Word (в данном случае абзац был Вашим объектом, который Вы подвергали групповому действию – изменению шрифта). Возможность реализации этих принципов связана с распространением операционной оболочки Windows, которая содержит графические средства взаимодействия с пользователем. Visual FoxPro 5.0 обращается именно к этим средствам, а Вам остается научиться, во-первых, проектировать пользовательский интерфейс (проще говоря, «рисовать» его путем переноса заготовок на эскиз интерфейса) и, во-вторых, программировать расчетную часть задачи (конечно, вторая задача сложнее). В настоящее время термины база данных и система управления базами данных используются исключительно как относящиеся к компьютерам. В общем смысле термин база данных можно применит к любой совокупности связанной информации, объединенной вместе по любому признаку. Например, в качестве базы данных можно рассматривать расписания движения поездов или книгу регистрации данных, организованных определенным образом. Большинство баз данных, независимо от того, реализованы ли они на компьютере или нет, для хранения данных используют таблицы. В ходе знакомства с Visual FoxPro5.0 читатель часто будет сомневаться в возможности решить нужную ему задачу обработки данных средствами этой СУБД. Но полезно помнить, что уровень услуг, предоставляемых средой Visual FoxPro5.0 как пользователю, так и разработчику прикладных задач, настолько высок, что можно рекомендовать исходить из принципа “Можно всё!”. Пособие содержит две части и приложение. В части 1 приводятся начальные сведения о СУБД, осваивается техника работы в среде Visual FoxPro5.0, описываются наиболее распространенные команды. Излагаются общие принципы работы с данными (фильтрации, логического удаления, индексирования), создание проектов и форм. После освоения материала части 1 (и даже в ходе освоения) читатель обнаружит, что научился решать простые задачи. Часть 2 посвящена изложению основ программирования в среде СУБД. Также пользователь ознакомится с элементами визуального программирования в среде Visual FoxPro5.0 (применительно к задачам создания форм отчетов), и некоторыми сервисными функциями, предоставляемыми Visual FoxPro5.0. Хотя описание приемов и техники программирования ведется путем сопоставления с другими языками процедурного программирования, знание этих языков не является обязательным. В данной части рассматривается много примеров, разбор которых помогает студенту быстро научиться составлять программы для СУБД самостоятельно. В конце каждой части приведены задания по самостоятельной разработке программных комплексов. В приложении приведены варианты контрольных вопросов, семестровых заданий и курсовых работ по дисциплине “Системы управления базами данных”, изучаемой в вузах. Для того чтобы облегчить поиск нужных команд и функций при самостоятельной работе, краткий конспект их описаний выделяется в тексте рамками. Наиболее важные замечания выделяются пометками (вертикальной чертой слева). Такие пометки позволяют быстро просмотреть освоенный текст и создать в памяти читателя как бы его макет.
51
Так как мы старались полнее и доступнее описать работу в Visual FoxPro5.0, то данное пособие адресуется читателям с различной степенью подготовленности (как студентам, избравшим программирование и информатику своей будущей профессией и освоившим специальность в объеме первых двух курсов обучения, так и лицам, имеющим лишь общее понятие о программировании - например, в объеме средней школы). Такое назначение привело к некоторой разнородности языка изложения. Студенты направления “Информатика и вычислительная техника” (как и студенты близких направлений и специальностей - “Техническая кибернетика”, ”Автоматизированные системы обработки информации и управления”, ”Управление в технических системах” и др.) найдут в тексте ассоциации с другими, известными им парадигмами и языками программирования, а также с интегрированными пакетами прикладных программ (в частности, с табличными процессорами). Но эти ассоциации включены не столько для облегчения понимания, сколько для углубления знаний по программированию вообще как научной дисциплине. Поэтому неподготовленному читателю не нужно опасаться непонятных терминов (можно рекомендовать просто не обращать внимания на них - скорее всего, удастся освоить нужный объем материала и без привлечения дополнительных сведений). Для этого в текст включены объяснения даже простейших приемов (их подготовленный читатель, разумеется, пропустит). Материал пособия может быть использован также лицами, самостоятельно изучающими системы управления базами данных. Пособие может оказаться полезным и преподавателям дисциплины “Системы управления базами данных” для разработки сценариев лабораторных работ и курсовых проектов. Успешное освоение материала пособия возможно только при работе за пультом ЭВМ (в режиме “пособие на коленях”). Требования к техническим средствам: IBMсовместимая персональная ЭВМ с объемом оперативной памяти не менее 16 Мбайт. Требования к системному программному обеспечению: операционная система версии не ниже Windows’95. Под управлением этой оболочки должен быть инсталлирован программный комплекс СУБД Visual FoxPro5.0. Требования к подготовке читателя: умение работать за пультом персональной ЭВМ и знакомство (хотя бы самое поверхностное) с операционной системой или ее пользовательской оболочкой. Часть 1. НАЧАЛЬНЫЕ НАВЫКИ РАБОТЫ с СУБД ”Visual FoxPro 5.0” Здесь и далее отдельные шаги по изучению СУБД снабжены номерами. Это облегчит читателю (как студенту, так и преподающему дисциплину “Системы управления базами данных”) дозирование изучаемого материала и планирование использования машинного времени. 1. ЗАПУСК и НАЧАЛО РАБОТЫ с Visual FoxPro 5.0 1.1. Первые девять шагов 1) Подготовка к работе. Во всплывающем меню пиктограммы Visual FoxPro выберите пункт “Свойства”. Перед Вами появиться окно, содержащее несколько вкладок, выберите вкладку под названием “Программа”, где Вы найдете строку, в которой устанавливается рабочий каталог для данной пиктограммы. Это означает, что все создаваемые Вами файлы, содержащие фрагменты Вашей базы данных и программы по умолчанию (т.е. без указаний пути к нужному подкаталогу) будут автоматически записываться в Ваш подкаталог, и не будут смешиваться с файлами Visual FoxPro. Пожалуйста, запомните: никогда не храните пользовательские файлы вместе с файлами систем математического обеспечения, всегда делайте свои подкаталоги. Это поможет Вам:
52
-
-
Избежать случайного удаления ресурсных файлов – трансляторов и служебных файлов; легко делать архивы и копии.
2) В дальнейшем операции п.1 делать будет не нужно, т.к. внесенные Вами изменения будут сохранены. Начинайте работу с п.3. 3) Теперь, после возвращения на рабочий стол, Вы можете запустить Visual FoxPro. При работе с Visual FoxPro версии 5.0 многое из того, с чем Вам придется работать - меню, панели инструментов, окна диалога – покажутся Вам знакомыми, если Вы работаете в среде Windows. Вы можете запустить Visual FoxPro несколькими способами. Рассмотрим два наиболее простых из них. Первый способ состоит в использовании кнопки Пуск и меню Программы заданий. 1. Нажмите кнопку Пуск в нижней части вашего экрана. 2. Выберите команду Программы, и появится меню Программы. 3. Укажите на папку Microsoft Visual FoxPro в меню Программы. 4. Выберите команду Microsoft Visual FoxPro 5.0 папки и нажмите левую кнопку мыши. Второй способ запуска Visual FoxPro из папки, которая создается при установке: 1. Откройте папку “ Microsoft Visual FoxPro”, находящуюся на рабочем столе. 2. Нажмите дважды курсором мыши на пиктограмму Microsoft Visual FoxPro 5.0. Независимо от того, каким из способов вы воспользуетесь, на экране появится приглашение для работы в Visual FoxPro, содержащее варианты предлагаемой работы с приложением: • Great a new project in which you can design, develop, and assemble related files – открывает окно диалога “Greate” для задания имени нового создаваемого проекта; • Discover programming solution by exploring sample applications – открывает справочную систему Visual FoxPro, содержащую описание демонстрационных примеров; • Explore the Visual FoxPro online documentation открывает окно “Online Documentation” с документацией по Visual FoxPro; • Open an existing project - открывает окно диалога “Open” для выбора имени открываемого проекта; • Close this screen - закрывает приглашение и входит в Visual FoxPro; В нижней части окна диалога расположена опция Don’t display this Welcome screen again. При установке этой опции при следующих запусках Visual FoxPro 5.0 на экране не будет отображаться данное приглашение. 4) Выберите опцию Close this screen, и Вы окажитесь в главном окне Visual FoxPro 5.0. Его можно разделить на шесть основных областей: заголовок, строка меню, панели инструментов, строка состояния, рабочая область и командное окно. Заголовок находится в верхней части главного окна. Строка меню содержит меню текущего окна. В Visual FoxPro имеется множество самых разнообразных панелей инструментов, которые содержат набор кнопок, состав которых зависит от назначения панели инструментов. При первом входе в Visual FoxPro на экране находится панель инструментов, называемая стандартной панелью инструментов. Строка состояния расположена в нижней части главного окна. В левой части строки состояния отображается наименование кнопки панели инструментов, на которую указывает курсор мыши, или наименование таблицы. В середине строки состояния могут отображаться номер текущей записи, а также индикатор режима работы. Командное окно обычно располагается в левом верхнем углу главного окна, его размеры можно изменить и оно имеет заголовок в верхней части Command. Если Вы закрыли командное окно, т.е. в главном окне оно отсутствует, то можно восстановить его на экране с помощью позиции системного меню Window/Command Window либо с помощью комбинации клавиш Ctrl+F2. В командное окно вводятся команды.
53
Кроме главного окна, в Visual FoxPro существует ряд окон, которые открываются, и помещаются в главном окне. 5) Освоим технику использования команд в диалоговом режиме (при последовательном вводе команд в командном окне и немедленном их исполнении нажатием ENTER) Можно набирать полное наименование команды, но в Visual FoxPro достаточно набирать четыре начальные буквы команды в любом регистре. Рекомендую всегда набирать только начальную часть команды – при этом: меньше риск сделать грамматическую ошибку, Вы работаете быстрее, экономится память ЭВМ, отведенная для хранения команд.
Наберите команду, изменяющую режим работы Visual FoxPro 5.0. Команды такого типа имеют “родовое” расширение SET И являются мощным средством конфигурации виртуальной машины, реализующей Visual FoxPro 5.0. Первая из команд такого типа: SET STATUS ON/OFF (включение/отключение статусной строки). Наберите SET STAT ON И нажмите ENTER. Вы увидите экран, в нижней строке которого выведена строка состояния (STATUS) Visual FoxPro5.0. Если часть строки окажется закрытой командным окном, переместите его. В статусной строке будет размещаться полезная информация о базе данных, с которой Вы будите работать. В данный момент на ней показаны только: • Текущий дисковод; • Режим, позволяющий вставлять литеры с автоматическим сдвигом текста вправо (Ins), принятый во встроенном текстовом редакторе Visual FoxPro 5.0 по умолчанию. Можно заменить режим, при котором вводимые литеры будут “забивать” имеющиеся нажатием клавиши Insert (при этом Ins в статусной строке погаснет, а курсор будет указан утолщенным). Повторное нажатие Ins возвращает в режим вставки. Наберите SET STAT OFF Произойдет отключение статусной строки. 6) Теперь ознакомимся с очень полезным приемом, позволяющим экономить время, затрачиваемое на набор команд. Visual FoxPro 5.0 хранит в оперативной памяти последние команды (по умолчанию – 20 последних команд), введенных пользователем. Область памяти, в которой хранятся ранее введенные команды, называется буфером команд. При желании Вы можете найти (с помощью мыши, вертикальной линейки просмотра или стрелочных клавиш) в буфере похожую (либо точно совпадающую) команду и выполнить ее. Используем этот прием для возврата к режиму с включенной статусной строкой. Не вводите команду SET STATUS ON. Вместо этого переместите курсор в командном окне мышью или стрелочными клавишами к команде SET STATUS ON , введенной Вами ранее и нажмите ENTER. 7) Ознакомимся с Вами с заголовком главного окна. В нем находятся три объекта: уменьшенная копия пиктограммы программы, текст “Microsoft Visual FoxPro” и кнопки управления размерами главного окна. Нажмите на пиктограмму, перед вами откроется меню управления, содержащее команды перемещения и изменения размеров главного окна. В таблице 1.1 приведены команды, доступные из меню управления. Попробуйте проделать все команды сами, чтобы впоследствии не иметь проблем при работе с главным окном (и вообще, при работе с другими окна приложений под Windows, т.к. все они имеют стандартный набор команд работы с окнами) Текст ” Microsoft Visual FoxPro” заголовка при желании можно изменить. Делается это довольно легко. Введите в командном окне: MODIFY WINDOW SCREEN TITLE ‘Новый заголовок’
54
или _SCREEN.caption = ‘Новый заголовок’ Таблица 1.1. Команды меню управления Команда Восстановить Переместить Размер Свернуть Развернуть Закрыть
Действие Восстанавливает предыдущий размер окна после минимизации или максимизации Выбирает главное окно Visual FoxPro и позволяет перемещать его с помощью клавиш перемещения курсора Выбирает главное окно Visual FoxPro и позволяет Вам изменять его размеры с помощью клавиш перемещения курсора Уменьшает окно Visual FoxPro до размеров пиктограммы Максимизирует размер главного окна Visual FoxPro. Максимизированное окно не имеет рамки Закрывает Visual FoxPro
Если Вы хотите быстро закрыть программу Visual FoxPro, сделайте это двойным щелчком мыши по уменьшенной копии пиктограммы программы в заголовке главного окна.
8) При работе в Visual FoxPro Вы столкнетесь с необходимостью использования панелей инструментов, используемых при создании форм, отчетов и запросов, а также других, наиболее часто используемых свойств и команд. Содержание панелей инструментов можно настраивать (путем добавления или удаления кнопок). Также можно изменять порядок и положение панелей инструментов на экране, и их размер. При работе Вы ознакомитесь и приобретете навыки работы со всеми этими панелями инструментов. 9) После завершения текущего сеанса работы Вам нужно выйти из Visual FoxPro 5.0. Это можно сделать несколькими способами: • Выбрать команду системного меню File/Exit; • Выбрать Закрыть в системном меню главного окна Visual FoxPro 5.0; • Указать на кнопку системного меню в главном окне Visual FoxPro 5.0. • В командном окне с помощью команды Quit. • • • •
1.2. Конспект начальных сведений Работайте до приобретения навыков только с включенной статусной строкой; Набирайте только четыре первые буквы команд; Пользуйтесь буфером команд; Завершайте работу с Visual FoxPro одним из описанных способов.
Освоенные команды: SET STATUS ON/OFF – включение/отключение статусной строки QUIT – выход из Visual FoxPro 5.0
2. ПРОЕКТИРОВАНИЕ СТРУКТУРЫ ФАЙЛОВ БАЗ ДАННЫХ 2.1. Создание структуры таблицы 1) Начнем с определения реляционной базы данных – это такая база данных, которая основана на математической теории отношений. В этой БД все данные хранятся в виде прямоугольных таблиц, при этом все операции над БД сводятся к манипуляции с таблицами. Основными понятиями в этой теории являются таблица, отношение, строка, столбец, первичный и внешний ключи. Visual FoxPro является системой управления реляционными базами данных. Реляционные базы данных в настоящее время наиболее распространены и фактически являются промышленным стандартом.
55
2)
Рассмотрим с Вами допустимых типов данных полей:
Тип данных
Описание
Размер
Character
Произвольный текст
Currency
Денежная сумма
1 байт символ; 254байт 8 байт
Date
Хронологическая дата, состоящая из месяца, года и числа Описание
8 байт
DateTime
Хронологическая дата, состоящая из месяца, года, числа, времени
8 байт
Logical
Логическое значение истинности
1 байт
Numeric
Целое или с дробной частью число
Double
Число с точности
8 байт в памяти; от 1 до 20 байт в таблице 8 байт
Float
Такое же, как и Numeric
General
Ссылка на OLE-объект
Integer
Целочисленные значения
Memo
Ссылка на блок данных
Character (двоичный)
Любые символьные данные, которые нужно сопровождать без изменения кодовых страниц Любые Memo поля, которые нужно сопровождать без изменения кодовых страниц
Тип данных
Memo (двоичный)
плавающей
запятой
двойной
Диапазон на до
Размер
8 байт в памяти; от 1 до 20 байт в таблице 4 байта в таблице 4 байта 4 байта в таблице 1 байт на символ; до 254 байт 4 байта в таблице
Любые символы От -922337203685477.5808 до 922337203685477.5807 От 01.01.100 до 12.31.9999 Диапазон От 01.01.100 до 12.31.9999 плюс от 00:00:00 утра до 11:59:59 вечера Истина (.T.) или Ложь (.F.) От –0.9999999999Е+19 до 9999999999Е+20 От +/4.94065645841247Е-324 до +/1.79769313486232Е-308 От –0.9999999999Е+19 до 9999999999Е+20 Ограничен только доступной памятью От –2147483647 до 2147483646 Ограничен только доступной памятью Любые символы Ограничен только доступной памятью
3) Пример создание структуры таблицы базы данных. 3.1. В командном окне (Command) наберите команду для создания таблицы сведений о студентах групп КЭ. Команда имеет вид: а) CREATE<имя таблицы, можно без расширения>. Если расширение не указывается (рекомендуется не указывать), то Visual FoxPro присвоит “родовое” расширение (.dbf), принятое для всех баз данных, отвечающих стандарту dBASE (соблюдаются большинством СУБД). б) Или введите команду CREA. После нажмите ввод (Enter) и на Вашем экране появится окно, в котором Visual FoxPro попросит сохранить будущую таблицу под какимнибудь именем, выбранным по усмотрению пользователя. Мы назовем нашу таблицу Students. Нажмите на кнопку Сохранить. Названный файл получит имя Students с расширением .dbf. в) Существует еще один способ создания таблицы. Для этого зайдите в системное меню File и выберите команду New, после ввода на Вашем экране появится окно диалога
56
New для создания новых файлов таблиц (баз данных, запросов, таблиц и т.д.). Выберите опцию Table и щелкните в правой части экрана диалога на картинку New File, и Visual FoxPro после ввода предложит записать Вашу таблицу с именем. Если выбрать картинку Wizards, то произойдет вызов мастера (Wizards) – это означает, что Ваша работа будет протекать в режиме “вопрос- ответ”. Таким образом, все зависит от Вашего желания и выбора. Из-за наличия большого числа способов, далее мы будем пропускать некоторые из них, оставляя пользователю на самостоятельное изучение. Авторы данного учебного пособия считают, что для знания Visual FoxPro Вам достаточно знать описанные здесь методы (являющиеся наиболее удобными и простыми), со временем, при более опытной работе в этой СУБД Вы сами приобретете свои привычки, и возможно выберите другие методы, которые мы здесь опустили. Вы увидите диалоговое окно создания/корректировки таблиц баз данных. Внимательно рассмотрите основные элементы окна. В верхней части окна помещено имя таблицы с названием окна - Table Designer, которое имеет три вкладки: Fields, Indexes, Table. Вкладка Fields содержит таблицу с полями: Name – имя поля; Туре – тип поля; Width – длина поля в байтах (для полей, в которых эта величина может варьироваться (см. пункт 2)); Decimal – количество знаков после запятой; Index - ключ индексирования данного поля (без индексирования, по возрастанию, по убыванию); Null – если установлен флажок, то по умолчанию присваивается значение Null данному полю. Заполните вкладку Fields по следующей таблице: Имя поля ФИО Группа Код_Спец Год_Поступ Балл_Сес01 Балл_Сес02 Балл_Сес03 Балл_Сес04
Пояснение к названию поля Имя, фамилия, отчество Группа Код специальности Год поступления в ВУЗ Средний бал за сессию 01 Средний бал за сессию 02 Средний бал за сессию 03 Средний бал за сессию 04
Тип данных Character Character Numeric Numeric Numeric Numeric Numeric Numeric
Остальные свойства типов полей таблицы Вы выберите сами (Width, Decimal, Index, Null) в зависимости от потребностей. Справа размещаются графические кнопки для ввода команд, полезных при создании баз данных: Insert – вставка поля, Delete – удаление поля, Cancel – прекращение работы без записи на диск, Перемещение по графическим кнопкам лучше осуществлять мышью. OK завершение работы с записью на диск. После ввода (OK) появится сообщение: Input data records now? (Будите вводить записи сейчас?) хотя можно вводить данные в файл и при ответе Yes (Да), гораздо удобнее вводить их в другом режиме см. пункт 3.1. Поэтому отвечайте Нет. Произойдет запись результатов на диск и возврат к режиму ожидания ввода другой команды (в командном окне). Вкладки Indexes и Table разберем позже. 2.2. Корректировка структуры таблицы 1) Корректировка - означает внесение в структуру таблицы изменений (например: при необходимости вставки или удаления имени поля, изменение его ширины и т.д.) Освоим технику внесения корректировок структуры на примере.
57
2) После заполнения приведенной таблицы внесите в нее еще одно поле с именем “Дополнение” типа Memo (текст примечаний, о котором подробнее будет рассказано ниже). От Вас требуется, пока, только внести его в таблицу, но ничего в него не записывать, т.к. работа в нем отличается от полей других типов. Наберите в командном окне команду: MODIFY STRUCTURE (Помните! Набирать нужно только четыре буквы команды, т.е. MODI STRU) Появиться экран уже знакомый Вам для создания структуры таблицы. Внесите в нее предложенное выше поле “Дополнение” типа Memo. Запишите результаты на диск. Если Вы хотите изменить порядок полей (т.е. поменять поля местами) в таблице, то воспользуйтесь кнопкой, расположенной слева от наименования поля. Для этого установите курсор на поле, которое Вы хотите переместить, на кнопке появится пиктограмма, имеющая вид двунаправленной стрелки. Установите курсор мыши на пиктограмму, нажмите кнопку мыши и, удерживая ее в нажатом состоянии, перенесите пиктограмму на нужное место, отпустите кнопку мыши. Поле окажется там, куда вы его поместили. Если Вы хотите добавить еще одно поле, то воспользуйтесь кнопкой Insert. Сначала установите стрелочными клавишами курсор на поле, перед которым Вы хотите вставить еще одно новое поле и нажмите кнопку Insert. Вставится новая строка. Если Вы хотите удалить поле, то поставьте на него курсор и воспользуйтесь кнопкой Delete. Внимательно читайте и используйте “подсказки”. Освоенные команды: CREATE - создание таблицы с именем и расширением .dbf. MODIFY STRUCTURE – корректировка структуры существующего файла с одновременным копированием записей в поля с точно совпадающими именами.
2.3. Создание структуры базы данных. 1) База данных в Visual FoxPro 5.0 представляет собой совокупность связанной информации, которая помещена в таблицу или в несколько таблиц. Число таблиц не ограничено. 2)Создадим с Вами базу данных и поместим в нее нашу, еще не заполненную записями таблицу. Для создания базы данных существует два способа: • Зайдите в системное меню File и выберите команду New на Вашем экране появится окно диалога, уже знакомое Вам, найдите в нем пункт Database и картинку New File, потом OK, и на экране появится окно для записи новой базы данных дайте ей такое же имя, как и у таблицы (Students). Теперь отличить базу данных от таблицы Вы сможете только по расширению, т.к. имена у них одинаковые. У таблицы стандартное расширение .dbf, а у базы данных - .dbc. • Также, при создании базы данных можно воспользоваться пиктограммой, расположенной на стандартной панели сразу под системным меню File (в виде листа с завернутым правым верхним углом), подведите курсор к пиктограмме и задержитесь на ней, под ней появится подсказка New. Нажмите на пиктограмму и действуйте по аналогии с верхним пунктом. 3) И так, мы с Вами создали базу данных. На экране Вы видите окно с заголовком Database Disigner – Students (имя Вашей БД). Оно пусто, т.к. еще не содержит ни одной таблицы. При этом на экране появляется панель инструментов Database Designer, она будет, находится либо под стандартной панелью, либо просто на экране в любом месте, для удобства поместите ее под стандартную панель или рядом, если там есть свободное место, для этого возьмитесь мышью за панель и, не отпуская кнопки мыши, переместите в удобное для Вас место. К каждой из пиктограмм есть подсказки. Рассмотрим быстро назначение всех пиктограмм: New Table – создает новую таблицу; Add Table – добавляет таблицу в базу данных;
58
Remove Table – удаляет таблицу из базы данных; New Remote View – создает удаленное представление данных; New Local View – создает локальное представление данных; Modify Table – модифицирует таблицу; Browse Table – показывает таблицу в режиме Browse; Edit Stored Procedures – редактирует хранимую процедуру; Connections – создает связь с удаленными данными. 4) Нам необходимо поместить таблицу Students.dbf в базу данных Students.dbc. Для этого щелкните на пиктограмму Add Table, перед Вами появится окно Open, найдите там необходимую нам таблицу. Выделите ее мышью, и она появится в текстовой строке Select Table. После этого нажмите кнопку OK и на экране Вы увидите базу данных с помещенной в ней таблицей, в окне которой отображаются Fields (поля таблицы). Размеры таблицы можно менять, в зависимости от потребностей пользователя. Для просмотра таблиц в диалоге Database Designer дважды щелкните мышью по таблице. 3. ОСВОЕНИЕ БАЗОВЫХ ПРИНЦИПОВ РАБОТЫ с Visual FoxPro 5.0. 3.1. Команды просмотра и редактирования файлов таблиц BROWSE и EDIT (CHANGE). Открытие конструкторов таблиц и баз данных. 1) Приступим к заполнению таблицы. Если Вы по каким- то причинам начали новый сеанс работы, то файл базы данных на вашей ЭВМ не открыт – откройте его командой: USE Students (сама команда будет описана ниже). • Вначале проанализируйте, ожидаются ли частые повторения значений полей в различных записях. В нашем примере повторы ожидаются (наименования групп, год поступления, код специальности). Поэтому полезен режим заполнения записей Visual FoxPro 5.0, при котором каждая новая запись копирует предшествующую. Ее нужно будет только подправлять. Специальный режим создается одной из команд группы SET: SET CARRY ON • Поскольку Вы не внесли в файл еще ни одной записи, Ваша таблица пуста. В этом случае самым удобным способом является добавление пустой (blank) записи командой: APPEND BLANK (наберите APPE BLAN и нажмите ENTER). Вообще существует несколько способов добавления пустой записи в окне BROWSE. Для этого нужно выбрать в системном меню Table команду Append New Record или с помощью комбинации клавиш Ctrl+Y. Выбор за Вами. • Теперь можно воспользоваться наиболее удобными и мощными командами одновременного просмотра, заполнения и корректировки записей. В наиболее краткой форме эти команды имеют вид: а) первая команда BROWSE позволяет редактировать данные в наиболее привычном для пользователя виде – табличном. Этот способ визуализации данных очень удобен, т.к. позволяет просматривать сразу несколько записей, но, как правило, все поля таблицы не умещаются одновременно в окне, даже раскрытом на весь экран. б) вторая команда EDIT позволяет редактировать данные в виде колонки полей. Просмотр данных в виде EDIT позволяет работать сразу со всеми полями в одной записи. Далее будем рассматривать только команду (т.к. их работа аналогична). BROWSE (наберите BROW, нажмите ENTER или через меню View/Browse). Перед Вами появится одно из наиболее часто эксплуатируемых окон Visual FoxPro 5.0 – окно просмотра (BROWSE).
59
Внимательно рассмотрите его и научитесь читать показанные в нем сведения. - Заголовок окна – имя файла таблицы; - Столбцы в окне – имена полей. Простейшие операции в окне BROWSE. ○ Перемещение по записям: стрелочными клавишами последовательно от записи к записи, левой кнопкой мыши (можно выборочно), клавишами PgUp, PgDown постранично или с помощью вертикальной линейки просмотра; ○ Перемещение по полям: клавишами Tab (вправо) или Shift+Tab (влево), левой кнопкой мыши или с помощью горизонтальной линейки просмотра; ○ Запись сделанных изменений: клавишами Ctrl+W или Ctrl+End, или из окна FileClose (при этом) файл таблицы не закрывается, просто исчезнет с экрана; ○ Выход из окна BROWSE без записи внесенных изменений: клавишами Ctrl+Q или Esc. 2) Редактирование полей примечаний (полей типа Memo): для вызова Memo- поля удобнее всего нажать два раза левую кнопку мыши. Можно также использовать клавиши Ctrl+PgDn. После окончания редактирования для возврата к окну BROWSE с записью изменений нужно использовать клавиши Ctrl+W или опции системного меню File-Close; для возврата без записи изменений нужно нажать Esc, тогда появится сообщение: Discard Change? (сохранить изменения?) на которое Вы должны ответить Yes (Да) или No (Нет). Можно также выйти из поля примечаний с помощью двойного щелчка на пиктограмму окна или с помощью кнопки закрытия окна, самой крайней на заголовке окна. Поле примечаний (Memo) вызывается двукратным нажатием левой кнопки мыши либо клавишами Ctrl+PgDn
Часто все поля таблицы не помещаются в окно BROWSE. Для просмотра не вместившихся полей пользуйтесь горизонтальной линейкой просмотра и мышью либо клавишами Crtl – стрелка вправо (влево). Аналогично, если в окне BROWSE не вмещаются все записи, просматривайте их с помощью вертикальной линейки просмотра и мыши либо с помощью клавиш PgUp, PgDown. • Вначале заполните видимую часть экрана - поля ФИО, Группа, Код_Спец, Год_Поступ, Балл_Сес01, Балл_Сес02, Балл_Сес03, Балл_Сес04 Содержимое полей необходимо заполнить следующим образом: (после заполнения одной записи, не забывайте добавлять следующую пустую запись командой Append Blank или с помощью клавиш Ctrl+Y): Содержимое полей: ФИО
Группа КЭ-106
Код_ Спец 220055
Год_ Поступ 1998
Балл_ Сес01 4.00
Балл_ Сес02 3.80
Балл_ Сес03 0.00
Балл_ Сес04 0.00
Яковлев И. Н. Темникова И. Р.
КЭ-105
220055
1998
5.00
5.00
0.00
0.00
Шипилова В. В.
КЭ-205
220055
1997
5.00
5.00
5.00
5.00
Краснянский А. А.
КЭ-205
220055
1997
4.00
5.00
4.50
4.00
Сарафанов А. А.
КЭ-206
220055
1997
5.00
5.00
5.00
5.00
Ерофеев А. С.
КЭ-205
220055
1997
4.00
4.40
5.00
4.00
Макаров С. О.
КЭ-105
220055
1998
3.00
3.70
0.00
0.00
Званцева Н. С.
КЭ-106
220055
1998
5.00
5.00
0.00
0.00
Петрова Е. Е.
КЭ-105
220055
1998
5.00
4.50
0.00
0.00
Бочкарева М. Д.
КЭ-105
220055
1998
5.00
5.00
0.00
0.00
60 Страхова А. Л.
КЭ-205
220055
1997
5.00
5.00
5.00
5.00
Денисова Е. А.
КЭ-206
220055
1997
4.00
4.20
4.60
4.00
Журавлева Г. О.
КЭ-206
220055
1997
3.00
3.00
3.50
3.50
Панова Э. Г.
КЭ-106
220055
1998
5.00
5.00
0.00
0.00
Лукьянова А. А.
КЭ-106
220055
1998
5.00
4.00
0.00
0.00
•
Осталось заполнить поле, отведенное под пояснительную записку с именем Дополнение.
Запомните: поскольку в пояснительных записках хранится информация, к которой пользователь обращается сравнительно редко, Visual FoxPro 5.0 отводит для полей типа Memo отдельные вспомогательные файлы, которые вызываются автоматически из основного файла таблицы данных. Нужно подвести указатель к полю типа Memo и нажать комбинацию клавиш Ctrl+PgDn или дважды нажать левую кнопку мыши.
•
После этого появится окно встроенного в Visual FoxPro 5.0 текстового редактора. Этот редактор имеет гораздо более скромный набор функций, чем даже скромный MultiEdit (не говоря уже о Microsoft Word). • Познакомьтесь с экраном текстового редактора: заголовок окна – имя таблицы и наименование поля примечаний; можно помечать блоки текста: Shift- стрелки вверх, вниз, вправо, влево и затем заносить их в буфер для повторного применения: - при копировании – Ctrl+C (или системное меню Edit-Copy); - при переносе в буфер с извлечением - Ctrl+X (или системное меню Edit-Cut); - при извлечении из буфера в текст по месту расположения курсора - Ctrl+V (или системное меню Edit-Paste; если буфер пуст, данная позиция меню недоступна). удобно работать с текстовым редактором при раскрытии окна до полного экрана. Используйте символ распахивания окна (расположен на заголовке окна справа средняя кнопка). предусмотрены обычные для текстовых редакторов операции поиска (Find, Ctrl+F), замены (Replace, Ctrl+L) и “мгновенной замены” (Replace All, данную операцию включает в себя поиск Find, Ctrl+F), а также возобновление поиска (Find Again, Ctrl+G) и пометка всего текста (Select All, Ctrl+A). Все эти операции можно найти в системном меню Edit. 3) Заполните поле примечаний для первой записи примерно следующим текстом: Пояснительная записка к файлу БД Students.dbc Наименования и содержательный смысл полей: ФИО - фамилии и инициалы (русские); Группа - наименование группы; Код_Спец – код специальности по классификатору РФ; Год_Поступ – год поступления в институт; Балл_Сес01…Балл_Сес04- средние (за сессии 01..04) баллы, полученные студентами 4) Пользуясь приемами редактирования, описанными выше, выполните следующие упражнения: ♦ средствами поиска найдите все словосочетания символов “по”; ♦ запишите подготовленный текст (будет автоматически создан файл с расширением .fpt) и тем же именем, что и составной файл (в нашем случае - Students.fpt); ♦ используя пометку блока текста и буфер, внесите тот же текст в поле Дополнение записей 3 и 5;
61
5) Освоим (на примере команды BROWSE) режим помощи пользователю, предоставляемый Visual FoxPro 5.0. Запишите результат внесения записей в базу данных Ctrl+End (^End) Произойдет выход из режима редактирования и возврат к режиму ожидания ввода команд. Освоим мощные средства помощи пользователю (режим HELP, переход к которому осуществляется нажатием клавиши F1). Помощь является контекстной (в окно выводится информация о команде либо о режиме, в котором Вы работаете в данный момент). Все команды и функции помещены в файле помощи по алфавиту. Выход к нужной букве можно ускорить, если ее набрать на клавиатуре. В окне помощи приводится полное описание команды (функции) и часто – примеры ее использования. Найдите команду BROWSE. Обратите внимание на огромное число опций команды, которая является мощной командой Visual FoxPro 5.0. Освоим несколько полезных опций команды BROWSE: BROWSE [FIELDS <list>][FOR <exprL>] Здесь (как и далее) использованы обозначения, принятые в Visual FoxPro 5.0 для описания команд: […] – необязательная (уточняющая) часть команды (называется опцией, способ использования называется опциональным); <expr> - произвольное выражение (сведения, которые вводит пользователь (знаки < > вводить не нужно!) <expr> - от <exprassion>=выражение); <exprC> - должно быть введено символьное выражение (текст); <exprL> - должно быть введено логическое условие; <exprN> - должно быть введено выражение с переменными числового типа; <list> - список (через запятые). а) FIELDS <list> - перечень полей (можно – не всех) из числа имеющихся в файле таблицы данных. Не забывайте, что теперь ваша таблица хранится в БД с аналогичным названием. Привыкайте к понятию БД. Наберите в командном окне (используя БУФЕР команд) команду BROW FIEL ФИО, балл_сес01 (перед Вами будут выведены данные с использованием принципа удаления лишнего
- одного из самых основных принципов работы с базами данных). Наименования полей нужно набирать точно. Однако Вы часто будите затрудняться в запоминании имен полей (особенно длинных). Visual FoxPro 5.0 предоставляет средства для облегчения ввода; для этого можно использовать встроенную функцию FIELD (<exprN1><exprN2>), которая возвращает имя поля по ее номеру (<exprN1>) и при работе с несколькими таблицами данных, открытых в разных рабочих областях – по ее номеру 1…9 нужной рабочей области (<exprN2>, см. дальше при описании команды SELECT). Наберите команду ?FIEL(1), и Вы увидите ответ Visual FoxPro 5.0: ФИО. Ознакомьтесь с использованием "ленивой" формы запроса о содержании полей в команде BROWSE. Присвойте имя поля ("не читая" его) какой-либо переменной например, введите команду y=FIEL(1) (пользуйтесь командным буфером!). Теперь в переменной y находится имя поля, номер которого Вы помните, а наименование "забыли". Используйте символ макроподстановки & для вставки "забытого" имени в команду BROWSE.
62
Наберите команду: BROW FIEL &y Вы увидите "усеченный" экран просмотра с нужным полем. Для того чтобы вернуться к полной базе данных, необходимо выполнить команду BROWSE. Особенности макроподстановки будут подробно описаны в Части 2 настоящего пособия. Сейчас дадим ее самое поверхностное описание: команду с макроподстановкой следует читать, "подставляя" в текст команды содержимое переменной, записанное за символом &. Макроподстановка & <переменная> вставляет в командную строку любую последовательность символов, предварительно присвоенную <переменной>.
б) Опция, позволяющая вывести на экран BROWSE только записи, удовлетворяющие условию <exprL>, заданному пользователем: BROWSE FOR <exprL> Данная опция устанавливает фильтр записей так, чтобы не загромождать вывод теми, которые в данном сеансе просмотра не интересуют пользователя. Эта опция также иллюстрирует принцип удаления лишнего. Пусть, например, пользователь хочет вывести на экран записи, относящиеся к отличникам набора 1998 г. Наберите BROWSE FOR Год_Поступ=1998.AND.(Балл_Сес01+Балл_Сес02=10) На экран будут выведены записи, удовлетворяющие этому условию (если таких нет, окно BROWSE будет пустым). Обратите внимание на форму записи логического условия <exprL>: логические операторы AND, OR, NOT выделяются точками (можно пробелами).
Завершите работы выходом из режима BROWSE (Ctrl+End, ^End или из системного меню File-Close). При закрытии окна BROWSE БД, открытая командой USE, не закрывается, в чем Вы можете убедиться, если повторно введете команду BROWSE. Освоенные команды и приемы: SET CARRY ON/OFF – становление/отмена режима воспроизведения содержимого предыдущей записи в следующей новой записи. APPEND BLANK – добавление пустой записи в конец файла. BROWSE – просмотр, заполнение и корректировка записей. ЗАПОЛНЕНИЕ полей ПРИМЕЧАНИЙ (типа MEMO) - двойным нажатием левой кнопки мыши. & - Макроподстановка (macrosubstitution) - вставка любой последовательности символов (предварительно присвоенных какой-либо переменной) в команду. Ctrl+End (^End ) - выход из режима редактирования с записью на диск. F1 - вызов "помощи".
3.2. Копирование файлов таблиц для использования в Visual FoxPro 5.0 и в других программных средах. 3.2.1. Для тиражирования файлов (например, для создания копий файлов на дискетах либо для ведения архива) необходима операция копирования Запомните: поскольку БД состоит из файлов, хранимых на диске, для копирования требуется, чтобы ЭВМ проделала (без участия пользователя) нужную совокупность операций с диском. Поэтому копировать можно только в закрытый файл.
3.2.2. Если Вы работаете после перерыва - вызовите Visual FoxPro 5.0. Откройте в одной (из 25 возможных) рабочих областей оперативной памяти созданную Вами таблицу командой
63
USE , расширение по умолчанию .dbf. Если вы хотите открыть БД, то с помощью системного меню File/Open указать тип файла .dbc и выбрать нужную Вам БД (либо воспользоваться пиктограммой Open при открытии которой действия аналогичные). Наберите USE students и нажмите ENTER. По умолчанию файл открывается в первой рабочей области (область A, другое допустимое обозначение 1) и автоматически приобретает псевдоним (ALIAS)(по имени рабочей области), в данном случае A. Использование USE без имени файла закрывает текущую таблицу. Обозначения рабочих областей (alias): первые 10: A..J (или 0..9. Это не цифры, а символы); остальные: W11..W25. Активной может быть только одна рабочая область.
Команда SELECT назначает и активизирует рабочую область в оперативной памяти и псевдонимы для файла, в ней открываемого. Имеет общий вид: SELECT< рабочая область A..J ,W11..W25> Опция IN позволяет указать рабочую область или псевдоним рабочей области, в которой будет открыта таблица. Например, если у Вас две таблицы students. dbf и teachers. dbf и Вам необходимо частое переключение между ними, то поможет в этом следующая конструкция: USE students IN 1 &&Открыть таблицу students и поместить ее в рабочую область 1; USE teachers IN 2 &&Открыть таблицу teachers и поместить ее в рабочую область 2; SELECT 2 &&Активизировать таблицу teachers; …. SELECT 1 &&Активизировать таблицу students; …. USE &&Закрываем таблицу students; USE IN 2 &&Закрываем таблицу teachers; Можно открыть файл и с помощью системного меню File/Open. В этом случае появится диалоговое окно Open, с которым Вы уже знакомы. В нем можно открыть существующий файл об интересующего Вас типа или просмотреть все файлы, содержащиеся в выбранной Вами папке. 3.2.3. Убедитесь, что файл открыт (просмотрите его содержимое командой BROWSE). 3.2.4. Освоим операцию КОПИРОВАНИЯ файла. Общая форма команды: COPY TO [<scope>][FIELDS <list>][FOR <exprL>][WHILE <exprL>][TYPE ] а) - имя файла. Если файл предназначен для использования в среде Visual FoxPro 5.0, то расширение указывать не нужно (по умолчанию .dbf). Если копировать приходится для работы вне среды Visual FoxPro 5.0 (например, для включения в текст, подготовленный внешним текстовым редактором, или для цифровой обработки данных средствами табличного процессора Microsoft Excel, то нужно указывать какое-либо расширение (лучше всего - "родовое": для текстовых txt, doc; для табличного процессора xls)). О создании таких копий см. ниже, п.3.2.4-е. б) <scope> - область записей, на которую распространяется команда. По умолчанию команда COPY распространяется на все записи. Возможные варианты <scope> нужно запомнить, т.к. это понятие используется в очень многих командах Visual FoxPro 5.0: <scope> =область файла таблицы, на которую распространяется действие команды (кратко область действия команды);
64
RECORD - запись с номером , например, record4; ALL - все записи; NEXT - следующие записей, включая текущую, на которой установлен файловый указатель; REST- записи от текущей (включая ее) до конца файла.
в) FIELDS <list> - список копируемых полей (если нужно выборочное копирование). Наименования полей разделяются запятыми. г) FOR <exprL> - условие, по которому отбираются записи, если нужно выборочное копирование. <exprL> - логическое выражение, содержащее условия отбора. WHILE <exprL> - условие, позволяющее отбирать записи подряд - пока остается истинным <exprL>. Примеры (не торопитесь использовать их на ЭВМ, ознакомьтесь с принципами формулирования условий): COPY TO otl FOR балл_сес01=5 из файла students.dbf в файл otl.dbf будут скопированы записи, в которых средний балл в первой сессии равен пяти. COPY TO КЭ106 FOR Группа="КЭ-106".AND.балл_сес01>=4.5 из файла students.dbf в файл КЭ106.dbf будут скопированы записи, в которых средний балл в первой сессии не ниже 4.5. Правила записи условий (для опций FOR и WHILE во многих командах) а) Логическое выражение <exprL> имеет вид: <арифметическое выражение>< знак условия>< арифметическое выражение> б) Арифметическое выражение для условия строится на именах полей с использованием при необходимости знаков действия (^,(),*,/,+,-), переменных памяти (которым должны быть ранее присвоены значения, например, zr=12) и числовые константы. Пример: (балл_сес01+2*балл_сес02)/4 в) Знаки условия: =,<,>,<=,>=,# (неравно) и логические действия AND ("и"), NOT ("не"), OR("или"). AND,NOT,OR отделяются от остальной части команды точками с обеих сторон. г) WHILE <exprL> - условие, позволяющее отбирать записи подряд - пока остается истинным <exprL>. Например: COPY год FIELDS ФИО, Группа WHILE Год_поступ=1997 (из файла students.dbf будут копироваться записи подряд, пока значение поля Год_поступ равно1997). На первой же записи, для которой Год_поступ не равно1997, процесс копирования остановится.) д) TYPE - опция, указывающая тип файла, подготавливаемого для использования не в Visual FoxPro 5.0, а в других программных средах.
Согласно стандарту, файлы для использования любыми программными средами, должны быть записаны с помощью ASCII-кодов (American Standard Codes for Information Interchange, Американские Стандартные Коды для информационного обмена, АСКИкоды). Файл, удовлетворяющий этому стандарту, относится в Visual FoxPro 5.0 к типу SDF(Sistem Data File - системный файл данных). Имеются и другие типы файлов, но Вам достаточно уметь пользоваться командой COPY TO students.txt TYPE SDF Обратите внимание: обязательно указывайте расширение, это поможет обрабатывать такие файлы вне Visual FoxPro 5.0 соответствующими программами.
3.2.5. Примеры копирования файлов мы создадим не в командном, а в программном режиме. Мы будем использовать один из наиболее распространенных приемов изучения нового языка - "погружение": Вы будите набирать и стараться понять готовую программу. В ходе этого изучите и запомните основные команды и приемы.
65
Для ускорения работы и для создания систем управления данными, ориентированных на непрофессионального пользователя, в Visual FoxPro 5.0 встроен интерпретатор. Ознакомимся с техникой составления и выполнения программ на Visual FoxPro 5.0 на примере задачи со следующей системой предписаний: • вызвать в рабочую область файл students.dbf; • просмотреть содержимое полей ФИО, Группа, этого файла; • изготовить ряд копий файла: 1. Список студентов, закончивших сессию 1 без "троек"; 2. Список группы КЭ-106; 3. Данные о студентах, зачисленных в 1998 году (для последующего использования в среде текстового редактора); • просмотреть копии; • вызвать в рабочую область файл students.dbf. Команда создания программы Visual FoxPro 5.0 имеет вид: MODIFY COMMAND <имя_программы> Расширение указывать не обязательно: по умолчанию будет присвоено расширение .prg (от слова program). Наберите: MODI COMM students и нажмите ENTER (несмотря на одинаковое имя с Вашей БД они отличаются по расширениям). Перед Вами - уже знакомый встроенный текстовый редактор, которым Вы пользовались при заполнении примечаний. Примечания, помеченные* (если пояснением является вся строка) или && (если пояснение нужно поместить в ту же строку, в которой записана команда) можете не набирать, но обязательно читайте их для понимания программы. *Программа, иллюстрирующая копирование в Visual FoxPro 5.0_____________________ •Если строка команды слишком длинная, то ее можно разбить на части знаком ";" (точка с запятой). ____________________________________________________________________________ CLOSE ALL && закрываются все файлы, которые были до этого открыты. USE students IN A * назначение рабочей области и псевдонима для файла, в ней открываемого. SELECT A BROWSE FIELDS ФИО, Группа, Балл_сес01 * просмотр файла students.dbf (перечисленыполя, выводимые для просмотра. Для продолжения после просмотра нажмите Esc). COPY TO stl FIELD ФИО FOR балл_сес01>=4.5 * из открытого файла students.dbf в закрытый файл stl.dbf копируются поля для всех записей, у * которых балл_сес01>=4.5. COPY TO КЭ106 FIELD ФИО, балл_сес01 FOR Группа="КЭ-106" * из открытого файла students.dbf в закрытый файл КЭ106.dbf копируются поля для * группы КЭ-106. COPY TO КЭ106.txt TYPE SDF && формируется ASCII- файл типа SDF. * Просмотр USE stl IN B && рабочая область и псевдоним B для файла stl.dbf. USE КЭ106 IN C && рабочая область и псевдоним C для файла КЭ106.dbf. * Просмотр файлов, вызываемых по псевдонимам__________________________________ SELECT B BROWSE && просматривается файл stl.dbf. SELECT C BROWSE && просматривается файл КЭ106.dbf.
66
SELECT A BROWSE && просматривается файл students.dbf. _____________________________________________________________________________ 3.2.6. После набора запишите программу (Crtl+W либо системное меню File/Save либо пиктограмма Save). Запустить ее на исполнение Вы можете тремя способами: • командой DO Students; • системное меню PROGRAM / DO (либо Ctrl+D); • пиктограмма запуска RUN. Программа будет выполнена только при отсутствии ошибок. Если ошибки все же будут, программа остановится и в нижней части экрана будет выведено окно с диагнозом ошибки (Program Error). Одновременно будет вызвано окно редактирования программы, в котором "сомнительная" строка будет выделена цветом. В окне с диагнозом ошибки имеются графические кнопки: • - сброс программы; • <Suspend> - приостановка программы (при этом можно выполнить любые команды и расчеты через командное окно); • - пропуск "сомнительной" строки программы. Например, исказите синтаксис какой-либо команды и запустите программу на исполнение. Будет выведено диагностическое сообщение: Inrecognized phrase/keyword in command (неопознаваемая фраза/оператор в программе) Нажмите графическую кнопку , найдите в буфере команд команду создания программы: MODI COMM students нажмите ENTER и откорректируйте строку с ошибкой. 3.2.7. Типичные ошибки в программах и сообщения, выводимые Visual FoxPro 5.0: • Inrecognized phrase/keyword in command - нераспознаваемая команда (при грамматической ошибке в команде); • Variable not found - не найдена нужная переменная (при грамматической ошибке в написании имени поля или при использовании любой переменной в выражениях, если ей не было предварительно присвоено какое-либо значение); • FOR/WHILE need logical Exprassion - не верно записано логическое условие в сочетании с FOR либо с WHILE (нужно проверить правильность команды); При обнаружении ошибки дальнейшее выполнение программы приостанавливается автоматически и выводится сообщение с диагнозом ошибки и с предлагаемым ее нахождением в команде (строка с ошибкой выделена цветом). 3.2.8. Сделайте ряд упражнений для закрепления навыков работы с программой: а) Найдите в буфере команд MODI COMM students, нажмите ENTER. б) Сделайте грамматическую ошибку в одной из команд (например, вместо CLOSE наберите CLASE. Нажмите Crtl+W). в) Найдите в буфере команду DO students, выполните ее. г) Прочтите сообщение об ошибке. д) Повторите п.а. е) Исправьте ошибку. ж) Сделайте ошибку в наименовании поля - например, ФИ вместо ФИО. з) Повторите п.п. в..е. и) Сделайте ошибку в записи условия FOR (например, удалите знак сравнения). к) Повторите п.г. и п.е. Освоенные команды, термины и приемы: SELECT <рабочая область A..J, W11..W25> - назначение рабочей области в
67
оперативной памяти и псевдонима для файла, в ней открываемого. USE - открытие файла с именем (без расширения) в рабочей области, определенной командой SELECT или (по умолчанию) - в рабочей области А. CLOSE -закрытие файла с именем (освобождение оперативной памяти и возврат файла на диск). CLOSE ALL - закрытие всех открытых файлов. COPY - копирование из открытого файла в закрытый. <scope> - зона действия команд (число записей, на которые распространяется команда все (ALL), одна (RECORD #), несколько следующих (NEXT), оставшиеся до конца файла(REST)). MODIFY COMMAND <имя> - вызов текстового редактора для создания программы. DO <имя программы без расширения> - выполнение программы с диагностикой ошибок. CANCEL - сброс программы.
3.3. Копирование структуры файлов таблиц. 3.3.1. Часто приходится создавать файлы, структура которых почти совпадает со структурой ужу существующих файлов. Повторение рутинной работы по созданию такой структуры можно избежать, если воспользоваться командами копирования структуры файлов. а) Команда копирования структуры имеет вид: COPY STRUCTURE TO <имя файла без расширения>[FIELDS <list>] По этой команде структура файла, который должен быть открыт в активной рабочей области оперативной памяти, копируется в файл с заданным именем. Образуется пустой файл, наименования, типы и характеристики полей которого совпадают с установленными в исходном файле. Если нужно воспроизвести в новом файле не все поля прототипа, то можно (опционально) указать перечень нужных полей в списке <list> (через запятые). Рассмотрим пример. Пусть требуется создать файл, похожий по структуре на файл students.dbf, для хранения сведений о студентах групп менеджеров. Введите команды (если хотите - в форме программы copy. prg; можно в форме последовательности команд, выводимых в командное окно). USE students &&файл students.dbf открывается в рабочей области А; BROWSE &&Показ students.dbf на экране && Выход из окна BROWSE по клавише Esc COPY STRUCTURE TO stud_ivt FIELDS ФИО, Балл_сес01 &&Создание файла stud_ivt.dbf USE stud_ivt &&Файл stud_ivt.dbf открывается в рабочей области А BROWSE && На экране пустой файл - stud_ivt.dbf б) Программное создание файлов, аналогичных по структуре уже существующим. Команда CREATE<имя файла> может быть использована только в диалоговом режиме (через командное окно). Но встречаются задачи, в которых файл нужно создать программно, для этого существует команда: COPY TO <имя файла без расширения>STRUCTURE EXTENDED По этой команде автоматически создается файл унифицированной структуры, в который записывается информация, необходимая для создания нового файла по его прототипу. Структура унифицированного файла: Файл имеет четыре поля с унифицированными именами: Field_name – в это поле в качестве записей будут скопированы имена полей файла прототипа; Field_type - в это поле в качестве записей будут скопированы символы, отражающие тип поля файла прототипа:
68
C=Character N=Numeric F=Float D=Date M=Memo Field_len - в это поле в качестве записей будут скопированы значения ширины полей файла прототипа; Field_dec - в это поле в качестве записей будут скопированы числа знаков после десятичной точки в числовых полях прототипа. После копирования можно откорректировать записи уже известными Вам средствами и завершить работу командой создания файла с использованием информации из унифицированного файла: CREATE<имя файла без расширения> FROM < имя унифицированного файла> Всегда уничтожайте унифицированный файл после выполнения команды CREATE FROM командой ERASE < имя файла с расширением>. Уничтожаемый файл должен быть предварительно закрыт (CLOSE или USE без указания имени, USE <имя другого файла>).
Постарайтесь самостоятельно составить программу, выполняющую следующие функции: открыть файл students.dbf в рабочей области, принятой по умолчанию; создать унифицированный файл с именем stud_tmp.dbf; удалить в этом файле записи, относящиеся к полям прототипа Балл_сес03 и Балл_сес04; создать файл stud_ivt.dbf по информации из унифицированного файла; уничтожить унифицированный файл stud_tmp.dbf. При затруднениях в составлении используйте текст программы copystru.prg [3](см. ниже). *Программное создание файлов “по образцу структуры” в Visual FoxPro 5.0____________ Если строка команды слишком длинная, то ее можно разбить на части знаком ";" (точка с запятой). Программа copystru.prg CLOSE ALL && закрываются все файлы, которые были до этого открыты. USE students && файл students.dbf открывается в рабочей области А; BROWSE && просматривается файл students.dbf. Для продолжения Esc. y1= FIELD(7) &&переменным памяти y1 и y2 присваиваются значения= y2= FIELD(8) && именам полей 7 и 8 *Старайтесь всегда делать такое присвоение: *Вы избежите ошибки неточного ввода имен полей; *Программу будет легче перестроить для работы с другими файлами базы данных.______ COPY TO stud_tmp STRUCTURE EXTENDED &&создается унифицированный файл USE stud_tmp &&этот файл открывается в рабочей области А BROWSE && просматривается файл stud_tmp DELETE FOR field_name= y1.OR.field_name= y2 &&удаление “лишних” записей (т.е. ненужных для &&нового файла полей) BROWSE && просмотр унифицированного файла с двумя записями, &&помеченными, как удаленные. PACK &&физическое удаление записей, помеченных как удаленные CREATE stud_ivt FROM stud_tmp &&воссоздание структуры по информации из stud_tmp.dbf USE stud_ivt && открывается новый файл stud_ivt.dbf с созданной структурой в &&рабочей области А;
69
APPEND BLANK && добавляется пустая запись BROWSE ERASE stud_tmp.dbf &&уничтожается файл stud_tmp.dbf. 3.4. Копирование произвольных файлов. Файлы любых типов могут быть скопированы командой (при этом оба файла должны быть закрыты, и для обоих должно быть обязательно указано расширение): COPY FILE <имя прототипа>TO <имя копии> Освоенные команды: COPY STRUCTURE TO <имя файла без расширения>[FIELDS <list>]- копирование структуры файла-прототипа (возможно не всех полей, а только указанных в списке <list>) COPY TO <имя файла >STRUCTURE EXTENDED – копирование данных, необходимых для создания нового файла программно по прототипу. CREATE<имя файла > FROM < имя файла_созданного командой COPY STRUCTURE EXTENDED >- создание нового файла по данным, записанным в полях унифицированного файла (который создан командой COPY STRUCTURE EXTENDED) PACK -физическое (в отличие от логического) удаление записей, предварительно помеченных как логически удаленные) USE (без имени файла) – закрывает файл в данной рабочей области CLOSE DATABASES – закрывает все файлы с расширением .dbf ERASE < имя файла с расширением> - уничтожается файл (только закрытый!) COPY FILE <имя 1>TO <имя 2> - копирует файл любого типа. Имена <имя 1>и<имя 2> указываются с расширениями. Оба файла должны быть закрыты.
4. ОСНОВНЫЕ ПРИЕМЫ РАБОТЫ с Visual FoxPro5.0. Прием 1: «удали лишнее»; Прием 2: «рассматривай базу данных через фильтры»; Прием 3: «упорядочивай записи». 4.1. Прием 1: удали лишнее Существо приема 1 состоит в просмотре и анализе только интересующего Вас аспекта базы данных. Схема использования приема 1: • логически (не физически!) удалите записи в файле базы данных, не относящихся к интересующему Вас аспекту (с помощью системного меню Table/Delete Records… или командой DELETE); • установите режим Visual FoxPro 5.0, при котором логически удаленные записи «не видны» (повторное выполнение команды системного меню Table/Delete Records… или командой SET DELETED ON в командном окне); • после этого почти все команды (как в программах, так и при диалоговых операциях просмотра, корректировки, копирования.) будут выполняться так, как будто логически удаленные записи отсутствуют; • после работы с «усеченной» базой данных нужно восстановить режим работы с полным набором записей SET DELETED OFF и отменить пометку логического удаления Table/Recall Records… RECALL ALL. 4.1.1. Освоим команду логического удаления записей. DELETE [<scope>][FOR <exprL>][WHILE <exprL>]
70
• <scope> - зона действия команды (см.п.3.2.4-б); по умолчанию помечается к удалению единственная запись, на которой располагается файловый указатель; • FOR, WHILE - задание условий отбора записей для удаления (см. п.3.2.4-г); <exprL> логическое условие отбора (см. п.3.2.4-г). Эту команду можно выполнять в диалоге (в командном окне), в программе (см. ниже), непосредственно в режиме просмотра BROWSE или через системное Table/Delete Records…. В последнем случае перед Вами появится диалог Delete, интерфейс которого содержит те же компоненты, что и выше описанная команда DELETE. Выражения <exprL> для FOR и WHILE можно набрать «вручную» или построить его с помощью построителя выражений Expression Builder (кнопка […], находящаяся справа от каждого поля). В результате чего на экране появится окно построения выражений Expression. В котором Вы увидите окно для ввода выражения Expression, группу функций для набора выражений: математические (Math), логические (Logical), строковые (String) и для работы с датами (Date), список полей таблицы (Fields), указанной в поле From table, и список системных переменных (Variables). С помощью всего этого набора можно просто нащелкать выражение, не набирая его вручную. Для выбора функций, нужно нажать на кнопку справа, после чего выпадет список функций. Выбор из списка осуществляется двойным щелчком левой кнопки мыши, после чего выбранная запись появляется в окне выражений Expression. Рассмотрим вначале способ в режиме просмотра BROWSE. Наберите в командном окне: USE students BROWSE Поместите файловый указатель на какую-либо запись (например, на третью) и пометьте ее как логически удаленную. Лучше всего это делать мышью: установите ее указатель на свободном левом столбце в самом левом поле записи и нажмите кнопку. Появится символ логического удаления (черный квадрат слева от записи). Повторное нажатие кнопки отменяет логическое удаление. Для этих же целей можно использовать комбинацию клавиш Ctrl-T или команду системного меню Table/Toggle Deletion Mark. 4.1.2. Команды изменения режима Visual FoxPro5.0 для работы с логически удаленными записями: SET DELETED ON/OFF (включить/отключить режим Visual FoxPro5.0 с логическим удалением), при котором логически удаленные записи не воспринимаются большинством команд (как бы не видны). 4.1.3. Команда восстановления логически удаленных записей: RECALL [<scope>][FOR <exprL>][WHILE <exprL>] (описание опций см. в п.4.1.1). Эту команду можно так же выполнять через системное меню Table/Recall Records…. Появится диалог Recall, интерфейс которого содержит те же компоненты, что и выше описанная команда RECALL. 4.1.4. Напишите программу, использующую прием удали лишнее, для просмотра различных аспектов базы данных students: (например, только «отличников»). Для оформления программы используйте приемы, описанные в п.п. 3.2.4 - 3.2.6. Начните командой MODIFY COMMAND stud01 Вам потребуются некоторые новые команды, перечисленные ниже: Новые команды и функции: GO <номер_записи> - перемещение файлового указателя к записи с номером <номер_записи> RECCOUNT( ) - (от records count) - функция, позволяющая определить число записей в открытом файле IF <exprL><последовательность команд>ENDIF программная конструкция «ветвление»:
71
<последовательность команд> будет выполнена, только если (IF) выражение <exprL> истинно. Если нет - программа будет выполняться с команды, следующей за операторной скобкой ENDIF. DO WHILE <exprL><последовательность команд>ENDDO конструкция «цикл»: <последовательность команд> будет выполняться до тех пор (WHILE), пока остается истинным логическое выражение <exprL>. DELETE - логическое удаление записей SET DELETED ON/OFF – включение/отключение режима «невидимости» удаленных записей RECALL - восстановление логически удаленных записей. При наборе программы не обязательно вставлять примечания, но обязательно читать и понимать их. Можно (и рекомендуется!) набирать четыре первых буквы команд.
Текст программы stud01. prg: * Иллюстрация к приему удали лишнее * Отбор студентов – «отличников» USE students && в рабочей области A открывается файл students.dbf BROWSE && просмотр файла с неудаленными записями y1=«Балл_сес01» && присваивание переменным y1,y2,y3,y4 значений, y2=«Балл_сес02» && соответствующих именам полей y3=«Балл_сес03» && со средними баллами. y4=«Балл_сес04» n=1 && переменная для размещения указателя. * циклически: переход к записи с номером n; * затем: проверка - (IF, если) год =1998, то помечается к удалению запись с этим номером *при условии, что в и первой (&y1),и во второй (&y2)сессии оценки не равны 5. * Здесь, как и выше, макроподстановка & позволяет вставить в команду присвоенное *переменной при &, в частности, &y1 равносильно Балл_сес01, т.к. выше переменной y1 *было присвоено значение Балл_сес01. Проверка на год поступления нужна для того, *чтобы не вычеркнуть из списка «отличников» студентов-1998 (у них в полях *Балл_сес03, Балл_сес04 нули). Затем: удаление из списка студентов-1997, у которых *оценки во всех сессиях не равны 5. Цикл будет выполняться, пока номер записи n не *станет равным числу записей reccount( ) * ___________________________________________________________________________ DO WHILE n<=reccount( ) && reccount( )=числу записей в файле. GO n && переход к записи с номером n IF year_start=1998 && проверка условия: год поступл. = 1998. DELETE FOR &y1#5.and.&y2#5 && если не «5» - удалить! ENDIF && конец действия условия. IF year_start=1997 && проверка условия: год пост=1997. DELETE FOR &y1#5.and.&y2#5.and.&y3#5.and.&y4#5 && если не все «5» - удалить! ENDIF n=n+1 && наращивание номера записи. END DO && конец цикла. SET DELETED ON && режим, когда удаленные не видны. BROWSE && просмотр «отличников». SET DELETED OFF && возврат к режиму видны все. RECALL && восстановление логически удаленных. BROWSE && просмотр всех записей. * ____________________________________________________________________________ После набора программы запустите ее на выполнение командой
72
DO stud01 и проанализируйте информацию, выводимую на экран. Возобновляйте процесс выполнения программы, прерванный показом экрана, клавишей ESC. 4.2. Прием 2: рассматривай базу данных через фильтры Существо приема состоит в просмотре записей файла базы данных после выполнения специальной команды-фильтра, делающего «невидимыми» записи, не удовлетворяющие условию фильтрации. В Visual FoxPro5.0 имеется две разновидности фильтров: • фильтр для отбора записей по условиям, задаваемым пользователем: команда SET FILTER TO <exprL>,см.п.4.2.1, или команда в системном меню Table/Properties при этом откроется диалог Work Area Properties (свойства рабочей области). Здесь, в поле Data filter, Вы “вручную” или с помощью построителя выражений Expression Builder (см. п. 4.1.1) (кнопка […] справа от поля) можете набрать условие фильтра. • фильтр для отбора полей по условиям, задаваемым пользователем: команда SET FIELDS TO , см.п. 4.2.2 или команда в системном меню Table/Properties. Во втором случае откроется диалог Work Area Properties (свойства рабочей области), в котором в нижней его части в группе Allow access to (позволить доступ …) находятся две опции: All fields in the work area (ко всем полям рабочей области) и Only fields specified by field filter (к полям определенным в фильтре полей Field Filter). Выберите вторую опцию и нажмите кнопку Field Filter, после чего появиться диалог Field Picker. Слева, в этом диалоге находится список всех полей таблицы All Fields, справа – список выбранных вами полей Selected Fields, между списками находятся кнопки: Move – выбрать поле, All – выбрать все поля, Remove – удалить поле из списка выбранных, Remove All – удалить все поля. Возможно использование обеих разновидностей. Для этого нужно ввести обе команды последовательно: SET FILTER TO <exprL> SET FIELDS TO или обе команды выполнить в диалоге Work Area Properties. Освоим обе разновидности фильтров. 4.2.1. Фильтры для отбора нужных записей. Команда, устанавливающая фильтр, имеет форму: SET FILTER TO <exprL> Здесь: <exprL> - логическое условие: если <exprL> для данной записи истинно, то запись будет восприниматься всеми командами (в том числе и командой просмотра BROWSE). Если <exprL> ложно, то запись не воспринимается - как будто отсутствует совсем. Отмена прежнего фильтра происходит автоматически при установлении другого, «свежего» фильтра. Если нужно вообще отменить фильтры, используйте команду SET FILTER TO (без условия <exprL>) или удалите в диалоге Work Area Properties выражение в поле фильтра Data filter. Освоим процедуры фильтрации на примерах. • Командой USE students откройте файл students.dbf в рабочей области. • Предположим, что Вам нужно просмотреть записи, относящиеся к студентам набора 1998 г. Установите фильтр SET FILTER TO Год_поступ=1998 и просмотрите результат фильтрации командой BROWSE. Вы увидите, что записи о студентах набора 1997 г. как бы исчезли.
73
При выполнении следующих заданий старайтесь предугадать, какие записи будут «видимыми» при использовании фильтра; обязательно проанализируйте состав записей, выведенных командой BROWSE после фильтрации, и сравните с Вашими предположениями. Мысленно поставьте себе оценку. • Установите фильтр для отбора записей, в которых баллы за сессии 01 и 02 больше 4.0: SET FILTER TO Балл_сес01>4.0.AND. Балл_сес02>4.0 BROWSE Обратите внимание: «сложное» условие фильтрации, содержащее операции над несколькими полями, может содержать операции АЛГЕБРЫ ЛОГИКИ («и», «или», «не» AND, OR, NOT), окруженные точками (можно - пробелами). • Установите фильтр для отбора записей, в которых средний балл за сес 01 и 02 выше 4.5: SET FILTER TO (Балл_сес01+ Балл_сес02)/2 > 4.5 BROWSE • Установите фильтр, содержащий разнотипные поля в условиях отбора - например, отберите записи, относящиеся к студентам с фамилиями, начинающимися с букв «Я» или «Т», и имеющим оценки не ниже 4.5 за сессию 01: SET FILTER TO LEFT(ФИО,1)=«Я».OR.LEFT(ФИО,1) =«Т»). AND. Балл_сес01>=4.5 (набирайте в одной строке или разделяйте строки символом « ; » !) BROWSE В последнем фильтре использована команда выделения нескольких символов в поле (начиная с левого) :функция LEFT(<имя_поля_симв._типа, число_символов>) возвращает заданное число_символов (в примере 1), читаемых слева в имени поля символьного типа. Имеется аналогичная функция, возвращающая заданное число_символов, читаемых справа RIGHT(<имя_поля_симв._типа, число_символов>) Имеется также функция, возвращающая заданное число_символов из «середины» символьной строки, начиная (и включая!) символ_с_ заданным_номером: SUBSTR(<имя_поля_симв._типа, симв._с_задан._номером,_ _число_символов_начиная_с_него>) (например: функция SUBSTR(Группа,5,1) возвратит значение одного символа в 5-й позиции поля Группа - в файле students.dbf в этой позиции записан символ (не цифра) «5» или «6»). Логические условия, по которым осуществляется фильтрация записей, могут содержать: • имена полей; • знаки действий, допустимых для полей данного типа (^,*,/,+,- для числовых полей; +,для полей типа ДАТА; + (слияние, в СУБД вместо этого принят термин конкатенация) для символьных полей); • знаки алгебры логики (.AND. .OR. .NOT.), которые могут соединять выражения над данными различных типов (см. вышеприведенный пример); • знаки скобок; • знаки сравнения >,<,>=,<=,#(не равно).
Решите следующие задачи: выполните выше описанные примеры в диалоге Work Area Properties; установите фильтр для отбора записей, в которых в наименовании группы имеется цифра 5 на 5-й позиции, и в которых средний балл за сессию 01 ниже 4.5. установите фильтр для отбора записей, которые относятся к студентамотличникам (наборов как 1997, так и 1993 г.). Новые команды и функции:
74
SET FILTER TO <exprL> - режим установления фильтра, при котором записи, не удовлетворяющие условию <exprL>, становятся как бы невидимыми для пользователя и для других команд. SET FILTER TO - отмена режима фильтрации. LEFT(<string>,N) - функция, возвращающая N левых символов из символьной строки <string> RIGHT(<string>,M) - аналогично, M правых. SUBSTR(<string>,N1,N2)- функция, возвращающая N2 символов из символьной строки <string>, начиная с N1-го. .AND..OR..NOT. – действия алгебры логики («и», «или», «не») окружаются точками (можно – пробелами).
4.2.2. Фильтры для отбора нужных полей. Команда для отбора нужных полей имеет вид: SET FIELDS TO Здесь: - список полей из числа имеющихся в файле, открытом в активной области, которые пользователь хочет просмотреть, «не отвлекаясь» на остальные поля. Перечисления в списке разделяются запятыми. Команда, устанавливающая режим Visual FoxPro5.0, при котором поля, не перечисленные в команде SET FIELDS TO , не воспринимаются остальными командами Visual FoxPro5.0: SET FIELDS ON Команда, отменяющая этот режим: SET FIELDS OFF или в диалоге Field Picker удалить все поля из списка выбранных. Команда, восстанавливающая полный список полей в режиме включенного фильтра полей (SET FILTER ON): SET FIELDS TO ALL или в диалоге Work Area Properties опция All fields in the work area (см. выше). Освоим процедуру фильтрации полей на примере. В программе, текст которой записан ниже, процесс фильтрации полей проиллюстрирован двумя командами: • в первой устанавливается режим, при котором невидимыми становятся все поля, кроме первого (его имя возвращает функция FIELD(exprN) и замещает операцией макроподстановки & наименование поля в команде SET FIELDS TO ); • во второй устанавливается режим, при котором невидимы все поля, кроме первого и третьего. Наберите программу (MODIFY COMMAND fld) и выполните ее DO fld). После каждой команды BROWSE для продолжения работы программы нажимайте Esc. • Программа fld. prg, иллюстрирующая работу с • фильтрами. CLEAR USE students && открывается файл students.dbf. BROWSE z=FIELD(1) && переменной z присваивается имя && поля 1 - в данном случае ФИО. SET FIELDS ON && включается фильтр полей. SET FIELDS TO &z && список полей - по переменной z
75
BROWSE SET FIELDS OFF z1=FIELD(3) SET FIELDS ON SET FIELDS TO &z,&z1
&& с помощью макроподстановки (ФИО). && просмотр «отфильтрованных» полей. && отключение режима фильтрации полей. && z1 содержит имя поля3 - Группа. && список полей: ФИО, Код_спец && (по макроподстановке вместо z,z1)
BROWSE SET FILTER TO
&& отключаются фильтры записей && (возможно, установленные в этом && сеансе работы с Visual FoxPro 5.0 ранее). SET FILTER TO Группа =«КЭ-106» && устанавливается фильтр && записей дополнительно к фильтру полей. BROWSE && только гр. КЭ-106,поля ФИО, Код_спец. SET FIELDS OFF && отключение фильтра полей. SET FILTER TO && отключение фильтра записей. Новые команды и функции SET FIELDS TO - устанавливается фильтр полей.. SET FIELDS ON/OFF – включение/отключение режима, при котором поля, перечисленные в списке команды set fields to , не будут восприниматься другими командами Visual FoxPro 5.0 FIELD(exprN) – наименование поля, номер которого (присвоенный автоматически Visual FoxPro 5.0 при создании файла базы данных) равен числовому выражению <exprN>
4.3. Прием 3: упорядочивай записи. Существо приема состоит в логическом упорядочивании записей по убыванию либо по возрастанию ключа. Ключом индексирования называется выражение, в котором использованы одно или несколько полей базы данных и знаки математических действий, допустимых для полей данного типа (в том числе и действия алгебры логики). Порядок следования записей по возрастанию (убыванию) ключа задается операцией индексирования, при которой файлу базы данных ставится в соответствие так называемый индексный файл, в котором перечислены физические номера файла в порядке возрастания (убывания) значения ключа. В Visual FoxPro 5.0 имеется возможность создавать индексные файлы двух типов: • одноиндексные файлы (имеют по умолчанию расширение *.idx),в которых использован единственный ключ индексирования; • многоиндексные файлы (имеют по умолчанию расширение *.cdx), в которых объединяются одноиндексные файлы. Эти файлы будут рассмотрены в п.4.3.2. 4.3.1.Создание и использование одноиндексных файлов. Операция индексирования позволяет многократно ускорить процессы поиска нужной записи в файле: появляется возможность сразу отсечь не менее половины записей как заведомо не содержащей искомую. В отличие от переборного, «пока-не-встретишь» алгоритма поиска нужной записи в неупорядоченных файлах алгоритм поиска в индексированных файлах строится следующим образом: •число записей в индексном файле делится пополам; •находится «физический» номер записи, соответствующий «середине» индексированного файла; •определяется значение ключа поиска для записи с этим номером. Если оно равно искомому, поиск заканчивается. Если оно меньше искомого, отбрасывается вторая половина записей индексного файла. Если он больше искомого - отбрасывается первая -
76
делится пополам оставшаяся часть индексного файла и т.д., до тех пор, пока не будет найдена запись с нужным значением ключа. Поиск по такому алгоритму многократно быстрее переборного. Его преимущества особенно сильно проявляются при работе с файлами баз данных, содержащими большое число записей (порядка сотен тысяч и более). 4.3.1.1. Схема использования приема «Упорядочивай записи». 1)продумайте, какие аспекты сортировки базы данных Вас интересуют. Определите ключи сортировок (т.е. наименования полей, их сочетания, формулы, использующие действия над полями). 2)создайте нужные индексные файлы. ЗАПОМНИТЕ: каждому файлу таблицы данных в Visual FoxPro 5.0 может быть поставлено в соответствие несколько индексных файлов. Их общее количество ограничено памятью ЭВМ.
Если Вы обладаете опытом работы с табличными процессорами, то можете заметить аналогию с операциями, предусмотренными для баз данных, встроенными в интегрированную среду. Для создания индексных файлов в одной из рабочих областей оперативной памяти (по умолчанию - в первой) должен быть открыт упорядочиваемый (индексируемый) файл (командой USE). Рассмотрим два пути индексирования: Команда, создающая индексный файл: INDEX ON <expr> TO [FOR <exprL>] [UNIQUE] Здесь: <expr> - ключ индексирования, т.е. выражение с числовыми или с символьными переменными или с датами, но не с логическими переменными и не с memo-полями!); - имя индексного файла без расширения (по умолчанию Visual FoxPro 5.0 присвоит расширение .idx). Можно не опасаться дать индексному файлу то же имя, что и индексируемому(Visual FoxPro 5.0 различит их по расширению). Если Вы создаете не один, а несколько индексных файлов, то у них должны быть различные имена. Старайтесь давать имена, мнемонически сходные с именем индексируемого файла (будет легче запомнить). FOR <exprL> - необязательная, но очень полезная и мощная опция, позволяющая эффективно сочетать индексирование и фильтрацию данных: в индексном файле будут упорядочены записи, для которых соблюдается логическое условие <exprL>. Разработчики Visual FoxPro 5.0 утверждают, что совместное использование индексирования и фильтрации эффективнее команды SET FILTER.(см.п.4.2.). UNIQUE - необязательная опция; если в индексируемом файле имеется несколько записей с одинаковым значением ключа, то при ее использовании в индексный файл попадет единственная («попавшаяся» при индексировании первой). Второй способ индексирования производится при помощи Table Designer, который открывается командой Modify (системное меню Table/Properties, кнопка Modify). Рассмотрим этот способ на примере: 1. Для этого откройте таблицу Students.dbf, выполните команду Browse. 2. С помощью системного меню Table/Properties, кнопка Modify войдите в Table Designer. 3. Выберите вкладку Fields в диалоге Table Designer, переместите курсор на имя поля, по которому Вы хотите произвести индексирование, например – ФИО. 4. Выберите из списка в колонке Index ключ по возрастанию Ascending (Descending – ключ по убыванию). 5. Аналогично проиндексируйте по полю Год_поступ.
77
Теперь нажмите кнопку OK, и Вы вернетесь в диалог Work Area Properties. Чтобы просмотреть созданные Вами индексы, выберите в поле Index Order имя индекса, например Students:ФИО, после чего нажмите OK и выполните команду Browse. Перед Вами на экране будет выведена таблица с упорядоченными по алфавиту фамилиями студентов. 3)В зависимости от конкретной цели установите, какой индекс должен быть активным, главным (master-index). Для этого используйте команды, устанавливающие главный индекс в их списке <list_of_indfiles>: SET INDEX TO <list_of_indfiles> SET ORDER TO <exprN> В команде SET INDEX перечисляются (через запятые) все индексные файлы (можно - без расширений, если Вы их создавали без указания расширений; при этом Visual FoxPro 5.0 автоматически присваивает расширение .idx), созданные Вами для данного индексируемого файла. По умолчанию первый из перечисленных будет активным (т.е. рабочим ключом индексирования будет служить ключ из первого в списке <list_of_indfiles> индексного файла). Эти же действия можно выполнить в диалоге Table Designer. Для этого выберите вкладку Indexes, и Вы увидите список установленных Вами индексов. Колонки: Order – указывает выбранный ключ индексирования по данному полю (↑ - индекс, в котором значения упорядочены по возрастанию; ↓ - индекс, в котором значения упорядочены по убыванию); Name – имя индекса, может быть любым (желательно давать информативные имена); Туре – тип индекса: Regular - хранятся значения индексного выражения для всех записей таблицы. Если несколько записей имеют одинаковое значение индексного выражения, то каждое значение хранится отдельно и содержит ссылку на связанную с ней запись. Unique – хранятся только не повторяющиеся значения индексного выражения. Если две или более записей содержат одинаковые значения индексного выражения, то будет хранится только одно значение и ссылка на первую из записей с одинаковым значением индексного выражения. Таблица может иметь несколько уникальных индексов. Candidate – создается уникальный индекс, который не содержит полей с пустыми значениями. Этот индекс обладает всеми качествами первичного ключа и не является им только по той причине, что таблица не может содержать не более одного первичного ключа. Primary - создается уникальный индекс, который используется для связывания таблиц и определения условий целостности данных. Поля, входящие в первичный ключ, не должны допускать ввода пустых значений. В отличие от уникального индекса, таблица может иметь только один первичный ключ . Expration – то же самое, что и <expr> (см. команду INDEX ON). Filter – фильтр индекса, используемый для ограничения формируемых индексных значений (см. команду SET FILTER TO п.4.2.1). Для изменения главного индекса, переместите мышкой значок слева от колонки Order на первую позицию, не отпуская кнопку мыши. Если по ходу работы с базой данных необходимо заменить ключ индексирования, то командой SET ORDER TO <exprN> укажите номер нужного индексного файла в списке <list_of_indfiles> или, если Вы работаете в диалоге Table Designer, во вкладке Indexes простой заменой ключа.
78
4) Если нужно просмотреть неиндексированный (исходный) файл, используйте команду SET ORDER TO 0 или в диалоге Work Area Properties в списке Index order выберите позицию <no order>. 5) Если нужно закрыть все индексные файлы и работать с исходным неиндексированным, используйте команду SET INDEX TO 6) Если Вы работаете с единственным индексным файлом, можно упростить порядок работы (поскольку ни в списке индексных файлов, ни в порядке их использования нет нужды). В этом случае используйте единственную команду USE <имя_неиндексир_исходн_файла> INDEX <имя_инд_файла> При этом Вы сможете работать с файлом, упорядоченным по ключу, который был «заложен» в <инд_файле>. 7) Хотя для многих команд перестройка индексных файлов производится в Visual FoxPro 5.0 автоматически при всех изменениях, вносимых в исходный (индексируемый) файл, целесообразно обновить все индексные файлы, созданные для данного, после любого внесенного в него изменения. Для этого и в «ручном» (диалоговом) режиме, и в программах используйте команду REINDEX (предварительно все индексные файлы должны быть открыты командой SET INDEX.) или с помощью команды системного меню Table/Rebuild Indexes. Не забывайте реиндексировать: «путаница» в индексах является одной из основных причин логических ошибок в системах управления базами данных! Не забывайте обновлять индексные файлы после внесения изменений в индексируемый файл. 4.3.1.2. Освоим прием индексации на примерах • Командами SELECT A USE students откройте файл students.dbf в рабочей области A. Просмотрите файл командой BROWSE, - убедитесь, что записи в нем неупорядочены. • Создайте индексный файл для упорядочивания записей по алфавиту фамилий: INDEX ON ФИО TO stud01 (набирайте INDE ON ФИО TO stud01). Будет создан индексный файл stud01.idx. • Просмотрите результат индексирования командой BROWSE. Вы увидите, что записи файла упорядочены по алфавиту фамилий. Переместите файловый указатель по записям. Обратите внимание на номера записей, указываемых при перемещении в статусной строке. Вы увидите «физические» номера (естественно, не совпадающие с видимым на экране). Если статусная строка отключена - предварительно включите ее (SET STATUS ON). • Если есть необходимость сохранить файл с физически упорядоченными записями, используйте копирование, например, командой COPY TO alf скопируйте логически упорядоченный файл в alf.dbf. Откройте его в рабочей области и просмотрите: SELECT C USE alf
79
BROWSE Вы увидите, что файл не только «выглядит» как упорядоченный, но и имеет упорядоченные номера записей (это можно заметить в статусной строке при перемещении файлового указателя). • Возвратитесь в рабочую область с файлом students.dbf SELECT A и создайте несколько других индексных файлов: a) ключ «по возрастанию оценки за сессию 01» INDEX ON Балл_сес01 TO stud02 BROWSE (будет выведен список, начинающийся с «плохих» студентов); б) ключ «по убыванию оценки за сессию 01» INDEX ON - Балл_сес01 TO stud03 BROWSE (будет выведен список, начинающийся с «отличников»); в) ключ «по убыванию среднего балла за сессии 01 и 02» INDEX ON -( Балл_сес01+ Балл_сес02)/2 TO stud04 BROWSE (будет выведен список, начинающийся с «устойчиво- хороших студентов»). • Закройте все файлы в рабочей область A командой CLOSE ALL. • Откройте все индексные файлы, связанные с файлом students.dbf командой USE students SET INDEX TO stud01,stud01,stud03 • Определите (мысленно), по какому индексу окажется упорядоченным файл students.dbf, если ввести команду BROWSE. Проверьте правильность Вашей догадки. •Измените главный индекс командой SET ORDER TO 3 По какому индексу окажется упорядоченным файл students.dbf, если ввести команду BROWSE? • Последовательно изменяйте главный индекс, проверяйте правильность Ваших предположений об упорядочении файла: SET ORDER TO 1 SET ORDER TO 2 SET ORDER TO 0 Задание: Выполните выше описанные примеры с помощью команд меню.
Новые команды и функции: INDEX ON <expr> TO [FOR <exprL>][UNIQUE] - создание индексного файла с расширением по умолчанию .idx SET INDEX TO <список_инд_файлов> - в рабочей области открываются индексные файлы (до семи),перечисленные в <списке>. SET INDEX TO - закрываются все индексные файлы. USE INDEX - неиндексированный файл открывается совместно с индексным файлом (для пользователя – упорядочивается). SET ORDER TO <exprN> - выбор номера индексного файла из списка открытых командой SET INDEX. SET ORDER TO 0 - отмена индексирования. REINDEX - обновление индексных файлов после изменений в исходном (индексируемом) файле. CLOSE ALL - закрытие файлов всех типов.
80
4.3.2. Создание и использование многоиндексных файлов и тегов. Причины, по которым желательно использовать многоиндексные файлы: •программисту легче запомнить имя одного многоиндексного файла, чем имена многих одноиндексных файлов; •многоиндексный файл создается средствами Visual FoxPro 5.0 ВСЕГДА как компактный (а для того, чтобы создать одноиндексный файл компактным, необходима специальная опция). Для понимания назначения многоиндексного файла можно использовать грубую аналогию: один двумерный массив - как альтернатива многим одномерным массивам. Каждый «столбец» многоиндексного файла называется ТЕГом (tag - в переводе: этикетка). Тегу присваивается имя (по правилам, принятым для переменных памяти в Visual FoxPro 5.0: до 254 символов, может любые буквы, цифры, нижнее подчеркивание, начинается с буквы). Многоиндексный файл создается двумя путями: • как объединение уже существующих одноиндексных файлов, если Вы пользовались при создании индексных файлов командой SET INDEX; • как первично образуемый многоиндексный файл (при этом не нужно предварительно создавать одноиндексные файлы). По умолчанию многоиндексный файл имеет расширение *.cdx Многоиндексный файл без использования одноиндексных файлов создается командами: INDEX ON TAG OF <имя_многоинд_файла> - проводится индексирование файла, открытого в одной из рабочих областей, по ключу ; результаты записываются в многоиндексный файл с указанным именем; «столбцу» (тегу) этого файла, содержащему результаты индексирования по ключу , присваивается указанное в команде имя. При использовании дизайнера таблицы Table Designer для создания индексов, многоиндексный файл создается автоматически с именем активной таблицы и расширением .cdx. Например, индексы, созданные в пункте 4.3.1. являются тегами с именами ФИО и Год_поступ многоиндексного файла students.cdx. USE <имя_*.dbf-файла> INDEX <имя_многоинд_файла>ORDER TAG <имя_тега> - в рабочей области открывается *.dbf-файл в режиме с индексированием, ключ которого «запомнен» в теге; Аналогичными действиями являются открытие индексного файла через системное меню File/Open с расширением *.cdx и выбор тега в поле Index Order диалога Work Area Properties (см. п.4.3.1.1) SET ORDER TO TAG OF <имя_многоинд_файла> - аналогично команде SET ORDER TO, описанной в п.4.2.2. USE <имя_*.dbf-файла> INDEX <имя_многоинд_файла> ORDER <exprN> - в рабочей области открывается *.dbf-файл в режиме с индексированием, ключ которого определяется по номеру тега, перечисленного в команде SET ORDER Примеры: USE students INDEX ON ФИО TAG t1 OF multiind && создается многоиндексный файл multiind.cdx, в который в && «столбец» (тег) записывается результат индексирования && по алфавиту фамилий INDEX ON –Балл_сес01 TAG t2 OF multiind && «заполняется второй столбец (тег)» t2 результатами && индексирования по убыванию баллов за первую сессию. USE students INDEX multiind ORDER TAG t1 BROWSE && на экране - записи по алфавиту. USE students INDEX multiind ORDER TAG t2
81
BROWSE && на экране - записи по убыванию оценок. SET ORDER TO TAG t2,t1 USE students INDEX multiind ORDER 2 BROWSE && на экране - записи по алфавиту. USE students INDEX multiind ORDER 1 BROWSE && на экране - записи по убыванию оценок. 4.4. Поиск записей в индексированных и неиндексированных файлах. 4.4.1. Поиск записей в индексированных файлах осуществляется с помощью совокупности команд открытия индексированных файлов (п.4.3) и одной из команд поиска (FIND или SEEK), в которых должно быть задано значение ключа. Если Вы не хотите указать значение ключа точно (например, не хотите или не помните точно искомой фамилии и ищете запись только по первой букве либо по нескольким первым буквам), следует использовать конфигурацию виртуальной машины Visual FoxPro 5.0 командой из группы SET: SET EXACT ON и SET EXACT OFF. Эти режимы возможны только для символьных переменных. Подробнее: SET EXACT OFF - отключение режима, при котором требуется полное соответствие наименования ключа в командах FIND, SEEK наименованию, использованному при создании индексного файла. SET EXACT ON - включение режима точного соответствия. По умолчанию в Visual FoxPro 5.0 установлено SET EXACT OFF. Команды поиска FIND имеют форму: FIND <значение_ключа_индексирования> SEEK <значение_ключа_индексирования> По любой из этих команд будет найдена запись, в которой значение ключа точно (если SET EXACT ON) или приблизительно (если SET EXACT OFF) совпадает с заданным в команде <значением_ключа_индексирования>. Если ключ - числовой, то совпадение требуется точное, если включен режим SET NEAR OFF, либо приблизительное, с округлением - если SET NEAR ON. По умолчанию в Visual FoxPro 5.0 установлено: SET EXACT OFF SET NEAR OFF Если в файле имеется несколько записей с одинаковым значением ключа, то по команде FIND файловый указатель остановится на «первой встреченной». Две почти идентичные по назначению команды (FIND, SEEK) введены для совместимости Visual FoxPro 5.0 с другими (более ранними) версиями Fox. Освоим процедуру поиска на примерах. а) Если у Вас сохранились индексные файлы, то можно использовать их. Если нет выполните следующие предваряющие команды: USE students INDEX ON ФИО TO stud01 INDEX ON Балл_сес01 TO stud02 INDEX ON - Балл_сес01 TO stud03 INDEX ON -( Балл_сес01 + Балл_сес02)/2 TO stud04 SET INDEX TO stud01,stud02,stud03,stud04 (по данным командам файл students.dbf будет открыт в рабочей области A, проиндексирован по алфавиту фамилий, по возрастанию балла за сессию 01, по убыванию балла за сессию 01, по убыванию среднего за сессии 01 и 02 балла. Будут открыты
82
соответствующие индексные файлы. КЛЮЧ индексирования - по первому в списке, т.е. по алфавиту фамилий). Не забывайте, что создать индексы можно и в режиме Modify в диалоге Table Designer.
б) Установите режим неточного совпадения значений ключей в индексном файле и в команде FIND. SET EXACT OFF (конечно, можно эту команду не набирать (реализована по умолчанию), но так Вы легче запомните). в) Найдите запись, в которой фамилия начинается с буквы Е: FIND «Е» Обратите внимание: значения ключа, сформированные из символьных переменных, должны быть показаны в кавычках (и, конечно, на языке, на котором записаны - в данном случае на русском) г) После выполнения команды определите номер записи, на которой остановился файловый указатель в результате поиска. Воспользуйтесь функцией RECNO(), возвращающей номер записи: ?RECNO( ) На экране Вы увидите номер записи, в которой в поле ФИО записана фамилия Ерофеева. Вы можете ее прочесть на экране по запросу ? ФИО Если Вы введете команду BROWSE, то файловый указатель выделит найденную запись (попробуйте это). д) К сожалению, начальная часть имени ключа должна быть указана правильно (не удается найти запись по одной или нескольким буквам внутри фамилии). Если такой поиск понадобится, то следует проиндексировать файл так, чтобы ключ использовал нужную часть имени поля - например, для того, чтобы найти запись по 4-й и 5-й буквам фамилий, создайте индексный файл с помощью команды: INDEX ON SUBSTR(ФИО,4,2) TO stud05 или же вторым способом, т.е. с помощью команды Modify войдите в дизайнер таблицы Table Designer, и создайте индекс с ключом, указанным выше. Теперь можно найти, например, запись, содержащую сочетание букв «нц» FIND «нц» ?RECNO( ) ? ФИО BROWSE На экране будет показан номер записи с фамилией «Званцева», значение поля ФИО и общий вид файла с указателем на этой записи. е) Найдите номера записей, в которых ключ начинается: с букв «Тем», с буквы «Я», с букв «Прив» (в последнем примере Вы увидите сообщение No find (не найдено). ж) Смените ключ индексирования командой SET ORDER TO 3 (индексирование по убыванию среднего балла). Или воспользуйтесь командой системного меню Table/Properties, где Вы сможете в списке Index order сменить ключ индексирования. Найдите запись, в которой значение балла равно 4.2 FIND 4.2 Вы увидите ответ, который может Вам показаться неправильным: No find = «не найдено» (хотя имеется запись, в которой Балл_сес01=4.2
83
Вспомните, что при создании индексного файла stud03 Вы использовали ключ «-» (минус!) Балл_сес01 (этим достигалось упорядочивание по убыванию: если Балл_сес01 возрастает, то - Балл_сес01убывает). Запомните! Команда FIND ищет не значение, записанное в соответствующем поле, а значение ключа индексирования
Поэтому для того, чтобы найти запись, в которой Балл_сес01=4.2 нужно набрать команду FIND 4.2 (с минусом). з) Выполните следующие задания: найдите запись, в которой средний балл за сессии 01 и 02 равен приблизительно 4.0; найдите запись, в которой балл за сессию 01 равен 5.0; найдите запись, в которой 5-я и 6-я буква фамилии: «ее». 4.4.2. Решим более сложную задачу: составим программу, осуществляющую поиск записей по очень приблизительным, «туманным» сведениям. Пусть требуется найти запись по фамилии, относительно которой известно, что «где-то в середине» в ней есть сочетание букв «вл». Вначале «придумаем» алгоритм - последовательность действий, ведущих к достижению результата: •предположим, что возможные варианты размещения буквы «в» в сочетании «вл» от 1-ого до 15-ого символа в поле ФИО; •будем перебирать возможные варианты в цикле i=1... 15: • проиндексируем файл по части имени поля SUBSTR(ФИО,i,2) • попытаемся найти буквы «тв»; • если поиск удачен, то файловый указатель остановится на найденной записи внутри файла. Признак конца файла EOF( ) при этом примет значение «ложно» (.F., от false - ложно). Дальнейший перебор нужно прекратить (это можно сделать, если положить i=16 - значение цикловой переменной заведомо больше, чем заданное 15). • если поиск неудачен, то файловый указатель остановится вне файла. Признак конца файла EOF( ) при этом примет значение «истинно» (.T., от true - истинно). Следует продолжить перебор с новым вариантом размещения (присвоить i значение i+1); •после окончания циклического поиска: • либо будет найдена запись с буквами «вл» (тогда EOF( ) ложно); • либо запись с буквами «вл» в файле отсутствует (тогда EOF( ) истинно). •В зависимости от результатов поиска следует вывести сообщение (либо с выдачей искомой фамилии, либо с указанием, что в файле отсутствует запись, содержащая заданное сочетание букв). Ниже приведен текст программы, реализующий этот алгоритм. Некоторые пояснения к новым командам: Новые команды и функции: SET SAFETY OFF – отключение режима, при котором Visual FoxPro 5.0 запрашивает подтверждение Да/Нет (Y/N) перед выполнением команд, которые могут привести к порче таблицы данных (например, перед записью новой информации в уже существующий файл). SET SAFETY ON - включение режима «безопасности». SET EXACT OFF – отключение режима соблюдения точного соответствия наименования ключа индексирования и запроса на поиск в командах FIND, SEEK. SET EXACT ON - включение режима точного совпадения. SET NEAR ON|OFF- включение/отключение режима точного совпадения цифровых значений ключа индексирования с искомым. FIND (ключ) – нахождение номера записи в индексированном файле по значению КЛЮЧА. SEEK (ключ) - ---------------»-----------------
84
EOF( ) – признак нахождения файлового указателя в конце файла (EndOf File): EOF( )=.T. – файловый указатель - в конце файла. EOF( )=.F. – файловый указатель - внутри файла. IF <exprL> <серия 1>ELSE <серия 1>ENDIF – конструкция ветвления: если логическое условие <exprL> истинно, то выполняется серия 1 команд, иначе (ELSE) - серия 2. IF... ENDIF – начало и конец конструкции ветвления (операторные скобки) RECNO( ) – функция, возвращающая номер записи, на которой в данный момент находится файловый указатель @row,col SAY «строка_текста_в_кавычках» - вывод сообщения (указанного в кавычках) на экран с размещением первой буквы в заданных строке (row) и столбце (col). Возможны значения: row=1...23, col=1...79
Текст программы (наберите его с помощью текстового редактора MODIFY COMMAND <имя, напр. fnd> и после набора и записи Ctrl-W,^W выполните DO fnd). *Программа fnd. prg, иллюстрирующая поиск данных в индексированных файлах CLEAR && очистка экрана. USE students && students.dbf открывается в рабочей области. SET EXACT OFF && отключается режим точного совпадения ключа и запроса. SET SAFETY OFF && откл. режим подтверждения опасных команд. i=1 && первый вариант размещения букв вл. DO WHILE i<=15 && цикл по возможным размещениям букв вл INDEX ON SUBSTR(ФИО,i,2) TO stud02 * индексирование с текущим вариантом (i-м,i=1...15) размещения искомых букв. FIND «вл» && попытка найти буквы вл. IF EOF( ) && если EOF( )=.T. - истинно, то достигнут конец файла - т.е. вл && при данном значении i не найдено. i=i+1 && новый возможный вариант размещения вл. ELSE && если EOF( )=.F. - ложно, то файловый && указатель остановился внутри файла, && т.е. буквы вл найдены. i=16 && нужно прервать дальнейший поиск и && выйти из цикла, поэтому присваиваем i=16. ENDIF && конец конструкции ветвления. END DO && конец циклической конструкции. IF EOF( ) && если после перебора всех возможных && вариантов размещения файловый && указатель находится в конце файла, && EOF( )=.T. - истинно - то это означает, && что букв вл ни в одной записи нет. @2,10 SAY «Сочетание букв вл не найдено» * @row,col - строка (row,можно 1..23) и столбец (col, можно 1..79), * в которой размещается текст SAY..., выводимый Visual FoxPro 5.0 ELSE &&файловый указатель - внутри файла, т.е. запись с буквами вл &&найдена. @2,12 SAY «Фамилия, содержащая буквы вл:» * текст сообщений по результатам поиска @4,20 SAY ФИО @6,10 SAY «номер записи в файле с этой фамилией:» @8,16 SAY RECNO( ) ENDIF SET SAFETY ON && восстановление режимов, SET EXACT ON && предусмотренных по умолчанию.
85
«Поэкспериментируйте» с программой (модифицируйте ее, команда MODIFY COMMAND fnd, не забывайте записывать Ctrl-W): • отключите команду SET SAFETY OFF (для этого поставьте знак * в начале строки, и Visual FoxPro 5.0 «будет думать», что это - строка примечаний), запустите программу и сравните, как работает программа; • при включенном/отключенном режиме «безопасности» SET SAFETY ON/OFF; • внесите в программу изменения, нужные для того, чтобы было найдено сочетание букв «ар»; • измените размещение ответов Visual FoxPro 5.0 на экране так, чтобы Вам нравилось. Сходные с командой SEEK (FIND) задачи можно решить, используя функцию SEEK(выражение для поиска), которая возвращает логическое значение .Т. в случае успешного поиска. Использование данной функции аналогично последовательному выполнению команды SEEK, а затем функции FOUND(), которая возвращает логическое значение .Т., если после команды FIND (SEEK) поиск в текущей рабочей области завершен успешно. Например, в диалоге Work Area Properties в поле Index order выберите ключ индексирования ФИО (если помните, мы проиндексировали поле ФИО по возрастанию) и нажмите кнопку OK, на экране появилась индексированная таблица, наберите команду в командном окне: @ 2,6 SAY SEEK ("Ж"). И на экран в указанной позиции будет выведено логическое .T. (TRUE – истина), т.е. поиск записи в индексной таблице, у которой фамилия начинается с буквы "Ж" завершен удачно. Более подробное описание команды (т.е. с остальными необязательными параметрами) см. помощь (F1).
4.4.3. Поиск записей в неиндексированном файле. Если база данных невелика (менее 100 записей, менее 10 полей), индексирование не даст заметного выигрыша во времени по сравнению с «прямым», переборным поиском. Этот поиск осуществляется совокупностью команд: LOCATE [<scope>] [FOR <exprL>][WHILE <exprL>] <серия команд FoxPro2.0> [CONTINUE] Здесь: <scope> - группа записей (все, ALL; насколько следующих NEXT<число>; оставшиеся до конца файла REST); (по умолчанию поиск ведется по всей базе данных). FOR... WHILE - необязательная часть команды, задающая условие поиска: запись найдена, если логическое условие <exprL> истинно. FOR - устанавливает условия для всех записей файла; WHILE действует до тех пор, пока не будет «встречена» первая запись, не удовлетворяющая условию <exprL>. По команде LOCATE файловый указатель останавливается на «первой встреченной» записи, для которой соблюдается условие поиска FOR... или WHILE. Затем может быть выполнена серия команд (например, просмотра базы данных и/или определения номера записи, на которой остановился указатель). Затем поиск может быть продолжен - необязательная опция CONTINUE для нахождения записей, возможно, также удовлетворяющих условию поиска - до конца файла (когда функция EOF( ) возвратит .T. («истина»)). Очень мощной функцией поиска является LOOKUP (возвращаемое поле, выражение для поиска, поле поиска). При успешном завершении поиска указатель записи передвигается на запись, содержащую искомое значение. Например, Вы можете вывести номер группы студента, фамилия которого начинается с буквы "Ж": @ 2,2 SAY LOOKUP (Группа, "Ж", ФИО). После чего в заданной позиции на экране появится запись КЭ-206. Более подробное описание команды (т.е. с остальными необязательными параметрами) см. помощь (F1).
86
Упражнение. Просмотрите все записи, относящиеся к набору 1998 г. Это можно сделать следующими командами: USE students LOCATE FOR Год_поступ=1998 @3,10 SAY RECNO( ) && Вы увидите номер записи, встреченной && по ходу файлового указателя первой. @4,10 SAY EOF( ) && Visual FoxPro 5.0 ответит .F. (ложно: && запись внутри файла BROWSE && указатель - на найденной записи. CONTINUE && продолжение поиска. @3,10 SAY RECNO( ) && вторая запись с Год_поступ =1998. @4,10 SAY EOF( ) && Visual FoxPro 5.0 ответит .F. (ложно: && запись внутри файла. BROWSE CONTINUE && продолжение поиска. @3,10 SAY RECNO( ) @4,10 SAY EOF( ) && Visual FoxPro 5.0 ответит .F. (ложно: && запись внутри файла BROWSE CONTINUE && продолжение поиска @3,10 SAY RECNO( ) @4,10 SAY EOF( ) && Visual FoxPro 5.0 ответит .T. (истинно: BROWSE && больше записей с Год_поступ =1998 в файле нет; файловый && указатель -в конце файла. 5. СОЗДАНИЕ ПРОЕКТА Проектирование систем обработки данных представляет собой непростую проблему, т.к. включает в себя очень большое число различных модулей, каждый из которых должен правильно функционировать сам по себе и взаимодействовать друг с другом. Назначение проекта – объединить все файлы пользовательского приложения в один файл, а также не задумываться над местоположением файлов, входящих в проект. Создадим с Вами проект students, в который поместим уже созданную нами базу данных students.dbc и программы students.prg, copystru.prg и впоследствии будем помещать в данный проект все приведенные ниже примеры. Для создания проекта можно воспользоваться двумя способами: 1. с помощью меню File/New выбрать опцию Project и далее нажать на кнопку New File; 2. с помощью меню File/New выбрать опцию Project и далее нажать на кнопку Wizard. Первый способ создания проекта является наиболее быстрым, а второй - наиболее полным, т.к. происходит поэтапное описание проекта, где на каждом из этапов мастер предлагает включить в проект ту или иную структуру. Воспользуемся быстрым способом. Выполним действия, описанные в п.1, после чего на экране появится диалоговое окно CREATE , в котором Вы зададите путь и имя проекта. После проделанных действий на экране появится диспетчер проектов Project Manager, который Вы видите на рисунке 5.1. Его интерфейс позволяет иметь под руками все необходимые средства для работы с любым, входящим в проект модулем.
87
Рис. 5.1. Диспетчер проектов.
Опишем заполнение нашего проекта на примере: 1. Добавьте в проект базу данных students.dbc. Для этого выберете структуру Data, нажмите на значок (+), стоящий слева от него, после чего появятся элементы этой структуры: • Databases - содержит базы данных; • Free Tables - содержит свободные таблицы, т.е. не входящие в БД; •Queries - содержит
SQL - запросы. Выберите элемент Databases и нажмите кнопку Add (добавить). Появится диалоговое окно Open, в котором укажите путь и имя базы данных students.dbc. Внутри структуры Databases будет находится структура students – ваша БД, и в ней - таблица students.dbf. 2. Добавите теперь в проект две программы. Для этого выберите структуру Code, нажмите на значок (+), стоящий слева от него, после чего появятся элементы этой структуры: • Programs - содержит программы Visual Foxpro; •API Libraries - содержит библиотеки API- функций; •Appications - содержит исполняемые (.exe) файлы. Выберите элемент Programs и нажмите кнопку Add (добавить). Появится диалоговое окно Open, в котором укажите путь и имя программы students.prg. Внутри структуры Programs будет находится программа students.prg. Аналогичным образом добавьте программу copystru.prg. 6. РАЗРАБОТКА ФОРМ С ПОМОЩЬЮ МАСТЕРА ФОРМ Мастер форм - Form Wizard позволяет создать форму в виде набора полей для работы с данными одной таблицы. Основное достоинство Мастера форм заключается в создании функционально законченного элемента пользовательского приложения, который имеет все необходимые средства просмотра, поиска и редактирования данных. Создайте форму students.scx, в которой будут содержаться поля Вашей таблицы students.dbf. Для этого выполните следующие действия: 1. Откройте проект students; 2. Нажмите ярлык Documents в диспетчере проектов для перехода на вкладку Documents; 3. Затем выберите группу Forms и нажмите кнопку New, в результате чего откроется окно диалога New Form; 4. Выберите опцию Form Wizard; В качестве альтернативного способа запуска мастера форм Вы можете выбрать команду File/New, в результате чего откроется окно диалога New. Далее выберите опцию Form, а затем нажмите кнопку Wizard. После того как Вы запустили мастер форм, Вам достаточно ответить на вопросы
88
текущего экрана мастера и нажать кнопку Next для перехода к следующему экрану. Если Вы допустили ошибку или решили изменить ответы предыдущего экрана, вернитесь к предыдущему экрану, нажав кнопку Back. Для отказа от продолжения создания объекта нажмите кнопку Cancel.
5. Вы запустили мастер форм для построения форм. 6. На экране откроется окно диалога Wizard Selection с помощью которого Вы должны указать, создаете Вы форму для одной таблицы или нескольких связанных таблиц. По умолчанию предполагается создание однотабличной формы. Для перехода к следующему шагу нажмите кнопку OK. 7. Теперь выберите таблицу students и все поля этой таблицы (которые будут размещены в форме). Для выбора БД и содержащейся в ней таблицы используются два списка, расположенные в области “Databases and tables”. Если в данный момент открытые БД и таблицы отсутствуют или открыты не те таблицы, которые Вы предполагаете использовать для построения формы, то эти списки пусты или содержат совсем не ту информацию, которая Вам нужна. Для выбора требуемой таблицы нажмите кнопку, … расположенную, рядом с кнопкой раскрытия списка БД. На экране откроется окно диалога Open, позволяющее найти таблицу, которая будет использоваться в форме. Выберите каталог, затем требуемую таблицу и нажмите кнопку OK. 8. После выбора таблицы список Available Fields содержит список полей открытой таблицы. Из данного перечня перенесите все поля, используя кнопки со стрелками, в список Selected Fields. 9. Нажмите кнопку Next. 10. Установите стиль отображения объектов формы Embossed и тип кнопок управления Picture Buttons. Список Style содержит шесть различных вариантов отображения объектов (полей, линий, заголовков и т.д.) в форме. Мастер форм позволяет при выборе каждого из стилей просмотреть результаты в верхней части окна диалога. Опции переключателя Button Type позволяют выбрать тип отображения кнопок управления. Кнопка Text Buttons Picture Buttons No Buttons Custom
Тип отображения кнопки управления содержат текстовые надписи кнопки управления содержат изображения кнопки управления в форме отсутствуют в форме размещается пять кнопок управления: Find, Print, Add, Delete, Exit. Перемещение по записям осуществляется с помощью располагаемой в форме линейки прокрутки.
После того как Вы установите опции, нажмите кнопку Next. Вы можете выбрать опции по Вашему усмотрению. 11. На третьем шаге укажите критерий сортировки данных при отображении в форме. Упорядочение осуществляется по полям, перечисленным в списке Selected Fields. Для переноса поля из списка Available Fields or index tag в список Selected Fields, установите курсор на поле, по значению которого требуется упорядочение данных, в нашем случае – Фио, и нажмите кнопку Add. Если Вы ошибочно перенесли не то поле, для его удаления из списка Selected Fields воспользуйтесь кнопкой Remove. Опции Ascending и Descending определяют, по возрастанию или по убыванию будут упорядочиваться данные в выбранном поле. Для перехода к следующему шагу создания формы нажмите кнопку Next. 12. В заключение создания формы задайте заголовок формы “Студенты” в поле Type a title for your form и выберите один из возможных вариантов продолжения работы над формой - Save and run form. Опция Save form for later use Save and run form
Действие Сохраняет созданную форму Сохраняет созданную форму и запускает ее на выполнение
89
Save form and modify it Сохраняет созданную форму и открывает ее в конструкторе форм in the Form Designer для модификации
После установки требуемых опций нажмите кнопку Finish. В открывшемся окне диалога Save as выберите каталог и введите имя созданной формы – students c расширением по умолчанию .scx. Ваша программа запуститься на выполнение, с действием каждой кнопки ознакомьтесь самостоятельно. Чтобы выйти из программы нажмите кнопку Exit. Если Вы хотите заново запустить форму на выполнение, то выберите один из следующих способов: Выполните команду меню Form/Run Form; Выполните команду меню Form Run всплывающего меню; Нажмите кнопку Run на стандартной панели инструментов Visual Foxpro5.0.
!
7. ЗАЧЕТНОЕ ЗАДАНИЕ по части 1. 1. Разработайте (для использования при освоении материала следующих частей пособия) два файла таблиц данных и поместите их в БД. В них Вы будете хранить сведения о командах (в файле commands. dbf) и встроенных функциях (в файле functions.dbf). Каждая команда и функция должна быть снабжена шифром (поле shifr, см. ниже); в качестве шифра выберите любое число из диапазона 1...999 (шифры не должны дублироваться: каждая команда и функция должна иметь свой шифр!). Должна быть обеспечена возможность, найти по запросу перечень команд и функций, близких к данной по назначению (т.е. ассоциированных с ней). Поиск таких команд и функций Вы будете делать по вводимому в поля shifr_assc (для команд) и shifr_assf (для функций) шифру, который имеет следующую структуру: предполагается, что с каждой командой (функцией) может быть связано не более 10 других команд (функций); под поле shifr_assc отводится 30 символов; каждая триада - шифр соответствующей ассоциированной команды; записывайте шифры ассоциированных команд с соблюдением формата (например, если шифр команды равен 9, то в отведенную под него триаду нужно записать символы 009). Например, если в поле shifr_assc записано 020345070002000000000000000000, то Ваша программа должна расшифровать его так: «с данной командой ассоциированы команды, имеющие шифры 20, 345, 70 и 2» (это получится после разборки содержимого поля на триады 020 345 070 002 и перевода полученных трехсимвольных строк в цифровую форму); признаком окончания перечня ассоциированных команд, если их число - меньше 10, является триада 000, встреченная в процессе расшифровки первой (в примере такой триадой является пятая); поле shifr_assf имеет полностью аналогичную структуру, его содержимое относится к шифрам функций, ассоциированных с данной командой (функцией). Более подробное описание файлов и полей: • файл Commands.dbf с полями: Command - поле символьного типа, число символов 35, назначение - команда Visual FoxPro 5.0; shifr - поле числового типа (целое), число знаков 3, назначение - шифр команды (присваивайте шифр произвольно, от 1 до 999, он понадобится для поиска «ассоциированных» команд и функций);
90
shifr_assc - поле символьного типа, содержащее шифры команд, связанных («ассоциированных») с данной; в описании Visual FoxPro 5.0 и в Help такие команды перечислены с ключевыми словами See also:.(см. также:..).Число символов в поле 30. shifr_assf - аналогичное по структуре поле, содержащее шифры «ассоциированных» функций (строится с использованием поля shifr файла functions.dbf, см. дальше. descript - поле символьного типа, ширина 30 символов, содержит краткое описание команды; example - поле примечаний; содержит подробное описание команды и пример. • файл functions.dbf с полями: function - поле символьного типа, число символов 35, назначение - функция Visual FoxPro 5.0; Остальные поля - с такими же наименованиями и назначением, что и в файле Commands. dbf 2. Заполните эти файлы изученными командами и функциями (они выделены по тексту рамками). 3. Выполните следующие упражнения: • проиндексируйте файлы по шифру; • найдите все ассоциированные команды к команде BROWSE. Пользуясь одним из приемов работы с базой данных, представьте на экране только ассоциированные команды; • придумайте 2-3 операции с созданной базой данных.
Часть 2. ПРОГРАММИРОВАНИЕ и ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС СУБД 1. КРАТКИЕ СВЕДЕНИЯ О ПРОГРАММИРОВАНИИ В СИСТЕМАХ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ (СУБД). Visual FoxPro 5.0 имеет мощный встроенный язык программирования, реализованный как интерпретатор. Режим компиляции позволяет получить исполняемые (*.exe) файлы, однако эти файлы весьма громоздки, и многие программисты предпочитают использовать исходные либо компилированные программы и работать в среде Visual FoxPro 5.0 (а не в среде операционной системы). Внешне структура языка Visual FoxPro 5.0 мало отличается от других языков процедурного программирования (Pascal, QuickBasic...), но стиль программирования в средах систем управления базами данных (СУБД) имеет особенности, связанные с назначением СУБД - обработка очень больших (до миллиарда записей!) объемов данных. Известно, что в этом случае возникают затруднения из-за затрат машинного времени. В теории программирования имеются разделы, посвященные методам ускорения так называемых массовых операций. Определение: массовыми операциями в программировании называют такие, количество которых (и соответственно затраты машинного времени на которые) зависят от объема обрабатываемых данных. Примерами таких операций являются: •поиск элемента в массиве; •упорядочивание массива или таблицы;
91
•вставка некоторого элемента между имеющимися в таблице. В СУБД именно такие операции являются основными. Поэтому первые СУБД (в том числе dBASEIII, FoxBase) работали настолько медленно, что раздражали и программиста, и пользователя. В Visual FoxPro 5.0 массовые операции многократно ускорены не только благодаря прогрессу технического обеспечения, но и благодаря новым способам программной реализации операторов языка (широкое использование кэш-памяти, использование быстрых логических операций и др.). Основные особенности стиля программирования в СУБД связаны с использованием приемов ускорения массовых операций. 1.1 Перечень особенностей стиля программирования в СУБД: а) Ускорение массовых операций: Старайтесь «делать невидимой» часть базы данных, которая не нужна для конкретного аспекта данного фрагмента программы. При этом будет достигнуто ускорение за счет замены «длинных» операций с записями базы данных на «короткие» операции анализа соответствующих признаков «невидимости». Ускорение массовых операций достигается при использовании описанных в Части 1 приемов: • удаления лишнего; • фильтрации полей и записей; • индексирования. Используйте эти приемы в своих программах. б) Не следует широко использовать привычный аппарат переменных как средств для хранения и управления данными. Visual FoxPro 5.0 имеет такой аппарат. Чтобы подчеркнуть его «медлительность», эти переменные называются переменными памяти (memo-variables). Работа с ними в Visual FoxPro 5.0 требует обращения к диску. Поэтому, если можно, управляйте данными внутренними средствами Visual FoxPro 5.0, например: •при циклическом просмотре записей вместо цикловой переменной (типа i:=i+1) используйте перемещение файлового указателя командой SKIP; •вместо известного алгоритма поиска наибольшего (или наименьшего) значения и (тем более) упорядочивания элементов данных используйте сортировку и индексирование. в) Всюду, где можно, избегайте команд и функций, требующих сведений о параметрах и характеристиках конкретной таблицы данных. Программу с такой конкретизацией трудно перестраивать при неизбежных (по самому смыслу и назначению СУБД) корректировках файлов таблиц данных. Перечень некоторых функций, при записи которых не используются конкретные сведения о базе данных: EOF( ), BOF( ) - признак конца и начала файла. DBF( ) - имя или псевдоним (alias) базы данных в рабочей области. FCOUNT( ) - число полей файла базы данных. FIELD(<exprN>) - имя поля (по его номеру). FILTER( ) - выражение, использованное в фильтре. FSIZE( ) - размер конкретного поля в байтах. NDX( ) - имя индексного файла, открытого в данной рабочей области. RECCOUNT( ) - число записей в файле базы данных. RECNO( ) - номер записи, на которой находится указатель. SYS(14) - ключ индексного файла. TYPE(<exprC) - тип поля (по его имени).
В программах, использующих эти функции, легко реализовать выполнение запросов пользователя в диалоге: все процедуры и подпрограммы будут
92
«абстрактными», пригодными для работы с любыми файлами. Расширяйте и пополняйте список таких функций. г) Поскольку потребителями СУБД являются лица, не имеющие специальной программистской подготовки, обращайте внимание на пользовательский интерфейс Ваших программ: •делайте программы меню-управляемыми; •обязательно программируйте «помощь» (вызываемую, например, путем нажатия правой кнопки мыши); •используйте окна. д) Принимайте меры к защите информации от неверных данных. Используйте как внутренние средства СУБД (например, опции команд ввода @ SAY,GET и корректировки BROWSE, см. Часть 3), так и ловушки ошибок (типа утверждение в терминологии [5]). 2. ОСВОЕНИЕ ОСОБЕННОСТЕЙ ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ В СРЕДЕ Visual FoxPro 5.0 2.1. Общая характеристика языка Visual FoxPro 5.0: Язык реализован как интерпретатор и имеет все признаки языка структурного программирования: •отсутствует оператор безусловного перехода (типа GOTO); •отсутствуют метки; •Все программные конструкции (ветвления, выбора, цикла) имеют строго скобочную форму: (IF...ENDIF, DO CASE...ENDCASE, DO WHILE...ENDDO); •Имеется развитый аппарат подпрограмм; •Имеется возможность оформить программы как модули и впоследствии слить их в проект; •Имеется аппарат функций, определяемых пользователем. Язык имеет мощные средства для создания пользовательского интерфейса: •команды и сервис для создания многоуровневых меню, горизонтальных и выпадающих; •команды и сервис для создания экранных форм и выходных документов; •команды для организации пользовательских окон. Благодаря реализации языка Visual FoxPro 5.0 как интерпретатора (т.е. такого, в котором выполнение директив происходит раздельно для каждой командной строки) в языке имеется возможность изменять смысл и текст последующих команд в зависимости от результата, полученного при выполнении предшествующих команд (например, в зависимости от информации, введенной пользователем), т.е. как бы «программой писать новую программу». Эта возможность обеспечивается функцией макроподстановки, которая же встречалась Вам (см. Часть 1). Такая функция в других языках не встречается (ее вряд ли можно реализовать в трансляторах). Ниже макроподстановка будет описана подробнее. В данном разделе приведены конспективные сведения об основных программных конструкциях. 2.2. Особенности оператора присваивания.
93
Оператор присваивания в Visual FoxPro 5.0 имеет две формы: 2.2.1. ФОРМА 1 оператора относится к присваиванию значений переменным памяти (memo-variables, сокращенно <memvar>) и не отличается от операторов присваивания в других процедурных языках. Переменная памяти (memo-variable) может содержать: не более 254 символов в обозначении; имя переменной может содержать любые буквы и цифры; первый символ в имени переменной должен быть буквой; в имени переменной должны отсутствовать пробелы. Определять тип переменной (как это делается в Pascal’е) или использовать специальные обозначения, определяющие тип по умолчанию (как в QuickBasic) НЕ НУЖНО: Visual FoxPro 5.0 определит и назначит тип переменной по первой операции присваивания. При следующем присваивании тип переменной может измениться, ошибки не будет. Список ограничений велик, чтобы знать его наизусть, но Вам всегда поможет проверка синтаксиса программы, при выполнении которой будет указано на использование недопустимых имен.
Прежде, чем использовать переменную в программе, ей нужно присвоить значение. Самый простой способ присвоения состоит в использовании оператора присвоения “=”, который имеет следующий синтаксис: переменная = выражение Кроме того, вместо оператора присваивания вы можете использовать команду, которая используется для сохранения значения в переменной или элементе массива: STORE <expr> TO <memvar> (Мы, конечно, не будем пользоваться такой формой из-за ее длиннот. Но в тексте Help используется именно она). Правильные формы оператора присваивания: STORE <expr> TO <memvar> значение, полученное в результате операций, записанных в выражении <expr>, присваивается переменной памяти <memvar>. Если в выражении <expr> будут входить операции, недопустимые для входящих в него данных, выдается сообщение об ошибке (Operator/operand type mismatch - несовпадение типов данных в операторе либо операндах). <memvar>=<expr> - краткая форма оператора присваивания. Примеры: n=12 && образуется memo-переменная числового типа. n =«Hello» && можно 'Hello' - образуется переменная символьного && типа с соответствующим числом символов. n=Балл_сес01 && если в рабочей области был предварительно && открыт файл, имеющий поле Балл_сес01, && то n получит значение этого поля из записи, && в которой находится файловый указатель n ={12.05.92} && образуется переменная типа дата &&(«родовой»признак - фигурные {}. Освоим приемы работы с переменными памяти на примере. Наберите фрагмент программы (MODI COMM store.prg):
94
* Программа store.prg, иллюстрирующая оператор присваивания n=15 && присваивание ?n && простейшая форма вывода - по месту расположения && курсора на экране с автоматическим переводом после && вывода на следующую строку n =« «+»15» && операция слияния символьных строк (конкатенация). ?? n && вывод без перевода на новую строку. * При выполнении программы обратите внимание на различия * в выводе чисел и символов: 15 будет справа, а «15» - слева USE students && файл students.dbf открывается в рабочей области A. GO 3 && перемещение файлового указателя на запись 3 n =ФИО && в переменную n передается значения поля ФИО && из записи 3 ?n n =Балл01 && попытка присвоить переменной имя несуществующего && поля. Будет выведено сообщение об ошибке && Variable ' Балл01 ' not found (переменная Балл01 не найдена) Запустите программу на исполнение (DO store) и обратите внимание на особенности ее работы: • при наличии ошибки программа будет частично выполнена (после вывода сообщения об ошибке на экране будут выведены все значения n, кроме последнего; если эта часть экрана закрыта программным или командным окном, переместите его мышью - за заголовок); • переменная n использовалась для обозначения данных различных типов. 2.2.2. форма 2 оператора присваивания относится к присваиванию полям таблицы данных значений, определяемых выражением над переменными памяти (memvar) и полями таблицы данных. Аналога этому оператору в других языках нет. Рассмотрим два пути создания команды: 1. Команда присваивания для использования в командном окне имеет форму: REPLACE WITH <expr1>[ADDITIVE] [, WITH<expr2>[ADDITIVE]]...[<scope>][FOR <exprL1] [WHILE <exprL2>] (Заменить поле1 выражением1, поле2 выражением2 ...для заданного диапазона <scope> файла при условии, что истинно логическое выражение <exprL1> или <exprL2>) 2. С помощью системного меню Table/Replace Field в открывшемся диалоге Replace Field, имеющем ту же самую структуру, что и команда REPLACE (см. первый способ) Вы можете задать в соответствующих полях условия для замены. Второй способ имеет несомненные преимущества перед первым, т.к. условия не набираются «вручную», а просто нащелкиваются мышью, что значительно экономит время пользователя. При этом после набора условий при нажатии кнопки OK выполненная команда отображается в командном окне, как, впрочем, и все команды, выполняемые через системное меню (если Вы заметили это). Вначале рассмотрим пример, затем подробнее опишем опции этой команды. Набирайте в командном окне и нажимайте ENTER: USE students REPLACE ФИО with ФИО +»!» FOR Балл_сес01+ Балл_сес02=10 BROWSE Вы увидите, что содержание базы данных не изменилось (хотя мы ожидали увидеть знак ! после фамилий отличников). Это произошло из-за того, что поле ФИО заполнено символами на всю отведенную командой CREATE ширину (после «смысловых» букв - пробелами), и знак »!» не поместился. Пользуясь буфером команд, подправьте ее (удалите пробелы с помощью функции TRIM( ) ):
95
REPLACE ФИО with TRIM(ФИО)+»!» FOR Балл_сес01+ Балл_сес02=10 BROWSE && Вы увидите ! после фамилий отличников. Введите команду, возвращающую базу данных в прежний вид. Упражнение: повторите те же действия, описанного выше примера с помощью второго способа, т.е. через системное меню. Убедитесь в сокращении времени при использовании второго способа по сравнению с первым. ОПЦИИ команды REPLACE: <scope> - диапазон записей, на который распространяется команда (по умолчанию - на ОДНУ текущую запись. Можно: ALL - все записи; NEXT <exprN> - следующие <exprN> записей после текущей; REST - от текущей до конца файла. FOR <exprL1> - присваивание произойдет только для тех полей из диапазона <scope>, для которых <exprL1> истинно. WHILE <exprL2> - присваивание происходит полям из диапазона <scope> ДО ТЕХ ПОР, пока не встретится первая запись, в которой <exprL2> ложно. ADDITIVE – опция относится ТОЛЬКО к memo-полям: при ее наличии новый текст записывается в конец существующего текста примечаний. При ее отсутствии старый текст примечаний уничтожается и заменяется на новый.
2.3. Операторы ветвления и выбора. Данные операции не имеют употребляемыми в других языках. 2.3.1. Оператор ветвления:
никаких
особенностей
по
сравнению
с
IF <exprL> <серия команд 1> [ELSE <серия команд 2>] ENDIF
2.3.2. Функция IIF(<exprL>,<expr1>,<expr2>) полностью аналогична функции @if() табличного процессора Quattro Pro. Если логическое выражение истинно, функция возвращает <expr1>, иначе <expr2>. Функция IIF( ) очень полезна при выводе информации пользователю. Например, если в поле цифрового типа не занесены данные, то при выводе его на экран в нем будет показан 0. Для пользователя желательно видеть это поле незаполненным. Тогда вместо вывода поля выведите функцию IIF(<имя_поля>=0,»»,<имя_поля>) Примеры функции и конструкции ветвления Вы рассмотрите по ходу разработки программ ниже. 2.3.3. Конструкция выбора: DO CASE CASE <exprL1> <серия 1> CASE <exprL2> <серия 2> ... CASE <exprLn> <серия n> [OTHERWISE] <серия n+1> ENDCASE Примеры функции и конструкции выбора Вы рассмотрите по ходу разработки программ ниже. 2.4. Конструкции цикла
96
Общие особенности конструкций циклов в Visual FoxPro 5.0 связаны с преодолением массовых операций (см. п.1).Для этого внутри циклических конструкций предусмотрены добавочные операторы, нарушающие цикл и относящиеся к числу запрещенных в других языках (рис.2.1). Благодаря этим нарушениям запретов» удается избежать операций завершения цикла «нормальным» образом после того, как искомая запись найдена (и не тратить время на просмотр оставшихся записей). 2.4.1. Конструкция DO WHILE...ENDDO: DO WHILE <exprL> <серия команд 1> [LOOP] && Досрочный возврат к началу цикла <серия команд 2> . [EXIT] && Досрочный выход из цикла <серия Команды до цикла
Команды до цикла
Начало цикла
Конец цикла Команды после цикла
Команды после цикла
Рис.2.1. Специальные конструкции цикла, разрешенные в Visual FoxPro
команд3>. ENDDO
Цикл выполняется, пока истинно логическое выражение <exprL> либо пока не встретится команда EXIT. Серии команд 2 и 3 выполняются только в том случае, если не встретится команда LOOP. Пример см. в п.2.4.4.
2.4.2. Конструкция FOR...ENDFOR: FOR <memvar>=<exprN1> TO <exprN2> [STEP <exprN3>] <серия команд1> [LOOP] <серия команд2> [EXIT] <серия команд3> ENDFOR &&(можно - NEXT) Конструкция аналогична FOR..NEXT в QuickBasic: <exprN1> - начальное значение цикловой переменной <memvar>; <exprN2> - ее конечное значение; <exprN3> - шаг изменения цикловой переменной. LOOP и EXIT имеют тот же смысл, что и в цикле DO WHILE...ENDDO (см.п.2.4.1). 2.4.3. Конструкция SCAN...ENDSCAN не имеет аналогов в других языках процедурного программирования. «Мотором» цикла в ней является файловый указатель: SCAN [<scope>][FOR <exprL1>][WHILE <exprL2>] <серия команд1> [LOOP] <серия команд2> [EXIT] <серия команд3> ENDSCAN
97
В этой конструкции файловый указатель перемещается по таблице данных (можно ограничить его перемещение путем указания диапазона<scope>). По умолчанию диапазон - вся база (ALL). Если встретится запись, удовлетворяющая условию <exprL1> (если форма конструкции - с FOR...) (или <exprL2>, если WHILE>), то выполняется серия команд внутри цикла. Форма с FOR... предусматривает просмотр всего заданного диапазона. Форма с WHILE... просматривает записи в заданном диапазоне<scope> только пока истинно <exprL2>; цикл обрывается на первой же записи, для которой <exprL2> ложно. LOOP и EXIT имеют тот же смысл, что и в цикле DO WHILE... ENDDO (см.п.2.4.1). Пример см. в п. 2.4.5. 2.4.4. Иллюстрация к циклу DO WHILE...ENDDO и к конструкции ветвления. Наберите программу whilloop.prg, НАЗНАЧЕНИЕ которой: вывести на экран фамилию отличника набора 1998 г., который в списке фамилий встретится первым. В данной программе по возможности исключены все указания на конкретный файл (кроме его имени и наименований полей), см. замечания к стилю программирования в Visual FoxPro5.0 *Программа whilloop.prg CLEAR USE students GO TOP && Файловый указатель - выше первой записи. * Цикл: пока файловый указатель - не в конце файла DO WHILE .NOT.EOF( ) IF Год_поступ<>1997 && Досрочный возврат к началу цикла, SKIP && если запись НЕ относится к студенту-1998. LOOP && Перемещение файлового указателя ENDIF && командой SKIP. IF Балл_сес01+ Балл_сес02<10 && Досрочный возврат к началу цикла, SKIP && если студент-1998 - НЕ отличник. LOOP && Студенты-1997 в данный фрагмент ENDIF && программы «не попадут» из-за ветвления выше. ?”Отличник-1998, первый в списке: “+ФИО * Вывод на экран фамилии отличника 1998, «попавшегося» при просмотре базы данных * ПЕРВЫМ. EXIT && Досрочное прекращение цикла после этого. ENDDO && Конец цикла. Запустите программу и обратите внимание на две особенности: а) все команды, предусмотренные в программе, будут выполнены для всех записей файла только в том случае, если все студенты набора 1998, и среди них нет отличников. При всех других исходных данных будет проанализировано меньшее число записей или выполнено меньшее число операций. б) Запустите программу еще раз. Вы заметите, что она выполнится гораздо быстрее: Visual FoxPro 5.0 автоматически выполняет компиляцию программы и при повторном запросе выполняет ее как компилированную. 2.4.5. Иллюстрация к циклу SCAN...ENDSCAN. Наберите программу scn.prg, назначение которой - вывод на экран фамилий всех студентов-отличников набора-1998. CLEAR
98
USE stud SCAN FOR Год_поступ =1998.and. Балл_сес01+ Балл_сес02=10 ? ФИО ENDSCAN Обратите внимание на компактность программы. Ее текст иллюстрирует средства Visual FoxPro 5.0, позволяющие избежать введения цикловых переменных при типовых операциях просмотра и «попутной» обработки записей. Упражнение: модифицируйте программу scn.prg так, чтобы выводилась на экран фамилия отличника, встретившегося при просмотре базы данных первым. 2.5. Макроподстановки & в Visual FoxPro 5.0 Visual FoxPro 5.0 является одним из немногих котором возможна замена части или всей командной программы («программа пишет программу в ходе ее называется макроподстановкой (Вы уже неоднократно подробнее, поскольку применение макроподстановки компактные, изящные программы. Изучение проведем на примере.
языков программирования, в строки в ходе выполнения выполнения»). Такая замена пользовались ею). Изучим ее позволяет создавать очень
По ходу решения нам понадобится команда чтения данных, введенных с клавиатуры. Далее операторы ввода/вывода будут изучены подробнее. В тексте программ, помещенной ниже, приведены разъяснения. Общая схема ввода: а) формируется переменная памяти, в которую будет ввод, и программно присваивается ей некоторое значение (благодаря чему Visual FoxPro 5.0 определит ее тип и формат. Это как бы «заготовка» ввода); б) командой @ GET ... вызывается на экран «заготовка» ввода, в которую Visual FoxPro 5.0 вписывает значение по п.а в качестве образца (примера); в) дальнейшее выполнение программы приостанавливается (командой READ) до тех пор, пока не будет проведен ввод и нажата клавиша ENTER. Группа простейших команд ввода с клавиатуры: <memvar>=<expr> - формирование переменной памяти - образца ввода. @ GET <memvar> - размещение (<строка>, столбец>) окошка ввода. Вывод образца на экран. READ - чтение ввода в переменную <memvar>. Кроме того, в программе будут использованы цвета. Подробности о цветах Вы можете узнать по Help Visual FoxPro 5.0 о командах: SET COLOR TO <цветовые_пары_текст/фон> SET COLOR SET TO <имя_файла_цветов> COLOR <цветовые_пары_текст/фон> COLOR SCHEME <exprN> В тексте команды смены цветов комментируются. n - черный (от noir - франц.) g - зеленый (от green) gr - коричневый (от green-red) r - красный (от red) + - усиление яркости
Обозначения цветов: b - синий (от blue) bg - бирюзовый (от blue-green) gr+ - желтый (ярко-коричневый) w - белый (от white) * - включение мигания
99
Назначение и функции программы: • открыть файл с именем, вводимым с клавиатуры; • в цикле от первого до последнего поля показать на экране BROWSE записи файла так, чтобы на экран выводилось только одно поле. Из перечня функций видно, что в постановке задачи отсутствует конкретизирующая информация: • не ясно, какой файл будем открывать (его имя вводится пользователем и, значит, может быть любым); • неизвестно, сколько полей в файле; • неизвестны имена полей файла («иди туда-не-знаю-куда, принеси то-не-знаю-что»). Уровень неопределенности задачи настолько высок, что возникает сомнение в возможности создания программы для ее решения. Однако с помощью макроподстановки эту задачу легко решить. Например, представьте себе, что пользователь ввел имя файла (командой GET...READ) в некоторую переменную памяти - например, с именем filename. Пусть пользователь ввел students (тогда в переменной памяти будет храниться символьная переменная students). Введем команду USE filename. По этой команде Visual FoxPro 5.0 будет искать на диске файл с именем filename.dbf. Если он имеется - откроет его (но ведь пользователю нужен другой файл - не filename.dbf, а students.dbf!). Теперь представим себе команду USE &filename с макроподстановкой. По этой команде Visual FoxPro 5.0 подставит в команду USE не filename, а содержимое filename т.е. stud. Получится команда, сконструированная в ходе выполнения программы - после ввода (пользователем!) имени файла students. Команда USE &filename будет расшифрована Visual FoxPro 5.0 как USE students (что и требовалось пользователю). Аналогично решаются и другие «неопределенные» вопросы в задаче, сформулированной выше. Этой же цели служат функции Visual FoxPro 5.0, не требующие сведений о конкретных именах файла и его полей. Наберите программу, реализующую перечисленные выше «неопределенные» функции, внимательно читая комментарии. Обратите внимание на «пользовательский» интерфейс - изменение цветов для выдачи сообщений пользователю. Для создания программы используйте команду MODIFY COMMAND macr * Текст программы macr.prg для поочередного вывода на экран полей файла, имя которого * вводится пользователем в диалоге * Фрагмент программы задания режима работы Visual FoxPro 5.0 (группа SET). SET COLOR TO gr+/b,n/w && цвета ответов Visual FoxPro 5.0: желтым по SET TALK OFF && синему; ввод: черным по белому SET ECHO OFF && Отключение режимов отчета Visual FoxPro 5.0 SET STEP OFF && о выполнении каждой команды, о выполняемой команде * и пошагового выполнения программы. *Фрагмент программы оформление заставки и инструкция CLEAR @3,15 SAY «Работает программа поочередного просмотра полей» @4,15 SAY « файла, имя которого вводится пользователем» SET COLOR TO g+/b && Смена цвета на ярко(+)-зеленый.
100
@9,15 SAY «Введите имя файла, поля которого будут показаны» @10,15 SAY « на экране поочередно. Затем нажмите ввод.» *Фрагмент программы ввод имени файла filename=« » && Заготовка переменной памяти для && последующего ввода имени файла. @14,30 GET filename READ && Прием имени файла, вводимого пользователем, && в переменную памяти filename. *Фрагмент программы смена инструкции (после ввода имени файла) CLEAR SET COLOR TO gr+/b && Серия команд вывода инструкции @6,65 SAY «Для смены» && со сменой цветов. @7,65 SAY «экранов BROWSE» && Пометка + означает «яркий» @8,65 SAY «нажимайте Esc.» && Пометка * означает «мигающий» SET COLOR TO r+/b && Символы цветов: см. выше, п.2.5. @10,65 SAY «Жмите « SET COLOR TO gr+*/b @10,71 SAY «HЕ» SET COLOR TO r+/b @10,73 SAY «долго!» SET COLOR TO gr+/b @11,62 SAY «(иначе - прерывание)» *Фрагмент программы открытие файла с именем, введенным *пользователем, и определение числа полей в нем. USE &filename && Представьте себе, какой вид примет команда, если && вместо filename записать ее содержимое. && Например, если ввели students, то получится && USE students - откроется файл students n=FCOUNT( ) && Переменной памяти n присвоено значение = && числу полей файла, имя которого введено пользователем. *Фрагмент программы : подготовка к циклическому просмотру i=1 && Начальный номер поля для вывода на экран && просмотра. Подготовка к циклическому && поочередному просмотру. *Фрагмент программы циклический поочередный просмотр полей DO WHILE i<=n && Цикл по полям от i=1 до i=n, где && n - общее число полей. z=FIELD(i) && Переменной памяти z присваивается && значение = имени очередного поля, i=1,...,n SET COLOR TO w+/b && Вывод текущего сообщения о номере && показанного поля и общего числа полей. @13,65 say «ПОЛЕ «+str(i,1)+» из «+str(n,1) BROW FIEL &z SET COLOR TO gr+/b BROWSE FIELDS &z && Представьте себе, какой вид примет && команда, если вместо z записать ее содержимое. * Например, при i=2 z=FIELD(2), т.е. z=Группа. Получится: BROWSE FIELDS Группа. * На экране будет поле Группа файла stud. i=i+1 && Переход к следующему номеру поля.
101
ENDDO * Конец цикла* CLEAR
&& Конец цикла DO WHILE...ENDDO. && очистка экрана перед концом про граммы.
Запустите программу несколько раз командой DO macr, проследите за выполнением «заказанных» функций. При каждом запуске вводите различные имена ранее созданных .dbf-файлов базы данных (students.dbf, commands.dbf, functions.dbf). Для смены полей на экране нажимайте ESC. Обратите внимание: в инструкции содержалось предупреждение не нажимать долго ESC. «Длинное» нажатие в Visual FoxPro 5.0 приводит к прерыванию программы (выводится сообщение interrupted). Используйте «длинное» нажатие Esc при зацикливаниях и подобных затруднениях (аналогично клавишам Ctrl-Break в других языках).
2.6. Подпрограммы в Visual FoxPro 5.0 Visual FoxPro 5.0 обладает развитым аппаратом подпрограмм, работа с которым мало отличается от используемой в других языках процедурного программирования (типа Pascal и QuickBasic). 2.6.1. Порядок поиска вызванной подпрограммы, принятый в Visual FoxPro 5.0: а) вначале Visual FoxPro 5.0 ищет вызванную подпрограмму в текущей программе (процедуре); если находит - выполняет ее и затем возвращается в вызвавшую программу (по умолчанию - на команду, следующую за вызовом; командой RETRY можно организовать возврат на вызвавшую команду); б) если подпрограмма не найдена - Visual FoxPro 5.0 пытается найти ее в т. наз. процедурном файле (своего рода библиотеке подпрограмм, которая должна быть заявлена командой SET PROCEDURE TO <имя_процедурного_файла_без_расш.> в) если процедурный файл не заявлен (п.б) или вызванной подпрограммы в нем нет - Visual FoxPro 5.0 ищет ее во всех процедурах, старших относительно текущей (снизу-вверх); г) если не находит и там, то ищет на диске, где она может быть оформлена в виде полностью самостоятельной программы; д) если поиск окончится неудачей - будет выдано сообщение об ошибке («File '<имя искомой процедуры>' does not exist» -файл не существует). 2.6.2. Классификация средств структурирования в Visual FoxPro 5.0 а) внутренние процедуры: подпрограммы, размещаемые внутри программы; их можно выполнить не только из «материнской» программы, но и из другой программы (если указать ее место нахождения). б) внешние процедуры: полностью самостоятельные программы (возможно, со своими подпрограммами), которые могут быть вызваны из любой другой программы. Все программы Visual FoxPro 5.0 могут быть использованы как внешние процедуры (аналогично понятию модуль в языке Pascal). в) Процедуры-функции (в Visual FoxPro 5.0 называются UDF): могут быть как внутренними, так и внешними. UDF - User Defined Functions -
функции, определяемые пользователем
Подчиненность структурных элементов в Visual FoxPro 5.0 -нестрогая:
102
возможна рекурсия, вызов «старшего» модуля из «младшего»... Глубина вложений подпрограмм - до 32. 2.6.3. Команда вызова процедуры (как внешней, так и
внутренней):
DO [WITH <parameter_list>][IN ] Если Вы не укажете расширения в имени командного файла , то Visual FoxPro 5.0 ищет его в следующем порядке: • *.exe - исполняемый файл (но только изготовленный средствами Visual FoxPro 5.0!) • *.app - файл приложений (проект Visual FoxPro 5.0, см. часть 3); • *.fxp - компилированный файл; • *.prg - не компилированный (*.prg)-файл. Опции команды: WITH <parameter_list> - список фактических параметров, передаваемых в подпрограмму (записывается через запятые); IN-наименование командного файла, внутри которого размещается процедура в качестве внутренней. 2.6.4. Команды обрамления процедуры: PROCEDURE <имя_процедуры> [PARAMETERS <parameter_list>] && ВТОРАЯ строка! <серия команд> [RETURN] Опции команды: PARAMETERS <parameter_list> - список формальных параметров (через запятые); RETURN - команда возврата в вызвавшую процедуру. Завершение модулей в Visual FoxPro 5.0 В отличие от других языков, команда RETURN не является обязательной: Visual FoxPro 5.0 «понимает», что процедура закончена, если: • встретилась команда RETURN - происходит возврат в старшую программу; • встретилась команда CANCEL - происходит выход в командное окно; • встретилась команда QUIT - происходит возврат в среду операционной системы; • встретилась последняя строка программы (за которой либо ничего не записано, либо начинается новая процедура) - возврат в старшую программу или в командное окно (если завершился самый старший модуль). 2.6.5. Процедурный файл Удобно помещать все модули, объединенные неким «родством» - например, по назначению - в один файл и загружать только его в память ЭВМ как источника всех необходимых программных ресурсов. Такой файл в Visual FoxPro5.0 называется процедурным. В каждый момент времени может быть открыт только один процедурный файл - командой SET PROCEDURE TO <имя_процедурного_файла> ¦ Файл закрывается командой SET PROCEDURE TO (без параметров).
103
Использование подпрограмм будет проиллюстрировано в программе с Меню в разделе 3 данной части. 2.6.6. Функции, определяемые пользователем (UDF) а) Если UDF определяется как внешняя (доступная для любых программ и для использования в командном окне наряду со встроенными функциями Visual FoxPro 5.0), то ее следует записать в отдельный файл (имеющий ее имя) с обрамлением: FUNCTION <имя_функции> PARAMETERS <parameter_list> Значение, которое будет возвращать UDF, записывается в строке с оператором RETURN. Рассмотрим создание UDF на примере. Пусть требуется создать UDF quartal, возвращающую сообщение о номере квартала по введенной дате. Наберите программу (MODIFY COMMAND quartal): FUNCTION quartal PARAMETERS qdate && сюда будет приниматься дата. DO CASE && конструкция выбора. CASE MONTH(qdate)>9 && функция MONTH( ) RETURN «Четвертый квартал» && возвращает номер месяца CASE MONTH(qdate)>6 && по аргументу - дате RETURN «Третий квартал» CASE MONTH(qdate)>3 RETURN «Второй квартал» OTHERWISE RETURN «Первый квартал» ENDCASE Запишите UDF на диск (Ctrl-W). В командном окне наберите ?quartal(date( )) Здесь date( ) - системная дата (по календарю ЭВМ). На экране - соответствующий номер квартала. Если хотите проверить UDF на других датах, вводите их с помощью функции преобразования символов (C) в дату (to D) - например: ?quartal(CTOD(«12.05.83»)) или - лучше - используйте соглашение Visual FoxPro 5.0 о вводе дат - возьмите их в {}, например: ?quartal({12.05.94}) б) Определение UDF как внутренней отличается только тем, что она записывается вместе с программой, в которой определена. Внутренняя функция может быть использована и в других программах, если указать имя ее «материнской» программы в качестве процедурного файла. Например, добавьте в программную реализацию функции quartal любую первую строчку, например, zzz=0 выше строки FUNCTION. Теперь при запросе ?quartal(date( )) будет диагностироваться ошибка: не будут найдены параметры, т.к. они должны быть описаны во второй (а не в третьей, как получилось) строке («No PARAMETER statement found» - не найдена строка с параметрами). Введите в командной строке
104
SET PROCEDURE TO quartal и повторите запрос. Будет получен правильный ответ. 2.7. Программные модули в Visual FoxPro 5.0 каждая Visual FoxPro 5.0-программа, созданная как самостоятельная, может быть использована без переделки в любой другой Visual FoxPro 5.0-программе (никаких добавок - например, типа команды RETURN, при этом делать НЕ надо). В этом смысле язык Visual FoxPro 5.0 похож на Pascal (с натяжкой и на QuickBasic, команда chain...). Модульность Visual FoxPro 5.0 обеспечивает простоту «склеивания» программ программой-диспетчером или «подвешивание» их к пользовательскому меню (см. раздел 3). Рассмотрим создание программы-диспетчера на примере - демонстрация всех программ, созданных в ходе чтения пособия. Наберите и выполните программу demo.prg: *Программа demo.prg (иллюстрирует модульность Visual FoxPro 5.0) CLEAR SET COLOR TO to g+*/b WAIT «Для вызова программы macr.prg нажмите пробел» * Команда для ожидания нажатия любой клавиши с выдачей сообщения SET COLOR TO gr+/b DO macr && Выполняется первая программа *После выполнения первой программы:* SET COLOR TO g+*/b WAIT «Macr.prg завершена, для вызова whilloop.prg нажмите пробел» SET COLOR TO to gr+/b DO whilloop && Выполняется вторая программа *После выполнения второй программы: SET COLOR TO g+*/b WAIT «Whilloop.prg завершена, для вызова scn.prg нажмите пробел» SET COLOR TO to gr+/b DO scn SET COLOR TO g+*/b WAIT «scn.prg завершена, для выхода в командное окно нажмите пробел» SET COLOR TO to gr+/b CLEAR && Очистка экрана после показа всех программ. Как видите, схема программы-диспетчера очень проста: DO... DO... ..... DO...
В тексте программы много повторений одних и тех же операторов. Ее можно сделать гораздо эстетичной, если заранее присвоить имена программ, подлежащих вызову, некоторым переменным памяти, имеющим различия только в номере (например, pr1, pr2,...). Используя макроподстановку, последовательный вызов программ можно провести в цикле. Упражнение: преобразуйте самостоятельно программу - диспетчер так, чтобы вызов программ осуществлялся в цикле. 2.8. Переменные памяти в структурированных программах
105
Как и во всех процедурных языках, в Visual FoxPro 5.0 имеются как средства для обеспечения автономности обозначений в подпрограммах, так и для создания переменных, «видимых» из всех модулей: переменные могут быть определены как глобальные или как локальные. А также региональные, внутренние и системные. PUBLIC, PRIVATE memory variables а) Глобальные (PUBLIC) переменные: переменные, видимые из подпрограмм. По умолчанию все переменные, образуемые в диалоге (при работе в командном окне), трактуются в Visual FoxPro 5.0 как глобальные. Переменные, которые по смыслу решаемой задачи целесообразно сделать общими для всех программных модулей, должны быть объявлены как глобальные командой PUBLIC <список_переменных_через_запятые> б) Локальные (PRIVATE)переменные: переменные, которые могут быть использованы Головной программой и подпрограммами автономно. Значения локальных переменных, присвоенные в Головной программе, после входа в подпрограмму не сохраняются. Обозначения этих переменных могут быть использованы в подпрограмме для своих целей, совершенно отличных от целей использования в Головной программе (вплоть до различий в типе переменных!). После возвращения из подпрограммы переменные будут иметь те же значения, что и имели непосредственно перед обращением к подпрограмме. По умолчанию все переменные в программах (кроме объявленных как глобальные) трактуются как локальные, и специальную команду для их объявления вводить не нужно. Такую команду следует использовать только для «переобъявления» глобальных переменных на локальные: PRIVATE<список_обозначений_через_запятые> в) Региональные (REGIONAL) переменные: переменные, подобны локальным и объявляются с помощью команды: REGIONAL <список_обозначений_через_запятые> перед командой помещается директива # REGION. После директивы необходимо указать номер региона (от 0 до 31), в котором действуют переменные перечисленные в списке. В регионе с другим номером та же переменная может иметь другое значение. г) Внутренние (LOCAL) переменные: переменные действуют только в пределах процедуры или функции, в которых были созданы. К ним нельзя обратиться из программы или функции ни более высокого, ни более низкого уровня. Объявляются внутренние переменные командой: LOCAL <список_обозначений_через_запятые> д) Системные переменные: переменные, встроенные в Visual FoxPro 5.0, и их имена всегда начинаются со знака подчеркивания. В этих переменных, как правило, содержаться значения различных установок, таких как параметры страницы при печати и т.п. Системные переменные загружаются в память при запуске Visual FoxPro 5.0, в процессе работы их значения могут изменяться, и будут, сохранены при последующих запусках СУБД. Сводка команд для работы с аппаратом подпрограмм: DO <имя_подпрограммы_без_расширения> WITH <список> - команда вызова подпрограммы с заданным именем (по умолчанию расширение .prg) и передачи фактических параметров по <списку>, в котором параметры имеют обозначения, действующие в Головной программе, либо являются константами. порядок перечисления существен, обозначения несущественны. Команда DO... записывается в теле Головной программы. PROCEDURE <имя_подпрограммы_без_расширения> PARAMETERS <список_формальных_параметров> - пара команд (обязательно следующих друг за другом); первая команда служит началом подпрограммы, вторая - объявляет формальные параметры.
106
RETURN - команда возврата из подпрограммы в Головную программу (либо другую вызвавшую подпрограмму) на команду, следующую за вызовом DO <...>. PUBLIC <список_переменных_памяти_через_запятые> - команда объявления глобальных (общих, «видимых из подпрограмм») переменнх в Головной программе. PRIVATE<список_переменных_памяти_через_запятые> - команда объявления локальных переменных (автономно используемых подпрограммами и Головной программой и не сохраняющих свои значения при переходе от Головной программы к подпрограмме и обратно. REGIONAL <список_обозначений_через_запятые> - команда объявления региональных переменных (подобных локальным переменным) LOCAL <список_обозначений_через_запятые> - команда объявления локальных переменных (действующих только в пределах процедуры или функции, в которых были созданы. К ним нельзя обратиться из программы или функции ни более высокого, ни более низкого уровня.) SET PROCEDURE TO <имя_процедурного_файла_без_расширения> - команда, объявляющая имя файла, в котором хранятся подпрограммы (это может быть тот же файл, в котором хранится Головная программа, или – лучше – отдельный файл, в котором «коллекционируются» подпрограммы; тогда будет удобнее использовать их в других программах).
3. РАБОТА с НЕСКОЛЬКИМИ БАЗАМИ ДАННЫХ (таблицами данных) В Visual FoxPro 5.0 (как во всякой реляционной СУБД) имеется развитый аппарат упорядочения файлов (в частности, путем индексирования). Благодаря этому в Visual FoxPro5.0 оказалось возможным реализовать систему взаимосвязей между таблицами по принципам: один – к – одному, один – ко – многим, много – к – одному и много – ко – многим причем для организации связей не используются массовые операции. Виды устанавливаемых отношений: Отношение один – к – одному означает, что каждая запись одной таблицы соответствует только одной записи в другой таблице. Отношение один – ко – многим означает, что каждая запись одной таблицы связана более чем с одной записью из другой таблицы. Отношение много – к – одному аналогично типу отношений один – ко – многим. Тип отношений между объектами зависит от Вашей точки зрения. Например, если Вы будите рассматривать отношение между полученными оценками по какому либо предмету за семестр и студентом, то получите отношение много – к – одному. Отношение много – ко – многим возникает между двумя таблицами в тех случаях, когда: одна запись из первой таблицы может быть связана более чем с одной записью из второй таблицы одна запись из второй таблицы может быть связана более чем с одной записью из первой таблицы
В Visual FoxPro 5.0 Вы можете устанавливать постоянные отношения между таблицами, которые будут поддерживаться при создании форм, отчетов и запросов. При определении отношений одна из таблиц является родительской, а другая – дочерней. Для родительской таблицы должен быть определен первичный ключ или ключ – кандидат, а для дочерней – индекс для связи с родительской таблицей. 3.1.Знакомство с техникой установления связей между таблицами данных (один_файл_со_многими)
107
3.1.1. Освоим работу со связанными таблицами вначале в командном окне. Будем считать файл students.dbf «материнским». Подготовьте исходные данные для «дочерних» файлов, с которыми будем устанавливать связь. Заготовьте файлы stud1.dbf (адреса студентов) и stud2.dbf (их увлечения и профессиональная ориентация). Способ быстрого создания: • откройте «материнский» файл students.dbf (USE students); - скопируйте поле ФИО в файл stud1.dbf (команда COPY TO stud1 FIELDS ФИО;) Это - не только быстрее: Вы не сделаете ошибку типа несовпадения длины символьного поля (такая ошибка привела бы к отсутствию общности с «материнским» файлом). И ВСЕГДА: если есть откуда копировать -КОПИРУЙТЕ, не дублируйте ввод. • откройте файл-копию stud1.dbf; • дополните его структуру нужными полями (см. таблицу ниже) команда MODIFY STRUCTURE); • на экране просмотра BROWSE заполните вновь созданные поля. Таблица для заполнения файла stud1.dbf ФИО Яковлев И.Н. Темникова И.Р. Шипилова В.В. Краснянский А.А. Сарафанов А.А. Ерофеев А.С. Макаров С.О. Званцева Н.С. Петрова Е.Е. Бочкарева М.Д. Страхова А.Л. Денисова Е.А. Журавлева Г.О. Панова Э.Г. Лукьянова А.А.
Адрес ул. Октябрьская, д.41, кв.14 ул. Камышинская, д. 29, кв.2 ул. Короленко, д.34, кв.3 ул. Разина, д.5, кв.9 ул. Текстильная, д.30, кв.28 ул. Ленина, д.24, кв.1 ул. Седова, д.12, кв.32 ул. Пролетарская, д.125, кв.4 ул. Мира, д.3, кв.12 ул. Некрасова, д.7, кв.14 ул. Серова, д.51, кв.3 ул. Радищева, д.4, кв.10 ул. Фабричная, д.7, кв.14 ул. Ленина, д.15, кв.3 ул. Молодежная, д.22, кв.11
Поля: ФИО - точно по файлу students.dbf, поле ФИО; Адрес - поле символьного типа (почтовый адрес).
Таблица для заполнения файла stud2.dbf ФИО Яковлев И.Н. Темникова И.Р. Шипилова В.В. Краснянский А.А. Сарафанов А.А. Ерофеев А.С. Макаров С.О. Званцева Н.С. Петрова Е.Е. Бочкарева М.Д. Страхова А.Л. Денисова Е.А. Журавлева Г.О. Панова Э.Г.
Склонности, увлечения Электроника Программирование Иностранные языки Высшая математика Компьютерные игры Компьютерная техника Организационная работа Обучение Коммерция Экономика Бухучет Высшая математика Нет Экономика
Рекомендуемая специализация Конструктор Программист – экономист Переводчик Преподаватель Эксплуатация программ Обслуживающий персонал (техник) Программист предприятия Преподаватель Программист – экономист Экономист Бухгалтер Экономист – предприятия Эксплуатация программ Экономист – Бухгалтер
108 Лукьянова А.А.
Коммерция
Менеджер предприятия
Поля: ФИО - точно по файлу students.dbf, поле ФИО; хобби - поле символьного типа (склонности); профессия - поле символьного типа (рекомендуемая профессия). Добавьте в проект students, в котором в базе данных находится таблица students.dbf, созданные таблицы stud1.dbf и stud2.dbf (см раздел 6 в главе 1). Для этого просто откройте проект в диалоге Open. В проекте с помощью мыши зайдите в БД students и после того, как откроется ее структура (т.е. внутри находится элемент этой структуры - таблица students) нажмите на кнопку Add. На экране откроется окно диалога Open, в котором Вы выберите созданную только что таблицу stud1.dbf. Аналогичным образом добавьте в БД students - таблицу stud2.dbf. Наша задача: сделать так, чтобы перемещение файлового указателя в “материнском” файле students.dbf сопровождалось автоматическим перемещением указателей в двух “дочерних” файлах. Последовательно вводите в командном окне: CLEAR CLOSE DATABASES && закрываются все базы, открытые ранее. В рабочих областях SELECT 1 && A (1), B (2) и C (3) будут открыты соответственно USE stud1 && файлы stud1.dbf, stud2.dbf, students.dbf SELECT 2 USE stud2 && Рабочая область 3 (с "материнским" файлом SELECT 3 && students.dbf) как открытая последней, является активной. USE students SET RELATION TO RECNO() INTO 1, RECNO() INTO 2 && По этой команде устанавливается связь (relation) между && "материнским" файлом и файлами, открытыми в других && (открытых, но неактивных) рабочих областях. CLEAR GO 3 && переход к третьей записи в файле students.dbf && ("материнском)". Благодаря команде SET RELATION... && одновременно происходит автоматическое перемещение && указателя в файлах, открытых в областях A и B. ?ФИО,A-> ФИО,B-> ФИО && по этой команде будут выведены на экран значения поля && ФИО из файлов в активной области и из двух неактивных && (A и B). Допускается и другой синтаксис: && a-> ФИО, b-> ФИО && A. ФИО, B. ФИО && a. ФИО, b. ФИО && stud1. ФИО, stud2. ФИО Вы увидите на экране одни и те же фамилии: файловый указатель одновременно с “материнской” переместился и в обеих “дочерних” базах. Второй способ установления связи между неиндексированными таблицами гораздо нагляднее и быстрее первого, т.к. осуществляется через системное меню. Для этого зайдите в проект и выберите структуру Databases, в ней находятся БД students.dbc, которая содержит наши три таблицы. После того, как Вы оказались в этой структуре выберите в системном меню Window команду Data Session или нажмите соответствующую кнопку на стандартной панели инструментов Visual FoxPro 5.0 (пиктограмма «с очками»). Перед Вами появится диалог Data Session – это отдельная среда, описывающая рабочую область, курсоры рабочей
109
области, их индексы и связи. Справа, в окне Data Session расположено поле Relations, предназначенное для отображения связей между таблицами. Для того чтобы открыть нужные таблицы нажмите кнопку Open, после чего появится окно диалога Open, в котором выберите сначала одну из таблиц, например, students.dbf. Затем нажмите кнопку ОК. Вы вернулись в диалог Data Session. Выбранная таблица students.dbf находится в поле Aliases (псевдонимы). Повторите те же действия для таблиц stud1.dbf и stud2.dbf. В окне Data Session постоянные связи не наследуются, и отношения между таблицами надо устанавливать “вручную”. Для этого следует использовать кнопку Relations. Выберите из списка открытых таблиц таблицу students.dbf, которая будет “родительской” (основной) в устанавливаемых отношениях. Нажмите кнопку Relations, а затем выберите в списке порожденную («дочернюю») таблицу. Первой укажите таблицу stud1.dbf. Появится диалоговое окно Expression Builder, в котором выберите в списке Math функцию Recno() и нажмите кнопку ОК. Повторите те же самые действия для таблицы stud2.dbf. Вы установили связь между основной таблицей и порожденными. Для того чтобы просмотреть результат Вашей работы, перейдите в поле Aliases, в котором последовательно выбирайте каждую из таблиц, при этом нажимая кнопку Browse. На экране откроются три окна с таблицами. Чтобы разместить их на экране так, чтобы были видны записи во всех трех таблицах, разместите их вручную или с помощью системного меню Window/Arrange All. Активизируйте таблицу students.dbf (щелкните в области ее окна мышью) и передвигайте указатель курсора по записям таблицы, при этом Вы увидите, что в дочерних таблицах курсор стоит на записях с той же фамилией, на которой стоит курсор в родительской базе. 3.1.2. Аналогично устанавливается связь между индексированными файлами по ключу индексирования. Проиндексируйте файл students.dbf по алфавиту фамилий. Для этого войдите в режим Modify и в окне Table Designer укажите для поля ФИО – ключ индексирования в списке Index - ↑Ascending (по возрастанию). Аналогичные операции сделайте для файлов stud1.dbf и stud2.dbf. Для иллюстрации выполните (в командном окне или в форме программы) следующие команды: CLEAR CLOSE DATABASES && закрываются все базы, открытые ранее. SELECT 1 USE stud1 SET ORDER TO TAG ФИО IN Stud1 SELECT 2 USE stud2 SET ORDER TO TAG ФИО IN Stud2 SELECT 3 USE students SET ORDER TO TAG ФИО IN students SET RELATION TO ФИО INTO 1, ФИО INTO 2 && Устанавливается связь по ключу индексирования, && одинаковому для всех связываемых баз данных. && Можно вместо 1 набирать A или a, вместо 2 - B или b... FIND"Лу" ? students. ФИО, stud1. ФИО, stud2. ФИО && Во всех базах данных будет установлен указатель && на фамилии "Лукьянова"
110
Второй способ установления связи между индексированными таблицами аналогичен п. 3.1.1 - осуществляется через системное меню. Для этого зайдите в проект и выберите структуру Databases, в ней находятся БД students.dbc, которая содержит наши три таблицы. Проиндексируйте файл students.dbf по алфавиту фамилий. Для этого войдите в режим Modify и в окне Table Designer укажите для поля ФИО – ключ индексирования в списке Index - ↑Ascending (по возрастанию). Аналогичные операции сделайте для файлов stud1.dbf и stud2.dbf. После индексации таблиц воспользуйтесь системным меню Window/Data Session. Перед Вами появится диалог Data Session. Для того чтобы открыть нужные таблицы нажмите кнопку Open, после чего появится окно диалога Open, в котором выберите сначала одну из таблиц, например, students.dbf. Затем нажмите кнопку ОК. Вы вернулись в диалог Data Session. Выбранная таблица students.dbf находится в поле Aliases (псевдонимы). Повторите те же действия для таблиц stud1.dbf и stud2.dbf. Выберите из списка открытых таблиц таблицу students.dbf, которая будет “родительской” (основной) в устанавливаемых отношениях. Нажмите кнопку Relations, а затем выберите в списке порожденную («дочернюю») таблицу. Первой укажите таблицу stud1.dbf. Появится диалоговое окно Set Index Order. В этом окне находится список, установленных в данной таблице индексов (в данном случае один и выделен синим цветом, т. е. является активным – ФИО). Нажмите кнопку ОК. После чего появится диалог Expression Builder, в котором выберите ключ индексирования – ФИО (поле SET RELATION должно содержать – ФИО). Повторите те же самые действия для таблицы stud2.dbf. Вы установили связь между основной таблицей и порожденными. Для того чтобы просмотреть результат Вашей работы, перейдите в поле Aliases, в котором последовательно выбирайте каждую из таблиц, при этом нажимая кнопку Browse. На экране откроются три окна с таблицами. Активизируйте таблицу students.dbf и передвигайте указатель курсора по записям таблицы, при этом Вы увидите, что в дочерних таблицах курсор стоит на записях с той же фамилией, на которой стоит курсор в родительской базе. Для соответствия с примером, найдем запись с фамилией, начинающейся с букв «Лу». Для этого нажмите кнопку Properties в диалоге Data Session. Появится диалог Work Area Properties. В поле Data Filter установите фильтр ФИО = «Лу». Нажмите кнопку ОК. Теперь просмотрите таблицы см. выше. В таблицах будет высвечена запись – с фамилией Лукьянова.
Сводка команд установления связей между открытыми базами данных: • Неиндексированные базы могут быть связаны только по номеру записи RECNO( ): 1. С помощью команды SET RELATION TO RECNO( ) INTO <exprN1> <exprC1> [,RECNO( ) INTO <exprN2> <exprC2> ...] [ADDITIVE] Здесь <exprN1> - номер рабочей области, с которой устанавливается связь. Можно вместо номера <exprN1> записывать <exprC1> - обозначение (буквенное) этой рабочей области. 2. С помощью системного меню Window/Data Session в диалоге Data Session ADDITIVE - опция, позволяющая сохранить созданные ранее связи данной базы с другими при добавлении новых. В отсутствие этой опции установление новой связи разрушает все старые связи. • Индексированные базы, открытые с индексными файлами, могут быть связаны по имени ключа индексирования (key): 1. С помощью команды SET RELATION TO INTO <exprN1> <exprC1>
111
[, INTO <exprN2> <exprC2>...[ADDITIVE] Отмена связи: SET RELATION TO (без опций) 2 .С помощью системного меню Window/Data Session в диалоге Data Session. Отмена связи в этом диалоге осуществляется закрытием в нем всех открытых Вами таблиц с помощью кнопки Close.
3.2. Установление связи одна_запись_со_многими Часто встречаются задачи, в которых в одном из полей значение повторяется для нескольких записей. Например, в перечне победителей олимпиад может повторяться одна и та же фамилия для ряда лет. Желателен режим, при котором «материнская» база как бы «раздвигается» на количество повторяющихся записей в «дочерней». Новинкой Visual FoxPro 5.0 является команда, позволяющая это сделать - т.е. установить связь одной записи со многими SET SKIP TO <exprN> <exprC> <exprN> <exprC> по номеру или обозначению рабочей области, с которой устанавливается связь. Выше этой команды должна быть записана команда SET RELATION..., устанавливающая связь между файлами. Предварительно создайте файл победителей олимпиад studolimp.dbf (не забудьте, что формат поля ФИО этогофайла точно должен совпадать с форматом поля ФИО в «материнском» файле students.dbf. Лучше скопируйте соответствующее поле, а потом замените фамилии). Таблица для файла studolimp.dbf с одинаковыми записями в поле ФИО Фамилия, инициалы (поле ФИО)
Год олимпиады (поле Год)
Предмет (поле Предмет)
Званцева Н.С. Званцева Н.С. Званцева Н.С. Яковлев И.Н.
1998 1997 1998 1998
Английский язык Химия Математика Физика
Яковлев И.Н.
1997
Математика
Поля: ФИО - фамилия победителя олимпиады; Год - год проведения олимпиады; Предмет - предмет, по которому проводилась олимпиада. *Программа browRelations.prg, иллюстрирующая работу BROWSE *со связанными базами данных. Используются файлы: *stud.dbf, stud1.dbf, stud2.dbf (заготовлены при выполнении задания к п.3.1.1). *Незнакомые команды и опции ниже поясняются комментариями. Кроме того, Вам встретятся команды, с помощью которых осуществляется прерывание по клавише или по нажатию кнопки мыши: ON key label righmouse DO... (по нажатию правой кнопки мыши будет проводиться повторный вызов программы); ON KEY LABEL Ctrl-Home DO... (по нажатию комбинации клавиш Ctrl-Home будет проводиться очистка окон и завершение программы). * Головная программа DO start ON KEY LABEL Ctrl+HOME DO ext ON KEY LABEL rightmouse DO start RETURN клавиш
&& Выполнение подпрограммы start && Hазначение ключей &&
Возврат
прерываний:
После
нажатия
&& или мыши будет возврат в ту фазу головной
112
&& программы, на которой она была прервана. *Конец Головной программы *Подпрограмма показа BROWSE PROCEDURE start CLEAR CLOSE DATABASES CLEAR WINDOWS filename2="students" filename1="studolimp" inde2=" students" inde1=" studolimp"
&& команда закрывает все файлы && баз данных (*.dbf),возможно, && открытые ранее && Создаются переменные памяти && filename1,2 для хранения имен файлов.
*Цикл открытия файлов и создания окон по числу файлов i=1 && Инициализация цикловой переменной. DO WHILE i<=2 && Условие возврата в цикл. is=STR(i,1) && Преобразование в символьную строку && длиной 1 символ для "подсадки" && в имена окон w1,w2,w3. DEFINE WINDOW w&is FROM 2+6*(i-1),3+7*(i-1); TO 10+6*(i-1),50+7*(i-1) FOOTER "Окно w"+is; TITLE filename&is CLOSE FLOAT GROW ZOOM && Создание окон. ACTIVATE WINDOW w&is SELECT &is && Выбор рабочей области USE &filename&is SET ORDER TO TAG ФИО IN &inde&is && и открытие в ней && соответствующего файла && (обязательно индексированного). IF i=1 && быстрый показ служебных файлов. BROWSE WINDOW w&is SAVE TIMEOUT 0.5 && можно NOWAIT вместо TIMEOUT. && Образ окна будет на экране после && его закрытия (SAVE). && Через 0.5 секунды программа && автоматически продолжится без && нажатия Esc (TIMEOUT 0.5). && NOWAIT - продолжает программу && без перерыва. ENDIF i=i+1 && наращивание цикловой переменной ENDDO && Операторная скобка конца цикла *В результате выполнения цикла активным остается окно w3, * а активной базой данных - stud.dbf в рабочей области 3. *Установление связи между базами данных по номеру записи SET RELATION TO ФИО INTO 1 SET SKIP TO 1 && установление связи && одна_запись__со_многими BROWSE WINDOW w2 && Показ активной базы данных && с показом соответствующих записей && в служебных файлах, связанных командой && SET RELATION..
113
RETURN
&& Конец подпрограммы
*Подпрограмма для окончания работы по клавишам Ctrl-Home PROCEDURE ext && Подпрограмма “Конец работы” CLOSE DATABASES && Закрытие всех файлов баз данных. CLEAR WINDOW && Очистка окон с экрана и из памяти. RETURN && Конец подпрограммы, возврат в Головную. Запустите программу на выполнение и проследите, какими FoxPro5.0 реализует связь.
средствами Visual
Второй способ установления связи между индексированными таблицами осуществляется через системное меню. Для этого зайдите в проект и выберите структуру Databases, в ней находятся БД students.dbc, которая содержит наши три таблицы. Проиндексируйте файл students.dbf по алфавиту фамилий. Для этого войдите в режим Modify и в окне Table Designer укажите для поля ФИО – ключ индексирования в списке Index - ↑Ascending (по возрастанию). Аналогичные операции сделайте для файла studolimp.dbf. После индексации таблиц воспользуйтесь системным меню Window/Data Session. Перед Вами появится диалог Data Session. Откройте нужные таблицы в диалоге Data Session (students.dbf и studolimp.dbf). Выберите из списка открытых таблиц таблицу students.dbf, которая будет “родительской” в устанавливаемых отношениях. Нажмите кнопку Relations, а затем выберите в списке порожденную таблицу studolimp.dbf. Появится диалоговое окно Set Index Order. В этом окне находится список, установленных в данной таблице индексов (в данном случае один и выделен, синим цветом, т. е. является активным – ФИО). Нажмите кнопку ОК. После чего появится диалог Expression Builder, в котором выберите ключ индексирования – ФИО. После того, как Вы установили связь Relations, нажмите кнопку 1 to many (устанавливается связь одна_запись_со_многими). При этом откроется диалог Create One-to-Many Relationships, в котором перенесите из поля Child Aliases в поле Selected Aliases дочернюю таблицу studolimp. После чего нажмите кнопку ОК. Для того чтобы просмотреть результат Вашей работы, перейдите в поле Aliases, в котором последовательно выбирайте каждую из таблиц, при этом нажимая кнопку Browse. На экране откроются окна с таблицами. Активизируйте таблицу students.dbf и передвигайте указатель курсора по записям таблицы, при этом Вы увидите, что в дочерней таблице курсор стоит на записях с той же фамилией, на которой стоит курсор в родительской базе, а родительская таблица «раздвигается» на количество записей в дочерней таблице (добавленные записи будут заполнены символом «*», что означает – запись по аналогии). 3.3. Установление постоянной связи RelationShip между таблицами в БД Все устанавливаемые Вами до этого пункта связи являлись временными, т.е. протекали в режиме сеанса Data Session: “установил- посмотрел”. В Visual FoxPro 5.0 Вы можете устанавливать постоянные отношения между таблицами, которые будут поддерживаться при создании форм, отчетов и запросов. При определении отношений одна из таблиц является родительской, а другая – дочерней. Для родительской таблицы должен быть определен первичный ключ Primary или ключкандадат Candidate, а для дочерней – индекс для связи с родительской таблицей (см. глава 1 п.4.3.1.1).
114
Для определения отношений между таблицами: 1. Установите, для начала, ключи индексов в таблице stud1.dbf для поля ФИО – ключ Primary, в таблице students.dbf для поля ФИО – Regular. 2. Откройте окно конструктора БД Database Designer (в диспетчере проекта выберите в структуре Databases БД students и нажмите кнопку Modify). Обратите внимание, на то, что установленные Вами индексы находятся внизу всех перечисленных полей в группе Indexes в таблице. 3. Выберите родительскую таблицу stud1.dbf (эта связь будет использоваться в дальнейшем для создания отчета). Вы увидите, что данная таблица содержит в группе Indexes поле ФИО, помеченное “ключиком” – означает, что индекс данной таблицы имеет первичный ключ Primary. Вторичные ключи не имеют такого значка. 4. Установите курсор мыши на первичный ключ таблицы. 5. Нажмите кнопку мыши и, не отпуская ее, переместите курсор мыши на индекс ФИО дочерней таблицы students.dbf, по которому устанавливается связь. 6. Отпустите кнопку мыши. В окне конструктора БД между таблицами появилась линия, отображающая созданные отношения между таблицами. Обратите внимание, что при установке курсора мыши на первичный ключ таблицы и нажатия кнопки мыши, вместо курсора образуется копия ключа, которую Вы переносите на индекс дочерней таблицы.
7. Установите курсор мыши на линию, соединяющую таблицы, и нажмите дважды левую кнопку мыши. На экране откроется окно диалога Edit Relationship, в котором слева в поле Table приведены наименование и раскрывающийся список индексов родительской таблицы, а справа в поле Related Table – аналогичная информация о дочерней таблице. В этом же диалоге приведен тип отношений между таблицами. Для сохранения отношений нажмите кнопку OK, для отказа – Cancel. Для удаления установленного отношения между таблицами, установите курсор на линию и нажмите правую кнопку мыши. Линия при этом увеличится в толщине и на экране появится контекстное меню. Выберите из этого меню команду Remove Relationship, и описание отношения будет удалено из словаря БД. Задание: Аналогично установите связь между таблицами students.dbf и stud2.dbf по полю ФИО. 4. СРЕДСТВА VISUAL FOXPRO 5.0 для ОТЛАДКИ ПРОГРАММ 4.1. Типы ошибок в программах, написанных на языке Visual FoxPro 5.0. Классификация ошибок в Visual FoxPro 5.0, подробно описана в [1], не отличается от знакомой Вам по курсам изучения других языков структурного программирования. Если Вы хорошо это знаете - прочтите только подраздел 4.2.2. Определения: • структурной называется ошибка, не позволяющая программе выполнить оператор (команду), наименование которого записано без ошибки; • синтаксической называется ошибка, не позволяющая Visual FoxPro 5.0 «понять» команду (обычно - описка в синтаксисе команды); • логической называется ошибка, из-за которой при отсутствии структурных и синтаксических ошибок Visual FoxPro 5.0-программа не обеспечивает получение нужного результата. Причиной логических ошибок является неверный алгоритм. Диагностика таких ошибок - наиболее трудоемкая, средствами Visual FoxPro 5.0
115
практически не обеспечивается (поскольку Visual FoxPro 5.0 не является строго типизированным языком). Единственным надежным средством обнаружения и устранения логических ошибок является расчет контрольных примеров и проверка соответствия счета по программе контрольному счету. Примеры структурных ошибок: • в программе имеется открывающая операторная скобка (например, • DO WHILE или DO CASE или IF...), но отсутствует закрывающая (ENDDO или ENDCASE или ENDIF); • в программе команда USE... использована для файла, не имеющего формата .dbf (не расширения .dbf - оно может быть любым, а принятой в Visual FoxPro 5.0 структуры файла базы данных); • в программе команда USE... использована с именем файла, который отсутствует в рабочем каталоге диска; • для приема ввода (в команде GET...) использовано обозначение переменной, которая не была определена выше (отсутствует команда присваивания некоторого значения этой переменной до выполнения команды GET... или отсутствует опция DEFAULT в этой команде); • не совпадает число формальных и фактических параметров в программе и подпрограмме (в Visual FoxPro 5.0 эта ошибка диагностируется только тогда, когда формальных параметров меньше, чем фактических. «Лишние» формальные параметры не вредят программе, т.к. не используются) Примеры синтаксических ошибок - любые описки в командах. Visual FoxPro 5.0 автоматически приостанавливает выполнение программы при наличии структурных и синтаксических ошибок и выводит сообщение о причине приостановки с запросами: Cancel? Suspend? Сбросить? Приостановить?
Ignore ? Пропустить и выполнять следующую строку?
Для отладки наиболее полезен ответ Suspend, после которого программа приостанавливается, управление передается в командное окно, и Вы можете запросить значения любой переменной или просмотреть файл или выполнить любую команду в диалоге. После анализа Вы можете продолжить выполнение программы с помощью команды системного меню Program/Resume (Ctrl+M).
Об отладочном сервисе см. в разделе 4.2. 4.2. Сервис Visual FoxPro 5.0 для отладки программ 4.2.1. Отладочный режим в Visual FoxPro 5.0 можно задать совокупностью команд из группы SET: Команды для отладки программ: SET STEP ON - пошаговый режим работы программы SET ECHO ON - эхо-сопровождение программы (при этом текст каждой очередной команды перед выполнением выводится на экран. SET TALK ON - режим выдачи отчета Visual FoxPro 5.0 о выполнении каждой команды (на экран) 4.2.2. УДОБНЕЕ проводить отладку с помощью отладчика, который представляет собой мощное средство, предназначенное для тестирования приложений. Отладчик позволяет Вам:
116
Показывать трассировку выполнения программы. Вывод в окно Trace – Visual FoxPro Debugger текста программы с помощью меню File/Open); Установить точки останова точек приостановки программы (BreakPoints); для этого нужно нажать левую кнопку мыши на серой полосе с левой стороны то команды, перед выполнением которой Вы хотите провести анализ обстановки. Повторное нажатие кнопки мыши снимает пометку точки приостанова, которая отмечается крупной точкой. Отменить все точки останова можно с помощью пиктограммы на панели инструментов отладчика с подсказкой Clear All Breakpoints; Просмотреть и изменить значения переменных. С помощью меню отладчика Window вызывается окно Watch (Alt+3), которое предназначено для слежения за изменением переменных в ходе выполнения программы; Отследить происходящие события: Можно установить режим вывода отчета о выполнении каждой команды с помощью всплывающего меню, для этого нажмите на правую кнопку мыши в области окна отладчика и в появившемся всплывающем меню выберите команду Trace Between Breaks; Можно установить темп прохождения программы с помощью меню отладчика Debug/Throttle...-появится диалог Execution Throttle, в котором Вы можете ввести интервал времени между выполнением команд, от 0 до 5.5 секунды; Выполнить программу в пошаговом режиме командами меню отладчика: Debug/ Step Into (F8) – осуществляет пошаговое выполнение программы; Debug/ Step Over (F6) – осуществляется вызов процедур в качестве одного шага; Debug/ Step Out (Shift+F7) – выходит из выполняемой в данный момент программы и останавливается на первой строке после команды, вызвавшей текущую программу; Run to Cursor (F7) – осуществляет выполнение программы до текущего положения курсора. Задание: Испытайте режим отладки при разработке собственного программного комплекса (см. зачетное задание в разделе 5 по Части 2). 4.2.3. Рекомендации по размещению точек приостановки программ при отладке (BreakPoints): • перед обращением к подпрограмме в Головной программе. После приостановки проверьте (либо с помощью окна Debug, либо в командном окне), какие значения приняли все фактические параметры, передаваемые в подпрограмму, а также все переменные памяти, объявленные как глобальные (PUBLIC); • после входа в подпрограмму (ниже команды PARAMETERS.). После приостановки проверьте, какие значения приняли все формальные параметры после приема фактических в подпрограмме, а также все переменные памяти, объявленные как глобальные (PUBLIC); • до входа в сложные программные конструкции (цикла DO ..ENDDO, ветвления IF...ENDIF, выбора DO САSE..ENDCASE). После приостановки проверьте, какие значения приняли переменные памяти и поля базы данных, подлежащие изменению внутри цикла (номер записи в файле базы данных, имя и номер поля базы данных, значения переменных, участвующих в организации цикла. • внутри цикла (после команды изменения значения переменной памяти, задающей номер цикла). Несколько (не менее двух) циклов следует выполнить в пошаговом режиме и проверить, правильно ли изменяются значения переменных памяти, участвующих в организации цикла. • после выхода из сложных программных конструкций (цикла DO..ENDDO, ветвления IF...ENDIF, выбора DO CASE... ENDCASE). После приостановки проверьте, какие
117
значения приняли переменные памяти и поля базы данных после выхода из цикла (номер записи в файле базы данных, имя и номер поля базы данных, значения переменных, участвующих в организации цикла). 5. ЗНАКОМСТВО С ЭЛЕМЕНТАМИ ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ. 5.1.Создание формы в конструкторе форм. 5.1.1. Введение. Вы ознакомились с созданием форм с помощью мастера форм в разделе 6 части 1. В данном разделе подробно изучим создание формы с помощью средств конструктора форм на примере. Процесс по созданию формы может включать в себя все или часть из приведенных ниже процедур: Настройка формы; Создание окружения; Размещение текста; Размещение полей; Создание управляющих кнопок; Размещение линий, прямоугольников и рисунков; Установка цвета объектов формы; Перемещение объектов формы, а также перемещение областей, которые могут содержать несколько объектов; Сохранение формы. Давайте рассмотрим основные идеи создания формы на следующем примере: требуется вывести поля – фио, Балл_сес01, Балл_сес02, Балл_сес03, Балл_сес04 и вывести средний балл успеваемости за 1 - 4 сессии. 5.1.2. Технология создания формы с помощью конструктора форм: 1. Вначале, изменим пользовательский интерфейс на «заготовке», которая в Visual FoxPro называется формой. Это основа, на которую помещаются средства управления программой (кнопки, окошки, линейки…). 2. Затем придадим заготовкам привлекательный вид, изменяя размер, цвет и разместим их согласно нашим представлениям об удобстве и гармонии. Такие действия называются приданием свойств объектам (properties). 3. Затем впишем тексты программ, которыми наши средства управления должны реагировать на действия с ними – например, на нажатие графической кнопки щелчком мыши. 4. Наконец, запишем текст программы, и просмотрим результат нашей работы. Таким образом, мы познакомимся с тремя основными этапами визуального программирования: I. Проектирование формы; II. Придание свойств объектам формы; III. Написание программ ( кодов). 5.1.3. Проектирование формы и придание свойств объектам 5.1.3.1. Знакомство с объектом Форма (Form). С помощью мастера форм Вы уже создали форму с находящимися на ней объектами. Откройте созданный Вами ранее проект students, в диспетчере проекта выберите вкладку Documents, в которой выберите элемент students в группе Forms, нажмите кнопку Modify, в результате чего откроется окно дизайнера форм – Form Designer с Вашей формой.
118
Форма будет иметь вид окошка, покрытого точками разметки. Сверху, на синей полосе, Вы увидите надпись students – заголовок окна. Справа, скорее всего, Вы увидите ещё одно окошко с надписью “Properties” – «Свойства». Эта надпись будет видна не на синем, а на сером фоне, чтобы Вы могли отличить активное окно (в данном случае окно формы) от пассивного (в данном случае окно Properties), действия в котором сейчас не проводятся. Если окно Properties (Свойства) не видно, вызовите его следующим образом: горизонтальное меню в верхней строке экрана: позиция View (щелкните по ней мышью). Появится выпадающее меню окон. Выберите в нём позицию Properties .
Теперь придадим форме желательные для нас свойства – с помощью окна Properties. Щёлкните мышью где-нибудь на этом окне. Вы увидите, что цвет заголовка окна Properties окна изменился (стал синим). То есть окно свойств (Properties) стало активным. (Так же, как во всех программах, работающих под управлением операционной оболочки Windows, активным может быть только ОДНО окно). Мы увидели в действии один из основных принципов работы визуально программирования – реакцию на событие (в данном случае – на нажатие мыши), которая проявилась в смене активного окна. Сначала дадим форме имя (русские программисты говорят - идентификатор, а англоязычные – name) взамен «машинного» Form1, которое присваивается форме «по умолчанию» – т.е. при отсутствии Ваших указаний. Конечно, можно оставить и «машинное» имя, но это не рекомендуется: если форм будет много, то Вы очень скоро начнёте путать их имена, отличающиеся лишь номерами. Имя формы может быть любым, но имеется общепринятый стиль имен, облегчающий Вам отладку, понимание и чтение Вашей программы. Согласно этому стилю первые 3 литеры имени объекта (в данном случае – формы) соответствуют общепринятому «шифру» этого объекта (в данном случае – frm). Затем без пробелов записывается «мнемоническое» имя, начиная с прописной литеры. Это имя должно напомнить Вам назначение объекта. Помня, что мы будем проектировать программу для иллюстрации нашей БД со студентами, дадим форме имя frmStud
Найдите в окне Properties свойство, позволяющее присвоить имя объекту (позиция Name). Все позиции перечислены по алфавиту, найдите ее в списке. Если позиция Name не видна (не поместилась) на экране, используйте линейку вертикальной прокрутки, расположенную справа вдоль окна Properties. Справа от Name Вы увидите «машинное» имя объекта Form1. Щёлкните левой кнопкой мыши где-нибудь на строчке с Name (при этом строчка выделится синим цветом). Теперь, не стирая имеющегося имени Form1, набирайте frmStud (конечно, можно и стереть – но не делайте лишней работы: Visual FoxPro многое делает само!). Вы увидите, что назначенное нами имя появилось одновременно и в перечне свойств (в строке Name), и в окошке свойств. Вверху окна Properties есть окно ввода, поверх всех свойств, в котором отражается то, что Вы набираете в данном свойстве (в данном случае имя). Далее не забывайте об этом. В перечне свойств Вы видите и другие строки (их много, и они позволяют выбрать разные свойства – размер формы, её цвет и т.д.). Воспользуемся перечнем свойств, чтобы заменить заголовок формы “students” на заголовок “Список студентов”. Заголовок можно изменить с помощью свойства Caption («капюшон»). Найдите его в окне Properties, щёлкните левой кнопкой мыши по строке, соответствующей этому свойству, и наберите: Список студентов
Вы увидите, что стали видны части заголовка (поместившиеся в отведенном месте окошка свойств и в правой части поля Caption). Если поместить курсор в окошко свойства и перемещать его (попробуйте!), то Вы убедитесь, что весь заголовок сохранился. Заголовок полностью виден на «строке заголовка» (верхняя строка формы). Вам может показаться, что «имя» (идентификатор) и «заголовок» – тождественные понятия.
119
Это не так. Имя будет использоваться для обращения к объекту в теле программ, а заголовок – чисто внешнее проявление, для пользователя (как «картинка»). С другими свойствами формы Вы будете знакомиться позднее.
5.1.3.2. Знакомство с объектом Группа командных кнопок(Command Group). Теперь сконструируем средства работы с таблицей students и выхода из программы. Для начала удалим ненужные для новой формы, которую мы с Вами создаем, текстовые поля и соответственные к ним метки, а также группу кнопок для работы с таблицей (эта группа кнопок находится внизу формы). Оставим на форме только метки фио, Балл_сес01, Балл_сес02, Балл_сес03, Балл_сес04 и текстовые поля к ним. Для того чтобы удалить ненужные текстовые поля и метки необходимо пометить один из удаляемых объектов с помощью мыши и удерживая клавишу Shift нажатой пометить все оставшиеся, после чего нажать на клавишу Delete, при этом все помеченные объекты удаляться (этот способ пометки сразу нескольких объектов удобен не только при операции удаления, но также и при групповом перемещении объектов по форме). Мы удалили с Вами группу кнопок для работы с таблицей, теперь сами попытаемся создать свою группу кнопок. Для этого воспользуемся панелью инструментов. Выберем форму графической группы командных кнопок (Command Group). Под стандартной панелью инструментов Вы, скорее всего, увидите так называемый Form Controls Toolbar (панель инструментов), на котором изображены «иконки» с косой стрелкой, буквой А и т.п. Если Form Controls Toolbar не виден, откройте выпадающее меню из позиции View в строке горизонтального меню Visual FoxPro (верхняя строка экрана) и щёлкните левой кнопкой мыши по позиции Form Controls Toolbar.
Найдите в Form Controls Toolbar’е иконку с изображением двух кнопок обведенных пунктиром (седьмая сначала панели) и щёлкните левой кнопкой мыши по ней. Вы увидите, что она выделится Список студентов контрастным цветом. Переместите указатель мыши на форму. Вы увидите, ФИО: что указатель принял вид креста (а не Балл_сес01: стрелки, каким был раньше). Поместите крестовидный указатель Балл_сес02: где-нибудь в нижней левой части Балл_сес03: формы, нажмите левую кнопку мыши Балл_сес04: и, не отпуская её, растяните «мерку» группы кнопок на всю видимую часть формы. Отпустите кнопку мыши. Стандартно в группе всего две кнопки Command1 Command2 (их количество можно увеличить), которые располагаются друг под другом. Чтобы расположить их в Рис. 5.1а. Вид формы: перенос группы порядке, как показано на рис. 5.1а, т.е. командных кнопок друг за другом необходимо пометить эту группу кнопок с помощью простого щелчка мышью по ней. После чего, удерживая мышь на помеченном объекте нажать на правую ее кнопку и в открывшемся рядом всплывающем меню нужно выбрать команду Edit (редактировать). Теперь можно перемещать кнопки внутри по отдельности (чего нельзя было раньше), попробуйте щелкнуть мышью на вторую кнопку и переместить ее к первой (построить линию из кнопок). Вам осталось поменять размеры этой группы, т.е. убрать лишнее место (оставшееся свободным внизу после второй кнопки). Чтобы выйти из режима редактирования объекта нужно просто щелкнуть мышью на свободном участке формы. Вы получите примерно следующее (рис. 5.1а): На форме появится изображение группы кнопок, на которых будут показаны их заголовки «по умолчанию» – Command1, Command2. Кнопка будет окружена «прихватками»
120
(handles), которые используются для изменения её размеров. Указатель мыши примет обычную стреловидную форму. Если Вы установите указатель мыши на «прихватке», то форма его снова изменится (примет форму двойной стрелки, горизонтальной (↔ ), вертикальной или расположенной под углом 45°, в зависимости от того, на какой «прихватке» Вы установите указатель). Если после этого нажать левую кнопку мыши и «потащить прихватку», то размер изображения соответственно изменится. Попытайтесь изменить все размеры группы кнопок – «протащите прихватки» вниз, вправо и одновременно вниз и вправо (для этого используйте «прихватку» в нижнем правом углу). Добейтесь, чтобы кнопка выглядела соразмерно (на Ваш вкус). Щёлкните левой кнопкой мыши где-нибудь на форме вне группы кнопок. «Прихватки» исчезнут. Научимся изменять расположение объекта (в данном случае – группы кнопок). Установите указатель мыши на кнопке, нажмите однократно, НЕ отпуская, левую кнопку и «потащите» изображение группы кнопок по форме, куда хотите. Такой приём “drag and drop” («подцепи и тащи») очень широко используется во всех программных продуктах, работающих в среде Windows. Он отражает концепцию визуального программирования, упомянутую во введении (делайте «на глаз», чтобы Вам казалось красивым). Теперь «очеловечим» свойства группы кнопок. Как и для объекта «форма», используем окно Properties (напоминание: если его не видно на экране используйте меню View – Properties). Научимся искать окно Properties, соответствующее данному объекту – группе кнопок. Это можно сделать двумя путями: • простейший – щёлкните однократно по изображению группы кнопок на форме; изображение окружат «прихватки», а в списке объектов в окне Properties (вторая строка окна сверху) появится имя группы кнопок (идентификатор «по умолчанию» Commandgroup1) и имя базового класса объекта BaseClass: Commandgroup (группа командных кнопок), а также имя класса в свойстве Class: Commandgroup; Может оказаться, что Вы случайно нажали кнопку мыши дважды. Тогда появится окно для ввода программы, пока Вам не нужное. Не пугайтесь. Просто закройте это окно так, как всегда закрываются окна в среде Windows – нажмите иконку ⌧ в правой стороне строки заголовка окна. •
профессиональный – откройте перечень объектов в окне Properties (для этого нажмите на кнопку списка объектов, справа во второй строке окна Properties). Вы увидите список объектов – уже описанную выше форму frmStud и группу командных кнопок Commandgroup1 и остальные объекты, созданные мастером формы, с помощью которого мы ее создали. Слева от имён объектов указаны их типы в виде пиктограмм с изображением соответствующего объекта как на панели инструментов.
Итак, окно Properties должно быть активным (его заголовок должен быть на синем фоне), и это окно должно отражать свойства объекта Commandgroup1. «Очеловечим» свойства группы командных кнопок.
Во-первых, придадим объекту легко запоминаемое имя (идентификатор), с помощью которого к нему можно будет обращаться «изнутри» Visual FoxPro, т.е. из программ. Следуя общепринятым соглашениям об именах, запишем (как и для формы) в качестве первых трех букв её шифр (cmdg, сокращение от command group ) и затем (без пробела!!!) – мнемоническое имя – например, Ruling (управление): сmdRuling
Запишем это имя в поле Name окна Properties (теми же приёмами, которые использовались при определении имени формы). Во-вторых, нам понадобится пять кнопок для управления, поэтому воспользуемся свойством объекта ButtonCount, которое определяет количество кнопок, размещаемых в объекте. По умолчанию свойство содержит значение, равное 2. Скорректируем его, задав количество кнопок, равное 5. Теперь, если Вы увеличить размеры объекта, то увидим новые кнопки, которые будут располагаться по порядку вниз. Зная, как их перемещать (команда Edit
121
во всплывающем меню) расположим их в ряд, если они не умещаются на видимой части формы, то увеличьте ее размеры, после чего можно редактировать размер кнопок, убрав лишнее место. Во-вторых, дадим каждой кнопке из группы «внешний» заголовок, под которым она будет являть себя пользователю. Этот заголовок будет напоминать о её функциональном назначении. Для этого опять воспользуемся командой Edit. В режиме редактирования данного объекта мы можем менять не только размеры и положение каждой кнопки отдельно, но и для каждой выбирать нужные нам свойства. Пометим мышью первую кнопку Command1 и используя поле Caption («капюшон») окна Properties, впишем в него Первая (имеется в виду запись в нашей таблице). Мы увидим, что безликий заголовок «по умолчанию» Command1 заменился на «очеловеченный». Теперь дадим имя нашей кнопки с помощью свойства Name, впишем в него cmdFirst (командная кнопка First- означает первая) (для чего нужно это свойство мы уже разобрали выше Не путайте со свойством Caption). Процесс придания экрану ЭВМ формы, легко понимаемой непрофессионалами, называется «создание дружественного интерфейса» Теперь пометим мышью вторую кнопку Command2 и, используя поле Caption окна Properties, впишем в него Предыдущая. Теперь дадим имя нашей кнопки с помощью свойства Name, впишем в него cmdPrev (Prev от слова previous - предыдущий). Заполним свойства третьей кнопки Caption: Следующая; Name: cmdNext (Next - следующий). Заполним свойства четвертой кнопки Caption: Список студентов Последняя; Name: cmdLast (Last ФИО: последний). Осталась пятая Балл_сес01: кнопка ее свойства Балл_сес02: Caption: Выход; Балл_сес03: Name: cmdExit (Exit - выход). Балл_сес04:
После определения свойств Первая Предыдущая Следующая Последняя Выход управляющих кнопок для работы с записями в нашей Рис. 5.1б. Вид формы после ввода свойств для каждой кнопки из группы командных кнопок таблице щёлкните левой кнопкой мыши где-нибудь на форме вне кнопок. Должно получиться что-то похожее на рис. 5.1.б.
5.1.3.3. Знакомство с объектом Текстовое окошко (Text Box). Нам нужно добавить к существующим на форме текстовым окнам еще одно, в котором будет показан общий средний балл с 1 по 4 сессии. Для этого используем пустое текстовое окошко, фон которого будем в дальнейшем изменять в зависимости от соотношения цветов. Используйте Form Controls Toolbar. Щёлкните левой кнопкой мыши по иконке текстового окошка (четвертая сначала панели, на ней написаны литеры ab|). Иконка станет активной (изменит цвет), а указатель мыши на форме станет крестовидным. Установите «крест» под всеми текстовыми окошками, уже имеющимися на форме, нажмите левую кнопку мыши и, не отпуская её, растяните окошко (см. рис. 5.1.в).
122
Пользуясь уже знакомыми вам приёмами, ФИО: «очеловечьте» его Балл_сес01: свойства: Замените его имя Балл_сес02: Text1 Балл_сес03: (присвоенное «по Балл_сес04: умолчанию»), на более читаемое. Text1 Используйте общепринятые Первая Предыдущая Следующая Последняя Выход соглашения – начальные три литеры как шифр Рис. 5.1в. Вид формы после размещения нового объекта - текстового (для этого объекта окна txt, от термина textbox) + мнемоническое «окончание», начинающееся с прописной литеры. Например: txtMidBall Введите это имя в поле Name окна Properties. Теперь пользуясь свойством ControlSource (которое отображает выражение с полями или сами поля таблицы), наберем выражение для расчета общего среднего балла за все четыре сессии. Как обычно мы рассчитываем средний балл – складываем все величины и делим на их количество. Щёлкните левой кнопкой мыши где-нибудь на строчке с ControlSource (при этом строчка выделится синим цветом). Вверху окна Properties есть окно ввода, поверх всех свойств, в котором отражается то, что Вы набираете в данном свойстве (в данном случае выражение). Слева от этого окна ввода располагается кнопка с надписью fx нажмите на эту кнопку. В результате чего на экране появится окно построения выражений Expression Builder. В котором Вы увидите окно для ввода выражения Expression, группу функций для набора выражений: математические (Math), логические (Logical), строковые (String) и для работы с датами (Date), список полей используемой таблицы БД (Fields) и список системных переменных (Variables). С помощью всего этого набора можно просто нащелкать выражение, не набирая его вручную. Для выбора функций, нужно нажать на кнопку справа, после чего выпадет список функций. Выбор из списка осуществляется двойным щелчком левой кнопки мыши, после чего выбранная запись появляется в окне выражений Expression. Наберите следующее выражение: (students.балл_сес01+students.балл_сес02+ students.балл_сес03+ students.балл_сес04)/4 и нажмите кнопку OK. В строке со свойством ControlSource Вы увидите набранное Вами выражение. Список студентов
5.1.3.4. Знакомство с объектом Этикетка (Label). Для того чтобы вывести на экран подсказки и надписи, используем этикетки. На этикетке мы напишем слова, указывающие на назначение поля txtMidBall. Для этого можно воспользоваться следующим способом (он не приведет к экономии времени в данном случае, но будет весьма полезен в дальнейшем). Щёлкните однократно левой кнопкой мыши где-нибудь внутри этикетки Балл_сес01; вокруг неё появятся «прихватки». Скопируйте весь объект (т.е. метку со всеми её свойствами, кроме имени) в буфер промежуточного хранения. Для этого: либо воспользуйтесь горизонтальным меню Visual FoxPro, позиция Edit (редактирование). В выпавшем меню выберите позицию Copy (копировать); либо воспользуйтесь сочетанием клавиш Ctrl-C. Тем из Вас, кто работал с текстовым редактором Word или с электронной таблицей Excel,
123
этот прием наверняка знаком.
«Прихватки» исчезнут. Извлеките копию из буфера. Для этого: либо воспользуйтесь горизонтальным меню Visual FoxPro, позиция Edit (редактирование). В выпавшем меню выберите позицию Paste (вставить); либо воспользуйтесь сочетанием клавиш Ctrl-V. «По умолчанию» новая метка получила имя Embossedlabel1, а заголовок – Балл_сес01. Разместите ее под остальными метками и рядом с текстовым полем txtMidBall. Осталось только подправить унаследованные (от метки Балл_сес01) свойства. Для этого: активизируйте окно Properties, дайте новой метке (этикетке) «внутримашинное» имя lblMidBall и заголовок “Общий средний балл:”. Мы встретились с одним из основных приёмов объектно-ориентированного программирования – наследованием признаков (свойств) объекта-прототипа объектом-копией: сохранились размеры кнопки, её заголовок и многие другие свойства, перечисленные в окне Properties, пока Вам незнакомые.
Можно изменить цвет метки, для этого используйте свойство ForeColor (цвет надписи) и цвет фона метки - свойство BackColor, щёлкните быстро дважды по значению свойства, на экране появится палитра цветов, выберите цвет на Ваш вкус. Для большей выразительности обведите этикетку рамкой. Используйте свойство BorderStyle (стиль рамки, «бордюра»). Щелчком мыши по значению свойства добейтесь, чтобы появилось 1-Fixed Single (сплошная одинарная). Если у Вас появились трудности при размещении объекта (не можете поставить объект в нужное местоположение, поскольку перемещение объекта происходит по сетке – пунктирным линиям на форме), то воспользуйтесь свойствами Top (отступ сверху относительно формы) и Left (отступ слева). Аналогичн ым образом Список студентов измените заголовки Список студентов и их баллы за сессии Балл_сес01… Балл_сес04 на ФИО: Балл за Балл за сессию 1: сессию 1… Балл за Балл за сессию 2: сессию 4 и Балл за сессию 3: свойства этих Балл за сессию 4: меток. Вы видите, Общий средний балл: txtMidBall что заголовок разместился на этикетке Первая Предыдущая Следующая Последняя Выход слева. Для красоты Рис. 5.1.г. Окончательный вид формы переместите его в вправо, т.е. ближе к текстовым окнам. Для этого используйте свойство Alignment (выравнивание). Щелчками мыши по значению этого свойства добейтесь, чтобы появилось 1- Right (выравнивание объекта по правому краю). Можно также поменять заголовок метки вверху формы с STUDENTS на Список студентов и их средний балл за сессии и также поменять ее свойства: цвет фона, цвет надписи, рамку и т.д.
124
Теперь приведите форму в порядок, т.е. расположите все объекты в видимой части формы, и если они не умещаются на ней, растяните ее. Получится что-то похожее на рис. 5.1.г. Первичное знакомство с процессом проектирования интерфейса и средств управления программой закончено. С остальными объектами на панели инструментов Вы познакомитесь самостоятельно. 5.2. Написание программы (кодов) Программа будет работать под управлением средств, размещенных на форме. Всякое действие пользователя с ними (из списка разрешенных, предусмотренных для данного объекта) называется, как уже упоминалось, событием – например, для кнопки таким событием является щелчок левой кнопки мыши. Начнём с кнопки Первая. 5.2.1. Коды для кнопки Первая Вспомните, как мы размещали кнопки в группе кнопок CommandGroup, т.е. для того, чтобы иметь возможность работать с каждой кнопкой в отдельности необходимо войти в режим редактирования (см. выше). Теперь пометьте кнопку Первая из группы кнопок. Щёлкните дважды (быстро) по кнопке Первая, откроется окошко кодов (программы-реакции на событие с кнопкой). Вы видите два открывающихся списка: слева Object – список объектов, внесенных Вами на форму (если щёлкните левой кнопкой мыши по значку списка Object, то увидите перечень всех объектов формы), справа Procedure – список событий Proc (от Procedures – процедуры), предусмотренных (и предопределенных) для каждого объекта. Например, для кнопки предусматривается Click, DragDrop, DragOver и др. Для того, чтобы увидеть перечень и выбрать нужное событие (если не подходит предложенное по умолчанию) щёлкните левой кнопкой мыши по значку списка Proc. Пока не будем останавливаться на описании всех предопределенных событий – по смыслу задачи событие «щелчок левой кнопки мыши» нам подходит. Сейчас в поле Object стоит объект cmdFirst (т.е. имя объекта (первой кнопки), для которого мы хотим описать реакцию на событие). А в поле Procedure - Click() (наименование события (одинарный щелчок левой кнопки мыши)). И пустое окно, в котором Вы будите набирать код действий, которые необходимо сделать при нажатии на кнопку. Вам остается только вписать нужные коды внутри окна. Теперь спроектируем действия, которые должна выполнять наша программа при нажатии кнопки Первая: Сначала мы должны проверить, где находится курсор в таблице. Если он находится вначале, то никаких действий не принимать, иначе перевести курсор в начало таблицы. Так как у нас таблица является внешней “структурой” по отношению к форме и перевод курсора в таблице не отразится в форме, то мы должны “обновить” форму, т.е. отобразить на форме изменения в таблице. Наберите текст программы внутри окна: If !Bof() && если не начало таблицы, то; Go top && перейти в начало; Endif && конец условия; _screen.ActiveForm.Refresh() && обновить форму;
125
Некоторые пояснения: Знаком && отделены комментарии (пояснения). Программа их не анализирует. Но программист должен обязательно комментировать программу – иначе через некоторое время забудет её логику. Если комментарий начинается с новой строки, то его знак *. Вы увидите, что Visual Foxpro выделяет комментарии контрастным цветом. Строка 1: функция Bof(<номер рабочей области/псевдоним таблицы>) (Begining Of File) возвращает логическое да – .Т. (True), если курсор находится в начале таблицы или логическое нет - .F. (False) – в противном случае. В скобках указывается номер рабочей области или псевдоним таблицы. Если параметр не указывается, то по умолчанию используется текущая таблица. Далее мы не будем описывать параметры функции, если они не используются. Более подробнее Вы можете о них узнать из контекстной помощи. Знак ! – означает отрицание (Not). Строка 2: Оператор Go переносит курсор в Top – начало таблицы, Bottom – в ее конец. Строка 3: Конец конструкции. Строка 4: Структура _screen.ActiveForm – означает, что следующий метод производится над активной формой, т.е. над формой, которая находится в фокусе. Метод Refresh() – обновляет объект, к которому он относится (в нашем случае форму). Таким образом, мы можем записать несколько освоенных правил оформления кодов – реакций на событие: Если нужно изменить свойство объекта по ходу программы, нужно записывать через разделитель-точку так: <имя (name) объекта>.<свойство> Комментарии отделяются от программы знаками && - если в строке с кодом программы и * если с начала следующей строки (после или перед строкой с кодом). Строка в программе (включая комментарии) не разрывается и не переносится. Вызов процедуры происходит по её имени. Рядом с именем, в скобках, указывается перечень параметров, которые должны быть в неё переданы. Если передается параметр по умолчанию, то в скобках ничего не указывается.
5.2.2. Коды для кнопки Предыдущая Для того, чтобы перейти к описанию кода программы для этой кнопки, воспользуйтесь списком Object, в котором выберите кнопку cmdPrev. В списке Procedure – выберите событие Click. Действия, которые должны быть выполнены при «нажатии» кнопки Предыдущая: Проверяем положение курсора в таблице, если он не в начале, то тогда переводим курсор на одну запись назад, иначе курсор оставляем на месте. “Обновляем” форму. Наберите текст программы внутри окна: If !Bof() && если не начало таблицы, то; Skip-1 && переместить курсор на одну позицию назад; Endif && конец условия; _screen.ActiveForm.Refresh() && обновить форму; Некоторые пояснения: Строка 2: Skip – переместить указатель в таблице назад или вперед на заданное число записей. Если знак минус- то назад, если – плюс, то вперед. 5.2.3. Коды для кнопки Следующая
126
Для того, чтобы перейти к описанию кода программы для этой кнопки, воспользуйтесь списком Object, в котором выберите кнопку cmdNext. В списке Procedure – выберите событие Click. Действия, которые должны быть выполнены при «нажатии» кнопки Следующая: Проверяем положение курсора в таблице, если он не в конце, то тогда переводим курсор на одну запись вперед, иначе курсор оставляем на месте. “Обновляем” форму. Наберите текст программы внутри окна: If !Eof() && если не конец таблицы, то; Skip && переместить курсор на одну позицию вперед; Endif && конец условия; _screen.ActiveForm.Refresh() && обновить форму; Некоторые пояснения: Строка 1: функция Eof() (End Of File) возвращает логическое да – .Т. (True), если курсор находится в конце таблицы или логическое нет - .F. (False) – в противном случае. 5.2.4. Коды для кнопки Последняя Для того, чтобы перейти к описанию кода программы для этой кнопки, воспользуйтесь списком Object, в котором выберите кнопку cmdLast. В списке Procedure – выберите событие Click. Действия, которые должны быть выполнены при «нажатии» кнопки Последняя: Проверяем положение курсора в таблице, если он не в конце, то тогда переводим курсор в конец таблицы, иначе курсор оставляем на месте. “Обновляем” форму. Наберите текст программы внутри окна: If !Eof() && если не конец таблицы, то; Go Bottom && переместить курсор в последнюю позицию; Endif && конец условия; _screen.ActiveForm.Refresh() && обновить форму; 5.2.5. Коды для кнопки Выход Для того, чтобы перейти к описанию кода программы для этой кнопки, воспользуйтесь списком Object, в котором выберите кнопку cmdExit. В списке Procedure – выберите событие Click. Действия, которые должны быть выполнены при «нажатии» кнопки Выход: выдать подтверждение о намерениях выхода из формы. работа программы должна прекратиться; экран Visual FoxPro должен вернуться к состоянию, которое было при проектировании формы. Наберите текст программы внутри окна: If MessageBox("Выходить из формы?", 4+32+256, "Выход")=6 * Если нажата кнопка Да в диалоговом окне, то _screen.ActiveForm.Release() && выход из формы Else && иначе _screen.ActiveForm.Refresh() && обновить форму Endif && конец условия Некоторые пояснения: Строка 1: функция MessageBox (текст сообщения, тип диалога, заголовок диалога) – API функция активизирует диалог с тестом "Выходить из формы?", заголовком
127
"Выход", кнопками “Да”, “Нет” с иконкой “Вопрос” и с активной кнопкой – “Нет”. Она возвращает код нажатой кнопки (6 – код кнопки “Да”). Строка 3: Метод Release () – освобождает из памяти объект Form. Наша работа по созданию «проекта» завершена. Для перехода в окно с формой нажмите кнопку Esc на клавиатуре, для перехода обратно в окно кода программы нажмите правую кнопку мыши и во всплывающем меню выберите позицию Code. 5.3. Сохранение файла формы •
Так как, у нашей формы есть имя Students, то для сохранения изменений достаточно выполнить команду Save в меню File. Если Вы хотите записать форму под другим именем, то выполните команду Save File As в меню File.
При этом появится диалоговое окно Save File As (Сохранить под именем).
• •
Итак, вы записали на диск Ваш файл формы. Можно также нажать мышкой на кнопку (на стандартной панели инструментов, расположенной в строке ниже меню) с изображенной на ней дискеткой (что то же самое, только быстрее) для записи файла.
Совет: Старайтесь сохранять файлы как можно чаще, так как из-за различных сбоев в компьютере вы можете потерять либо изменения, внесенные вами до этого, либо вообще файл!
5.4. Запуск программы на выполнение Для запуска формы выберите один из следующих способов: Выполните команду меню Form/Run Form; Выполните команду меню Form Run всплывающего меню; Нажмите кнопку Run на стандартной панели инструментов ! Visual Foxpro5.0; Если Вы внесли изменение в код программы и выполняете запуск программы, при этом выйдет окно диалога с вопросом: Do you want to save changes to Form Designer – students.scx? (Вы хотите сохранить изменения в файле формы?) При ответе Yes – сохраняться изменения, при ответе Cancel – останетесь в прежнем месте. Одно из важнейших преимуществ языка Visual FoxPro 5.0 состоит в том, что вы можете разрабатывать программу маленькими шагами. А после каждого шага запускать ее и наблюдать в действии. Это создает своего рода обратную связь и позволяет вам оценивать и корректировать программу на всех этапах ее разработки. Как уже говорилось ранее, вы легко можете запустить программу на любом этапе ее создания, однако в Вашем коде может присутствовать ошибка, способная привести к зависанию или краху системы. Это значит, что если вы не сохраните свои файлы перед запуском программы, всегда есть возможность их потерять. Поэтому возьмите за правило обязательно сохранять свой проект перед запуском программы на выполнение. 5.5. Работа с программой Итак, запустите программу на выполнение. Нажмите мышкой кнопку “Следующая” и просмотрите действия программы. Вы увидите, что в текстовых окнах с соответствующими метками к полям появилась первая запись. Поэкспериментируйте с другими кнопками для работы с записями таблицы. Для выхода из программы нажмите кнопку “Выход”. 5.6. Итоги проделанной работы:
128
Итак, мы написали первую программу на Visual FoxPro, прошли все необходимые этапы: этап проектирования формы, придание свойств объектам формы и написание программы. На первом этапе поместили на форму необходимые объекты. На втором этапе задали значения свойствам объектов. На последнем этапе создали процедуры обработки некоторых событий для соответствующих объектов и ввели в них операторы Visual FoxPro. Задания: 1. Попробуйте изменить цвет главного окна формы с серого на любой другой цвет (свойство BackColor). 2. Попробуйте изменить шрифт надписей и их размер на командных кнопках (свойства: FontName и FontSize). 3. Попробуйте подчеркнуть надписи и сделать шрифт жирным, а также изменить его цвет на командных кнопках (свойства: FontUnderline, FontBold, ForeColor). 4. Усовершенствуйте программу на свой вкус. 6. СОЗДАНИЕ ОТЧЕТОВ 6.1. Введение В процессе работы с Visual FoxPro Вы уже научились создавать таблицы, вводить и редактировать в них данные. Вы можете также обрабатывать информацию, содержащуюся в таблицах, и получать результаты на экране. В этом разделе Вы познакомитесь со средствами Visual FoxPro, предназначенными для создания отчетов. Под отчетом понимается форматированное представление данных, выводимое на экран, принтер или в файл. Прежде, чем приступить к созданию отчета, Вы должны дать ответ на следующие вопросы: С какой целью создается настоящий отчет, и чем он будет вам полезен? Какая информация, и из каких таблиц должна быть представлена в отчете? Ответ, какого вида Вы предполагаете создать (табличный, в свободной форме или наклейки)? Предполагается ли группировка данных? При создании отчета Вы можете воспользоваться стандартными средствами, ускоряющими процесс создания отчета, или разработать для отчета специальный формат с помощью конструктора отчетов. Табличный отчет представляет собой напечатанную таблицу, в которой данные упорядочены по столбцам и строкам. Каждый из столбцов отчета содержит поле исходной таблицы или вычисляемое поле, а строка представляет собой запись. Недостатком этого вида отчета является то, что в нем невозможно располагать поля исходной таблицы в специально отведенных для них местах отчета. Отчеты в свободной форме позволяют устранить ограничения, свойственные табличным отчетам. При получении этого вида отчета Вы можете воспользоваться стандартным форматом, автоматически создаваемым Visual FoxPro для каждой таблицы. В этом формате поля исходной таблицы расположены вертикально. В Visual FoxPro 5.0 для создания отчетов используется: Мастер отчетов (Report Wizard), позволяющий достаточно быстро создать отчет, выбрав параметры сортировки и группировки данных, стиль отображаемых данных и их расположение.
129
Стандартный отчет (Quick Report), позволяющий создавать стандартный отчет, в котором поля отчета располагаются автоматически по внутреннему алгоритму Visual FoxPro 5.0. Конструктор отчета, в котором Вы самостоятельно разрабатываете собственные отчеты. 6.2. Использование мастера для создания отчета При создании отчета с помощью мастера предварительно откройте создаваемый Вами проект students. Затем перейдите на вкладку Docs, выберите группу Reports и нажмите кнопку New. В открывшемся окне диалога New Report выберите опцию Report Wizard. В качестве альтернативного способа запуска мастера отчетов выполните команду меню File/New. В открывшемся окне диалога выберите опцию Report, а затем нажмите кнопку Wizard. Итак, Вы запустили мастер отчетов. На экране откроется окно диалога Wizard Selection, позволяющее определить требуемый тип отчета: Group/Total Report Wizard – создает отчеты с группировкой данных One-to-many Report Wizard – создает отчет для таблиц с отношением один-ко многим Report Wizard – создает простой однотабличный отчет. Рассмотрим создание простого однотабличного отчета. Выберите тип Report Wizard и нажмите кнопку ОК для перехода к следующему шагу. Появится диалог Report Wizard, в котором пошагово в режиме вопрос – ответ установите необходимые параметры. Шаг 1 – выбор полей, которые Вы хотите разместить в Вашем отчете. В самом левом поле Databases and tables выберите таблицу students.dbf из базы данных students. В списке Availabel fields Вы увидите поля таблицы students.dbf, выберите из него с помощью кнопок со стрелками поля, которые будут размещены в отчете (выбранные поля будут отображаться в списке Selected fields): все кроме поля Дополнение. Для перехода к следующему шагу нажмите кнопку Next. Шаг 2 – выбор стиля отчета. Переключатель Style содержит три варианта отображения объектов (полей, линий, заголовков и т.д.) в отчете. Мастер позволяет при выборе стиля просмотреть результат в верхнем левом углу окна диалога. Например, выберите стиль Presentaton. Для перехода к следующему шагу нажмите кнопку Next. Шаг 3 – установка схемы отчета – порядок размещения объектов в отчете и ориентацию страницы отчета. Поле Number of Columns указывает число колонок в отчете (установите значение этого поля в 1). Переключатель Field Layout указывает в каком виде будут расположены записи в отчете: Columns – в виде колонок (аналог режима BROWSE) и Rows – в виде строк (аналог режима EDIT). Выберите режим Columns. Просмотреть результат Вы можете в верхнем левом углу окна диалога. Переключатель Orientation устанавливает ориентацию «бумаги»: Portrait – книжная и Landscape – альбомная. Установите переключатель Orientation в положение Landscape. Для перехода к следующему шагу нажмите кнопку Next. Шаг 4 – определение полей, по которым происходит сортировка данных, выводимых в отчет. Из списка полей и индексов Availabel fields or index tag выберите те, по которым требуется упорядочивание данных (в нашем случае выберите поле ФИО) и нажмите кнопку Add. Для поля ФИО укажите порядок сортировки - по возрастанию (Ascending). Для перехода к следующему шагу нажмите кнопку Next. Шаг 5 – заключительный. Здесь указывается заголовок отчета в поле ввода Type of title for your report и выбирается один из трех вариантов дальнейшей работы с отчетом: • Save report for later use – сохранить созданный отчет.
130
•
Save report and modify it in the Report Designer – сохранить отчет и открыть его в конструкторе отчетов. • Save and print report – сохранить отчет и напечатать его. Укажите заголовок отчета – СТУДЕНТЫ и выберите опцию Save report for later use. Для просмотра созданного отчета нажмите кнопку Preview, которая находится в правом нижнем углу окна диалога. После того, как Вы установили требуемые опции, нажмите кнопку Finish. Появится диалог Save As, в котором выберите каталог, и введите имя созданного отчета для сохранения его на диск. Чтобы просмотреть уже созданный отчет, существует ряд способов: Команда File/Print Preview основного меню; Команда View/Preview основного меню; Команда Preview всплывающего меню; Кнопка Print Preview на стандартной панели инструментов Visual FoxPro 5.0. Созданный отчет может полностью удовлетворять Ваши требования. Однако, если Вам потребуются дополнительные возможности, Вы можете использовать созданный отчет в качестве чернового отброска и модифицировать его с помощью конструктора отчетов. 6.3. Описание окна конструктора отчетов Любой отчет состоит из пояснительного текста, полей отчета и рамок. Текст носит произвольный характер. Рамки служат для улучшения восприятия информации. Поля отчета могут соответствовать полям исходной таблицы или является результатом вычислений над ними. При создании и модификации отчетов конструктор позволяет Вам удалять, добавлять, перемещать области вместе с расположенными в них объектами. Вы можете установить цвет и управлять параметрами отображения любых элементов и областей отчета. Открыть окно конструктора отчетов при создании нового отчета можно одним из следующих способов: Команда File/New. В открывшемся окне диалога New установите опцию Report и нажмите кнопку New File. Кнопка New в окне проекта, при этом необходимо предварительно выбрать группу Reports. Кнопка New на стандартной панели инструментов. В открывшемся окне диалога New установите опцию Report и нажмите кнопку New File. Открыть окно конструктора отчетов для модификации созданного отчета можно следующим способом: Зайдите в проект (в нашем случае students), потом выберите в нем группу Reports После этого выберите там свой отчет и нажмите кнопку Modify. Перед Вами появиться окно конструктора отчетов. Итак, Вы находитесь в окне конструктора отчетов с панелями инструментов Report Designer и Report Controls. Обратите внимание на то, что в строке основного меню добавился пункт Report. Краткое описание панели инструментов Report Controls приведено в таблице 6.1. Для того, чтобы узнать к какой из кнопок относится данное наименование инструмента необходимо подвести курсор мыши к любой из кнопок и подождать немного, пока, не появится подсказка к данной кнопке, в которой и будет наименование инструмента, одного из указанных в таблице. Таблица 6.1. Наименование кнопок панели инструментов Report Controls. Наименование инструмента
Назначение
131
Selected Objects Label Field Line Rectangle Rounded Rectangle Picture/OLE Bound Control Button Lock
Является указателем выбора объектов отчета Размещает текст Размещает поля Рисует линии Рисует прямоугольники Рисует прямоугольник со скругленными краями Помещает в отчет рисунок Закрепляет выбор кнопки
Окно конструктора отчетов содержит три полосы, ограничиваемые разделительными строками. Наименование полосы отображается на разделительной строке, находящиеся непосредственно под этой полосой. При задании групп, титульной страницы и итоговой сводки появляются дополнительные полосы. Каждая полоса может содержать текст, табличные поля, вычисляемые поля, линии, прямоугольники и рисунки. Типы полос окна конструктора отчета перечислены в таблице 6.2. Тип полосы определяет, когда и где будут печататься объекты полосы. Таблица 6.2. Типы полос. Наименование Title (Титул) Page Header (Верхний колонтитул) Group Header (Группа: сверху) Detail (Детали) Group Footer (Группа: снизу) Page Footer (Нижний колонтитул) Summary (Итоги)
Описание Информация, появляющаяся перед основным отчетом. Титулом может быть имя отчета, сопроводительное письмо или любая информация, которую необходимо поместить на первой странице отчета. Информация, которая печатается в начале каждой страницы. Обычно в этой полосе содержится название отчета, текущая дата, номер страницы и т.д. Информация, используемая при группировке. При группировке данных группа может иметь верхние полосы, печатаемые до нее. Они помогают идентифицировать информацию, содержащуюся на каждом уровне группировки. Информация полей из таблицы или результат вычислений над полями из таблицы. Итоговая информация по группе. Информация, содержащая название отчета, дату, номер страницы и итоговые значения по данным текущей страницы. Информация, появляющаяся один раз после основного отчета и содержащая общие суммы или текст, подводящий итог содержимого отчета.
Вы можете управлять высотой полосы для добавления в нее текста, полей или просто, чтобы добавить в свой отчет пробелы. Чтобы изменить высоту полосы выберите нужную полосу (Вы увидите двустороннюю стрелку), и опустите ее границу вниз, если Вам нужно больше места. В противном случае поднимите границу полосы вверх. Можно также дважды нажать мышью на полосе и ввести высоту в появившемся окне диалога. 6.4. Создание стандартного отчета Процесс создания отчета может включать в себя все или часть из приведенных ниже процедур: Определение окружения Размещение текста Размещение полей Размещение линий, прямоугольников и рисунков Перемещение объектов, а также перемещение областей, которые могут содержать любые объекты отчета, тексты Сохранение отчета
132
Первоначальное размещение полей данных можно облегчить, используя средство конструктора отчетов, называемое стандартным отчетом. Стандартный отчет – это средство конструктора отчетов, которое автоматически помещает выбранные поля в пустое окно конструктора отчета. Для завершения создания отчета необходимо лишь требуемым образом изменить расположение полей, а также вставить дополнительный текст и другие объекты отчета. Для создания стандартного отчета необходимо выполнить следующие действия: Находясь в окне конструктора отчета, выполните команду меню Report/Quick Report. В открывшемся окне диалога Open содержится список всех таблиц, открытой в проекте базы данных. Выберите таблицу stud2.dbf, для которой создадим стандартный отчет, и нажмите кнопку OK. На экране откроется окно диалога Quick Report. Выберите вариант расположения полей в отчете из двух предложенных: в столбец или в строку. Для примера выберем вариант расположения полей в виде строк, для этого нажмите в группе Fields layout на кнопку с изображением расположения полей в строку. Окно диалога Quick Report содержит следующие флажки: • Titles – определяет, должны ли имена полей отображаться над соответствующим полем или рядом с ним; • Add alias – определяет, добавить ли псевдоним таблицы в имена полей в окне конструктора отчета; • Add table to data environment – определяет, добавить ли таблицу в окружение. Для выбора полей отчета нажмите кнопку Fields в окне диалога Quick Report. Перед Вами появится окно диалога Field Picker, в нем выбираются поля, которые Вы собираетесь поместить в отчет. В поле All fields указаны все поля открытой Вами таблицы stud2.dbf. Перенесем все поля stud2.dbf в наш новый отчет. Для этого нажмите кнопку All. В списке выбранных полей Selected Fields появились все поля таблицы (Вы уже знаете, что можно переносить не все поля, а только выбранные, для этого помечаете каждое и отдельно переносите в список выбранных полей; существуют и другие способы переноса). Нажмите кнопку OK. Теперь отчет содержит все необходимые поля, номер страницы (в нижнем правом углу в полосе Page Footer, системная переменная _PAGENO (номер страницы)) и дату формирования отчета (в нижнем левом углу в полосе Page Footer, функция DATE()), которые будут использоваться в качестве черновика отчета. Для просмотра созданного отчета выполните команду View/Preview. Перед Вами на экране представлены данные таблицы, записанные в соответствующие поля. Теперь для того, чтобы предать отчету законченный вид, добавим к нему заголовок: Выполните команду Report/Title/Summary. Перед вами появится окно диалога Title/Summary, установите в нем флажок (опцию) Title/Band (при установлении этой опции в окне конструктора отчетов появляется полоса заголовка отчета) и нажмите кнопку OK. В отчете появится полоса Title (заголовка). Разместите в ней текст заголовка отчета “Список студентов их увлечения и рекомендуемая специализация”. Для размещения используйте кнопку Label на панели инструментов Report Controls. Нажмите на эту кнопку и установите с помощью мыши курсор на полосе заголовка в то место, откуда будет начинаться текст заголовка. Затем наберите в ней текст, и если он не умещается, то разбейте его на части с помощью Enter (аналог текстового редактора). Вы можете изменить шрифт заголовка с помощью команды меню Format/Font…, а также расположить заголовок с помощью выравнивания текста, например, на середину листа командой Format/Text Alignment/Center. Если Вы хотите отредактировать текст, то нажмите кнопку размещения текста Label на панели инструментов Report Controls. И установите курсор в редактируемый текст.
133
Попробуйте изменить цвет шрифта и заливки заголовка с помощью палитры цветов командой View/Color Palette Toolbar, если цвет заливки не устанавливается, установите свойство Opaque (непрозрачный задний план) с помощью команды Format/Mode/Opaque. Измените нижний колонтитул Page (см. пункт 6.2) на русское “Страница” (как это сделать см. выше). Для того, чтобы в отчете использовать данные нескольких таблиц (в нашем случае двух - stud2.dbf и students.dbf), необходимо установить среду окружения. Для этого, откройте с помощью меню View/ Data Environment диалог Data Environment (установка среды окружения – аналог Databases Designer). Окно среды окружения будет пустым, для того, чтобы добавить в него таблицы со связью, установленной в части 2 п.3.3, во всплывающем меню выберите команду Add .Перед Вами появится диалог Add Table or View, в котором выберите таблицы stud2.dbf и students.dbf. В окне Data Environment Вы увидите таблицы со связью. На этом установка среды окружения закончена. В полосе Detail добавьте вычисляемое поле (инструмент Field, см.п.6.3.). Во всплывающем меню этого инструмента выберите команду Properties. Перед Вами появится окно диалога Report Expression. В поле Expression нащелкайте выражение: (students.балл_сес01+ students.балл_сес02+ students.балл_сес03+ students.балл_сес04)/4. В поле Format установите тип данных поля Numeric. В полосе Page Header добавить инструмент Label с надписью “Общий средний балл” – заголовок для нового поля. Измените шрифт и цвет выводимых записей по аналогии с заголовком, для этого пометьте в полосе Detail изменяемое поле (или группу полей с помощью комбинации клавиши Shift и мыши). Добавьте итог (Summary) к отчету с помощью команды Report/Title/Summary. Перед вами появится окно диалога Title/Summary, установите в нем флажок (опцию) Summary/Band. В отчете появится полоса Summary (итоговая). Добавьте в нем новое поле (инструмент Field), которое будет содержать в себе балл средней успеваемости всех студентов по вычисляемому полю “Общий средний балл”. Для этого в свойстве Expression нащелкайте выражение, описанное для нашего вычисляемого поля. Свойство поля Format будет также аналогичным. Нажмите кнопку Calculations…. Появится диалог Calculation Field, в котором в группе Calculate выберите позицию Average (вычисляется среднее арифмическое значение поля по записям). Наберите текст в новой метке Label в полосе Summary “Общий балл средней успеваемости всех студентов”, измените шрифт и цвет текста. Просмотрите окончательный отчет с помощью команды Preview всплывающего меню. Создание отчетов в свободной и табличной форме по мере необходимости, изучите самостоятельно, при этом можете использовать [1], [2]. 7. ВЫБОРКА ДАННЫХ На практике часто требуется выбрать из исходной таблицы часть записей, удовлетворяющих определенным критериям, и упорядочить выборку. Критерии могут определяться сочетанием ряда условий. Для решения таких задач предназначены конструктор запросов и команда SELECT языка Visual FoxPro 5.0 (подробно описаны в [1], [2]). При помощи этих мощных и гибких средств Visual FoxPro 5.0 Вы сможете: Формировать сложные критерии для выбора записей из одной или нескольких таблиц; Указать поля, которые должны быть отображены для выбранных записей; Выполнить вычисления с использованием выбранных данных.
134
Сначала мы рассмотрим использование конструктора запросов для обработки информации, содержащейся в одной таблице. Вы познакомитесь с формой запроса и языком запросов. Вы узнаете, как сформировать выражение запроса для того, чтобы выбрать из таблицы записи, удовлетворяющие определенным условиям, и отобразить в них все или часть полей исходной таблицы. Кроме того, мы разберем конструкции команды SELECT, соответствующие запросам, созданным с помощью конструктора.
7.1. Создание запроса по образцу в окне конструктора запросов Вопросы, формулируемые по отношению к БД, называются запросами. В Visual FoxPro 5.0 для формирования запросов используется конструктор запросов и команда SELECT. Запрос по образцу – это интерактивное средство для выбора данных из одной или нескольких таблиц. Результатом выборки всегда является таблица, которую Вы можете сохранить в массиве, созданной новой таблице, отобразить на экране в окне BROWSE или вывести в виде отчета. При формировании запроса Вам необходимо указать критерии поиска записей в исходной таблице и определить вид результирующей таблицы. При этом вместо того, чтобы печатать предложения на специальном языке, Вы должны просто заполнить форму запроса, которая располагается в окне конструктора запросов. Метод формирования запроса путем заполнения формы прост для изучения, он способствует эффективному использованию возможностей Visual FoxPro пользователями, имеющими даже минимальный навык работы с системой или не имеющими его вовсе. Для создания простейших запросов вы можете использовать мастер запросов, который запрашивает у Вас последовательно наименования таблиц, используемых в запросе, перечень полей таблиц, критерий упорядочения и простые условия для фильтрации данных. Создадим запрос по образцу, для этого: Вызовете конструктор запросов, для этого в окне проекта выберите группу Queries на вкладке Data и нажмите кнопку New Query. Перед Вами откроется окно диалога выбора таблиц Add Table Or View. В области SELECT данного окна диалога по умолчанию установлена опция Tables и список Tables in Databases содержит список таблиц открытой БД. Так как выбранные для примера таблицы students.dbf, stud2.dbf входят в базу данных students.dbc, то Visual FoxPro автоматически откроет также эту БД. Выберите из списка Tables in Databases таблицы students.dbf, stud2.dbf и, используя кнопку Add, перенесите их последовательно в окно конструктора запросов. Обратите внимание, что в основном меню появился пункт Query. Вы можете заметить, что в верхней части окна конструктора запросов находятся две открытые нами таблицы и между ними установлена связь (при рассмотрении создания постоянной связи в части 2 п.3.3). Во вкладке Join (определяет условия объединения таблиц) Вы увидите отображение этой связи: колонка Type показывает тип связи (в данном случае Inner Join – в результат включаются записи, удовлетворяющие условию объединения); в колонке Field Name указано имя поля (в нашем случае Stud2.ФИО), которое должно удовлетворять критерию, указанному в колонках Criteria (оператор сравнения) и Value (выражение или имя поля; в нашем случае колонка Criteria будет содержать “равно”, а колонка Value - имя поля Students.ФИО). Колонка Not означает отрицание критерия (например, НЕ равно). Тип обьединения Inner
Назначение В результат включаются только записи, удовлетворяющие условию, указанному в объединении.
135
Left Outer Right Outer Full Outer
В результат включаются все записи таблицы, указанной слева от ключевого слова Join, и записи, удовлетворяющие условию из таблицы, указанной справа. В результат включаются все записи таблицы, указанной справа от ключевого слова Join, и записи, удовлетворяющие условию из таблицы, указанной слева. В результат включаются все записи, удовлетворяющие и не удовлетворяющие условию объединения.
Вы можете начать создание нового запроса с помощью команды меню File/New или ввести в командном окне команду CREAT QUERY.
Для формирования запроса в окне конструктора запросов необходимо выбрать поля результата запроса, указать критерии для выборки, группировки и упорядочения данных, а также, указать, куда выводить результат выборки. Выберите во вкладке Fields (указывает поля исходных таблиц, выбираемых в результирующую таблицу) с помощью кнопки Add, поля Stud2.ФИО, Stud2.Хобби, Students.Балл_сес01, Students.Балл_сес02, из поля Available fields в поле Selected fields. И создайте в запросе вычисляемое поле для расчета среднего бала за первые две сессии, для этого существует поле в нижней части конструктора запросов Functions and Expressions, при нажатии кнопки справа от поля на экране появится окно построителя выражений Expression Builder, с которым Вы уже знакомы, наберите в нем выражение: (Students.Балл_сес01+ Students.Балл_сес02)/2 Далее нажмите кнопку Add для помещения его в поле Selected fields. Войдите во вкладку Filter (определяет фильтры, накладываемые для выбора записей) и поставьте условие для отбора записей: Students.Балл_сес01>3 AND Students.Балл_сес02>3 (логический оператор AND устанавливается в колонке Logical). В колонке Case можно задать условие учета регистра при сравнении символьных выражений. Войдите во вкладку Order By (определяет критерий упорядочения). Из списка Selected fields перенесите в список Ordering Criteria поля, по которым будут упорядочиваться записи (по убыванию, по возрастанию) – в данном случае выберите поле Stud2.ФИО. Вкладка Group By позволяет задать группировку записей. Группировка осуществляется на основании значения в одном или более полях результирующей таблицы. В нашем случае ничего указывать не будем, т.к. это будет лишним. Вкладка Miscellaneous определяет дополнительные установки, такие как признак выборки повторяющихся значений, количество или процент выбора данных. Просмотреть результат построения запроса можно следующим образом: Команда меню Query/View SQL; Команда View SQL всплывающего меню. Просмотреть результаты текущего запроса можно следующим образом: Команда меню Query/Run Query; Команда Run Query всплывающего меню; Кнопка Run на стандартной панели инструментов. 7.2. Команда SELECT Для формирования запросов в программах на языке Visual FoxPro используется команда SELECT, которая аналогична конструкции SELECT, используемой в языке
136
высокого уровня SQL. SQL может использоваться для манипуляции с данными (выборка и модификация) и обработки структуры БД (создание и удаление таблиц и индексов). Мы рассмотрим с Вами только конструкцию SELECT языка SQL, и на ее примере Вы сможете почувствовать силу и простоту языка SQL. Вначале рассмотрим упрощенный синтаксис конструкции SELECT: SELECT [DISTINCT] списокВыбираемыхПолей FROM СписокТаблиц [WHERE УсловиеВыборки] [GROUP BY УсловиеГруппировки] [ORDER BY УсловиеУпорядочения] [[INTO имяТаблицы] [TO FILE имяФайла [ADDITIVE] ⎢[TO PRINTER]] По умолчанию все строки, полученные в результате запроса, будут включены в результирующую таблицу. Для исключение появления одинаковых строк используется опция DISTINCT. Аргумент списокВыбираемыхПолей содержит список полей, а также допустимых выражений, включаемых в результирующую таблицу. Элементы списка разделяются запятыми. В имя поля Вы можете включить имя выбираемой таблицы. Ключевое слово AS может использоваться для изменения наименования поля в результирующей таблицы, FROM – содержит список таблиц, из которых осуществляется выборка, таблицы разделяются запятыми. ORDER BY – сортирует результат запроса на основании одного или нескольких полей результирующей таблицы. Поле результирующей таблицы может задаваться по имени соответствующего поля таблицы или же числом, указывающем положение поля в результирующей таблице. Для каждого поля Вы можете указать необязательный ключ для сортировки результата в порядке убывания DESC, или для сортировки по возрастанию ASC. По умолчанию для каждого поля устанавливается признак сортировки по возрастанию. Если в конструкции SELECT эта фраза не указана, то результат будет неупорядоченным. GROUP BY – группирует строки в запросе на основании значения в одном или более полях результирующей таблицы. INTO - указывает направление вывода результатов запроса. Просмотреть результаты текущего запроса можно следующим образом: Команда меню Query/Run Query; Команда Run Query всплывающего меню; Кнопка Run на стандартной панели инструментов. Создадим на примере запрос с помощью команды SELECT в программном окне, для этого создайте программу с именем SQL.prg, в которую занесите запрос, приведенный ниже: SELECT Stud1.фио, Stud1.адрес, Student.Год_поступ; FROM students!stud1 INNER JOIN students!student; ON Stud1.фио = Student.фио; WHERE Student.Год_поступ = 1998; ORDER BY Stud1.фио Задание: запустите программу на выполнение, просмотрите результат выполнения и объясните каждую строку запроса.
137
8. СОЗДАНИЕ МЕНЮ ФОРМЫ С ПОМОЩЬЮ КОНСТРУКТОРА МЕНЮ Основное назначение меню заключается в том, чтобы дать возможность пользователю получить легкий доступ к командам программы. Visual FoxPro5.0 имеет множество команд для создания пользовательских меню. Эти команды Вы можете освоить по Help (@...MENU, CREATE MENU и ссылки на похожие по назначению команды). Здесь мы изучим распространенный в настоящее время вариант создания меню формы, аналогичный использованному в системном меню Visual FoxPro5.0 (и многих других программных продуктов): • горизонтальное” меню, постоянно представленное на экране, называется строкой меню; • “ниспадающее” (popup) меню, расшифровывающие позиции Горизонтального; “всплывающие” меню могут быть многоуровневыми; • всплывающее (контекстное) (shortcut) меню, появляющееся, когда пользователь щелкает правой кнопкой мыши на элементе управления или на каком-либо объекте. Это один из наиболее оперативных способов выполнения команд в программе, причем перечень команд может быть легко привязан к возможностям того или иного объекта. • переход от меню старшего уровня к подчиненному меню - по клавише ENTER или по нажатию левой кнопки мыши; • переход от подчиненного меню к меню вышестоящего уровня - по клавише Esc; • выбор позиций меню - указателем, перемещаемым стрелочными клавишами или мышью. Такая структура системы меню предложена фирмой Ashton Tate (разработчиком dBASE) и соблюдается другими разработчиками программных продуктов как фактический стандарт. Термин “Горизонтальное” - условный: позиции меню можно размещать на экране так, как кажется удобным разработчику программы и ее пользователю. Исторически сложилось размещать системные меню в верхней строке экрана горизонтально (отсюда - и термин). Типовая структура фрагмента программы для описания системы Горизонтального и подчиненных всплывающих меню: •Вначале определяется Главное (“горизонтальное”) меню (ему присваивается имя, определяются имена и надписи в позициях меню, определяются действия при выборе каждой позиции). Действия, которые должны последовать за выбором позиции меню, обычно определяются подпрограммой, в которую можно передать меню-зависимые значения, образующиеся в памяти ЭВМ автоматически как глобальные переменные при нажатии ENTER или левой кнопки мыши: •Затем последовательно определяются “ниспадающие” меню (им присваиваются имена, определяются надписи на позициях и действия при их выборе). В ниспадающем меню также образуются меню - зависимые значения. •Затем (это обычно - последняя строка Головной программы) активизируется вся система меню. Создание меню для формы ничем не отличается от меню приложения, поэтому, получив знание о создании меню формы, Вы легко сможете сами создать меню для приложения. 8.1. Создание контекстного (всплывающего) меню Shortcut формы Знакомство с всплывающим меню проведем на примере создания его для нашей формы. Создадим простейшее контекстное меню, с помощью которого пользователь мог
138
бы работать с данными через буфер обмена (Вырезать, Копировать, Вставлять данные в текстовых полях): Для создания такого контекстного (всплывающего) меню выберите в диспетчере проектов (Project manager), созданного Вами проекта students вкладку Other, найдите заголовок Menu и нажмите кнопку New. Выберите в появившемся диалоговом окне New Menu кнопку Shortcut. На экране появится конструктор контекстного меню Shortcut Designer, работа с которым аналогична работе с конструктором меню Menu Designer. Для определения текстов пунктов всплывающего меню напечатайте текст в поле Prompt: - Выре\<зать - \<Копировать - \<Вставить Символы «\<» выделяют букву подчеркиванием при запуске меню (Вы можете увидеть аналогичное подчеркивание, посмотрев меню Visual FoxPro5.0), перед которой они стоят – это используется для быстрого выполнения пунктов меню (при нажатии выделенной буквы произойдет выполнение команды меню). Дважды одну и ту же букву в одном меню подчеркивать нельзя, т.к. при этом данная процедура теряет смысл. Для определения типа пунктов меню в поле Result выберите из списка элемент Bar# (в отличие от других элементов списка не предусматривает привязки к команде какого-то действия). В поле, справа от поля Result, наберите имена переменных соответственно тексту меню: - _med_cut - _med_copy - _ med_paste Эти переменные представляют собой внутренние названия меню Visual FoxPro5.0. Подробное описание этих и других переменных см. в помощи. Войдите в поле Options, для этого нажмите на кнопку и в появившемся окне диалога Prompt Options. Определите в поле Key Label быстрые клавиши для каждой из команд всплывающего меню, для этого с помощью мыши перейдите в это поле и когда курсор будет находится внутри поля, нажмите сочетание клавиш Ctrl+X, Вы увидите, что в этом поле и в поле Key Text находится набранная Вами комбинация клавиш. В языке Visual FoxPro5.0 для назначения клавиши ускоренного действия используется опция Key имяКлавиши [, символьноеВыражение]. Аргумент имяКлавиши соответствует значению поля Key Label, а символьноеВыражение значению поля Key Text окна диалога Prompt Options.
В поле Message наберите подсказку “Вырезать текст в буфер”, которая при запуске меню и выборе соответствующей позиции появляется в строке состояния (которая находится в нижней части экрана). Нажмите на кнопку OK. Для оставшихся пунктов меню аналогично наберите сочетание быстрых клавиш соответственно Ctrl+C (копировать) и Ctrl+V (вставить). В поле Message наберите соответствующие подсказки: - “Копирование текста в буфер” - “Вставка текста из буфера” В поле Menu Level находится уровень выбранного Вами меню Shortcut. На этом создание меню почти закончено, осталось только сохранить, сгенерировать и запустить меню. Для сохранения созданного меню выполните команду системного меню File/Save As и дайте меню имя, например Menu_Shortcut. Для использования меню в нашей программе (конкретно в нашей форме при ее запуске) его необходимо предварительно сгенерировать, для этого выполните команду системного меню Menu/Generate. На экране откроется окно диалога Generate Menu.
139
В поле окна диалога Вы увидите имя меню, которое Вы ему присвоили с указанием пути, где оно находится, Вы можете оставить имя таким же, а можете присвоить здесь другое имя файлу (с расширением .MPR), который будет создан в результате генерации. Для запуска генерации описания меню нажмите кнопку Generate. Для того, чтобы Вы смогли использовать это меню при работе с формой, необходимо выполнить следующие действия. Откройте в конструкторе форм, созданную Вами форму students (см. часть2. пункт 5). Щелкните мышкой (дважды) на текстовом поле с меткой «Общий средний балл», перед Вами появится окно написания кода, найдите процедуру события Right Click (из списка в поле Procedure). Запишите следующую строчку: Do Menu_Shortcut.MPR Сохраните файл формы. Запустите форму на выполнение. Щелкните мышью на поле «Общий средний балл» и нажмите правую кнопку мыши, Вы увидите на экране (рядом с полем) всплывающее меню. Пометьте текст в поле и выберите команду Копировать (Ctrl+C) в строке состояния появится сообщение: “Копирование текста в буфер”, перейдите в командное окно и вставьте скопированный текст. Теперь Вы познакомились с созданием и использованием меню в программе на простом примере, это позволит Вам создавать в дальнейшем меню более сложного вида. 8.2. Создание меню формы Знакомство с горизонтальным и ниспадающим меню проведем на примере создания меню для нашей формы. Создадим простейшее меню, с помощью которого пользователь мог бы работать с данными в форме не через панель управления (командные кнопки), а через меню формы, т.е. создадим меню, которое позволит Вам работать с записями таблицы (Первая, Следующая, Предыдущая, Последняя записи и Выход): Для создания такого меню выберите в диспетчере проектов (Project manager), созданного Вами проекта students вкладку Other, найдите заголовок Menu и нажмите кнопку New. Выберите в появившемся диалоговом окне New Menu кнопку Menu. На экране появится конструктор меню Menu Designer, работа с которым аналогична работе с конструктором контекстного меню, описанного выше в пункте 8.1. Для определения текстов пунктов горизонтального меню (строки меню) напечатайте текст в поле Prompt: - \<Работа с записями - В\<ыход Для определения типа пунктов меню в поле Result выберите из списка элемент Submenu (это означает, что при выборе пункта меню будет раскрываться связанное с данным пунктом ниспадающее меню). В поле, справа от поля Result, появилась кнопка Creat для создания подменю (ниспадающего меню), нажмите эту кнопку перед Вами появится чистое окошко Menu Designer и в поле Menu Level будет находится уровень выбранного Вами меню Работа с записями, переход в меню высшего уровня производится выбором в этом поле (Menu Level) записи соответствующего уровня. Начнем описание ниспадающего меню для горизонтального меню Работа с записями. В поле Prompt напишите Первая запись, далее в списке Result выберите элемент Procedure (это означает, что при выборе пункта меню вызывается процедура, которую Вы определяете для данного пункта меню). Далее нажмите кнопку Create. Появится окно для написания кода процедуры. Наберите код, аналогичный коду, который Вы написали для кнопки Первая (данная процедура описана в п. 5.2). Для возврата в конструктор меню, нажмите кнопку Esc. Обратите внимание, что кнопка Creat сменила название на Edit, то есть при нажатии этой кнопки Вы сможете отредактировать код процедуры. Аналогично сделайте для пунктов меню: - Следующая запись
140
- Предыдущая запись - Последняя запись Коды для этих пунктов меню см. в пункте 5.2. После того, как Вы описали все выше перечисленные пункты, перейдем к описанию следующего пункта горизонтального меню – Выход, который будет содержать: - Выход из формы - Выход из Visual FoxPro Опишем процедуры для этих пунктов: для пункта Выход из формы (аналогично описанию процедуры для кнопки «Выход», см. пункт 5.2): If messagebox ("Выходить из формы?", 4+32+256, "Выход")=6 _screen.ActiveForm.Release() Else _screen.ActiveForm.Refresh() EndIf для пункта Выход из Visual FoxPro: If messagebox ("Выходить из Visual FoxPro?", 4+32+256, "Выход")=6 Quite Else _screen.ActiveForm.Refresh() EndIf Для сохранения созданного меню выполните команду системного меню File/Save As и дайте меню имя, например Menu_Form. Cгенерируйте файл (с расширением .MPR). Для запуска генерации описания меню нажмите кнопку Generate. Для того, чтобы Вы смогли использовать это меню при работе с формой, необходимо выполнить следующие действия. Не выходя из конструктора меню, выполните команду системного меню View/General Options. Перед Вами появится диалог General Options, в котором отметьте флажок Top-Level Form. Откройте в конструкторе форм, созданную Вами форму students. После того, как Вы оказались в форме выполните команду системного меню View/Code или воспользуйтесь соответствующей кнопкой на панели инструментов Form Designer. Перед Вами появится окно для написания кода программы, выберите в поле Object объект формы (frmStud) в поле Procedure выберите событие Init (инициализация формы) и запишите следующую строчку: Do Menu_Form.MPR WITH THIS,.T.,.T. (параметры этой команды Вы можете посмотреть в помощи). Сохраните код программы. Запустите форму на выполнение. И Вы увидите, что в верхней части окна формы появилось созданное Вами меню, действия с которым дублируют действия с соответствующими командными кнопками, кроме одного пункта меню “Выход из Visual FoxPro”. Вы познакомились с созданием и использованием меню для формы, это позволит Вам в дальнейшем создавать более сложные меню. 9. ПЕРЕЧЕНЬ ЗАЧЕТНЫХ ЗАДАНИЙ к Части 2 После освоения материала Вы должны самостоятельно разработать менюуправляемый комплекс со следующими функциями: • Главное меню, позиции: Команды Visual FoxPro 5.0
141
Функции Visual FoxPro 5.0 Выход в Windows При выборе позиции «Команды Visual FoxPro 5.0» должно выпадать меню второго уровня, позициями которого должны быть записи в файле Commands.dbf (заготовка см. раздел 7 Части 1) в поле command); При выборе позиции «Функции Visual FoxPro 5.0» - аналогично, по файлу functions.dbf. • При выборе позиции ниспадающего меню должно появляться меню третьего уровня с позициями: позиция 1: разъяснение (в форме message - по содержанию поля descript) и пример ( вывод на экран поля примечаний memo (поле example) к соответствующей команде или функции); позиция 2: информация о командах и функциях, ассоциированных с данной (похожих по назначению или дополняющих) - в форме меню четвертого уровня или в форме вывода в различные окна. Информация о «сходстве» и ассоциациях - в полях shifr_assc и shifr_assf файлов commands.dbf и functions.dbf, см. пояснения в разделе 7 Части 1). • При движении указателя по позициям меню четвертого уровня должна выводиться краткая информация об «ассоциированных» командах и функциях (в форме строки пояснения - message - поле descript, см. раздел 7 Части 1). • При выборе позиции меню четвертого уровня должна выводиться информация с описанием «ассоциированной» команды (функции) (поле example, см. раздел 7 Части 1).
142
Заключение Несколько слов о том, что оказалось за рамками пособия (это предстоит осваивать тем из Вас, кто выберет системы управления базами данных своей специализацией): 1) группа вопросов, связанных с работой СУБД в локальных и глобальных сетях передачи данных - и: в частности, идеология “клиент-сервер” [12] для объединения пользователей базы данных (“клиентов”) и владельца ее (“сервера”); 2) технология создания крупномасштабных проектов математического обеспечения СУБД (в терминологии Visual FoxPro5.0 - приложений, applications, сборка которых производится в специальный файл с расширением *.app), см. [1], [2]; 3) изучение более тонких вопросов программирования в среде СУБД, чем рассмотрены в данном небольшом пособии (пакета Microsoft Graph для построения диаграмм [1], техники включений подпрограмм, написанных на языке Assembler и C++); 4) создание самих СУБД - т.е. исполнителей [6], реализующих алгебру для СУБД на другом языке, выбранном в качестве базового; 5) знакомство с альтернативами идеологии Visual FoxPro5.0 - в частности, с реляционными СУБД, написанными на языке ProLog, а также с иерархическими и сетевыми СУБД. По всем перечисленным вопросам имеются многочисленные публикации (см., например, [6..12] ) Может быть, при чтении литературы по базам данных что-то Вам покажется знакомым, и Вы ощутите, что данное пособие хоть в какой-то мере помогло Вам. Тогда автор будет считать, что удовлетворительно справился со своей задачей пройти вместе с Вами начальный отрезок пути в увлекательный мир СУБД.
143
Приложение ВАРИАНТЫ КОНТРОЛЬНЫХ ЗАДАНИЙ, СЕМЕСТРОВЫХ И КУРСОВЫХ РАБОТ ПО ДИСЦИПЛИНЕ “Системы управления базами данных” Ниже приведены варианты контрольных вопросов (студентам, для которых программирование не является профилирующим предметом - например, направления “Экономика и менеджмент”) и семестровых (или курсовых) работ (студентам, изучающим программирование профессионально - например, направления “Информатика и вычислительная техника”). Материал может быть полезен преподавателям также при составлении заданий к экзаменационным билетам, при проведении практических занятий и контрольных работ. Как и остальной материал пособия, предлагаемые варианты были испытаны в течение трех циклов изучения дисциплины “Системы управления базами данных” студентами направлений “Информатика и вычислительная техника” и “Экономика и менеджмент” Камышинского технологического института Волгоградского государственного технического университета. Схема описания вариантов: • сначала описывается структура и приводится примерное содержание файлов базы данных; эта часть - общая для обеих групп студентов; • затем предлагаются задания для студентов, не имеющих профессионального опыта в программировании; • затем приводятся задания для семестровых или курсовых работ для студентов, изучающих программирование как профилирующую дисциплину. Вариант 1. Создайте файл "Русско-английский словарь" с полями: • rus - для хранения русских слов (до 20 символов в слове); • engl - для хранения английских слов (до 20 символов в слове); • synon - для хранения русских синонимов к английскому слову (synon сделайте полем примечаний). Заполните записи в файле (например, по таблице П1): Таблица П1. Примерное содержание записей в файле Поле rus бесконечный
Поле engl infinite
память
indent inequali ty memory
нажимать назад автор
press back author
абзац неравенство
Поле synon infinite – бесконечный, неограниченный indent - абзац, отступ inequality – неравенство, несоответствие memory - память, воспоминание, запоминающее устройство press - нажимать, прессовать back - назад, спина author - автор, творец
Задание для студентов, не имеющих профессионального опыта программировании: записать последовательность команд, обеспечивающих:
в
144
1) вывод файла на экран в порядке алфавита английских слов так, чтобы поле с английскими словами (engl) было слева; 2) вывод на экран файл в порядке алфавита русских слов так, чтобы поле с русскими словами (rus) было слева; 3) вывод на экран только записи, в которых английское слово начинается с буквы i; 4) вывод на экран записей файла в порядке убывания длины русского слова в поле rus. Указание: используйте функции: • LEN(exprC) - число символов в символьном выражении <exprC>; • LTRIM(exprC) - удаление левых пробелов в символьном выражении; • RTRIM(exprC) - удаление правых пробелов в символьном выражении; 5) аналогично п.4 - в порядке возрастания длины русского слова; 6) аналогично п.4 - в порядке возрастания суммы длин русского слова (в поле rus) и английского слова (в поле engl). 7) вывод на экран только поля rus, причем необходимо сделать так, чтобы в записи нельзя было бы внести изменения; 8) вывод на экран только тех записей, в которых длина русского слова больше 9 букв; 9) установка фильтра записей такого, чтобы выводились на экран только такие записи, в которых длина русского слова (в поле rus) равна длине английского слова (в поле engl); 10)вывод файла "Русско-английский словарь" на экран для просмотра в такой форме, чтобы можно было бы вносить изменения только в поле synon (остальные поля должны быть доступны для просмотра). 11)вывод на экран записей файла в форме русского "анти-алфавита" (по первой букве слова в поле rus в порядке от Я до А). Указание: используйте следующие функции: • ASC(exprC) - значение ASCII-кода первой литеры символьного выражения <exprC>; • LEFT(exprC,n)-выделение n символов слева из символьного выражения <exprC>. Задание для студентов, изучающих программирование профессионально: Разработайте меню-управляемый программный комплекс со следующей системой предписаний (они же будут позициями Главного меню): 1) Расчет общего числа букв во всех полях файла “Русско-английский словарь”, в которых английское (русское) слово начинается с буквы, введенной пользователем. 2) Вывод и пополнение списка русских синонимов, соответствующих введенному пользователем (с экрана, в диалоге) английскому слову (если введенного слова в файле “Русско-английский словарь” нет - должно быть выведено сообщение об этом). 3) Поиск и вывод на экран полей rus и engl во всех записях, в которых в поле rus (engl) имеется литера, введенная пользователем (причем она расположена на позиции слова, номер которой также вводится пользователем). 4) Последовательный вывод на экран содержимого поля synon (по одной записи, с ожиданием нажатия клавиши для перехода к следующей записи) для всех записей, удовлетворяющих тому же условию, что в пп.3,4. 5) Вывод русского перевода, соответствующего введенному пользователем (с экрана, в диалоге) английскому слову (если введенного слова в файле “Русско-английский словарь” нет - должно быть выведено сообщение об этом). 6) Программа, в которой содержимое поля engl (rus) использовалось бы в качестве позиций меню, содержимое поля rus (engl) использовалось бы в качестве разъясняющей “длинной” строки. При выборе какой-либо позиции меню экран должен быть очищен, затем на экран должно быть выведено содержимое поля synon, соответствующее выбранному в меню английскому (русскому) слову. После просмотра этого поля должен быть предусмотрен возврат в меню (по нажатию клавиши пробел).
145
Должен быть предусмотрен выход из меню в среду Visual FoxPro5.0. Желательно предусмотреть защиту от ввода непредусмотренных символов 7) Программа для подсчета общего числа русских (английских) букв (наименование буквы вводится пользователем) записях в поле rus (engl) файла “Русско-английский словарь”. Указание: в FoxPro2.0 имеется функция LEN(exprC), возвращающая длину символьной строки <exprC>. Для выделения одной буквы из символьной строки <exprC>, стоящей на i-й позиции (i изменяйте в цикле от 1 до LEN(ecprC>) ) используйте функцию SUBSTR(<exprC>,i,1) 8) Программа, в которой позициями меню являются буквы английского алфавита. Поскольку букв больше, чем строк на экране, используйте скроллинг. При выборе позиции с какой-либо буквой: • если в словаре нет слов, с нее начинающихся, должно выводиться сообщение об этом; • после нажатия клавиши пробел должен произойти возврат в меню букв; • если в словаре имеются слова, с нее начинающиеся, должен выводиться экран просмотра, содержащий записи, в которых в поле engl содержатся слова, начинающиеся с этой буквы. 9) Аналогично п.8 - для букв русского алфавита. 10)Программа для замены строчных букв в поле engl на прописные во всех записях файла “Русско-английский словарь”, в которых в поле rus содержится хотя бы одна буква, введенная пользователем. (после этого все буквы в записи должны оказаться преобразованными в прописные). После замены файл должен быть выведен на экран для просмотра, затем должна быть произведена “обратная” замена: записи прописью должны быть преобразованы в записи строчными. Указания: в Visual FoxPro5.0 имеется функция LEN(<exprC>), возвращающая длину символьной строки <exprC>. Для выделения одной буквы из символьной строки <exprC>, стоящей на i-й позиции (i изменяйте в цикле от 1 до LEN(ecprC>) ) используйте функцию SUBSTR(<exprC>,i,1). Для преобразования строчных литер в прописные используйте функцию UPPER(exprC). Для обнаружения записи прописными литерами используйте функцию ISUPPER(exprC), возвращающую .T., если <exprC> записано прописными. Для преобразования литер из прописных в строчные используйте функцию LOWER(<exprC>. 11)Программа для поиска английских слов и вывода их русского перевода по любой последовательности букв (не обязательно начинающейся с первой буквы искомого слова), вводимой пользователем. Должны быть найдены и выведены на экран все слова, содержащие введенную последовательность букв. 12)Указание: воспользуйтесь функцией AT(<exprC1>,<exprC2>), которая ищет подстроку (часть символьного выражения) <exprC1> в строке (символьном выражении) <exprC2>. Если подстрока <exprC1> имеется в строке <exprC2>,то функция возвращает номер буквы в слове <exprC2>, с которой начинается подстрока <exprC1>. Если нет - функция возвращает 0 (нуль). На базе данного программного комплекса разработайте гипертекстовую оболочку для русского текста: в тексте определите слова, пояснения к которым предусмотрены в словаре. Выделите эти слова (лучше всего - с помощью объекта “невидимая кнопка”) контрастным цветом. При нажатии правой кнопки мыши должны выводиться: • английский перевод; • синонимы Желательно, чтобы пояснения (синонимы) также были оформлены как гипертекст - к выделенным словам также были предусмотрены переводы и вывод синонимов при нажатии правой кнопки мыши. Как Вы думаете, можно ли сделать бесконечное число вложений гипертекста?
146
Вариант 2 Создайте файл1 (продукция, выпускаемая фирмой 1) с полями: • поле 1: наименование продукции (поле символьного типа, число символов - не более 25); • поле 2: цена единицы продукции (поле числового типа, число знаков - 6 до десятичной точки и 2 после точки); • поле 3: расстояние до потребителя продукции ( поле числового типа, числа целые, число знаков 4). Заполните записи файла согласно таблице П2: Таблица П2. Примерное содержание записей файла 1. Поле 1 железо листовое медь (проволока) алюминий в слябах цинк листовой сталь профильная
Поле 2 600.00 900.90 700.00 950.00 650.00
Поле 2 400 1500 2700 6900 400
Скопируйте структуру файла1 в файл2 (продукция, выпускаемая фирмой 2) и заполните его записи согласно таблице П3: Таблица П3. Примерное содержание записей файла 2 Поле 1 нефть сырая бензин АИ93 бензин АИ72 масло машинное керосин
Поле 2 400.00 800.90 650.00 980.00 500.00
Поле 2 1200 500 3400 5500 1200
Задание для студентов, не имеющих профессионального опыта в программировании: записать последовательность команд, обеспечивающих: 1) вывод информации о продукции фирмы 2 по алфавиту и о ее ценах (информацию о расстояниях до потребителя выводить не нужно; требуется; необходимо защитить информацию от внесения дополнений и изменений); 2) копирование поля1 файла1 в новый файл, затем - изменение его структуры и создание нового поля: наименование потребителя продукции (символьного типа, с числом символов до 25); 3) установление связи файла2 и созданного (п.2) нового файла. Поиск наименования “керосин” в файле2 и вывод на экран наименования потребителя керосина из созданного (п.2) файла); 4) логическое удаление записей в файле2, содержащих сочетание символов “бензин”; 5) вывод на экран полного содержания файла2 и обнаружение факта удаления части записей ; 6) ввод для просмотра только неудаленных записей; 7) вывод на экран содержимого файла1 в порядке убывания расстояния до потребителей;
147
8) установление фильтра записей, позволяющего просматривать в файле1 только такие, у которых цена единицы продукции не ниже 600.00 тыс. руб. и не выше 800.00 тыс. руб. Затем - отмена фильтра; 9) установление связи между файлами файл1 и файл2 по номеру записи. Активизация файла1. Нахождения записи 3. Вывод на экран наименования продукции в записи 3 файлов1 и 2 с использованием установленной связи; 10)установление связи между файлами файл1 и файл2 по номеру записи. Активизация файла2. Нахождение записи, в которой цена продукции равна 980.00 тыс. руб. Вывод на экран наименования продукции в файле2 для этой записи и одновременно - в файле1 с использованием установленной между файлами связь; 11)установление связи между файлами файл1 и файл2 по номеру записи. Активизация файла1. Нахождение всех записей, в которой расстояние до потребителя равно 400 км. По мере нахождения этих записей - вывод на экран наименований продукции в файлах1 и 2 с использованием установленной между файлами связи; 12)создание режима “невидимости” поля3 файла1. Вывод на экран наименований полей 1,2,3. Восстановление доступности поля3 для просмотра и вывод файла1 на экран в полном виде; 13)просмотр только тех записей файла1, в которых расстояние до потребителя равно 400 км. Задание для студентов, изучающих программирование профессионально: Разработайте меню-управляемый программный комплекс со следующей системой предписаний (они же будут позициями Главного меню): 1) Просмотр записей файлов1 и 2, в которых значения расстояния до потребителей лежат в пределах, задаваемых пользователем в диалоге; при отсутствии записей, удовлетворяющих этому условию, должно выводиться сообщение об этом. Просмотр должен быть с запретом внесения дополнительных записей и корректировки содержимого файла; после просмотра должен выдаваться повторный запрос - до тех пор, пока пользователь не введет условные символы (например, NNN или nnn), после ввода которых должен произойти возврат в среду Visual FoxPro5.0. . 2) Программа, выполняющая следующие функции: • в начале работы программы должен задаваться вопрос (лучше всего - в форме popupменю): какой из режимов просмотра файлов нужен пользователю: ∗ с разрешением корректировки и ввода дополнительных записей; ∗ с разрешением корректировки, но запретом ввода дополнительных записей; ∗ с запретом корректировки и ввода дополнительных записей; • в зависимости от ответа пользователя должен формироваться соответствующий режим просмотра. В этом режиме должен быть проведен просмотр файлов 1 и 2. • После просмотра должен выдаваться повторный вопрос - до тех пор, пока пользователь не введет условные символы (например, NNN или nnn), после ввода которых должен произойти возврат в среду Visual FoxPro5.0. 3) Установление связи между файлами 1 и 2 по номеру записи; в цикле по всем записям вывод на чистый экран значений наименований продукции (одновременно для файлов1 и 2), приостановка дальнейших действий до нажатия клавиши пробел; после окончания цикла - замена расстояний до потребителей (поле3), указанных в файле1, на содержимое поля3 файла2. 4) Логическое удаление записей в файлах1 и 2 по условию: цена единицы продукции не выше заданной пользователем в диалоге. При отсутствии продукции, удовлетворяющей этому условию, должно выводиться соответствующее сообщение; 5) Определение числа записей, удаленных логически; вывод на чистый экран значения процента удаленных записей (к общему числу записей);
148
6) Восстановление части логически удаленных записей, в которых цена единицы продукции не ниже, чем заданная пользователем в диалоге. 7) Вывод на экран записей в файлах1 и 2 в порядке убывания цен за единицу продукции; состав полей при выводе на экран должен задаваться пользователем в диалоге. 8) Изменение (программно) структуры файлов1 и 2: ввод нового поля 4 (количество продукции на складе) и заполнение его произвольными данными (в диалоге). Запись результатов изменения в те же файлы1 и 2. 9) Замена цен продукции, указанных в поле2 файлов1 и 2 в тыс.руб, на цены в долларах. Курс доллара (тыс.руб/долл) вводится пользователем в диалоге; 10)Расчет затрат на оплату полного объема продукции фирмы, имя которой вводится пользователем, для вида продукции, указываемого пользователем в диалоге. Вывод значения затрат на экран. Вариант 3 Создайте файл 1 (Доходы акционерного общества) с полями: • наименование АО • пять остальных полей доходы за неделю №... - доходы АО за последние пять недель (так, чтобы последнее поле соответствовало самой “свежей” неделе). Заполните 6 записей этого файла так, чтобы встречались такие: • доходы от недели к неделе растут; • доходы от недели к неделе падают; • стабильная тенденция отсутствует (доходы то растут, то падают)). Скопируйте поле “наименование АО” в другой файл (файл 2) и путем изменения его структуры дополните его полем: • адрес АО Заполните это поле. Скопируйте поле “наименование АО” в файл 3 и путем изменения его структуры дополните его полем: • доходы в текущей неделе Заполните это поле так, чтобы не нарушались тенденции изменения доходов, использованные в записях файла 1. Задание для студентов, не имеющих профессионального опыта в программировании: записать последовательность команд, обеспечивающих: 1) одновременное перемещение файлового указателя по записям файлов 1, 2, 3.;связь между файлами - по номеру записи; вывод на экран: • записи №3, поле “наименование АО” в файле 1; • записи с тем же номером, поле “адрес АО”; • записи с тем же номером, поле “доход в текущей неделе”; 2) открытие файлов 1, 2, 3, в рабочих областях, активизация рабочей области с файлом 1; 3) после выполнения п.2 - логическое удаление всех записей файла 1, соответствующих АО с падающими и нестабильными доходами; 4) после выполнения п.2 - установление режима, при котором удаленные записи не видны. Просмотр файлов 1, 2, 3 после этого; 5) после выполнения п.2 - вывод на экран записей из файлов 1, 2, 3: • поля “наименование АО” и “доходы в текущей неделе” из файла1; нужно найти запись по приблизительному наименованию АО; • все поля файлов 2 и 3 для этого же наименования; 6) после выполнения п.2 - установление режима фильтрации, позволяющего просмотреть записи, относящиеся к АО с убывающими доходами; 7) просмотр последовательно всех трех файлов после фильтрации (п.6);
149
8) отмена фильтра (п.6), просмотр всех трех файлов после отмены. Задание для студентов, изучающих программирование профессионально: Разработайте меню-управляемый программный комплекс со следующей системой предписаний (они же будут позициями Главного меню): 1) Просмотр записей во всех трех файлах, удовлетворяющих одному из условий, записанных в позициях popup-меню: • позиция 1: АО с возрастающими доходами; • позиция 2: АО с падающими доходами; • позиция 3: АО с нестабильными доходами; • позиция 4: выход в среду Visual FoxPro5.0. 2) Замена записей в поле №6 файла 1 на запись в поле №2 файла 3 (замена информации о доходах на “свежую”). 3) Обновление информации в файле 1 по правилам: • последняя запись заменяется текущим доходом (из файла 3), • предпоследняя запись последней, • ... ... ... ... ... ... ... ... • запись за самую “давнюю неделю” пропадает. Число полей и их наименования сделать по возможности абстрактными. Должно получиться: • Прежний файл 1: неделя(-5-я) | неделя (-4-я) | неделя (-3-я) | неделя (-2-я) |неделя (-1-я) | (отсчет ведется от текущей недели назад - поэтому используется знак “минус” • После корректировки: неделя (-4-я) | неделя (-3-я) | неделя (-2-я) | неделя (-1-я) | свежая информация о неделе 0-й | 4) Просмотр записей во всех трех файлах, соответствующих приблизительному наименованию одного из АО. 5) Просмотр полей: 1,3,5-го файла 1; 2-го файла 2 и 2-го файла 3, соответствующих приблизительному наименованию АО, вводимому в диалоге с клавиатуры. Вывод сообщения для случая, когда запись с введенным наименованием отсутствует. Необходимо придать программе свойства универсальности. 6) Установка и отмена фильтров согласно выбранной позиции popup-меню: • позиция 1: “Наименование АО” • позиция 2: “Адрес АО” • позиция 3: “Доходы за последние 5 недель” • позиция 4: “Доходы за текущую неделю” • позиция 5: “Выход в среду FoxPro2.0 “ Действия после выбора каждой позиции: • после выбора позиции 1 - вывод на экран BROWSE всех наименований АО из файла 1. Перемещение файлового указателя (вручную) на запись с любым наименованием АО; • после выбора остальных позиций (кроме последней) - вывод на экран BROWSE всех нужных полей файлов 2, 3, соответствующих записи, выбранной при выполнении действий по позиции 1. Вариант 4 Задание для студентов, изучающих программирование профессионально и склонных к САМОСТОЯТЕЛЬНОСТИ: Разработайте меню-управляемый программный комплекс для справочной системы “Жильцы домовладения” со следующими характеристиками: экран дисплея должен представлять собой стилизованный план этажа;
150
каждый этаж дома (этажность вводится пользователем при настройке программного комплекса) должен выводиться в свое окно, с возможностью одновременного просмотра всех окон и распахивания окна для выбранного пользователем этажа на полный экран; план этажа - двухуровневый: на первом уровне подробности на плане минимальная единица - квартира в целом; на втором уровне - детальный план конкретной квартиры, выбранной пользователем (мышью) на плане первого уровня; чертеж плана должен допускать корректировки лицами, не имеющими профессиональной программистской подготовки; для каждой квартиры необходимо разработать базу данных о ее жильцах; состав полей выберите самостоятельно; должны быть предусмотрены экранные формы для вывода статистических характеристик обитателей дома (средний возраст, количество детей до 16-ти лет, количество пенсионеров, инвалидов и т.п. - по Вашему усмотрению; экранные формы должны выбираться с помощью меню. Указание: для изображения схемы дома, выбор элемента которой должен вызвать некоторую реакцию программы, целесообразно использовать экранную форму с объектами типа “невидимая кнопка” (invisible button). Данный вариант может быть использован в качестве задания по выпускной работе на соискание степени бакалавра по направлению “Информатика и вычислительная техника”. Аналогичные задания можно предложить выполнить и по другим сценариям например: •план цеха с указанием размещения станков и с базой данных, в которой указаны их характеристики; •план территории микрорайона с указанием размещения домов и с базой данных демографического характера; •план транспортных маршрутов с указанием типов и характеристик транспортных средств.
151
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. С. Каратыгин, А. Тихонов, Л. Тихонова Visual FoxPro5.0. К вершинам мастерства. – М.: БИНОМ, 1997. – 736 с. 2. А. Горев, Visual FoxPro5.0. Книга для программистов. – М.: Журнал “FoxTalk” ТОО “Эдэль”, 1997. – 552 с. 3. Е.Г. Крушель. Системы управления базами данных FoxPro2.0 – от начальных навыков к профессиональной работе (учебное пособие). – Типография Волгоградского государственного технического университета, 1996. – 174 с. 4. Попов А.А. Программирование в среде СУБД FoxPro2.0. Построение систем обработки данных. - М.: “Радио и связь”, 1994. - 350 с. 5. FoxPro2.0. Commands & Functions. Interface Guide. Developer’s Guide. - Microsoft Corp., 1992. 6. Кауфман В.Ш. Языки программирования. Концепции и принципы. М.: “Радио и связь”, 1993. - 430 с. 10. Гетманский А.Д., Топчан Б.Х. СУБД: так какая же быстрее? // “Мир ПК”, 1992, №2. с.59-62. 11. Ривкин М.Н. Распределенные СУБД. // “Мир ПК”,1993,№5, с. 40-46. 12. Ривкин М.Н. Взаимодействие пакетов разных фирм в архитектуре //”Мир ПК”, 1993, №8.
клиент-сервер.
13. Кузин Л.Т. Основы кибернетики, т.2.Основы кибернетических моделей. - М.:изд-во “Энергия”, 1979. - с.283...309.
2
СОДЕРЖАНИЕ Введение.....................………………..........................................................................……....2 Часть 1. Начальные навыки работы с СУБД “ Visual FoxPro 5.0”………………….5 1. Вызов и начало работы с Visual FoxPro 5.0.................................………………......5 1.1.Первые девять шагов.......................................................….....…………………5 1.2 Конспект начальных сведений..........................................……………………..8 2. Проектирование структуры файлов баз данных………………....…………………8 2.1. Создание структуры таблицы……….......................................…………………..8 2.2. Корректировка структуры таблицы……….......................……………………..10 2.3. Создание структуры базы данных..….………………………………………….11 3. Освоение базовых принципов работы с Visual FoxPro 5.0……………...………..12 3.1. Команды просмотра и редактирования файлов таблиц Browse и Edit (Change). Открытие конструкторов таблиц и баз данных………................……………12 3.2. Копирование файлов для использования в Visual FoxPro 5.0 и в других программных средах.….....…..........…………..16 3.3. Копирование структуры файлов таблиц …..…………....….........……………21 3.4. Копирование произвольных файлов................................……..………………23 4. Основные приемы работы с Visual FoxPro 5.0....................................……………24 4.1. Прием 1: удали лишнее....................................................………………….…..24 4.2. Прием 2: рассматривай базу данных через фильтры......………………….…26 4.3. Прием 3: упорядочивай записи.........................................…………………….30 4.4. Поиск записей в индексированных и неиндексированных файлах..........…..36 5. Создание проекта……………………………………………………………………42 6. Разработка форм с помощью мастера форм……………………………………….43 7. Зачетное задание по части 1.......................................................…………………...45 Часть 2. Программирование и пользовательский интерфейс СУБД…………..…47 1. Краткие сведения о программировании в системах управления базами данных (СУБД)..........................................……………………47 1.1. Перечень особенностей стиля программирования в СУБД..................................................................................…………………..47 2. Освоение особенностей процедурного программирования в среде Visual FoxPro 5.0...................................................................………………48 2.1. Общая характеристика языка Visual FoxPro 5.0..........………………………48 2.2. Особенности оператора присваивания.............................……………………49 2.3. Операторы ветвления и выбора..........................................…………………..51
3
2.4. Конструкции цикла.............................................................…………………...52 2.5. Макроподстановки & в Visual FoxPro 5.0....................................…………..54 2.6. Подпрограммы в Visual FoxPro 5.0...........................…………………...........57 2.7. Программные модули в Visual FoxPro 5.0...............…………………............60 2.8. Переменные памяти в структурированных программах……………………61 3. Работа с несколькими базами данных.....................................…………………...62 3.1. Знакомство с техникой установления связей между базами данных(один_файл_со_многими).............………………….63 3.2. Установление связи одна_запись_со_многими...............………………….67 3.3. Установление постоянной связи RelationShip между таблицами в БД….70 4. Средства Visual Foxpro5.0 для отладки программ..................………….........…70 4.1. Типы ошибок в программах, написанных на языке Visual Foxpro5.0........70 4.2. Сервис Visual Foxpro5.0 для отладки программ..............…………….........71 5. Знакомство с элементами визуального программирования……………………73 5.1. Создание формы в конструкторе форм………………………..……………73 5.2. Написание программы (кодов)………………………………………………80 5.3. Сохранение файла формы……………………………………………………83 5.4. Запуск программы на выполнение……………………………………….…83 5.5. Работа с программой…………………………………………………………83 5.6. Итоги проделанной работы………………………………………………….83 6. Создание отчетов…………………………………………………………………...84 6.1. Введение………………………………………………………………………84 6.2. Использование мастера для создания отчета……………………………….85 6.3. Описание окна конструктора отчетов……………………………………….86 6.4. Создание стандартного отчета……………………………………………….87 7. Выборка данных………………………………………………………………….…89 7.1. Создание запроса по образцу в окне конструктора запросов……………...89 7.2. Команда Select………………………………………………………………...91 8. Создание меню формы с помощью конструктора меню………………………...92 8.1. Создание контекстного (всплывающего) меню Shortcut формы………..93 8.2. Создание меню формы………………………………………………………95 9. Перечень зачетных заданий к Части 2...................................………………….…97 Заключение..........................................................................................…………………..98 Приложение. Варианты контрольных заданий, семестровых и курсовых работ по дисциплине “Системы управления базами данных”.........................................................................................……………………99 Список использованных источников...............................................…………………107
4