Страница 1 из 1

Как заполнить "Ссылки на таблицу"?

Добавлено: 24 окт 2006, 14:33
DarkAngel27
В Support'е при просмотре Карточки Таблицы есть кнопка "Ссылки на таблицу".
Как можно туда занести информацию?

Добавлено: 25 окт 2006, 18:00
coolibin
alter table...

Добавлено: 26 окт 2006, 12:12
Goblin
Описание ссылок
Ссылочная целостность описывается посредством оператора ALTER TABLE и может быть с проверкой ограничений ( RESTRICT ) и без ( декларативная ). Добавлена возможность не иметь в качестве FOREIGN KEY индекса, а дать возможность указывать просто поля таблицы. Синтаксис в данном случае будет такой :

ALTER TABLE <Имя подцепляемой таблицы>
[ FOREIGN KEY <Имя индекса> | ( <список полей> ) ]
REFERENCES

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

<поле> ::== <имя поля> : ( <описание типа> |
REF ( <имя таблицы>)) [" <заголовок поля> "]

В данном случае считается, что таблица ссылается на NRec в родительской таблице, т.е. поле типа Comp, по которому есть индекс, и обладающее флажками Unique, Surrogate, Journal. Для упрощения использования добускаются ссылки вперед. Т.е., если таблица, на которую ссылается компилируемая еще не существует, проверка ссылки откладывается до конца компиляции словаря.

Использование ссылок
Оператор ссылки -> работает по описанной ссылочной целостности и позволяет получить поля записи из родительской таблицы, с точки зрения ссылочной целостности, которая при применении оператора становится подцепляемой. Работает такой оператор следующим образом, когда компилятор встречает оператор -> в коде программы он добавляет в код синоним на подцепляемую таблицу, генерируя имя ему по следующему алгоритму <имя родительской таблицы>+"_"+<имя поля-ссылки>+"_"+<имя подцепляемой таблицы>. К синониму можно обращаться по его имени.

Пример
Create table Example.KatCity "Города"
With TableOptions Header, Journal, Corpo
(
code : integer,
name : string[80]
);

Create table Example.Route "Маршруты"
With TableOptions Header, Journal, Corpo
(
cCity1 : ref(KatCity),
cCity2 : ref(KatCity),
name : string[80]
);

//-------------------------------

Interface CaseTest;

Create View
As select
*
From
Route;


HandleEvent
cmInit :
if( getfirst Route = tsOk )
{
Route.cCity1->Name; // обращаемся к полю KatCity.Name
Route_cCity1_KatCity.Name; // обращаемся к тому же полю через имя синонима
// возможно но лучше через оператор ссылки
Route.cCity2->Code; // обращаемся к полю KatCity.Code
Route_cCity2_KatCity.code; // обращаемся к тому же полю через имя синонима
// возможно но лучше через оператор ссылки
}

end;
end.






Описание ссылок реляционных связей
Существует возможность описывать ссылочную целостность при создании таблицы. К двум старым способам описания ссылок при создании таблицы добавлен третий. Недекларативная ссылочная целостность описывается двумя способами:

Первый способ(старый)
<поле> ::== <имя поля> ( <имя таблицы> ) : <описание типа> [" <заголовок поля> "]

Второй способ(новый)
<поле> ::== <имя поля> : REF( <имя таблицы> ) RESTRICT | SET NULL [" <заголовок поля> "]

Декларативная ссылочная целостность описывается так:

<поле> ::== <имя поля> : REF( <имя таблицы> ) [" <заголовок поля> "]

Внимание При описании недекларативной ссылочной целостности первым способом и декларативной ссылочной целостности SET NULL выставляется по умолчанию. Следует также заметить, что в описании недекларативной ссылочной целостности при создании таблицы через REF, используется синтаксис описания ссылки с помощью ALTER TABLE. Однако, синтаксис установки самого нулевого значения, SET NULL = { <нулевое значение> [ ,<нулевое значение> ] }, не поддерживается.

Пример
Create table Example.Route "Маршруты"
With TableOptions Header, Journal, Corpo
(
cCity1 : ref(KatCity) "Декларативная ссылка(SET NULL по умолчанию)",
cCity2 : ref(KatCity) restrict "Недекларативная ссылка без SET NULL",
cCity3(KatCity) : comp "Недекларативная ссылка, старый синтаксис(SET NULL по умолчанию)",
cСity4 : ref(KatCity) restrict set null "Недекларативная ссылка с SET NULL"
)
With index
(
Route1 = cCity1 + cCity2, //Наличие этого индекса никак не повлияет на создание
//декларативной ссылки для поля cCity2
Route1 = cCity2 + cCity1, //Без этих индексов компилятор выдаст ошибку об
Route2 = cCity3, //отсутствии индексов для описанной недекларативной
Route3 = cCity4 //ссылочной целостности по полям cCity3,cCity4
);

Информация
Версия : Атлантис 3.03.13.

Добавлено: 26 окт 2006, 12:38
DarkAngel27
Спасибо, всё получилось.