AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.10.2008, 10:32   #1  
Corsar is offline
Corsar
Участник
 
15 / 12 (1) ++
Регистрация: 23.10.2008
И снова про 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.
Просто не понимаю , почему не происходит "validation" (данные во второй таблице не зависят от данных в основной таблице не смотря на существующий Relation) ?

Спасибо!
Старый 24.10.2008, 12:44   #2  
Corsar is offline
Corsar
Участник
 
15 / 12 (1) ++
Регистрация: 23.10.2008
Дополню:
Так понимаю, что в некоторых случаях Relation с (validate=YES) корректно отрабатывают, в некоторых нет. Нет общего механизма... Тогда вопрос - как при редактировании данных (не рассматриваю DeleteAction) соблюдать ссылочную целостность , если система сама не может сама это сделать (точнее не всегда может) - писать код , например в validateWrite запрещать сохранять такую запись или реализовывать, как предлагают Relation на таблице и EDT ? Существует ли какое то единственное "правильное" решение . В тех же RDBMS Foreign Key спасают от таких действий . Или это баг аксапты???
Старый 24.10.2008, 13:13   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 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) ?
Откуда это такой примерчик взялся?.. В общем, relation'ы по полям проверяются ядром в методе validateField(), а не validateWrite() (если только самому не прописать их в validateWrite()). Соотв., метод validateField() вызывается на нужном поле ядром в момент изменения значения поля на форме, а не в момент сохранения полностью сформированной записи. Если проверка прошла успешно, то ядро сохраняет в поле измененное значение и вызывает метод modifiedField(), в противном случае изменения откатываются с выводом соотв. сообщения об ошибке. Отсюда есть одно следствие: хотя в обычных реляционных БД foreign key constraint может связывать более одного поля одной таблицы с более чем одним полем другой таблицы, в Аксапте механизм 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  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Подозреваю что ситуация такая же как и Тут
Просто при наличии нескольких релейшинов на одном поле проверяется и используется только один.

В переделать приведённый по ссылке пример в следующем виде (при этом тип поля можно вообще поставить стринг, чтоб не смущало, это ни на что не влияет), то увидите, что и выбираться и проверятся будет только ссылка на номенклатуру.
Хотя оба validate=yes.
Всё-таки relation в Аксапте - это далеко не то же самое, что foreign key в RDBMS, к сожалению.
Изображения
 
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Corsar (1).
Старый 24.10.2008, 13:43   #5  
Corsar is offline
Corsar
Участник
 
15 / 12 (1) ++
Регистрация: 23.10.2008
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Откуда это такой примерчик взялся?..
Да на axaptapedia.com - дело вообщем даже не в примере (он демонстрирует совершенно другое). Увидел Relation между таблицами , ну и решил в табличном браузере напрямую ввести данные и посмотреть, как этот Relation среагирует на "невалидные" данные (я теоретически о них читал и представляю, как они работают, вот и решил попробовать практически)

Всё таки правильно ли я понял, что универсального рецепта не существует. В некоторых случаях проверка целостности (по Relation) сработает, в некоторых нет. Нужно разбираться в каждом конкретном случае. А вообще не надеяться на проверку целостности в relation, и проверять самостоятельно в validateWrite. Тогда, лучше бы служили Relation только для навигации (dynalink)...

Спасибо

Последний раз редактировалось Corsar; 24.10.2008 в 13:53.
Старый 24.10.2008, 14:03   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от gl00mie Посмотреть сообщение
.......
Именно поэтому ядро не проверяет такие relation'ы, когда прописано более одной связи типа "нормально"; проверяются лишь relation'ы с одной связью типа "нормально" и (опционально) связями типа "поле фиксировано" и/или "поле ссылки фиксировано".
.............
Вы не правы. Проверяются и составные тоже. Но только в том случае, когда он оказывается "тем самым" на который смотрит аксапта. (см. моё предыдущее сообщения)
Пример делается элементарно, создаём таблицу без всяких ЕДТ, с одним единственным составным релейшинам - и всё будет проверятся, правда на изменени каждого из полей, как вы верно подметили, что не даёт пользователю возможности ввести вручную что-либо, если оба поля обязательные в ссылаемой таблице, а вот если нет, то пожалуйста - вводите и убеждайтесь.

Пример (для 3-ки, EDT в полях нет):
Изображения
 
__________________
Zhirenkov Vitaly
Старый 24.10.2008, 14:07   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Corsar Посмотреть сообщение
Всё таки правильно ли я понял, что универсального рецепта не существует. В некоторых случаях проверка целостности (по Relation) сработает, в некоторых нет. Нужно разбираться в каждом конкретном случае. А вообще не надеяться на проверку целостности в relation, и проверять самостоятельно в validateWrite. Тогда, лучше бы служили Relation только для навигации (dynalink)...
К сожалению....

На DAX2009 по крайней мере вроде как появился приоритет табличных релейшинов над EDT. Но и на таблице их тоже может быть несколько.
А для предыдущих версий вообще похоже, что берётся порвый попавшийся (по какому критерию - не совсем понятно).

Так что вы абсолютно правильно сформулировали сложившуюся ситуацию.
__________________
Zhirenkov Vitaly
Старый 24.10.2008, 14:19   #8  
Corsar is offline
Corsar
Участник
 
15 / 12 (1) ++
Регистрация: 23.10.2008
Спасибо всем участникам ветки !!!
Теги
ax2009, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Включение и отключение relation между двумя таблицами? Hidden DAX: Программирование 2 08.02.2007 17:20
Пропал Relation в фильтре Pavel Pustovalov DAX: Администрирование 5 03.12.2005 10:16
Relation на таблице и EDT Alex_K DAX: Программирование 2 15.12.2004 15:49
О динамическом Relation в EDT у поля таблицы NIMERE DAX: Программирование 4 23.03.2004 13:21
Создать Relation в AOT программным кодом EVGL DAX: Программирование 3 21.05.2003 12:47

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:01.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.