47
Государственный комитет Российской Федерации по высшему образованию
Волгоградский государственный технический униве...
62 downloads
277 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 - назначение рабочей области в
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 TO - копирует файл любого типа. Имена и указываются с расширениями. Оба файла должны быть закрыты.
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,см.п.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.), которые могут соединять выражения над данными различных типов (см. вышеприведенный пример); • знаки скобок; • знаки сравнения >,=, - режим установления фильтра, при котором записи, не удовлетворяющие условию <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 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 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> ELSE ENDIF – конструкция ветвления: если логическое условие <exprL> истинно, то выполняется серия 1 команд, иначе (ELSE) - серия 2. IF... ENDIF – начало и конец конструкции ветвления (операторные скобки) RECNO( ) – функция, возвращающая номер записи, на которой в данный момент находится файловый указатель @row,col SAY «строка_текста_в_кавычках» - вывод сообщения (указанного в кавычках) на экран с размещением первой буквы в заданных строке (row) и столбце (col). Возможны значения: row=1...23, col=1...79
Текст программы (наберите его с помощью текстового редактора MODIFY COMMAND и после набора и записи Ctrl-W,^W выполните DO fnd). *Программа fnd. prg, иллюстрирующая поиск данных в индексированных файлах CLEAR && очистка экрана. USE students && students.dbf открывается в рабочей области. SET EXACT OFF && отключается режим точного совпадения ключа и запроса. SET SAFETY OFF && откл. режим подтверждения опасных команд. i=1 && первый вариант размещения букв вл. DO WHILE i] [FOR <exprL>][WHILE <exprL>] [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> [ELSE ] ENDIF
2.3.2. Функция IIF(<exprL>,<expr1>,<expr2>) полностью аналогична функции @if() табличного процессора Quattro Pro. Если логическое выражение истинно, функция возвращает <expr1>, иначе <expr2>. Функция IIF( ) очень полезна при выводе информации пользователю. Например, если в поле цифрового типа не занесены данные, то при выводе его на экран в нем будет показан 0. Для пользователя желательно видеть это поле незаполненным. Тогда вместо вывода поля выведите функцию IIF(=0,»»,) Примеры функции и конструкции ветвления Вы рассмотрите по ходу разработки программ ниже. 2.3.3. Конструкция выбора: DO CASE CASE <exprL1> CASE <exprL2> ... CASE <exprLn> [OTHERWISE] ENDCASE Примеры функции и конструкции выбора Вы рассмотрите по ходу разработки программ ниже. 2.4. Конструкции цикла
96
Общие особенности конструкций циклов в Visual FoxPro 5.0 связаны с преодолением массовых операций (см. п.1).Для этого внутри циклических конструкций предусмотрены добавочные операторы, нарушающие цикл и относящиеся к числу запрещенных в других языках (рис.2.1). Благодаря этим нарушениям запретов» удается избежать операций завершения цикла «нормальным» образом после того, как искомая запись найдена (и не тратить время на просмотр оставшихся записей). 2.4.1. Конструкция DO WHILE...ENDDO: DO WHILE <exprL> [LOOP] && Досрочный возврат к началу цикла . [EXIT] && Досрочный выход из цикла . ENDDO
Цикл выполняется, пока истинно логическое выражение <exprL> либо пока не встретится команда EXIT. Серии команд 2 и 3 выполняются только в том случае, если не встретится команда LOOP. Пример см. в п.2.4.4.
2.4.2. Конструкция FOR...ENDFOR: FOR <memvar>=<exprN1> TO <exprN2> [STEP <exprN3>] [LOOP] [EXIT] 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>] [LOOP] [EXIT] 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=<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][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 i3 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: - Выре\) ) используйте функцию 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