Показать сообщение отдельно
Старый 24.10.2008, 13:13   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (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).