56
КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ ПИНЯГИНА О.В., Практикум по курсу “Базы данных” Часть 2 Разработка интерфейса на Visual FoxPro Казань – 2012

Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

  • Upload
    dangque

  • View
    230

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ

ПИНЯГИНА О.В.,

Практикум по курсу

“Базы данных”

Часть 2

Разработка интерфейса на

Visual FoxPro

Казань – 2012

Page 2: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

2

Содержание СОДЕРЖАНИЕ ......................................................................................... 2

ПРЕДИСЛОВИЕ ....................................................................................... 3

УСТАНОВКА ПРОГРАММЫ ................................................................ 3

СОЗДАНИЕ ПРОЕКТА ........................................................................... 4

Задание без номера ............................................................................... 6

ИСТОЧНИКИ ДАННЫХ ODBC ........................................................... 7

Задание 10, предварительный этап................................................. 10

УДАЛЕННЫЕ ПРЕДСТАВЛЕНИЯ .................................................... 10

Представление на основе одной таблицы ...................................... 11

Представление на основе нескольких таблиц ............................... 13

Задание 10 ............................................................................................ 15

КРАТКИЙ ОБЗОР КОМАНД FOXPRO ............................................. 16

ФОРМЫ: КЛАССЫ, СВОЙСТВА И МЕТОДЫ ............................... 26

ФОРМЫ: ПРИМЕР ИНТЕРФЕЙСА .................................................. 32

Задание 11 ............................................................................................ 36

ОТЧЕТЫ ................................................................................................... 37

Задание 12 ............................................................................................ 41

МЕНЮ ....................................................................................................... 42

Задание 13 ............................................................................................ 44

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ .................................................. 45

ПРИЛОЖЕНИЕ 1: РАБОТА С ПОДТИПАМИ ................................ 51

ПРИЛОЖЕНИЕ 2: VFP И COM-ТЕХНОЛОГИЯ - ВЫГРУЗКА ДАННЫХ В EXCEL ................................................................................ 53

Page 3: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

3

Предисловие

В первой части нашего пособия мы последовательно рассмотрели

и применили на практике технологии проектирования баз данных –

построили ER-модель и реляционную модель, а также разработали

серверную часть базы данных – создали таблицы, заполнили их

информацией с учетом правил ссылочной целостности, придумали

разнообразные запросы и представления, научились писать хранимые

процедуры, познакомились с триггерами.

Во второй части пособия мы будем рассматривать разработку

Windows-интерфейсов к базам данных в среде Visual Fox Pro.

Хотя Visual Fox Pro представляет собой СУБД – систему управления базами данных и имеет собственные средства для

хранения данных, мы воспользуемся в нём только возможностями

создания интерфейсов к уже разработанной базе данных SQL server.

Преимущества этой среды для наших приложений заключаются в

следующем:

• FoxPro, как и SQL server, является продуктом компании

Microsoft, поэтому (теоретически) они должны быть хорошо

совместимы;

• FoxPro, в отличие, например, от Visual C++, представляет собой

среду, специально созданную для работы с базами данных и

имеющую удобные средства для этого.

Примечание: Разработкам windows-интерфейсов для баз данных на

языке C# будет посвящена курсовая работа в следующем семестре.

Установка программы

Будем использовать версию Visual FoxPro 8.0 (в крайнем случае,

можно ограничиться версией 6.0). Установка программы не вызывает

особых сложностей. В процессе установки достаточно пройти первый

и второй этапы, показанные на следующей картинке. Третий этап –

загрузку обновлений – можно будет пропустить.

Page 4: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

4

Создание проекта

Page 5: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

5

Создание приложения следует начать с проекта (меню File – New – тип файла Project – кнопка New file). Обратите внимание, создается два файла – с расширениями PJX и PJT.

Проект в FoxPro представляет собой контейнер, содержащий

ссылки на файлы приложения. Все файлы проекта, если он небольшой,

удобно помещать в один общий каталог. Первая вкладка проекта All содержит полный список всех объектов, остальные вкладки содержат отдельные группы файлов.

Типы файлов проекта:

• Данные (Data) o Базы данных (типы файлов DBC, DCT, DCX)

o Свободные таблицы (типы файлов DBF, FPT, TBK)

o Запросы (типы файлов QPR)

• Документы (Documents) o Формы (типы файлов SCX, SCT)

o Отчеты (типы файлов FRX, FRT)·

o Наклейки (типы файлов LBX, LBT)

• Библиотеки классов (типы файлов VCX, VCT)

• Отдельные коды программ (Code) o Программы (типы файлов PRG, FPX)

o API библиотеки (тип файлов DLL)

o Приложения (тип файлов APP)

• Прочее (Other) o Меню (типы файлов MNX, MNT, MPR)

o Текстовые файлы

o Прочее

(например,

картинки)

Один из файлов

проекта должен быть

главным. Обычно это

меню. Его название

выделяется жирным

шрифтом. С этого файла

начинается выполнение

приложения в формате

APP или EXE.

Page 6: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

6

Кнопка "Build…" предназначена для перестройки проекта и позволяет выполнить следующие действия:

• Rebuild project означает просто обновление всех ссылок и

перегенерацию файлов меню;

• Build application позволяет создать приложение – единый файл с

расширением .APP, который можно запускать из сокращенной среды FoxPro;

• Build executable позволяет создать исполняемый файл, который

можно запускать без использования среды FoxPro (требуются только 2 библиотеки времени выполнения, их названия зависят

от версии FoxPro);

• Build OLE DLL позволяет создать COM-объект.

Полезным средством

в FoxPro является

командное окно. Оно

позволяет выполнять

команды, набранные

вручную и, кроме того, отображает в виде "эха" многие из команд,

выполненные через главное меню.

Вызывается на экран через пункт

меню Window – Command window или комбинацию клавиш Ctrl+F2.

Другим полезным средством

является окно сеанса данных (Data session). Оно содержит

информацию об открытых в данный

момент таблицах и представлениях.

Многие из типичных проблем (и их решения), которые могут

возникнуть при работе в FoxPro, упомянуты на странице Часто задаваемые Вопросы.

Задание без номера

Создайте проект. Сохраните его в своем каталоге, а не в

служебном каталоге FoxPro.

Page 7: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

7

Источники данных ODBC

ODBC (Open Database Connectivity, открытый интерфейс доступа к базам данных) – это самая старая, самая универсальная и самая

широко используемая технология доступа к данным в операционной

системе Windows. Технология ODBC позволяет установить

взаимодействие практически между любыми СУБД и самыми

разнообразными языками и средами программирования – C#, ASP.Net, Visual FoxPro, Delphi, PHP, Java и т.п.

Среди служебных программ операционной системы Windows

содержится средство управления источниками данных ODBC.

Вызывается эта программа через "Пуск" – "Панель управления" – "Администрирование" – "Источники данных ODBC" (можно также запустить эту программу по имени odbcad32.exe через командную строку):

Для доступа к данным SQL server 2008 лучше создавать

«пользовательский DSN», а для SQL server 2005 – «системный DSN».

Итак, на соответствующей вкладке нажимаем на кнопку

«Добавить», появляется список драйверов СУБД, которые

установлены на текущем компьютере.

Page 8: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

8

В конце этого списка (по алфавиту) располагаются нужные нам

драйвера SQL server. Для версии SQL server 2005 драйвер называется

SQL Native Client, а для версии SQL server 2008 – SQL Native Client

10.0. Выбираем нужный драйвер, нажимаем на кнопку «Готово».

На следующем этапе нужно назначить имя источнику данных

(если вы предполагаете переносить ваш проект на другой компьютер,

запомните это имя, а лучше даже запишите!) Кроме того, нужно

выбрать из списка или набрать вручную имя сервера. Вспомним, что

Page 9: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

9

имя сервера для EXPRESS-версии SQL server обычно имеет вид:

ИмяКомпьютера\SQLEXPRESS, например, HOME\SQLEXPRESS. Для источника данных SQL server можно оставить способ

аутентификации Windows only (встроенная проверка подлинности Windows),

а также следует назначить вашу базу данных в качестве базы данных

по умолчанию:

Page 10: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

10

На последнем шаге можно протестировать соединение с

источником данных.

Задание 10, предварительный этап

Создайте источник данных ODBC для вашего проекта.

Запомните его имя, поскольку при переносе проекта на другой

компьютер источник данных придется создавать заново с тем же

именем.

Удаленные представления

Для доступа к данным SQL server из Visual FoxPro мы будем использовать удаленные представления (Remote Views).

Удаленное представление – это объект базы данных, в котором

хранится информация, из какого источника и в каком формате

выбираются данные. Основная часть представления – хорошо

известная нам команда SELECT (только создается она в данном случае с помощью визуальных средств).

Сначала следует создать базу данных FoxPro. Для этого проще всего в проекте щелкнуть по строке Databases и нажать кнопку New – New database. Сохраните базу данных в том же каталоге, что и проект. Не забывайте при переносе информации с одного компьютера на

Page 11: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

11

другой, что база данных хранится сразу в трех в файлах с

расширениями DCT, DCX, DBC. В этой базе данных FoxPro мы не будем хранить сами данные, а только ссылки на них – удаленные

представления.

Создадим новое удаленное представление (Remote View). Для

этого можно в проекте щелкнуть по значку «+» рядом с именем базы

данных, затем в раскрывшемся списке щелкнуть по строке Remote views и нажать кнопку New:

Представление можно создавать на основе соединений

(Connections) или доступных источников данных (Available Data

Sources). Выберем второй вариант. Среди источников данных

выберите ваш и нажмите на кнопку OK. Затем из появившегося списка следует выбрать одну или насколько таблиц, на основе которых будет

создаваться представление. После выбора таблиц закройте окно.

Представление на основе одной таблицы

Рассмотрим пример представления на основе одной таблицы –

справочника предприятий. Выберем из списка таблицу k_firm и закроем окно выбора. Появится окно конструктора запроса:

Page 12: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

12

На первой закладке выберем все поля – нажмем кнопку Add all. Закладки Join, Filter, Order by и Group by соответствуют отдельным частям команды SELECT и не нуждаются в комментариях. В текущем представлении мы их использовать не будем.

Следует более подробно рассмотреть закладку Update Criteria (критерии обновления):

На этой закладке располагается список полей представления, около

каждого поля можно поставить:

Page 13: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

13

• галочку в столбце "ключ", указав, что данное поле считается ключевым,

• и/или галочку в столбце "карандаш", указав, что поле является обновляемым (обычно ключевые поля, особенно если они имеют свойство Identity, не рекомендуется назначать

обновляемыми – пользователю незачем их менять).

Назначим ключевым полем firm_num и обновляемыми – все остальные поля.

Набор радиокнопок "SQL WHERE clause includes" позволяет задать режим, по которому будут осуществляться обновления в

таблице. При сопоставлении старых и новых данных могут

проверяться:

• только ключевые поля "Key fields only",

• ключевые и обновляемые поля "Key and updatable fields",

• ключевые и измененные поля "Key and modified fields" (по умолчанию),

• или ключ и метка времени "Key and timestamp". И, наконец, обязательно нужно включить переключатель "Send

SQL updates" для отсылки изменений серверу. В любой момент можно просмотреть получившийся код команды

SELECT, если щелкнуть правой кнопкой и выбрать пункт View SQL. Удаленное представление готово, нужно его сохранить в базе

данных. Теперь его можно протестировать, нажав кнопку Browse и попробовав добавить, удалить или изменить какие-нибудь данные.

Представление на основе нескольких таблиц

Рассмотрим представление для редактирования списка

договоров. В представление обычно включают всю необходимую

информацию об объекте, которую мы хотим видеть на экране, поэтому

данное представление будет содержать основную таблицу договоров

(k_contract) и поля из таблиц-справочников: название организации из справочника предприятий (k_firm) и фамилию сотрудника из списка сотрудников (k_staff).

В данное представление следует включить все три таблицы и связать основную таблицу договоров со списком предприятий по полю

Page 14: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

14

firm_num и со справочником сотрудников по полю staff_num. При совпадении названий полей в разных таблицах FoxPro автоматически

предлагает связать их и выбрать один из типов связи: Inner join, Left join, Right join или Full join:

Связывать таблицы можно также перетаскиванием поля в окне

представления из одной таблицы в другую или же вручную, добавив

условие на закладке Join или Filter. Далее на закладке Fields выберем все поля договоров, фамилию

сотрудника (k_staff.staff_name) и название организации

(k_firm.firm_name).

Page 15: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

15

На закладке Update Criteria в качестве ключевого поля отметим код договора (contract_num), а в качестве обновляемых полей – все остальные поля договора. Название организации и фамилию

сотрудника обновлять здесь не следует, поскольку они относятся к

внешним таблицам!

Рекомендация: В представлении никогда не следует делать

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

из таблиц-справочников!

Кроме удаленных представлений, в FoxPro есть другой способ доступа к "чужим" данным – так называемые pass-through функции. Это SQLCONNECT, SQLEXEC и т.п. Их преимущество состоит в том, что SELECT-команды для выборки данных можно формировать динамически (например, выбрать договоры только одного

предприятия и т.д.).

Задание 10

Создайте удаленные представления для всех ваших таблиц.

Page 16: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

16

Краткий обзор команд FoxPro

Язык FoxPro – довольно мощный и разнообразный, многие

команды сохранились в нём ещё со времен FoxPro 2.0 под DOS. Мы

рассмотрим только очень небольшое количество команд, которые

потребуются для решения наших задач. Попутно приведем несколько

определений.

Обратите внимание! FoxPro не различает регистр букв. Однако ключевые слова принято писать заглавными буквами – так текст

программы легче читается.

Обратите внимание! Многие ключевые слова можно сокращать до 4-х букв.

Обратите внимание! Если команда не уместилась на одной строке, точка с запятой в конце строки означает перенос команды на

следующую строку.

Обратите внимание! Логические константы «истина» и «ложь» выглядят как .t. (или .T.) и .f. (или .F.).

Для печати текущих значений переменных удобно использовать

команду ? Выражение. Информация будет выведена прямо на экран. Более экзотичный способ вывода текущей информации –

команда WAIT WINDOW симвВыражение. Выражение будет выведено в системное окно в правом верхнем углу экрана (не

забывайте преобразовывать выражение к символьному типу!)

Операторы FoxPro: Строковые + Конкатенация (сцепление строк).

– Конкатенация с подавлением концевых пробелов в первом

операнде

$ Поиск первого операнда во втором. Возвращает истину,

если найдено.

Числовые **, ^ Возведение в степень *, / Арифметические умножение и деление

% Остаток по модулю

Page 17: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

17

+, – Арифметические сложение и вычитание

Логические .NOT., ! Логическое отрицание

.AND. Логическое И

.OR. Логические ИЛИ

Сравнения < Меньше, чем

> Больше, чем

= Равно

<>, #, != Не равно

<= Не больше

>= Не меньше

== Точное сравнение строк

Операторы даты и времени + Сложение:

время1 = время2 + секунды или дата1 = дата2 + дни

– Вычитание

секунды = время1 – время1 или

время1 = время2 – секунды или дата1 = дата2 – дни

База данных в FoxPro – это контейнер, содержащий

информацию о таблицах, их свойствах, связях, индексах, соединениях,

представлениях, хранимых процедурах. Эта информация хранится в

файлах с расширениями .DBC, .DCX и .DCT. Представление – объект базы данных, пользовательская

виртуальная таблица. Различают локальные и удаленные

представления. Локальное представление может быть построено

только на основе таблиц текущей базы данных. Удаленное

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

типов, например, SQL Server или Oracle.

Команды открытия и закрытия базы данных

Page 18: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

18

OPEN DATABASE ИмяБазыДанных – открывает базу данных и

делает её текущей. В каждый момент времени только одна база

данных может быть текущей.

CLOSE DATABASE – закрывает текущую базу данных.

CLOSE ALL – закрывает всё, кроме базы данных (окна, таблицы,

представления, и т.п.).

Рабочая область – логическая область, в которой в каждый

момент времени может быть открыта только одна таблица или

представление (их открывают командой USE). К рабочей области можно обращаться по номеру (от 1 до 32767) или по псевдониму

таблицы, если в данной рабочей области открыта таблица. Только одна

рабочая область может быть текущей. Для переключения между

рабочими областями используется команда SELECT (не путайте с командой SQL SELECT!).

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

USE. По этому псевдониму можно обращаться к таблице и к рабочей области в текущем сеансе работы. Если псевдоним не указан явно, он

совпадает с коротким именем таблицы.

Команды открытия и закрытия таблиц и представлений USE Таблица | Представление – открывает таблицу или

представление в текущей рабочей области.

SELECT Число | Псевдоним – устанавливает в качестве текущей

рабочей области область с номером Число или Псевдонимом. Если в качестве номера записать 0, то будет выбрана первая свободная

рабочая область.

USE IN Число | Псевдоним – закрывает таблицу или

представление в рабочей области, заданной числом или псевдонимом.

Примечание: эти три последние команды нам явно использовать

практически не придётся, поскольку мы будем открывать нужные нам

представления в формах и отчетах с помощью объекта

DataEnvironment.

Page 19: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

19

Обмен данными с сервером

Начальное чтение данных происходит в момент открытия

представления. После закрытия представления происходит отправка

измененных данных на сервер. Если же в процессе работы требуется

явно отправить изменения на сервер, либо получить новые данные с

сервера, нужно использовать следующие команды.

TABLEUPDATE(.t., .t.) – отправка данных на сервер. Если

сервер успешно примет изменения, будет возвращено значение

«истина». Если же возникнут какие-либо ошибки (например, нарушено

ограничение внешнего ключа), то будет возвращено значение «ложь».

TABLEREVERT() – отмена изменений в текущей строке, без

отправки на сервер.

REQUERY() – повторный запрос данных с сервера в текущей

рабочей области. Это бывает полезно, например, при создании новой

строки, если значение первичного ключа генерирует SQL server с

помощью свойства IDENTITY.

Навигация в таблице

В FoxPro имеется такое понятие, как указатель на текущую строку

таблицы. Этот указатель можно перемещать. Многие из команд

действуют именно на одну текущую строку таблицы, в отличие от SQL

server, где команды обычно относятся ко всей таблице в целом. GO[TO] [RECORD] НомерЗаписи

– указатель переходит к строке с физическим номером НомерЗаписи в текущей рабочей области.

GO[TO] TOP | BOTTOM

– указатель переходит к началу (TOP) или к концу (BOTTOM) таблицы.

SKIP [Количество]

– указатель текущей строки передвигается на Количество записей в таблице (число может быть и отрицательным). По умолчанию – переходит к следующей записи в таблице.

Пример. Переход к предыдущей записи в текущей рабочей области

Page 20: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

20

SKIP –1 IF BOF() GO TOP ENDIF

Пример. Переход к следующей записи в текущей рабочей области SKIP IF EOF() GO BOTTOM ENDIF BOF([РабочаяОбласть | Псевдоним])

– возвращает истину, если указатель записей находится в начале

таблицы. EOF([РабочаяОбласть | Псевдоним])

– возвращает истину, если указатель записей находится после

последней строки таблицы. RECNO([РабочаяОбласть | Псевдоним])

– возвращает физический номер текущей записи. RECCOUNT([РабочаяОбласть | Псевдоним])

– возвращает количество строк в таблице (включая строки,

помеченные к удалению).

ПОИСК И ЛОКАЛИЗАЦИЯ ДАННЫХ

LOCATE FOR Выражение1

– производит поиск в текущей таблице первой строки, для которой выполняется условие Выражение1. Если запись найдена, на неё перемещается указатель. Если запись не найдена, возникает

состояние “конец файла”.

Пример. Ищем в таблице строку со значением поля nomer, равным 5.

Если не нашли, остаемся на той же строке, что были до поиска. rec=RECNO() LOCATE FOR nomer=5 IF !FOUND() GOTO rec ENDIF

CONTINUE – продолжает поиск записей по условию, заданному в

последней команде LOCATE.

Page 21: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

21

FOUND() – возвращает истину, если последняя операция поиска в

текущей рабочей области была успешной.

SET EXACT ON | OFF

– включает/выключает режим точного сравнения символьных строк. Если режим выключен, сравнение производится по длине

второй строки.

Пример сравнения строк. SET EXACT OFF ? ‘Иванов’=’И’ && печатает значение “Истина” (.T.)

SET EXACT ON ? ‘Иванов’=’И’ && печатает значение “Ложь” (.F.) SET FILTER TO [логВыражение]

– устанавливает фильтр на записи текущей таблицы. Записи, для

которых условие логВыражение не выполняется, становятся

невидимыми.

После выполнения этой команды для активизации фильтра

нужно обязательно выполнить какое-либо перемещение в таблице

(например, GO TOP). Команда без параметров отменяет фильтр.

Пример. Фильтруем таблицу по условию nomer=5. SET FILTER TO nomer=5 GO TOP

УДАЛЕНИЕ ДАННЫХ

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

удаление, а собственно удаление данных будет происходить тогда,

когда мы отправляем изменения на сервер.

Page 22: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

22

В том случае, когда включен режим отображения удаленных

строк, строки, помеченные на удаление, содержат «чёрную метку» в

левой своей части. Эту метку также можно ставить и убирать щелчком

мыши.

DELETE [FOR условие]

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

условию (по умолчанию – только текущую запись).

Пример. Удаляем сотрудников, относящихся к отделу с номером 2. SET DELETED ON SELECT k_staff DELETE FOR dept_num=2

RECALL [FOR условие]

– восстанавливает помеченные к удалению строки таблицы,

отвечающие заданному условию (по умолчанию – только текущую

запись).

Пример. Восстанавливаем данные, удаленные в предыдущем примере. SELECT k_staff RECALL FOR dept_num=2

SET DELETED ON | OFF

– включает/выключает режим отображения помеченных к

удалению записей. Если режим включен (ON) – удаленные записи не видны.

ДОБАВЛЕНИЕ ДАННЫХ

APPEND BLANK – добавляет новую строку к текущей таблице.

ИЗМЕНЕНИЕ ДАННЫХ

REPLACE ИмяПоля1 WITH Выражение1 [,ИмяПоля 2 WITH Выражение2 ...] [FOR условие]

Page 23: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

23

– заменяет значения полей ИмяПоляN на ВыражениеN в записях, отвечающих заданному условию. По умолчанию (без

условия) команда действует на текущую строку таблицы.

Пример. Изменим номер отдела для сотрудника с фамилией “Иванов”. SELECT k_staff REPLACE dept_num WITH 5 FOR staff_name=”Иванов”

РАБОТА СО СТРОКАМИ

Для работы со строками есть множество функций, приведем

только несколько их них. ALLTRIM(симвВыражение)

– удаляет лишние пробелы слева и справа и возвращает символьное

выражение.

LTRIM(симвВыражение)

– удаляет лишние пробелы слева и возвращает символьное выражение.

RTRIM(симвВыражение)

– удаляет лишние пробелы справа и возвращает символьное

выражение.

STR(числВыражение) и VAL(симвВыражение)

– преобразуют число в строку и строку в число. Функция STR почти всегда добавляет лишние пробелы. Не забывайте их удалять!

DTOC(датВыражение | времВыражение) и

СTOD(симвВыражение)

– преобразуют дату в строку и строку в дату.

AT(симвСтрока1, симвСтрока2 [, числНомер])

– ищет в строке симвСтрока2 вхождение строки симвСтрока1 с номером числНомер и возвращает номер символа или 0, если не найдено.

SUBSTR(симвВыражение, числСтарт, числКоличество)

– выделяет подстроку из строки.

Page 24: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

24

РАБОТА С ДАТАМИ

DATE()

– возвращает текущую дату.

SET DATE GERMAN

– устанавливает привычный для нас формат даты DD-MM-YY SET CENTURY ON | OFF

– включает/выключает режим отображения столетия в дате.

Пример. SET DATE GERMAN SET CENT ON ? DATE()

напечатает текущую дату в формате 18.11.2012

YEAR(датВыражение)

– возвращает год из заданной даты.

MONTH(датВыражение)

– возвращает номер месяца из заданной даты.

DAY(датВыражение)

– возвращает число из заданной даты.

Пример. Получить дату 1 января текущего года. SET DATE GERMAN myDate = CTOD(“01.01.”+ALLTRIM(STR(YEAR(DATE()))))

Пример. Получить дату 1 число текущего месяца. SET DATE GERMAN myDate = CTOD(“01.”+ ALLTRIM(STR(MONTH(DATE())))+; ”.”+ALLTRIM(STR(YEAR(DATE()))))

КОМАНДЫ УПРАВЛЕНИЯ

Используются, главным образом, в программном коде.

DO WHILE логВыражение && Команды [LOOP] [EXIT] ENDDO

– цикл по условию. EXIT – выход из цикла, LOOP – переход к следующей итерации.

FOR переменная = числНачЗнач TO числКонЗнач [STEP числШаг]

&& Команды [EXIT]

Page 25: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

25

[LOOP] ENDFOR | NEXT

– цикл по счетчику. IF логВыражение [THEN] && Команды [ELSE && Команды] ENDIF

– условный оператор. IIF(логВыражение, Выражение1, Выражение2)

– функция, эквивалентная условному оператору. Если истинно логВыражение, возвращает Выражение1, в противном случае Выражение2.

SCAN [FOR логВыражение1] && Команды [LOOP] [EXIT] ENDSCAN

– цикл сканирования таблицы в текущей рабочей области. Эквивалентен DO WHILE !EOF() … SKIP … ENDDO, но не требует явного выполнения команды SKIP.

EXIT – выход из цикла.

CANCEL – выход из программы и возврат в среду FoxPro.

QUIT – выход из программы и возврат в операционную систему.

* и && – однострочные комментарии.

Page 26: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

26

Формы: классы, свойства и методы

Каждая форма состоит из 2 файлов с расширениями SCX, SCT. Сама форма и многие из ее объектов являются контейнерами, т.е.,

объектами, которые содержат другие объекты. Таким образом, каждая

форма включает иерархию объектов. Для того чтобы в программе

обратиться к нужному объекту, мы можем использовать

«абсолютную» или «относительную» ссылки. Следующие ключевые

слова означают:

• this – ссылку на текущий объект; • thisform – ссылку на текущую форму; • parent – ссылку на родительский объект. Пусть, например,

Форма содержит

Набор страниц (PageFrame1), который содержит Страницы (Page1 и Page2), Page1 содержит Кнопки (Insert, Edit, Delete).

Из метода кнопки Insert обращаемся к кнопке Delete (делаем кнопку Delete недоступной):

– абсолютная ссылка

Thisform.PageFrame.Page1.Delete.Enabled = .f. – относительная ссылка:

This.Parent.Delete.Enabled = .f.

Page 27: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

27

Рассмотрим наиболее полезные свойства и методы, которые

имеют многие объекты.

Общие свойства:

• Name – название объекта (не путайте с заголовком!); • Caption – заголовок; • AutoCenter – автоматическое центрирование; • BackColor – цвет фона; • ForeColor – цвет текста; • Font… – группа характеристик шрифта; • Left – левая координата; • Top – верхняя координата; • Height – ширина; • Width – высота; • Picture – имя файла с изображением; • Visible – признак видимости; • Enabled – признак доступности; • ReadOnly – признак "Только для чтения"; • ToolTipText – подсказка при наведении мыши; (нужно установить ShowTips = .t. в свойствах формы)

• StatusBarText – текст в статусной строке при активизации объекта;

• Comment, Tag – вспомогательные свойства символьного типа, в которых можно хранить произвольные значения;

• Value – текущее значение объекта; • ControlSource – источник данных (обычно – имя поля таблицы).

Cобытия

• Load – загрузка объекта; • Unload – выгрузка объекта; • Init – инициализация объекта (если возвратить из метода "ложь", объект не будет создан);

• Destroy – разрушение объекта; • Click – щелчок мышью; • DblClick – двойной щелчок мышью; • RightClick – щелчок правой кнопкой мыши; • GotFocus – получение фокуса; • LostFocus – потеря фокуса; • MouseDown – кнопка мыши нажата; • MouseUp – кнопка мыши отпущена; • MouseMove – перемещение мыши;

Page 28: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

28

• MouseWheel – прокрутка колесика мыши; • KeyPress – нажатие клавиши клавиатуры;

Прочие методы

• SetFocus – переместить фокус на объект; • Refresh – обновить (перерисовать) объект; • Release – уничтожить объект.

При необходимости можно добавить в форму свои собственные

свойства и методы (пункт меню Form – New property… и New method…)

Теперь рассмотрим более подробно разные элементы управления:

Label – метка, применяется для создания поясняющих надписей, чаще всего используется свойство Caption.

Text – текстовое поле, обычно через свойство ControlSource оно связывается с полем таблицы.

Свойства:

• InputMask – маска ввода (например, 999-99-99 для телефона); • Format – формат данных (например, @Z выводит лидирующие нули слева для числовых данных);

• NullDisplay – признак, показывать или нет NULL-значения; • SelectedBackColor – цвет фона для выделенного текста; • SelectedForeColor – цвет букв выделенного текста; • SpecialEffect – плоский или 3-мерный объект.

Command – кнопка. Свойства:

• Default – если равно «истине», то при нажатии клавиши Enter срабатывает Click данной кнопки;

• Cancel – если равно «истине», то при нажатии клавиши Esc срабатывает Click данной кнопки;

• DisabledPicture – картинка для недоступной кнопки (по умолчанию – картинка из свойства Picture в серых тонах);

• DownPicture – картинка для нажатой кнопки • Style:

o 0 – обычная,

o 1 – невидимая.

CommandGroup – группа кнопок и

Page 29: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

29

OptionGroup – группа радиокнопок (радиокнопка не может существовать вне группы)

Радиокнопка тоже может быть связана с полем таблицы (числового

типа).

Свойства:

• Buttons – массив кнопок (или радиокнопок); • ButtonCount – количество кнопок (или радиокнопок).

Check – переключатель, тоже может быть связан с полем таблицы (логического типа).

List – обычный список и Combo – комбинированный список (текстовое поле + список) могут быть связаны с полем таблицы через свойство ControlSource (т.е., при выборе из списка выбранный элемент записывается в поле таблицы).

Свойства:

• RowSourceType – тип источника строк, чаще всего равен 1 (value) или 2 (alias);

• RowSource – источник строк, o если RowSourceType=1, то содержит список строк через запятую (например, Январь,Февраль,Март…),

o если RowSourceType=2, то содержит имя поля таблицы, из которой выбираются данные в этот список;

• ListCount – количество строк; • ListIndex – индекс выбранной строки; • List – массив строк; • Sorted – признак упорядоченности; • IncrementalSearch – признак, допускается ли для этого списка быстрый переход по строкам при нажатии клавиш на клавиатуре;

• Style (только для Combo) o DropDown List – выпадающий список без текстового поля, o DropDown Combo – настоящий комбинированный список;

• Text (только для Combo) – значение, соответствующее набранному тексту в поле ввода или выбранной строке из списка.

Методы:

• AddItem (значение) – добавить строку; • RemoveItem (индекс) – удалить строку.

Spinner – счетчик, может быть связан с полем таблицы числового типа • Increment – приращение;

Page 30: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

30

• SpinnerHighValue, SpinnerLowValue, KeyboardHighValue, KeyboardLowValue – допустимое максимальное и минимальное значение при выборе мышью и с клавиатуры.

Picture – картинка из файла • Stretch – признак "растяжимости" картинки.

Timer – невидимый объект-таймер, позволяющий выполнять какие-либо действия по истечении заданного интервала времени

• Interval (в миллисекундах) – интервал времени; • Timer – событие, содержит действия, которые необходимо выполнить.

PageFrame – набор страниц или вкладок (страница не может существовать вне набора)

• TabStretch – признак размещения заголовков страниц: в несколько строк или с обрывом.

Container – контейнер для объектов любого типа.

Line – линия (элемент оформления).

Shape – фигура от овала до прямоугольника (элемент оформления) • Curvature задает степень закругленности углов.

OLEBoundControl, OLEContainedControl – позволяют помещать в форму OLE-объект (с возможностью его редактирования при запуске формы).

Grid – объект для табличного представления данных, содержит • Column – колонки таблицы, каждая из которых содержит

o Header – заголовок и o Text – содержимое ячейки (м.б. также Check, List и т.п.), свойства DynamicBackColor и пр. Dynamic… позволяют задавать динамически оформление ячейки

Свойства:

• ActiveColumn – номер текущего столбца; • ActiveRow – номер текущей строки; • RecordSourceType – тип источника данных; • RecordSource – имя источника данных (обычно – имя таблицы); • RecordMark – наличие меток строк; • DeleteMark– наличие меток для удаления строк;

Page 31: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

31

События

• AfterRowColChange – событие после перемещения по

строкам/столбцам;

• BeforeRowColChange – событие перед перемещением по строкам/столбцам.

Data Environment – объект "среда данных", является контейнером, содержащим курсоры. Представляет собой удобное средство для

управления открытием-закрытием таблиц и режимом буферизации.

Свойства:

• AutoOpenTables – признак, открывать автоматически таблицы при запуске формы или нет;

• AutoCloseTables – признак, закрывать автоматически таблицы при запуске формы или нет;

• InitialSelectedAlias – текущая рабочая область при запуске формы.

События

• BeforeOpenTables – действия перед открытием таблиц; • AfterCloseTables – действия после закрытия таблиц.

Методы

• OpenTables – открыть таблицы (по умолчанию открываются все таблицы, для которых заданы курсоры, можно написать

собственный код для открытия);

• CloseTables – закрыть таблицы (по умолчанию закрываются все таблицы, для которых заданы курсоры, можно написать

собственный код для закрытия).

Cursor – курсор – составная часть Data Environment, представляет собой объект, связанный с открытой таблицей или представлением

• Alias – псевдоним, обычно совпадает с именем таблицы; • BufferModeOverride – режим буферизации.

Form – форма Свойства

• WindowType – тип окна (модальное или немодальное); • MaxButton – наличие кнопки максимизации окна; • MinButton – наличие кнопки минимизации окна; • BufferMode – режим буферизации;

Методы

• Hide – скрыть окно; • Show – показать окно (можно изменить модальность).

Page 32: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

32

Формы: пример интерфейса

Рассмотрим разработку диалоговых окон – так называемых форм

в Visual FoxPro. Для каждой таблицы будем создавать отдельную форму. Форма будет содержать две страницы, на первой странице

разместим данные в табличном виде без возможности редактирования,

а на второй странице поместим поля и другие объекты для

редактирования отдельной строки.

Рассмотрим создание формы для таблицы Сотрудники. Создадим новую форму, настроим ее общие свойства:

• Во-первых, форму следует сделать модальной: WindowType=1 (modal).

Page 33: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

33

• Во-вторых, зададим режим буферизации: BufferMode=2 (optimistic).

• И, наконец, зададим заголовок формы: Caption=Сотрудники. Затем следует настроить Data Environment – окружение данных, т.е., выбрать представления, которые будут автоматически открываться

при запуске этой формы. Выберем пункт меню View – Data environment или щелкнем по пиктограмме с картинкой,

изображающей связанные таблицы. Открылось пустое окно окружения

данных. Щелкнем по нему правой кнопкой, выполним действия Add – View и выберем представление k_staff (оно содержит все поля таблицы k_staff плюс название отдела, в котором сотрудник работает). В дальнейшем нам понадобится также представление k_dept, поэтому выберем его тоже. В рамках Data Environment созданы два курсора:

Для курсора k_staff зададим режим буферизации

BufferModeOverride=3 (Optimistic row buffering) Для того, чтобы при открытии формы текущей была таблица k_staff, назначим свойству InitialSelectedArea значение k_staff.

Далее на форме создадим набор из 2-х вкладок. Каждая вкладка

является контейнером, поэтому для редактирования ее содержимого

следует щелкнуть правой кнопкой и выбрать пункт Edit, вокруг

вкладки появится голубая рамка.

На первой вкладке разместим объект Grid. Проще всего его создать следующим образом: открыть окно Data environment, зацепить за заголовок курсора k_staff и перетащить его на вкладку. Будет создан объект Grid, который связан с курсором k_staff. Для более тонкой настройки щелкнем на нем правой кнопкой и вызовем

Builder, с помощью которого можно добавить или убрать поля, назначить стиль, заголовки столбцов и т.д. (если Builder не работает,

Page 34: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

34

придется вносить изменения вручную в окне свойств).

В любом случае, в окне свойств нужно назначить этому объекту

свойство "Только для чтения" (ReadOnly=.T.) и убрать метки для удаления строк (DeletedMark=.F.).

Для того чтобы данные можно было редактировать, разместим в

нижней части вкладки кнопки "Добавить", "Изменить" и "Удалить". При щелчке на кнопке будем переходить на вторую вкладку, а первую

вкладку делать недоступной.

Код события Click кнопки "Добавить" будет содержать следующие действия:

APPEND BLANK && добавляем строку

&& запрещаем доступ к 1-ой вкладке

thisform.pageframe1.page1.enabled=.f.

&& открываем доступ к 2-ой вкладке

thisform.pageframe1.page2.enabled=.t.

&& активизируем вторую вкладку

thisform.pageframe1.page2.setfocus()

thisform.refresh() && обновляем изображение формы

При щелчке на кнопке "Удалить" мы должны удалить текущую строку (можете предварительно задать вопрос с помощью функции

MessageBox) и отправить изменения на сервер с помощью функции TABLEUPDATE. Эта функция возвращает истину при успешном выполнении и ложь при возникновении ошибки. Если команда

выполнена успешно, то мы запрашиваем обновленные данные с

помощью повторного запроса REQUERY. Если же на сервере возникла ошибка, то следует отменить сделанные изменения с

помощью функции TABLEREVERT и, возможно, выдать сообщение пользователю.

DELETE && Удаляем текущую строку

IF TABLEUPDATE(.t., .t.) && отправляем изменения на сервер

REQUERY()

ELSE

TABLEREVERT()

WAIT WINDOW "Изменения были отвергнуты сервером!"

ENDIF

thisform.refresh()

Page 35: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

35

Теперь рассмотрим вторую вкладку. Во-первых, изначально она

должна быть недоступна, поэтому назначим ей свойство Enabled=.F. На этой вкладке будем размещать текстовые поля для редактирования.

Проще всего снова использовать Data environment, зацепить за курсор, но только не за заголовок, а за слово Fields и перетащить его на вкладку. Будут созданы метки и текстовые поля для всех полей

таблицы.

Код сотрудника представляет собой поле IDENTITY, его редактировать нельзя, поэтому соответствующее текстовое поле

следует сделать недоступным.

Напрямую нельзя редактировать и название отдела, это поле мы

тоже запретим и разместим рядом с ним список, из которого можно

будет выбрать другой отдел. Создадим объект Combo, пусть это будет просто выпадающий список без текстового поля (Style=DropDown List). Назначим свойству RowSourceType значение Alias, в качестве источника строк для списка выберем название отдела из таблицы

отделов (RowSource=k_dept.dept_short_name). При щелчке на списке (событие Click) мы должны заменить код отдела в таблице Сотрудники на код отдела, выбранного в списке. Список связан с таблицей отделов, поэтому мы просто выполним команду

REPLACE k_staff.dept_num WITH k_dept.dept_num

Код мы заменили, и после отсылки на сервер он будет заменен в

исходной таблице. Но пока данные не отосланы, название отдела в

таблице Сотрудники остается старым! Его можно (временно) обновить командой

this.parent.txtDept_name.value=this.value

(txtDept_name – это имя поля в форме) или же командой

REPLACE k_staff.dept_name WITH k_dept.dept_name

(в представлении поле k_staff.dept_name является необновляемым, так как это поле из справочника!)

На этой вкладке также нужно поместить кнопки "Сохранить" и "Отменить", которые завершают работу с текущей строкой и активизируют первую вкладку.

Кнопка "Сохранить" должна предусматривать:

Page 36: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

36

• отправку данных на сервер (см. кнопку "Удалить");

• получение обновленных данных с сервера (в частности, при

создании новой строки ее код создается на сервере и мы должны

его получить), это действие выполняется функцией REQUERY()

• активизацию первой вкладки (действия, обратные тем, которые

выполнялись на кнопку "Редактировать" или "Удалить");

• перерисовку формы.

Кнопка "Отменить" должна предусматривать:

• отмену всех изменений в текущей строке, это действие

выполняется функцией TABLEREVERT(). Примечание:

функция TABLEREVERT() может оказаться очень полезным средством в процессе проектирования приложения – если

возникла какая-либо ошибка, касающаяся данных, и удаленное

представление не закрывается, следует выполнить эту функцию

из командного окна.

• активизацию первой вкладки (действия, обратные тем, которые

выполнялись на кнопку "Редактировать" или "Удалить");

• перерисовку формы.

Так может выглядеть тривиальный интерфейс для

редактирования таблицы Сотрудники. Вам нужно будет разработать что-то вроде этого для всех ваших таблиц.

Разумеется, можно разрабатывать и более сложный интерфейс –

например, на форму Сотрудники можно поместить кнопку Договоры, при нажатии на которую вызывается форма со списком договоров

данного сотрудника, на этой форме поместить кнопку Счета, при нажатии на которую выдается список счетов по данному договору и

т.д. Это можно реализовать, например, с помощью фильтров.

Задание 11

Создайте формы для просмотра и редактирования всех ваших

таблиц. Не используйте Wizard (мастер построения форм).

Page 37: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

37

Отчеты

Отчеты представляют собой удобное средство для вывода

табличной информации на экран или на печать (отчет нельзя

сохранить в файл).

Отчет всегда, как в режиме проектирования, так и в режиме

выполнения, основывается на таблице (или представлении), открытом

в текущей рабочей области.

Откройте любое представление (например, рассмотрим

справочник предприятий).

Шаблон для отчета можно создать с помощью мастера

(единственный случай, когда не запрещается пользоваться мастером).

Выберем обычный Report Wizard.

На первом шаге выберем поля, которые будут выданы в отчет.

Page 38: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

38

На третьем шаге – стиль отчета:

Заготовка для отчета готова. На последней странице можно

нажать на кнопку Preview и просмотреть сформированный отчет:

Page 39: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

39

Теперь откроем отчет в режиме проектирования и рассмотрим

его структуру более подробно.

Он состоит из 5 основных частей:

• Title (заголовок);

• Page header (верхний колонтитул страницы);

• Detail (детальная часть – сюда выводится информация из таблицы);

• Page footer (нижний колонтитул страницы);

• Summary (итоговая часть);

(если Title/Summary отсутствуют, их можно включить через меню: "Report" –"Title/Summary").

Page 40: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

40

Главная часть здесь – Detail. Она будет повторяться для каждой строки. В Page header обычно включают шапку таблицы, в Page footer можно поместить номер страницы и дату, они будут повторяться на

каждой странице.

Title содержит обычно заголовок отчета, в Summary помещают итоговые данные.

В отчетах можно размещать такие же элементы, как и в формах,

только не все. Можно использовать текстовые поля, метки, картинки и

элементы оформления: линии, прямоугольники.

Добавим, например, для нашего списка предприятий итоговую

строку, содержащую количество предприятий.

В Summary поместим метку "Итого:" и текстовое поле, связанное с полем таблицы k_firm.firm_num. Затем в окне свойств для этого объекта нажмем кнопку "Calculations…" и выберем функцию Count. Обратите внимание, что в окне свойства этого поля сразу же установлено свойство Reset: End of Report (т.е., обнулять счетчик только по окончании всего отчета).

Для просмотра результатов отчета в режиме проектирования

используйте меню "View" – "Preview", для печати – "Report" – "Run report".

Из вашей программы (например, в обработчике кнопки со

значком принтера из вашей формы) отчет запускается с помощью

команды

REPORT FORM имя_файла_отчета PREVIEW | TO PRINT

Обратите внимание, что после выполнения отчета текущая таблица

находится в состоянии End of File. Если по логике вашей программы это состояние является ошибочным, следует его обработать

(переместить указатель в таблице).

Рассмотрим пример более сложного отчета. Пусть, например, мы

хотим получить список всех договоров, сгруппированных по их

кураторам. (Единственная проблема здесь в том, что данные для

отчета должны быть уже отсортированы по признаку группировки).

Изменим представление k_contract – добавим условие ORDER BY staff_name. Откроем представление k_contract и создадим заготовку отчета.

Теперь добавим условие группировки – "Report" – "Data Grouping", создадим новую группировку по полю

Page 41: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

41

k_contract.staff_name. В шаблоне отчета появились две новые области – "Group header" и "Group footer". Перетащим текстовое поле staff_name в заголовок группы, а в Group footer поместим итоговое поле, содержащее количество договоров у данного сотрудника. Это

итоговое поле будем создавать так же, как и в предыдущем примере.

Обратим внимание, что в окне свойства этого поля сразу же

установлено свойство Reset: k_contract.staff_name (т.е., обнулять счетчик по окончании группы).

Дата договора выдается в формате дата+время. Это слишком

громоздко, поэтому отредактируем текстовое поле. К полю

contract_date применим функцию TTOD (преобразовать формат TIME (дата+время) в формат DATE (дата)).

Задание 12

Создайте несколько отчетов для вашей базы данных.

Page 42: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

42

Меню Меню в FoxPro создается в конструкторе меню. Файлы с

описанием меню имеют расширение .MNX, .MNT, с кодом меню – .MPR.

Каждый пункт меню имеет название.

В названии пункта следует сразу же задать горячую клавишу (при

запуске меню она подчеркнута, а при нажатии клавиши с этой буквой

пункт меню активизируется). По умолчанию первая буква пункта

меню считается горячей клавишей, а русские буквы Fox не понимает и при запуске меню будет выдавать ошибки. Выходов здесь несколько.

• Можно названия пунктов меню начинать с цифр: 1.Просмотр 2.Редактирование 3.Справочники и т.п. (не очень-то красивое решение).

• Можно в качестве первой буквы набирать латинскую (для пункта

Просмотр не годится). • Наконец, можно задать любую горячую клавишу с помощью

символов \< и латинских букв, например, Прос\<мотр. Пункт меню с названием \- создает разделитель.

Для каждого пункта меню можно задать соответствующую

реакцию:

• Command – выполнение отдельной команды FoxPro (например, DO FORM имя_формы, или DO имя_процедуры);

• Pad name – выполнение пункта стандартного меню;

Page 43: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

43

• Procedure – выполнение процедуры (имя процедуры создается автоматически);

• Submenu – активизация подменю.

Для меню можно и нужно задать код, который будет

выполняться до и после активизации меню: View – General options. Секция Setup представляет собой код, который выполняется до активизации меню, секция Cleanup – после активизации.

В Setup обычно помещают разнообразные команды

инициализации приложения. Например, команды установки

параметров SET. В любом случае, полезно выполнить следующие

команды: && не показывать пометки на удаление:

SET DELETED ON

&& установить немецкий формат даты SET DATE GERMAN

&& задать свой заголовок приложения _SCREEN.Caption="Заголовок приложения"

&& открыть базу данных OPEN DATABASE имя_моей_базы_данных

В Cleanup обязательно нужно поместить команду, которая после активизации меню сразу же запускает цикл обработки сообщений:

READ EVENTS

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

следующую функцию и назначить ее на пункт меню "Выход":

FUNC vixod

&& завершить цикл обработки сообщений CLEAR EVENTS

&& восстановить системное меню SET SYSMENU TO DEFAULT

&& закрыть всё (кроме БД) CLOSE ALL

&& закрыть БД CLOSE DATABASE

&& выйти из приложения и вернуться в среду FoxPro CANCEL

Page 44: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

44

Наконец, после создания меню можно сгенерировать его код:

Menu – Generate. При этом создается файл с расширением .MPR. Откройте его и посмотрите, как выглядит код вашего меню. Запускать

на выполнение можно именно этот файл. При изменении меню в

режиме конструктора его код автоматически не генерируется! При перестройке проекта (в окне проекта кнопка Build… - Rebuild project) меню генерируется автоматически.

Задание 13

Создайте меню для вашего приложения. Оно должно содержать

по крайней мере пункты для редактирования всех ваших таблиц и

пункт выхода (можете включить также пункты для отчетов и других

возможностей – поиска и пр., если вы успеете их разработать).

Page 45: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

45

ЧАсто задаваемые ВОпросы

Как <сделать что-либо>

Вопрос: Как вызвать хранимую процедуру SQL server из FoxPro?

Ответ: Пусть, например, мы хотим вызвать процедуру распродажи clearance:

&& подключаемся к серверу через источник данных c=SQLCONNECT("kontora",.t.) && выполняем процедуру SQLEXEC(c,"exec clearance 10") && отключаемся от сервера SQLDISCONNECT(c)

Вопрос: Как отфильтровать данные в представлении по какому-либо условию?

Ответ: Следует использовать команду SET FILTER TO условие

Например: Отфильтровать договоры по номеру предприятия, как на рисунке:

В методе Init второй формы следует задать команду: SET FILTER TO k_contract.firm_num=k_firm.firm_num

Page 46: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

46

(Здесь также предполагается, что открытие и закрытие представлений

происходит автоматически, а формы являются модальными).

Вопрос: Как распечатать текущее значение переменной для отладки в программе?

Ответ: Удобнее всего использовать команду WAIT WINDOW строка

Например: Распечатать код организации (числовой тип) и название (символьный тип): WAIT WINDOW 'код=' + STR(kod_firm) + ' название='+naz_firm

Окно сообщения серого цвета будет показано в правом верхнем углу экрана. Не забывайте преобразовывать несимвольные данные к

символьному типу!

Вопрос: Как отсортировать данные в удаленном

представлении?

Ответ: Во-первых, можно задать параметр ORDER BY при формировании представления. Если же вы хотите

предусмотреть возможность сортировки, например, при

щелчке по заголовку столбца в Grid'е, то используйте индексы. Для

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

индекс командой INDEX ON. Только учтите, что при повторном

запросе данных с сервера этот индекс нужно будет перестраивать

заново.

Почему <не получается сделать что-либо>

Вопрос: Почему после выхода из моей программы на экране остается мое меню, а системного меню нет?

Ответ: Для того чтобы увидеть системное меню, выполните команду SET SYSMENU TO DEFAULT

Вопрос: Я набираю в поле даты значение 31/12/02, а мне выдается сообщение Invalid Date. Почему?

Ответ: По умолчанию в FoxPro установлен американский формат даты: MM/DD/YY. Установите привычный для нас формат DD.MM.YY командой SET DATE GERMAN. Не помешает

Page 47: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

47

включить эту команду в секцию SETUP вашего меню.

Вопрос: Я запускаю одну форму из другой формы (вариант – запускаю форму из моего меню), а мне выдается сообщение, что файл с формой

не найден, хотя я точно знаю, что он есть в том же каталоге. Почему?

Ответ: Ваш каталог не установлен в качестве рабочего каталога. Можете выполнить в командном окне команду SET DEFAULT TO вашКаталог

Можете запустить вашу программу из меню Fox'а: Program – Do – ИмяПрограммы (или ИмяФормы), тогда SET DEFAULT выполнится автоматически.

Только не пытайтесь включить команду SET DEFAULT в текст вашей

программы – это очень плохое решение, потому что при переносе

программы с компьютера на компьютер и даже из каталога в каталог

придется это назначение корректировать. Кстати, для EXE-файла такая проблема существовать не будет, так как текущий каталог

назначается автоматически в качестве рабочего каталога (можно

изменить это назначение на ярлыке программы).

Вопрос: Я выполняю команду SET FILTER, а данные не

фильтруются. Почему?

Ответ: Не забывайте "оживить" фильтр с помощью любой команды навигации в таблице, например, GO TOP.

Вопрос: Я добавляю новую строку в таблицу, в которой включен фильтр, а строка не добавляется. Почему?

Ответ: Абсолютно закономерно. Фильтр содержит какое-то условие, по которому отбираются данные. Вставляемая строка

пустая и, скорее всего, для нее это условие не выполняется, и она сразу

после вставки оказывается за пределами фильтра. Поэтому перед

вставкой строки фильтр нужно отключить (командой SET FILTER TO

без параметров), вставить строку, проинициализировать поля,

входящие в условие фильтра, затем снова включить фильтр.

Вопрос: Я обновляю значения текстовых полей

(радиокнопок, флажков) в обработчике события, а на форме

они не обновляются. Почему?

Page 48: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

48

Ответ: Не забывайте обновлять содержимое формы, например, вызовом функции thisform.refresh().

Вопрос: Я изменяю данные в удаленном представлении, а на сервере изменений нет. Почему?

Ответ: Не забывайте устанавливать параметры обновления на закладке Update Criteria в удаленном представлении.

Необходимо указать ключевые поля, обновляемые поля и включить

флажок "Send SQL Updates". Если представление состоит из нескольких таблиц, возможно, его (или некоторые его поля) обновлять

нельзя – это зависит от того, может ли сервер однозначно определить,

в какую строку какой таблицы вносить изменения – если не может,

представление будет необновляемым.

Вопрос: Я создаю меню с помощью построителя меню, запускаю его, а оно выдает ошибки. Почему?

Ответ: Если вы называете пункты меню русскими словами, возникает следующая ситуация. По умолчанию первая буква

пункта меню считается горячей клавишей (при запуске меню

она подчеркнута, а при нажатии клавиши с этой буквой пункт меню

активизируется), а русские буквы Fox не понимает. Выходов здесь несколько.

• Можно названия пунктов меню начинать с цифр: 1.Просмотр 2.Редактирование 3.Справочники и т.п. (не очень-то красивое решение).

• Можно в качестве первой буквы набирать латинскую (для пункта

Просмотр не годится). • Наконец, можно задать любую горячую клавишу с помощью

символов \<, например, Прос\<мотр.

Вопрос: Почему выдается следующее окно с ошибкой, и что делать в этом случае?

Page 49: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

49

Ответ: Такое окно выдается в том случае, если измененные данные были отправлены на сервер, а сервер их по какой-то причине отверг.

Например, было нарушено ограничение первичного ключа или

внешнего ключа. В этом случае следует отменить сделанные

изменения – в командном окне выполнить команду TABLEREVERT()

для текущей рабочей области.

Что такое <некоторый термин>

Вопрос: Что такое "рабочая область" и зачем она нужна? Ответ: В FoxPro нельзя обратиться напрямую к таблице или представлению. Сначала их нужно открыть. Команда USE

открывает таблицу или представление в некоторой рабочей

области, по умолчанию – в текущей (при этом открытая ранее

в этой рабочей области таблица закрывается!). Чтобы открыть таблицу

в свободной рабочей области, используйте команду USE таблица IN 0

При открытии таблицы рабочая область получает псевдоним (по умолчанию он совпадает с именем таблицы). Среди всех рабочих

областей только одна в каждый момент времени является текущей.

Для перехода в другую рабочую область выполняйте команду

SELECT псевдоним

(не путайте c SQL-командой SELECT!). Команда USE без параметров закрывает таблицу в текущей рабочей области.

Не забывайте! Не забывайте перед выполнением какой-либо операции с таблицей – APPEND, REPLACE, SET FILTER и т.п., перейти в нужную рабочую

область, т.е., выполнить команду SELECT псевдонимТаблицы

Не забывайте в обработчиках событий, которые изменяют внешний вид формы (например, кнопки листания – перемещают по строкам

таблицы) обновлять содержимое формы, например, командой thisform.refresh()

Page 50: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

50

Не забывайте перед выполнением команды APPEND BLANK убрать

фильтр, если он есть. После добавления строки и инициализации

полей, по которым таблица фильтруется, фильтр можно восстановить.

Это самое надежное выражение для сравнения двух символьных строк на точное совпадение (используются два символа '='): ALLTRIM(строка1)==ALLTRIM(строка2)

Не забывайте в секции CLEAN UP меню первой же строкой записать следующий текст: READ EVENTS

Эта команда запускает бесконечный цикл ожидания событий. Без нее

ваша программа, откомпилированная в виде EXE-модуля, не будет работать.

Page 51: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

51

Приложение 1: работа с подтипами

Рассмотрим создание интерфейса для подтипов. Пусть у нас есть

надтип (предприятие) и два подтипа (физическое лицо и юридическое

лицо).

Создаем таблицы:

CREATE TABLE k_firm (firm_num NUMERIC(6) IDENTITY PRIMARY KEY, firm_name VARCHAR(100) NOT NULL, firm_addr VARCHAR(100), firm_phone NUMERIC(7) ) CREATE TABLE k_fiz ( firm_num NUMERIC(6) PRIMARY KEY REFERENCES k_firm(firm_num), passport CHAR(10) NOT NULL ) CREATE TABLE k_ur ( firm_num NUMERIC(6) PRIMARY KEY REFERENCES k_firm(firm_num), INN CHAR(20) NOT NULL )

Обратите внимание, что у подтипов первичный ключ firm_num является одновременно и внешним ключом, но не имеет ограничения

identity. Для создания новых строк в этих таблицах создадим

специальные хранимые процедуры. Например, следующая процедура

предназначена для создания физического лица: она создает

Page 52: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

52

одновременно строку в таблице "Предприятия" и строку в таблице

"Физическое лицо" с тем же самым первичным ключом (получаем его

с помощью глобальной переменной @@IDENTITY).

CREATE PROCEDURE add_fiz @firm_name VARCHAR(100), @firm_addr VARCHAR(100), @firm_phone NUMERIC(7), @passport CHAR(10) AS INSERT INTO k_firm (firm_name, firm_addr, firm_phone) VALUES (@firm_name, @firm_addr, @firm_phone) INSERT INTO k_fiz (firm_num, passport) VALUES (@@IDENTITY, @passport) GO

Теперь создадим удаленное представление на основе надтипа и

одного из подтипов:

Выберем все столбцы, не забудем указать условие связи и

пометим ключевые и обновляемые поля, как на рисунке:

В обработчике кнопки "New" добавим переменную – что-то вроде флажка, означающего, что мы выполняем команду Insert (Tag –

это некое строковое свойство формы). thisform.Tag='I'

В обработчике кнопки "Save" добавляем следующий код: IF thisform.Tag='I' && если мы добавляем новую строку && подключаемся к серверу через источник данных

Page 53: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

53

c=SQLCONNECT("kontora",.t.) strexec="EXEC add_fiz '"+; ALLTRIM(this.Parent.txtFirm_name.Value)+"','"+; ALLTRIM(this.Parent.txtfirm_addr.Value)+"',"+; ALLTRIM(STR(this.Parent.txtfirm_phone.Value))+",'"+; ALLTRIM(this.Parent.txtPassport.Value)+"'" && выполняем процедуру, которая добавляет новые строки SQLEXEC(c,strexec) && отключаемся от сервера SQLDISCONNECT(c) && отменяем команду APPEND BLANK, чтобы строка && не добавилась еще раз TABLEREVERT() && выполняем запрос данных с сервера REQUERY() ELSE ... && если мы обновляли старую строку – && код остается прежним ENDIF

Обратите внимание, что строковые параметры хранимой

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

ошибка.

Для удаления строки также следует написать и вызвать

хранимую процедуру, которая сначала удаляет строку из таблицы

"Физическое лицо", а затем из таблицы "Фирма".

Приложение 2: VFP и COM-технология - выгрузка

данных в EXCEL

Технология COM (Component Object Model) была разработана фирмой Microsoft и представляет собой логическое развитие

технологии OLE (Object Linking Embedding). COM является стандартом для взаимодействия между приложениями и позволяет,

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

были написаны на одном языке. Например, программа на FoxPro может создать по шаблону Word-документ и записать в него данные

или же выгрузить данные в Excel и нарисовать диаграмму.

Вызываемое приложение при этом называется COM-сервером, а вызывающее – COM-клиентом.

Page 54: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

54

Рассмотрим, как можно использовать FoxPro в качестве COM-клиента.

Для создания объекта, к которому будет обращаться FoxPro как COM-клиент, используется вам функция CREATEOBJECT:

<объект> = CREATEOBJECT(<тип объекта>)

При этом <тип объекта> обязательно должен быть

зарегистрирован в реестре WINDOWS (например, «Word.Application»),

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

установить параметр SET OLEOBJECT ON. Если в реестре будет найдено соответствующее описание, то функция создаст объект и

возвратит ссылку на него.

Итак, объект готов. Что же с ним делать дальше? Ответ на этот

вопрос зависит от того, какой именно объект вы создали. Разные

объекты имеют разные свойства и могут выполнять разные действия.

Информация об этом имеется в справочной системе по объектной

модели того или иного приложения.

В следующем примере мы выгружаем всё содержимое прайс-

листа в файл EXCEL: SET OLEOBJECT ON myExcel=CREATEOBJECT("Excel.Application") IF ISNULL(MyExcel) WAIT WINDOW "Объект Excel не найден!!" RETURN ENDIF MyExcel.visible=.t. && делаем объект видимым WITH MyExcel .workbooks.add && создаем новую книгу m=1 && это счётчик строк SCAN && перебираем последовательно все строки таблицы .activesheet.cells(m, 1).select .activecell.value=price_num .activesheet.cells(m, 2).select .activecell.value=price_name .activesheet.cells(m, 3).select .activecell.value=price_sum m=m+1 ENDSCAN ENDWITH GO TOP

Page 55: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

Практикум по курсу «Базы данных»

55

Полученный результат в EXCEL:

Этот файл теперь можно сохранить, распечатать, отправить по почте и

т.п.

Page 56: Практикум по курсу “Базы данных”kek.ksu.ru/eos/bd/Fox.pdf · среду, специально ... odbc позволяет установить ... языками

О.В. Пинягина

56

Литература

1. Базиян М. и др. Использование Visual FoxPro 6.0. Специальное

издание. // К.; М.; СПб.; Издательский дом "Вильямс", 1999.

2. Омельченко Л. Самоучитель Visual FoxPro 8.0 // СПб: BHV-CПб,

2003.

3. Попов А. Создание приложений для FoxPro 2.5/2.6 в DOS и

Windows // М.: ДЕСС, 2001.