- •Московский авиационный институт (Государственный технический университет)
- •Управление данными
- •3 Семестр
- •Лекция 1
- •Лекция 2
- •Первичный ключ
- •Лекция 3
- •Лекция 4.
- •Лекция 5. Базисные средства манипулирования реляционными данными
- •Лекция № 6
- •Лекция 7 Команды управления ходом выполнения программы:
- •Команды удаления данных
- •Команды изменения данных
- •Функции vfp
- •Лекция 8 Элементы объектно-ориентированного программирования в vfp
Лекция № 6
Основные компоненты, входящие в состав приложений VFP
Приложение на VFP состоит из следующих компонентов:
- все описание приложения храниться в специальном файле проекта (расширение PJX)
В VFP принципиально изменена система организации данных. Теперь она приблизилась к теоретическим основам реляционной модели и позволяет более естественно выполнять операции реляционной алгебры.
Основная единица хранения данных — это таблица, в столбцах и строках которой содержатся данные, как это и было раньше в dbf-файле. Таблица сохранила расширение файла dbf и имеет прямую совместимость со “старыми” dbf-файлами. Таблицы объединяются в базу данных (БД), в которой можно описать все связи, устанавливаемые между полями отдельных таблиц, правила проверки, определяющие реакцию системы на вносимые изменения, добавление или удаление данных и правила проверки целостности данных в БД. Файлы баз данных имеют расширение dbc и при открытии автоматически поддерживают все перечисленные установки для входящих в нее таблиц. При необходимости мы можем создать и таблицы, не входящие в БД, — свободные таблицы.
VFP5 обеспечивает поддержку значений NULL и выполнение операций с этими данными в соответствии со стандартом ANSI. Это облегчает задачу представления неизвестных данных и взаимодействие с базами данных SQL, которые могут содержать такие типы значений.
Для таблиц, входящих в БД, могут быть созданы следующие типы индексов, первые два из которых в FoxPro появились впервые:
• Первичный (Primary) — обеспечивает наличие только уникальных данных в поле, по которому построен. В таблице может быть только один первичный индекс.
• Кандидат (Candidate) — аналогичен первичному, но позволяет иметь несколько индексов этого типа для одной таблицы независимо от того, включена она в БД или нет.
• Регулярный (Regular) — обычный тип индекса, поддерживаемый в предыдущих версиях.
• Уникальный (Uniq) — при наличии одинаковых значении в поле, при активизации этого индекса обеспечивается вывод только уникальных значений. Этот тип индекса включен для поддержки совместимости.
Таким образом, база данных в VFP — это основной элемент организации данных, который помимо формирования структуры представления информации выполняет функции словаря данных за счет поддержки следующих функциональных возможностей:
• допускаются длинные имена таблиц;
• каждому полю и таблице можно давать комментарии;
• позволяется задавать длинные имена полей;
• для полей помимо идентификаторов появились заголовки, которые могут использоваться как в окне Browse, так и в качестве заголовков для колонок в объекте Grid;
• введены значения по умолчанию для полей;
• добавлены два новых типа индексов: первичный и кандидат;
• предусмотрены правила проверки для полей и записей при изменении и вводе новых данных;
• имеются триггеры для поддержания целостности данных;
• поддерживаются постоянные связи между таблицами, размещенными в БД;
• имеются процедуры БД для описания сложных условий правил проверки;
• появились соединения с внешними источниками данных;
• поддерживаются локальные и внешние просмотры.
Все объекты хранятся в таблицах(за исключением файлов PRG и TXT)
Контейнерный файл БД (DBC) – содержит информацию о всех остальных таблицах входящих в БД. (Словарь БД) А также о различных ограничениях, значениях по умолчанию, триггерах,
Индексах, связях между таблицами, и тд.
Интерфейс управляемый событиями.
Основные элементы языка программирования Visual FoxPro.
- типы данных;
- переменные и массивы;
-рабочие области;
-операторы поиска и перемещения по записям;
-операторы циклов;
-управляющие операторы;
Аналогично многим языкам высокого уровня язык Visual Foxpro работает с переменными некоторого фиксированного набора типов. Т.К. основная цель языка VSFP - обработка данных из таблиц то, соответственно, и типы переменных совпадают с возможными типами полей в таблицах VFP. Имена полей могут содержать до 254 символов, но не должны содержать пробелы, не могут начинаться с цифры и включать специальные символы кроме символов подчеркивания.
Поля могут быть следующих типов:
ТИП |
ОБОЗНАЧЕНИЕ |
ДЛИНА В БАЙТАХ |
Character |
C |
1-254 |
Character(binary) |
C |
1-254 |
Memo |
M |
Не ограничена |
Memo(binary) |
M |
Не ограничена |
Numeric |
N |
1-20 цифр, 0-19 дробных деся-тичных знаков (хранятся значения от -0.99E19 до 0.99E20) Целые числа храняться в этом же формате. |
Float |
F |
20 цифр, 0-19 дробных десятичных знаков (хранятся значения от -0.99E19 до 0.99E20) |
Double |
B |
8 (фиксированная длина, допускаются значения от -4.9Е-324 до 1.8Е308) |
Integer |
I |
4 (фиксированная длина, допускаются значения от -2 147 483 647 до 2 147 483 647) |
Currenсy |
Y |
8 (фиксированная длина, допускаются значения от -9.2Е14 до 9.2Е14) |
Date |
D |
8 (фиксированная длина, допускаются значения от 01.01.100 до 31.12.9999) |
DateTime |
T |
8 (фиксированная длина, допускаются значения от 01.01.100 до 31.12.9999 плюс время от 00.00.00 до 23.59.59) |
Logical |
L |
1 (фиксированная длина) |
General |
G |
Не ограничена |
Переменные в VSFP не являюся жестко типизованными - тип переменной определяется последним присвоенным значением.
Переменные создаются либо описанием операторами Public, Private, либо оператором присваивания.
В VSFP разрешается работа с одномерными и двумерными массивами переменных. Для этого они должны быть описаны специальной командой:
DECLARE/DIMENSION <переменная> (<вырN1>[,<N2>])
[,<переменная> (<вырN1>[,<N2>])]
Нумерация элементов массива начинается с 1.
Сразу после описания все элементы массива получают тип LOGICAL и значение .F.
Тип каждого отдельного элемента определяется результатом последней операции присваивания.
Разрешается повторное описание существующего массива без потери имеющихся данных.
При обращении к элементам массива разрешено использовать круглые или квадратные скобки.
VSFP Может одновременно работать с большим количеством таблиц. Каждая таблица открывается в так называемой рабочей области, открывая новую таблицу Вы либо выбираете определенную рабочую область командой SELECT, либо таблица будет открыта в текущей рабочей области. Всего VSFP имеет 32767 рабочих областей. При запуске по умолчанию активизируется рабочая область 1. Таблица в текущей области открывается командой:
USE <имя таблицы>.
Открытие таблицы в конкретной области:
USE <имя таблицы> IN <номер рабочей области>.
Открытие таблицы в свободной области с наименьшим номером:
USE <имя таблицы> IN 0.
Открытой таблице VSFP назначает псевдоним (Alias) - имя длиной до 10 символов, служащее для ссылок на эту таблицу:
USE <имя таблицы> IN 0 ALIAS <псевдоним>.
Дополнение:
Над переменными и полями таблиц могут выполняться следующие операции:
Математические(перечислены в порядке приоритетов):
** или ^ - возведение в степень;
* - умножение, / - деление;
+ - сложение, - -вычитание;
Логические (в порядке приоритетов):
NOT - НЕ(другая форма - !);
AND - логическое И;
OR - логическое ИЛИ;
Знаки логических операций (кроме !) окаймляются точками или пробелами.
Отношения:
< - меньше, > - больше, = - равно, # - не равно,
<= - не больше, >= - не меньше.
Знаки отношения применимы как к числовым выражениям, так и к датам и символьным выражениям.
Если сравниваются символьные строки разной длины, сравнение выполняется по длине второго выражения; Остаток левого операнда, превышающий длину правого операнда, игнорируется. Существуют операции отношения только для символьных выражений:
$ - сравнение символьных строк. Операция A$B даст значение .T. если A идентично B,
либо A входит в B, и .F. в противном случае.
== - сравнение на полное тождество символьных строк и по длине, и по содержанию, включая пробелы.
Сцепления:
+ - соединение двух или более строк в одну;
- то же, но пробелы в конце первой строки помещаются в конец итоговой строки;
Оператор присваивания
<перем>=<выраж>
STORE <выраж> TO <список перем>
Структура команды -
команды ориентированные на обработку файлов БД , в самом общем виде имеют следующий синтаксис:
НАЗВАНИЕ [<границы>] [<список выражений>]
[FOR <условие>] [ WHILE <условие>]
где НАЗВАНИЕ - имя команды;
<границы> - диапазон действия команды
ALL
REST
NEXT N
RECORD N
FOR <условие> - выполнение команды только для записей, отвечающих <условию>
WHILE <условие> - выполнение команды до тех пор, пока не перестанет выполняться условие;
FOR и WHILE могут присутствовать в команде одновременно. В этом случае WHILE условие имеет преимущество перед FOR условием.
Порядок следования элементов команды - произвольный. По умолчанию, если отсутствуют <границы> и <условия > , команда выполняется только над текущей записью или над всей таблицей в целом.
Рассмотрим команды перемещения указателя текущей записи в таблице. (знакомые по практическим занятиям;) Запись на которой находиться указатель, является текущей, и только к ней возможен непосредственный доступ. Команды перемещения по записям:
GO TOP [IN <ВырN/ВырС>] - переход к первой записи таблицы;[в указанной области];
GO BOTTOM [IN <ВырN/ВырС>] - переход к последней записи;
GO <ВырN> [IN <ВырN/ВырС>] - переход к записи с номером <ВырN>;
SKIP <ВырN> [IN <ВырN/ВырС>] - переход к записи, отстоящей от текущей на <ВырN> записей; В данной команде <ВырN> может быть отрицательным, что означает движение указателя назад;
SKIP - без параметра аналогично SKIP 1;
Для контроля положения указателя и наличия записей в таблице предусмотрены функции:
RECNO([ <ВырN/ВырС>]) - возвращает номер текущей записи;
RECCOUNT([ <ВырN/ВырС>]) - Возвращает общее число записей в таблице, включая записи, помеченные к удалению;
EOF([ <ВырN/ВырС>]) - Возвращает .T. если достигнут конец таблицы, если нет возвращает .F.
ВOF([ <ВырN/ВырС>]) - Возвращает .T. если достигнуто начало таблицы, если нет возвращает .F.
Поиск данных в таблицах
Команда LOCATE осуществляет последовательный поиск одной самой первой записи в таблице, удовлетворяющей заданному FOR - условию, среди записей , находящихся в заданных границах, и до тех пор, пока соблюдается WHILE - условие(если есть);
LOCATE [FOR <условие>] [<границы>] [ WHILE <условие>]
Если границы и while - условие отсутствуют, поиск ведется во всей таблице, начиная с первой записи; Если запись найдена функция FOUND() - оценивающая результат поиска, возвращает .T.
указатель записей устанавливается на эту запись. При неудачном поиске FOUND()=. F. EOF() = .T.;
Продолжение поиска начатого командой LOCATE возможно с использованием команды:
CONTINUE
Пример использования команды LOCATE
Из таблицы заказов выбираются заказчики находящиеся в Москве и подсчитывается их число.
USE customer && Open Customer table
SET TALK OFF
STORE 0 TO gnCount
LOCATE FOR ALLTRIM(UPPER(customer.city)) = 'Москва'
DO WHILE FOUND( )
gnCount = gnCount + 1
? company
CONTINUE
ENDDO
? 'Всего заказчиков в Москве: '+ LTRIM(STR(gnCount))
SEEK <выражение>
Осуществляет поиск в таблице первой записи такой, что значение индекса совпадает с указанным выражением, указатель текущей записи устанавливается на найденную запись.
SEEK eExpression
[ORDER nIndexNumber | IDXIndexFileName
| [TAG] TagName [OF CDXFileName]
[ASCENDING | DESCENDING]]
[IN nWorkArea | cTableAlias]
Циклы:
DO WHILE <условие>
<команды>
[exit]
[loop]
EndDO
<команды > выполняются когда <условие> истинно.
[EXIT] - Прерывает выполнение цикла(управление передается оператору следующему за enddo, endfor, endscan)
[LOOP] - переход к началу цикла(на проверку условия)
Пример DO WHILE ... ENDDO
В примере суммируется количество товаров на складе цена которых превышает 20 рублей
USE products && Opens Products table
SET TALK OFF
gnStockTot = 0
DO WHILE .T. && Begins loop
IF EOF( )
EXIT
ENDIF
IF unit_price < 20
SKIP
LOOP
ENDIF
gnStockTot = gnStockTot + in_stock
SKIP
ENDDO && Ends loop
CLEAR
? 'Всего товаров стоимостью больше 20 руб.:'
?? gnStockTot
Цикл FOR
FOR <перем>=<вырN1> TO <вырN2> [STEP <вырN3>]
<команды>
[exit]
[loop]
EndFOR
<Перем> - используется в качестве управляющего параметра цикла для которого N1 является начальным значением, N2- конечным, а N3 шагом изменения переменной. По умолчанию шаг изменения параметра цикла =1.
[EXIT] - Прерывает выполнение цикла(управление передается оператору следующему за enddo, endfor, endscan)
[LOOP] - переход к началу цикла(на проверку условия)
Пример FOR ... ENDFOR
* Пример 1
CLEAR
FOR gnCount = 1 TO 10
? gnCount
ENDFOR
* Пример 2
SET TALK OFF
CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE customer && Opens Customer table
STORE 2 TO gnI && Initial value
STORE 10 TO gnJ && Final value
STORE 2 TO K && Step value
FOR gnCount = gnI TO gnJ STEP K
GOTO gnCount && Move record pointer
DISPLAY company && Display company name
ENDFOR
Цикл SCAN
Просматривает таблицу в текущей рабочей области и выполняет команды для каждой записи которая удовлетворяет условиям.
SCAN [<границы>] [FOR <условие>] [ WHILE <условие>]
<команды>
[exit]
[loop]
ENDSCAN
[EXIT] - Прерывает выполнение цикла(управление передается оператору следующему за enddo, endfor, endscan)
[LOOP] - переход к началу цикла(на проверку условия)
Контрольные вопросы.
Перечислите основные компоненты входящие в состав проекта Visual Foxpro.
Какие типы данных могут использоваться в таблицах Visual Foxpro?
Какой оператор используется для описания массивов?
Перечислите операторы организации циклов.
