Объектное программирование в Microsoft Visual Fo

Download Report

Transcript Объектное программирование в Microsoft Visual Fo

SQL в Visual FoxPro® 6.0
(основные понятия)
Дроздов Михаил
Компания «ИВС Софт»
My Page: http://vfpdmur.narod.ru/
ICS Page: http://ics.perm.ru/
mailto:[email protected]
Что такое SQL
• SQL (Structured Query Language) - язык
структурированных запросов: является универсальным
языком для создания, модификаций и управления
данными в реляционных базах данных.
• Историческая справка:
– предложен в 1970 И.Ф. Коддом (E.F.Codd) в исследовательской
лаборатории IBM
– начало 80-х Oracle Relational Technology создаёт СУБД на
основе SQL
– в 1989 уже существует более 25 SQL-подобных СУБД
– в 1983 выходит ANSI-стандарт (American National Standards
Institute) SQL, а в 1992 расширенный стандарт (SQL2 или SQL92). Все промышленные версии стараются поддерживать ANSISQL, но не обеспечиваю его полностью, однако, каждая из них
имеет свои расширения, стремясь покрыть требуемые
функциональные возможности.
Общие требования к реляционной СУБД
• Вся информация представлена в виде таблиц.
• Поддерживать логическую структуру данных независимо от их
физического представления.
• Использовать язык высокого уровня для работы со структурой
данных, получения данных и их изменения.
• Обеспечивать теоретико-множественные операции над данными,
такие как объединение, пересечение и дополнение.
• Поддерживать виртуальные таблицы, как альтернативный способ
получения данных.
• Позволять различать неопределённые (пропущенные) данные.
• Обеспечивать механизмы для
–
–
–
–
поддержки реляционной целостности,
авторизованного доступа,
транзакционности изменений,
восстановления данных.
Данные в реляционной СУБД
Вся информация представлена в виде таблиц:
Отношение (relation), таблица (table), файл (file)
Ячейка (cell), адрес (addres), значение атрибута (alltibute value)
Кортеж (tuple), строка (row), запись (record)
Атрибут (attribute), столбец (column), поле (field)
Структура СУБД
• В реляционных СУБД обычно существует два типа таблиц:
– пользовательские таблицы (user tables)
– системные таблицы (system tables).
В VFP системные таблицы в виде одной единственной таблицыфайла с расширением dbc. Обычно также системные таблицы
объединяются в системную базу данных (в MS SQL Server
например, это база Master)
• Системные таблицы (известные также под названием системный
каталог [system catalog]) содержат описания баз(ы) данных. Доступ
к этим таблицам обычно открыт и осуществляется либо через
системные процедуры-функции либо непосредственно.
• Независимость данных в реляционных СУБД обеспечивается на
двух уровнях:
– Физическая независимость - означает независимость от способа
физического хранения данных.
– Логическая независимость - означает, что правильное
функционирование не зависит от изменений, вносимых в структуру
пользовательских данных.
Язык программирования
Единый язык высокого уровня, позволяющий:
• описывать данные (data definition)
• манипулировать данными (data manipulation)
• вести администрирование данных (data administration)
Любая операция осуществляется посредством:
• операторов (statement)
• команд (command)
Манипулирование с данными различается на
• выборку данных (data retrieval) или запросы к данным (data queries)
• модификация данных (data modification)
Язык SQL является непроцедурным языком (nonprocedural language)
Создание объектов базы данных
• CREATE DATABASE [DatabaseName | ?]
• CREAE TABLE | DBF TableName1 [NAME LongTableName] [FREE]
(FieldName1 FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
• INDEX ON eExpression
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
TO IDXFileName | TAG TagName
[PRIMARY KEY | UNIQUE]
[OF CDXFileName]
[REFERENCES TableName2 [TAG TagName1]]
[FOR lExpression]
[NOCPTRANS]
[COMPACT]
[, FieldName2 ...]
[ASCENDING | DESCENDING]
[, PRIMARY KEY eExpression2 TAG TagName2
[UNIQUE | CANDIDATE]
|, UNIQUE eExpression3 TAG TagName3]
[ADDITIVE]
[, FOREIGN KEY eExpression4 TAG TagName4 [NODUP]
REFERENCES TableName3 [TAG TagName5]]
• CREATE TRIGGER ON TableName
[, CHECK lExpression2 [ERROR cMessageText2]])
FOR DELETE | INSERT | UPDATE AS lExpression
| FROM ARRAY ArrayName
• CREATE CONNECTION [ConnectionName | ?]
[DATASOURCE cDataSourceName]
[USERID cUserID] [PASSWORD cPassWord]
[DATABASE cDatabaseName]
| CONNSTRING cConnectionString]
• CREATE SQL VIEW [ViewName ] [REMOTE]
[CONNECTION ConnectionName [SHARE]
| CONNECTION DataSourceName]
[AS SQLSELECTStatement]
• CREATE CURSOR alias_name
(fname1 type [(precision [, scale])
[NULL | NOT NULL]
[CHECK lExpression [ERROR cMessageText]]
[DEFAULT eExpression]
[UNIQUE]
[NOCPTRANS]]
[, fname2 ...])
| FROM ARRAY ArrayName
Изменения объектов базы данных
• ADD TABLE TableName | ?
[NAME LongTableName]
ALTER TABLE TableName1
ADD | ALTER [COLUMN] FieldName1
FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
[NOVALIDATE]
• MODIFY PROCEDURE
• Gendbc.prg
• COMPILE DATABASE DatabaseName
-orALTER TABLE TableName1
ALTER [COLUMN] FieldName2
[NULL | NOT NULL]
[SET DEFAULT eExpression2]
[SET CHECK lExpression2 [ERROR cMessageText2]]
[DROP DEFAULT]
[DROP CHECK]
[NOVALIDATE]
-orALTER TABLE TableName1
[DROP [COLUMN] FieldName3]
[SET CHECK lExpression3 [ERROR cMessageText3]]
[DROP CHECK]
[ADD PRIMARY KEY eExpression3 TAG TagName2 [FOR lExpression4]]
[DROP PRIMARY KEY]
[ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]]
[DROP UNIQUE TAG TagName4]
[ADD FOREIGN KEY [eExpression5] TAG TagName4 [FOR lExpression6]
REFERENCES TableName2 [TAG TagName5]]
• VALIDATE DATABASE
[DROP FOREIGN KEY TAG TagName6 [SAVE]]
[RECOVER]
[RENAME COLUMN FieldName4 TO FieldName5]
[NOCONSOLE]
[NOVALIDATE]
[TO PRINTER [PROMPT] | TO FILE FileName]
Удаления объектов базы данных
• DELETE DATABASE DatabaseName | ?
[DELETETABLES] [RECYCLE]
• DELETE CONNECTION ConnectionName
• DELETE TAG TagName1 [OF CDXFileName1]
[, TagName2 [OF CDXFileName2]] ...
-orDELETE TAG ALL [OF CDXFileName]
• DELETE VIEW ViewName
-orDROP VIEW ViewName
• DROP TABLE TableName | FileName | ? [RECYCLE]
• DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE
Добавление изменение и удаление данных из таблиц
• INSERT INTO dbf_name [(fname1 [, fname2, ...])]
VALUES (eExpression1 [, eExpression2, ...])
-orINSERT INTO dbf_name FROM ARRAY ArrayName | FROM MEMVAR
• UPDATE [DatabaseName1!]TableName1
SET Column_Name1 = eExpression1
[, Column_Name2 = eExpression2 ...]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
• DELETE FROM [DatabaseName!]TableName
[WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]
• DELETE
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]
• RECALL
[Scope] [FOR lExpression1] [WHILE lExpression2]
[NOOPTIMIZE] (VFP specific)
Выборка данных
SELECT список_полей
FROM список_таблиц
WHERE условия_на_записи
GROUP BY способ_группировки
HAVING условия_на_группы
ORDER BY способ_сортировки
INTO новая_таблица
SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]]
[Alias.] Select_Item [AS Column_Name]
[, [Alias.] Select_Item [AS Column_Name] ...]
Команда SQL Select
синтаксис
FROM [FORCE]
[DatabaseName!]Table [[AS] Local_Alias]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
DatabaseName!]Table [[AS] Local_Alias]
[ON JoinCondition …]
[[INTO Destination]
| [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT]
| TO SCREEN]]
Destination:
[PREFERENCE PreferenceName]
• ARRAY ArrayName
• CURSOR CursorName [NOFILTER]
[NOCONSOLE]
• DBF | TABLE TableName
[PLAIN]
[DATABASE DatabaseName [NAME LongTableName]]
[NOWAIT]
[WHERE JoinCondition [AND JoinCondition ...]
[AND | OR FilterCondition [AND | OR FilterCondition ...]]]
[GROUP BY GroupColumn [, GroupColumn ...]]
[HAVING FilterCondition]
[UNION [ALL] SELECTCommand]
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]
Order_Item:
• field
• № field
Допустимые форматы FilterCondition
№
1)
2)
3)
Формат
FieldName оп_срав. Expression
FieldName1 оп_срав FieldName2
FieldName оп_срав ALL (Subquery)
4)
FieldName оп_срав ANY | SOME (Subquery)
5)
6)
FieldName [NOT] BETWEEN Start_Range AND
End_Range
[NOT] EXISTS (Subquery)
7)
FieldName [NOT] IN Value_Set
8)
FieldName [NOT] IN (Subquery)
9)
FieldName [NOT] LIKE cExpression
Операция сравнения
=
==
LIKE
<>, !=, #
>
>=
<
<=
Пояснения
Равенство
Точное совпадение
SQL LIKE
Неравенство
Меньше чем
Больше либо равно (не меньше)
Меньше
Меньше либо равно (не больше)
Команда SQL Select
Пример
Payments.amount >= 1000
Сustomer.cust_id = orders.cust_id
Company < ALL (SELECT company FROM
customer WHERE country = "UK")
company < ANY (SELECT company FROM
customer WHERE country = "UK")
customer.postalcode BETWEEN 90000 AND 99999
EXISTS (SELECT * FROM orders WHERE
customer.postalcode = orders.postalcode)
customer.postalcode NOT IN
("98052","98072","98034")
customer.cust_id IN (SELECT orders.cust_id FROM
orders WHERE orders.city="Seattle")
(можно использовать групповые символы % любое множество неизвестных символов _ - один
неизвестный символ)
Select_Item:
• поле таблицы
• строкой (‘№’)
• вычисляемым выражением (ydt_sales*price),
которое может включать UDF
Агрегирующие функции:
Команда
• AVG(Select_Item) среднее значение
• COUNT(Select_Item) количество выбранных записей для поля
• COUNT(*) количество выбранных записей в запросе
• MIN(Select_Item) наименьшее значений поля
• MAX(Select_Item) наибольшее значение поля
• SUM(Select_Item) сумма для числового поля
SQL Select
Нужно иметь ввиду:
• Системная глобальная переменная _TALLY содержит количество записей выбранных в последнем
запросе
• Значение SET FILTER не влияет на запрос
• Подзапрос не может быть вложенным, т.е. снова содержать в себе подзапрос.
• Названия полей должны быть уникальны в списке полей
•
Использование функций: DELETED( ), EOF( ), FOUND( ), RECCOUNT( ) и RECNO( ) может
привести к непредвиденным результатам по причине неопределённости рабочих областей для
таблиц, участвующих в запросе
•
Предложение WHERE накладывает ограничения на строки в то время как HAVING на группы.
WHERE не может применяться к агрегирующим функциям, в то время как HAVING может.
ALL
>ALL(1,2,3)
<ALL(1,2,3)
=ALL(1,2,3)
Результат
>3
<1
=1 или =2 или =3
ANY
>ANY(1,2,3)
<ANY(1,2,3)
=ANY(1,2,3)
Результат
>1
<3
=1 или =2 или =3
Оператор
=ANY(1,2,3)
<>ANY(1,2,3) [!=ANY(1,2,3)]
NOT IN(1,2,3)
Результат
IN(1,2,3)
!=1 или !=2 или !=3
!=1 и !=2 и !=3
Команда SQL Select
Коррелированные и некоррелированные подзапросы:
Некоррелированный:
Select pub_name
from publishers
where pub_id in
(select pub_id
from titles
where type = ‘business’)
Внутренний запрос
«работает» независимо,
передавая результаты
во внешний.
Коррелированный:
Select pub_name
from publishers p
where ‘business’ in
(select type
from titles
where pub_id = p.pub_id)
Внутренний запрос
«работает» каждый раз
только получив результаты
от внешнего.
Технология Rushmore
Технология основана на оптимизации доступа к данным с помощью использования
стандартных VFP-индексов (idx,cdx) и способна резко повысить производительность
операций обработки данных за счёт использования оперативной памяти компьютера.
Способна уменьшить время выполнения многотабличных запросов если даже индекс
создаётся как временный (только на время выполнения запроса).
Кратко: оптимизации подвержены команды, содержащие предложение FOR и когда
используемые условные выражения представлены в терминах определяющих
выражений индексов.
В SQL командах для успешной оптимизации не требуется предварительного открытия
ни таблиц ни индексов. SQL самостоятельно решает вопрос о необходимости тех или
иных индексов и, если они не существуют, создаёт их временными самостоятельно.
Потенциально оптимизируемые команды, содержащие предложение FOR:
•
•
•
•
•
•
•
•
•
•
AVERAGE
BLANK
BROWSE
CALCULATE
CHANGE
COPY TO
COPY TO ARRAY
COUNT
DELETE
DISPLAY
•
•
•
•
•
•
•
•
•
•
EDIT
EXPORT TO
INDEX
JOIN WITH
LABEL
LIST
LOCATE
RECALL
REPLACE
REPLACE FROM ARRAY
•
•
•
•
•
•
•
REPORT
SCAN
SET DELETED
SET FILTER
SORT TO
SUM
TOTAL TO
и SQL-команды:
•
•
•
SELECT
UPDATE
DELETE
•
В предложениях FOR наличие
Технология Rushmore
– ALL и REST - используют,
– NEXT и RECORD -отключает оптимизацию.
•
Поскольку ALL-режим по умолчанию, то отсутствие указанных выше параметров
подразумевает оптимизацию.
Оптимизации отключается для:
– индексов при наличии любого фильтра
– индекса типа UNIQUE
•
•
•
•
все другие типы индексов оптимизируемы.
Для повышения производительность отключайте (SET ORDER TO 0) активные
индексы у таблиц (включенные индексы вынуждают выполнять «двойную
работу»).
Выражения типа: NOT DELETED() или DISCOUNT > 10 не оптимизируются, хотя
оптимизируется например, DELETED() [INDEX ON DELETED() TAG DEL]
Если WHERE(FOR) содержит несколько условий соединённых AND или OR, то
оптимизации подвергается каждое подвыражения, ...и если нашлось хотя бы одно
не оптимизируемое подвыражение при наличии оптимизируемых, то говорят о
частичной оптимизации.
Оптимизация не выполняется:
– если в FOR невозможно выполнить хотя бы частичную оптимизацию.
– в WHILE-выражениях.
– нет достаточно оперативной памяти.
•
•
•
Технология Rushmore
Функция SYS(3054) позволяет контролировать режим оптимизации: None, Partial, Full
Определяя допустима ли оптимизации в FOR-выражениях VFP тратит некоторое время, … и
если Вам известно, что выражения не оптимизируемы, то можно «сэкономить» это время,
отключив оптимизацию посредством параметра NOOPTIMIZE или команды SET OPTIMIZE
OFF
Оптимизация производится над базовым выражением
eIndex relOp eExp
-илиeExpr relOp eIndex
•
где
– eIndex - точное совпадение с индексным выражением
– relOp - операция сравнения: <, >, =, <=, >=, <>, #, ==, или !=, возможно использование
также функций: ISNULL(), BETWEEN(), или INLIST() (или SQL эквивалентов, таких
как IS NULL, и т.д.) Однако, функции ISBLANK() и EMPTY() не оптимизируются.
– eExp - любое выражение, включая переменные и поля таблиц
Если созданы индексы: firstname, custno, UPPER(lastname), and hiredate, каждое из
нижеследующих выражений оптимизируемы:
firstname = "Fred"
custno >= 1000
UPPER(lastname) = "SMITH"
hiredate < {^1997-12-30}
•
Выражение может содержать переменные или функции, вычисляемые до конечных
выражений, например, нижеследующая последовательность команд приводит к
оптимизации:
STORE "WASHINGTON AVENUE" TO cVar
ADDR = cVar
ADDR = SUBSTR(cVar,8,3)
Доступ к внешним данным через ODBC
Позволяет:
• Осуществлять соединения с различными ODBC-совместимыми источниками
данных.
• Выполнять SQL-команды и операторы работы с данными.
• Осуществлять контроль над возможными ошибками.
• Закрывать соединения и завершать сеанс работы с данными
Доступ к внешним данным через ODBC
(схема обмена данными)
Приложение
ODBC драйвер
приёмника
Процесс
ODBC
Источник данных
ODBC драйвер
источника
Доступ к внешним данным через ODBC
(регистрация источника данных в ODBC Администраторе)
Доступ к внешним данным через ODBC
(регистрация источника данных в ODBC Администраторе)
Доступ к внешним данным через ODBC
(регистрация соединения в VFP-базе данных)
Доступ к внешним данным через ODBC
(создание удалённых представлений в VFP-базе данных)
Доступ к внешним данным через ODBC
(открытие данных удалённых представлений в VFP)
Доступ к внешним данным через ODBC (п-тры соединения)
Data Processing (Параметры обмена данными)
• Asynchronous execution (Асинхронное выполнение) - Работа с данными в фоновом режиме.
Если не включен, то выполнение приложения будет приостановлено вплоть до завершения
операций обмена всех данных, вовлечённых в процесс обмена.
• Display warning (Отображение предупреждений) - Определяет, будут ли выводится диалоги
предупреждений при возникновении ошибок. Если Вы программно обрабатываете все
возможные ошибки соединения, то выключите этот режим.
• Bath processing (Пакетная обработка) - Определяет, будет ли обмен данными осуществляться
единым блоком данных. Если этот режим установлен, то Ваше приложение не получит ни
одной записи, пока сервер не завершит выполнение запроса.
• Automatic transaction (Автоматические транзакции) - Определяет, должны ли изменения
данных оформляться как транзакция. Если Вы не управляете транзакциями в ручном режиме
(используя команды T-SQL), то установите этот режим.
• Packet size (Размер пакета) - Управляет размером блока пересылаемых данных. Данный режим
влияет на производительность процесса обмена данными.
Timeout Intervals (Параметры интервалов ожидания)
• Connections (sec) (Соединение) - Время в секундах, по истечении которого VFP сообщит об
ошибки соединения, в случае неудачи.
• Idle (min) (Время простоя) - Время в минутах, по истечению которого будет разорвано
соединение. Если соединение находится в ручном режиме, оно не будет разорвано до
окончания транзакции.
• Query (sec) (Запрос к данным) - Время в секундах ожидания данных запроса.
• Wait time (ms) (Время ожидания) - Время в миллисекундах для проверки завершения
выполнения инструкции.
Доступ к внешним данным через ODBC (список функций)
Выполнение инструкций SQL Pass Through
обеспечивается следующими функциями:
• SQLCANCEL()
• SQLCOLUMNS()
• SQLCOMMIT()
• SQLCONNECT()
• SQLDISCONNECT()
• SQLEXEC()
• SQLGETPROP()
• SQLMORERESULTS()
• SQLPREPARE()
• SQLROLLBACK()
• SQLSETPROP()
• SQLSTRINGCONNECT()
• SQLTABLES()
А также:
• DBGETPROP ()
• DBSETPROP()
• CURSORGETPROP()
• CURSORSETPROP()
Доступ к внешним данным через ODBC
(различия между Remote View и SQL Pass-trough)
Remote View
Основан только на команде SQL-SELECT.
Может использоваться как источник данных для
элементов управления во времени разработки.
Не обеспечивает никакой возможности выполнять
команды DDL на источнике данных.
Получает только один набор результатов
Обеспечивается встроенное управление соединениями
Обеспечивает встроенный механизм изменения данных
для операций: изменения, добавления, и удаления.
Обеспечивает неявное выполнение SQL-инструкций и
выборку данных.
Не обеспечивает никакого контроля над ходом
выполнения транзакций
Хранит свойства соединения в базе данных.
Использует асинхронную прогрессивную выборку
данных при выполнении SQL-инструкций
SQL Pass Through
Основан на любых командах, специфичных для
используемого SQL сервера, могут быть использованы:
команды языка определения данных, команды
выполнения любых SQL-инструкций, а также хранимые
процедуры.
Не может использоваться как источник данных для
элементов управления во времени разработки.
Обеспечивает возможность выполнять команды DDL на
источнике данных.
Может получать как один, так или несколько наборов в
качестве результата выполнения команды.
Требует явного управления соединениями.
Нет никакого неявного механизма изменения данных.
Обеспечивает явное выполнение SQL-инструкций и
контроль над выборками данных
Обеспечивает явный контроля над ходом выполнения
транзакций
Обеспечиваются только временные свойства SQL курсора
на основании свойств сеанса данных
Полностью поддерживает программируемую
асинхронную выборку данных.
Доступ к внешним данным через ODBC
(преимущества и недостатки Remote View и SQL Pass-trough)
SQL pass-through технология имеет следующие преимущества над
Remote Views:
• Вы можете использовать особенности функциональных
возможностей сервера данных, таких как сохраненных процедур и
встроенных функций сервера.
• Вы можете использовать SQL расширения Вашего конкретного
сервера данных, также как и особенности языка описания данных,
администрирования сервера, и команд контроля безопасности.
• Вы имеете большие возможности контроля выполнения SQLинструкций для операций изменения, удаления, и добавления.
• Вы имеете возможность управления внешними транзакциями
• Напоминание: в настоящее время Visual FoxPro может
обрабатывать SQL запросы, которые возвращают больше чем един
набор результатов. Более подробной см., «Processing Multiple
Result Sets»
Доступ к внешним данным через ODBC
(преимущества и недостатки Remote View и SQL Pass-trough)
В свою очередь, SQL pass-through также имеет свои недостатки:
• По умолчанию, SQL pass-through запрос всегда возвращает неизменяемый
набор данных (snapshot), в виде курсора, служащего только для просмотра
данных. Вы можете сделать курсор изменяемым, с помощью функции
CURSORSETPROP(), позволяющей переустанавливать ряд свойств курсора.
Изменяемые Remote View, напротив, обычно не требует, чтобы Вы меняли
какие-либо свойства пред тем, чтобы в дальнейшем курсор был редактируемый,
поскольку набор его свойств, отвечающий за редактирование, постоянно
хранится в базе данных
• Вам необходимо ввести код SQL команды либо непосредственно в окно
Команд либо в программу, без помощи среды Проектировщика запросов.
• Вам необходимо создать и контролировать соединением с источником данных.
• Так или иначе, используете ли Вы remote views или SQL pass-through, Вы
можете создать как запросы, так и изменяемый remote views. Во многих
приложениях обычно используются как те, так и другие.
Блокировка данных
Перед выполнение ряда команд автоблокировка выполняется автоматически:
• ALTER TABLE - таблица
• APPEND - заголовок таблицы
• APPEND BLANK - заголовок таблицы
• APPEND FROM - заголовок таблицы
• APPEND MEMO - текущая запись
• BLANK - текущая запись
• BROWSE, CHANGE, EDIT - текущая запись и все записи связанные с
редактируемой из других таблиц
• CURSORSETPROP() - зависит от параметров
• DELETE - текущая запись, с предложением FOR вся таблица
• GATHER - текущая запись
• INSERT - таблица
• INSERT SQL - заголовок таблицы
• MODIFY MEMO - текущая запись
• RECALL - текущая запись, с предложением FOR вся таблица
• REPLACE - текущая запись и все записи в других таблицах, поля которых
указанны в команде. При указании диапазона вся таблица.
• TABLEUPDATE() - зависит от типа буферизации
• UPDATE SQL - таблица
Блокировка данных
Режимы:
• SET EXCLUSIVE - таблица выключает/отключает монопольный режим
работы с данными
• SET REFRESH TO - определяет интенсивность обновления данных
• SET REPROCESS TO - определяет время/количество попыток блокировки
данных, если первая попытка блокировки была неудачной
• SET MULTILOCS - определяет возможность блокировки нескольких записей
• SET LOCK - определяет возможность блокировки таблиц для команд:
• AVERAGE
• CALCULATE
• COPY TO
• COPY TO ARRAY
• COUNT
• DISPLAY (with a scope)
• INDEX
• JOIN (both files)
• LABEL
• LIST
• REPORT
• SORT
• SUM
• TOTAL
Функции:
• RLOCK() [LOCK()] - осуществляет попытку блокировки записи(ей)
• FLOCK() - осуществляет попытку блокировки таблицы
• ISRLOCKED() - проверяет блокировку записи(ей)
• ISFLOCKED() - проверяет блокировку таблицы
• SYS(2011) - определяет статус блокировки записи таблицы
Снятие блокировки: UNLOCK [RECORD nRecordNumber] [IN nWorkArea | cTableAlias] [ALL]
(снятие должно производится из того программного модуля, в котором
производилась блокировка)
Блокировка данных
Функции работы с блокированными записями:
• CURVAL() -возвращает текущее значение поля таблицы
• GETFLDSTATE() - определяет статус изменения поля(ей) записи таблицы
• GETNEXTMODIFIED() - определяет номер следующей изменённой записи в
буферизованном курсоре
• OLDVAL() - определяет прежнее значение поля (до изменения) если
изменение выполнено, но данные не обновлялись
• SETFLDSTATE() - изменяет статус изменения полей записи
• TABLEREVERT() - отменяет изменения, выполненные в буфере, но ещё не
сохранённые
• TABLEUPDATE() - пытается выполнить изменения , выполненные в буфере
курсора.
Транзакции
Функции и команды не поддерживающие транзакции:
• APPEND PROCEDURES
• CLOSE ALL
• COPY INDEXES
• CREATE CONNECTION
• CREATE SQL VIEW
• CREATE VIEW
• DELETE DATABASE
• DELETE VIEW
• MODIFY DATABASE
• MODIFY VIEW
• CLEAR ALL
• CLOSE DATABASES
• COPY PROCEDURES
• CREATE DATABASE
• CREATE TRIGGER
• DELETE CONNECTION
• DELETE TRIGGER
• MODIFY CONNECTION
• MODIFY PROCEDURE
• REQUERY()
Функции и команды, которые не могут быть выполнены над таблицей
вовлечённой в транзакции:
• ALTER TABLE
• DELETE TAG
• CREATE TABLE
• TABLEREVERT()
• CURSORSETPROP()
• INSERT
• INDEX
• PACK
• REINDEX
• ZAP
• MODIFY STRUCTURE
Транзакции
Функции и команды, обеспечивающие поддержку транзакций:
• BEGIN TRANSACTION- открывает блок транзакций
• END TRANSACTION - закрывает блок транзакций сохраняя все изменения
текущего блока
• ROLLBACK - отменяет все изменения в текущем блоке транзакций
• TXNLEVEL() - определяет уровень вложенности транзакций (0 - нет
транзакций [0:5])
Нужно иметь ввиду, что транзакции VFP поддерживает только локальных
данных, помещённых в VFP базу данных. Для обеспечения транзакций
внешних данных, следует использовать средства сервера данных.
Вовлечённые в транзакции данные не доступны даже на чтение, пока
транзакция не завершится. Поэтому, следует стремиться свести к минимуму
время выполнения транзакции