24.10.2008, 10:32 | #1 |
Участник
|
И снова про Relation
Добрый день!
Скачал примерчик tutorial_Form_Dynalink. Собственно вопрос не по коду, а по Relation. Там есть две таблички : "master" tutorial_Form_Dynalink1 и "slave" tutorial_Form_Dynalink2. В обеих таблицах есть поля VendAccount (EDT-> VendAccount) ItemId (EDT-> ItemId) на tutorial_Form_Dynalink2 создан Relation tutorial_Form_Dynalink1 (validate=YES) tutorial_Form_Dynalink2.VendAccount==tutorial_Form_Dynalink1.VendAccount tutorial_Form_Dynalink2.ItemId == tutorial_Form_Dynalink1.ItemId Предположим, после этого в "master" таблицу (tutorial_Form_Dynalink1) ввожу значения (из лукапов по EDT) ItemId='Стул' VendAccountId='3000' в "slave" таблицу (tutorial_Form_Dynalink2) добавляю совершенно другие значения (из лукапов по EDT) ItemId='Стол' VendAccountId='0001' И это "съедается" для "slave" не смотря на присутствие Relation со свойством validate=YES Почему так происходит? Вот выдержки из Developer Guide Цитата:
Relations in the data model must be expressed in relations. Such relations must be validating. This means that the Validate property must be set to Yes.
Performing validation and maintaining referential consistency Both the Validate and DeleteAction properties on a relation and on a DeleteAction node respectively are used to maintain referential consistency in the database. Similarly, the programmer uses the Validate property to maintain consistency when records are updated or inserted. If the Validate property on a relation is set to Yes, the system uses the relation to perform the validation automatically. Спасибо! |
|
24.10.2008, 12:44 | #2 |
Участник
|
Дополню:
Так понимаю, что в некоторых случаях Relation с (validate=YES) корректно отрабатывают, в некоторых нет. Нет общего механизма... Тогда вопрос - как при редактировании данных (не рассматриваю DeleteAction) соблюдать ссылочную целостность , если система сама не может сама это сделать (точнее не всегда может) - писать код , например в validateWrite запрещать сохранять такую запись или реализовывать, как предлагают Relation на таблице и EDT ? Существует ли какое то единственное "правильное" решение . В тех же RDBMS Foreign Key спасают от таких действий . Или это баг аксапты??? |
|
24.10.2008, 13:13 | #3 |
Участник
|
Цитата:
Сообщение от Corsar
Собственно вопрос не по коду, а по Relation. Там есть две таблички : "master" tutorial_Form_Dynalink1 и "slave" tutorial_Form_Dynalink2. В обеих таблицах есть поля VendAccount (EDT-> VendAccount), ItemId (EDT-> ItemId)
на tutorial_Form_Dynalink2 создан Relation tutorial_Form_Dynalink1 (validate=YES) tutorial_Form_Dynalink2.VendAccount==tutorial_Form_Dynalink1.VendAccount tutorial_Form_Dynalink2.ItemId == tutorial_Form_Dynalink1.ItemId Просто не понимаю , почему не происходит "validation" (данные во второй таблице не зависят от данных в основной таблице не смотря на существующий Relation) ? В вашем примере вы просто не можете физически ввести в поля VendAccount и ItemId в таблице tutorial_Form_Dynalink2 значения, которые бы удовлетворяли значениям полей в записях из tutorial_Form_Dynalink1: после ввода значения поля ItemId вы получаете пару ['', 'Стол'], которая не встречается в tutorial_Form_Dynalink1; если начать вводить с поля VendAccount, то вы получите пару ['3000', ''], которая тоже не встречается в master-таблице. Именно поэтому ядро не проверяет такие relation'ы, когда прописано более одной связи типа "нормально"; проверяются лишь relation'ы с одной связью типа "нормально" и (опционально) связями типа "поле фиксировано" и/или "поле ссылки фиксировано". Реализовать нужную вам проверку можно лишь программно - где-нить в validateWrite(). |
|
|
За это сообщение автора поблагодарили: Corsar (1). |
24.10.2008, 13:16 | #4 |
MCITP
|
Подозреваю что ситуация такая же как и Тут
Просто при наличии нескольких релейшинов на одном поле проверяется и используется только один. В переделать приведённый по ссылке пример в следующем виде (при этом тип поля можно вообще поставить стринг, чтоб не смущало, это ни на что не влияет), то увидите, что и выбираться и проверятся будет только ссылка на номенклатуру. Хотя оба validate=yes. Всё-таки relation в Аксапте - это далеко не то же самое, что foreign key в RDBMS, к сожалению.
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Corsar (1). |
24.10.2008, 13:43 | #5 |
Участник
|
Да на axaptapedia.com - дело вообщем даже не в примере (он демонстрирует совершенно другое). Увидел Relation между таблицами , ну и решил в табличном браузере напрямую ввести данные и посмотреть, как этот Relation среагирует на "невалидные" данные (я теоретически о них читал и представляю, как они работают, вот и решил попробовать практически)
Всё таки правильно ли я понял, что универсального рецепта не существует. В некоторых случаях проверка целостности (по Relation) сработает, в некоторых нет. Нужно разбираться в каждом конкретном случае. А вообще не надеяться на проверку целостности в relation, и проверять самостоятельно в validateWrite. Тогда, лучше бы служили Relation только для навигации (dynalink)... Спасибо Последний раз редактировалось Corsar; 24.10.2008 в 13:53. |
|
24.10.2008, 14:03 | #6 |
MCITP
|
Цитата:
Пример делается элементарно, создаём таблицу без всяких ЕДТ, с одним единственным составным релейшинам - и всё будет проверятся, правда на изменени каждого из полей, как вы верно подметили, что не даёт пользователю возможности ввести вручную что-либо, если оба поля обязательные в ссылаемой таблице, а вот если нет, то пожалуйста - вводите и убеждайтесь. Пример (для 3-ки, EDT в полях нет):
__________________
Zhirenkov Vitaly |
|
24.10.2008, 14:07 | #7 |
MCITP
|
Цитата:
Сообщение от Corsar
Всё таки правильно ли я понял, что универсального рецепта не существует. В некоторых случаях проверка целостности (по Relation) сработает, в некоторых нет. Нужно разбираться в каждом конкретном случае. А вообще не надеяться на проверку целостности в relation, и проверять самостоятельно в validateWrite. Тогда, лучше бы служили Relation только для навигации (dynalink)...
На DAX2009 по крайней мере вроде как появился приоритет табличных релейшинов над EDT. Но и на таблице их тоже может быть несколько. А для предыдущих версий вообще похоже, что берётся порвый попавшийся (по какому критерию - не совсем понятно). Так что вы абсолютно правильно сформулировали сложившуюся ситуацию.
__________________
Zhirenkov Vitaly |
|
24.10.2008, 14:19 | #8 |
Участник
|
Спасибо всем участникам ветки !!!
|
|