Цитата:
Сообщение от
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().