Устанавливает Отношение (реляцию) между открытыми таблицами, чтобы при перемещении указателя в родительской (главной) таблице - перемещался соответствующим образом указатель записи в дочерней (зависимой) таблице. 

SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1
   [, eExpression2 INTO nWorkArea2 | cTableAlias2 ...]
[IN nWorkArea | cTableAlias] [ADDITIVE]]

Параметры

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 сначала закрываются все имеющиеся Реляции, а потом устанавливается новое указанное отношение.

Expand imageКомментарии

Перед созданием нового отношения между таблицами, они сначала открываются в разных рабочих областях. Дочерняя таблица должна быть индексирована по общему (для связываемых таблиц) полю, в этом случае выражение связи не является числовым. Индекс для дочерней таблицы может быть либо простым индексом (.idx), или структурированным индексом (.cdx), или любым компактным индексом. Если нужный индекс является компактным, то необходимо его активировать при помощи команды SET ORDER.

NoteПримечание

Если вы выполняете команду SET RELATION с нечисловым реляционным выражением, а дочерняя таблица - не имеет активного индекса, то система , Visual FoxPro генерирует сообщение об ошибке.

Обычно, для установки нескольких Реляций между одной родительской таблицей и несколькими дочерними таблицами, имеющими общие поля для связи, используется одна команда SET RELATION.

NoteПримечание

Если в дочерней таблице отсутствует необходимая запись, то указатель в ней устанавливается на конец таблицы, файла, EOF()=.t.

Если дочерняя таблица имеет активный индекс, то его тип должен совпадать с типом реляционного отношения eExpression1. Если дочерняя таблица не имеет активного индекса, то реляционное выражение eExpression1 должно иметь числовой тип; Реляция устанавливается по номеру записи в дочерней таблице.

Expand imageПримеры

Пример 1

В следующем примере создается Реляция между таблицей Клиентов (Customer) и таблицей Заказов (Orders); когда один клиент может иметь несколько заказов из таблицы Заказы. Для создания Реляции нужно иметь общие поля в обоих таблицах Cust_ID (идентификатор Клиента), в дочерней таблице (Orders) должен быть активный индекс по указанному полю. Данный индекс, в некотором смысле, группирует заказы относительно каждоко Клиента.

Сначала, открываем нужные таблицы в разных рабочих областях, при помощи команды USE, устанавливаем активный индекс для дочерней таблицы, при помощи команды SET ORDER to tag Cust_ID :

  CopyCode imageКопировать Код
USE Customer IN 1
USE Orders IN 2
SELECT Orders
SET ORDER TO TAG Cust_ID

Далее, делаем родительскую таблицу активной, перемещаемся в рабочую область данной таблицы, используем команду SELECT,  наконец выполняем команду создания реляционного отношения между данными таблицами, используется команда SET RELATION :

  CopyCode imageКопировать Код
SELECT Customer
SET RELATION TO Cust_ID INTO Orders

Далее, открываем системные окна browse для для каждой из связанных таблиц:

  CopyCode imageКопировать Код
BROWSE NOWAIT
SELECT Orders
BROWSE NOWAIT

При перемещении указателя записи в родительской таблице Клиенты, синхронно перемещается указатель записей в дочерней таблице - Заказы. При открытии системного окна Data Session можно увидеть реляционное отношения между рассматриваемыми таблицами.

Пример 2

В данном примере создается реляционное отношение для одной таблицы, таблица реляционно связывается "сама-с-собой". Для открытия одной таблицы в разных рабочих областях используются различные алиасы, и опция AGAIN, для повторного открытия таблицы (в другой области).

  CopyCode imageКопировать Код
SELECT 0
USE Employees ALIAS Manager
SELECT 0
USE Employees AGAIN ALIAS Employee

Далее, главная (родительская) таблица имеет алиас Manager, дочерняя таблица имеет алиас  Employee. Для последней, дочерней таблицы создается индексный тэг Mgr_ID, который будет использоваться для создания реляционного отношения, данный индексный тэг делается активным. См. команды INDEX и SET ORDER. Данный индекс сортирует (индексирует) записи по управляющему...

  CopyCode imageКопировать Код
INDEX ON Reports_To TAG Mgr_ID
SET ORDER TO Mgr_ID

Далее, переходим в рабочую область главной таблицы, устанавливаем Реляционное отношение, команды  SELECT и  SET RELATION 

  CopyCode imageКопировать Код
SELECT Manager
SET RELATION TO Emp_ID INTO Employee

Далее, открываем системные окна просмотра данных таблиц и наблюдаем как премещаются указатели в связанных таблицах, хотя используется одна таблица: BROWSE nowait, SELECT Employee, BROWSE nowait

Когда в одном окне мы выбираем Управляющего, то во втором окне отображаются соответствующие записи, той же самой таблицы, но упорядоченные созданным реляционным отношением.

Expand imageСм. также