Устанавливает Отношение (реляцию) между открытыми таблицами, чтобы при перемещении указателя в родительской (главной) таблице - перемещался соответствующим образом указатель записи в дочерней (зависимой) таблице.
SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1 [, eExpression2 INTO nWorkArea2 | cTableAlias2 ...] |
Параметры
- eExpression1
-
Определяет реляционное выражение, определяющее суть отношения между родителькой и дочерней таблицами. Обычно, реляционное выражение является индексным выражением в дочерней таблице.
Если параметр eExpression1 есть числовое выражение, то оно вычисляется при перемещении указателя в главной таблице. Указатель в дочерней таблице перемещается на запись с номером, = eExpression1.
При отсутствии параметров в команде SET RELATION - освобождаются все реляции, установленные для текущей рабочей области ранее. Можно отключить конкретную Реляцию, для этого используется команда SET RELATION OFF. См. дополнительно раздел SET RELATION OFF, команда.
- INTO nWorkArea1| cTableAlias1
-
Определяет номер рабочей области или алиас дочерней таблицы.
- eExpression2 INTO nWorkArea2| cTableAlias2...
-
Определяет выражение реляции, номер рабочей области или алиас другой дочерней таблицы. Тем самым, можно задавать несколько реляционных отношений; при этом группы параметров реляции указываются через запятую.
- IN nWorkArea
-
Определяет номер или алиас Родительской таблицы (см. ниже...), если рассматривается не текущая рабочая область
- IN cTableAlias
-
Определяет алиас родительской таблицы.
Опция IN используется без предварительного выбора рабочей области родительской таблицы. Если эти параметры отсутствуют ( nWorkArea и cTableAlias), то предполагается, что родительская таблица открыта в текущей рабочей области.
- ADDITIVE
-
Предотвращает закрытие ранее установленных отношений для указанной рабочей области, добавляет указанное новое отношение. При отсутсвии опции ADDITIVE сначала закрываются все имеющиеся Реляции, а потом устанавливается новое указанное отношение.
Комментарии
Перед созданием нового отношения между таблицами, они сначала открываются в разных рабочих областях. Дочерняя таблица должна быть индексирована по общему (для связываемых таблиц) полю, в этом случае выражение связи не является числовым. Индекс для дочерней таблицы может быть либо простым индексом (.idx), или структурированным индексом (.cdx), или любым компактным индексом. Если нужный индекс является компактным, то необходимо его активировать при помощи команды SET ORDER.
![]() |
---|
Если вы выполняете команду SET RELATION с нечисловым реляционным выражением, а дочерняя таблица - не имеет активного индекса, то система , Visual FoxPro генерирует сообщение об ошибке. |
Обычно, для установки нескольких Реляций между одной родительской таблицей и несколькими дочерними таблицами, имеющими общие поля для связи, используется одна команда SET RELATION.
![]() |
---|
Если в дочерней таблице отсутствует необходимая запись, то указатель в ней устанавливается на конец таблицы, файла, EOF()=.t. |
Если дочерняя таблица имеет активный индекс, то его тип должен совпадать с типом реляционного отношения eExpression1. Если дочерняя таблица не имеет активного индекса, то реляционное выражение eExpression1 должно иметь числовой тип; Реляция устанавливается по номеру записи в дочерней таблице.
Примеры
Пример 1
В следующем примере создается Реляция между таблицей Клиентов (Customer) и таблицей Заказов (Orders); когда один клиент может иметь несколько заказов из таблицы Заказы. Для создания Реляции нужно иметь общие поля в обоих таблицах Cust_ID (идентификатор Клиента), в дочерней таблице (Orders) должен быть активный индекс по указанному полю. Данный индекс, в некотором смысле, группирует заказы относительно каждоко Клиента.
Сначала, открываем нужные таблицы в разных рабочих областях, при помощи команды USE, устанавливаем активный индекс для дочерней таблицы, при помощи команды SET ORDER to tag Cust_ID :
![]() | |
---|---|
USE Customer IN 1 |
Далее, делаем родительскую таблицу активной, перемещаемся в рабочую область данной таблицы, используем команду SELECT, наконец выполняем команду создания реляционного отношения между данными таблицами, используется команда SET RELATION :
![]() | |
---|---|
SELECT Customer |
Далее, открываем системные окна browse для для каждой из связанных таблиц:
![]() | |
---|---|
BROWSE NOWAIT |
При перемещении указателя записи в родительской таблице Клиенты, синхронно перемещается указатель записей в дочерней таблице - Заказы. При открытии системного окна Data Session можно увидеть реляционное отношения между рассматриваемыми таблицами.
Пример 2
В данном примере создается реляционное отношение для одной таблицы, таблица реляционно связывается "сама-с-собой". Для открытия одной таблицы в разных рабочих областях используются различные алиасы, и опция AGAIN, для повторного открытия таблицы (в другой области).
![]() | |
---|---|
SELECT 0 |
Далее, главная (родительская) таблица имеет алиас Manager, дочерняя таблица имеет алиас Employee. Для последней, дочерней таблицы создается индексный тэг Mgr_ID, который будет использоваться для создания реляционного отношения, данный индексный тэг делается активным. См. команды INDEX и SET ORDER. Данный индекс сортирует (индексирует) записи по управляющему...
![]() | |
---|---|
INDEX ON Reports_To TAG Mgr_ID |
Далее, переходим в рабочую область главной таблицы, устанавливаем Реляционное отношение, команды SELECT и SET RELATION
![]() | |
---|---|
SELECT Manager |
Далее, открываем системные окна просмотра данных таблиц и наблюдаем как премещаются указатели в связанных таблицах, хотя используется одна таблица: BROWSE nowait, SELECT Employee, BROWSE nowait
Когда в одном окне мы выбираем Управляющего, то во втором окне отображаются соответствующие записи, той же самой таблицы, но упорядоченные созданным реляционным отношением.