|
03.06.2013, 08:29 | #1 |
Участник
|
Field Fixed Relation в AX2012 R2
Есть таблица - в ней 2 поля. Одно - enum (клиент или поставщик), другое код контрагента.
Стоит задача создать Relation так чтобы если enum=клиент 'код контрагента' был клиентом если enum=поставщик 'код контрагента' был поставщиком На проекте принято все делать без ошибок Best Practice С виду простая задача, однако решение в лоб упирается в ошибку Best Practice "Only foreign key constraints are allowed on this table." В интернете гуглил, по этой ошибке советуют создавать Relation вида foreign key, однако в relation такого вида не получится добавить условие Field Fixed Вот сижу думаю что с этим можно сделать. Самое удивительное что Microsoft для своих таблиц как-то умудрились отключить эту проверку, т.е. к примеру на InventPosting ошибка не возникает. файл с таблицей прилагаю |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), Logger (5). |
03.06.2013, 08:46 | #2 |
Участник
|
Видимо, по новой идеологии AX2012 в таких случаях нужно делать двух наследников от базовой таблицы. В одной таблице-наследнике делать поле со связью на клиентов, а во второй на поставщиков.
|
|
03.06.2013, 09:13 | #3 |
Участник
|
ну можно и просто 3 поля сделать - код клиента, код поставщика и тип.
Т.е. получается это такой мягкий намек - не использовать Relation вида Field fixed. все бы хорошо если бы они сами это повсеместно не использовали |
|
03.06.2013, 09:19 | #4 |
Участник
|
Сейчас подумалось, наверное при использовании наследования можно попробовать поле с контрагентом оставить в базовой таблице, а в дочерние таблицы вообще никакие поля не добавлять, а использовать их только для размещения на них Relation. Получится?
|
|
03.06.2013, 09:26 | #5 |
Участник
|
Цитата:
да и непонятно, как работать с такими таблицами - все переводить на View? т.е. простейший while select не сделаешь |
|
03.06.2013, 10:56 | #6 |
Участник
|
EnforceFKRelation устанавливается на таблицах, импортированных из 2009.
Мне кажется, с наследованием правильно сделать два наследника с двумя разными полями. |
|
03.06.2013, 11:34 | #7 |
Участник
|
Цитата:
Интересно а как теперь в стандарте реализуется механизм связи с использованием перечисления TableGroupAll? |
|
03.06.2013, 09:16 | #8 |
Участник
|
В макросе SysBPCheckIgnore нет InventPosting => где-то в логике бестпрактисов зашиты различия (может там RelationType какой установить надо). Можно поставить breakpoint в \Classes\SysBPCheck\addError и посмотреть в чем разница
|
|
03.06.2013, 09:21 | #9 |
Участник
|
дебагинг выявил следующее
у таблицы есть невидимое св-во EnforceFKRelation(можно увидеть в xpo). если оно в 0, то данная ошибка не возникает. по умолчанию оно стоит в 1. просто поменять его в xpo и загрузить таблицу с перезаписью не получится, оно игнорируется. если удалить таблицу и загрузить заново, то да, меняется. К сожалению в моем варианте таблица много где используется, да и данные есть, т.е. вариант с удалением не проходит |
|
|
За это сообщение автора поблагодарили: Logger (1). |
31.10.2022, 20:17 | #10 |
Участник
|
Цитата:
Сообщение от trud
дебагинг выявил следующее
у таблицы есть невидимое св-во EnforceFKRelation(можно увидеть в xpo). если оно в 0, то данная ошибка не возникает. по умолчанию оно стоит в 1. просто поменять его в xpo и загрузить таблицу с перезаписью не получится, оно игнорируется. если удалить таблицу и загрузить заново, то да, меняется. К сожалению в моем варианте таблица много где используется, да и данные есть, т.е. вариант с удалением не проходит |
|
03.06.2013, 11:21 | #11 |
Боец
|
Я очень надеюсь, что это недоразумение пофиксят\переделают в ближайших релизах. Я так и не нашел, как это зарезолвить по-человечески.
А пока я делаю так, :
|
|
|
За это сообщение автора поблагодарили: Logger (3), wojzeh (1). |
03.06.2013, 14:36 | #12 |
Участник
|
Вряд ли как-то проверяет.
Возможно только такие банальности, как отсутствие дублей и т.п. |
|
03.06.2013, 18:25 | #13 |
Участник
|
Я тоже с этой проблемой столкнулся, тоже докопался до этого EnforceFKRelation и забил в итоге
Так до сих пор и выдает эту ошибку BP при компиляции. |
|
03.06.2013, 18:44 | #14 |
Участник
|
Есть макрос SysBPCheckIgnore, куда можно добавлять пути, которые не надо проверять на специфические ошибки
|
|
|
За это сообщение автора поблагодарили: trud (1), S.Kuskov (1), Logger (1). |
27.01.2021, 17:28 | #15 |
Участник
|
up-ну тему.
Поделитесь, спустя 7 лет. Как вы решали проблему? Отрубали EnforceFKRelation на таблице ? Добавляли в макрос SysBPCheckIgnore ? Проектировали по-другому структуру данных ? А как ? P.S. Как я понимаю, в 365-й аксапте все аналогично. Т.е. вопрос не устарел. Последний раз редактировалось Logger; 27.01.2021 в 17:53. |
|
27.01.2021, 18:59 | #16 |
Участник
|
Цитата:
Возьмем связку InventTrans - SalesLine или InventTrans - SalesTable Раньше (ax4 - ax2009) были связи : Для SalesLine \Data Dictionary\Tables\InventTrans\Relations\SalesOrderLine условия: InventTrans.InventTransId == SalesLine.InventTransId при этом неявно подразумевалось Fixed условие InventTrans.TransType == 0 Для SalesTable \Data Dictionary\Tables\InventTrans\Relations\SalesOrderNum условия: InventTrans.TransType == 0 InventTrans.TransRefId == SalesTable.SalesId Для фильтрации / связи всегда добавлялось условие по InventTrans.TransType В 2012-й придумали промежуточную табличку со связью InventTransOriginSalesLine т.е. чтобы перейти от InventTransOrigin к SalesLine идет джоин InventTransOrigin - InventTransOriginSalesLine - SalesLine В каждой связи нет Fixed условия по InventTransOrigin.ReferenceCategory (это аналог InventTrans.TransType). Его заменила InventTransOriginSalesLine. т.е. вместо фильтра по полю с типом записи мы просто джоиним нужную табличку сязей. От InventTransOrigin к InventTransOriginSalesLine связь InventTransOriginSalesLine.InventTransOrigin == InventTransOrigin.RecId а от InventTransOriginSalesLine к SalesLine : InventTransOriginSalesLine.SalesLineDataAreaId == SalesLine.dataAreaId InventTransOriginSalesLine.SalesLineInventTransId == SalesLine.InventTransId Ну в вашем случае, аналогия такая atest -- InventTransOrigin atest_cust -- InventTransOriginSalesLine atest_vend -- InventTransOriginPurchLine CustTable -- SalesLine VendTable -- PurchLine atest_cust новая табличка связей поля CustAccount (если извращаться то refRecId ссылка на atest) atest_Vend поля VendAccount (если извращаться то refRecId ссылка на atest) Ну и в случае фильтрации / связи вместо условия на atest.CustVendCode делаем джоин либо с atest_cust либо с atest_vend А поле atest.CustVendCode как бы и не нужно. Правда если табличка atest не предполагает других полей, то нужна ли она вообще ? Ее можно заменить union вьюхой от atest_cust и atest_vend Все это выглядит несколько громоздко и не очень удобно. Зачем они так сделали ? Возможно хотели упростить работу оптимизатора запросов SQL. Если предположить что в нашей табличке для клиентов миллионы записей, а для поставщиков - десятки, то возможно оптимизатору проще будет запросы строить и не промахиваться с оценками. Последний раз редактировалось Logger; 27.01.2021 в 19:08. |
|
|
За это сообщение автора поблагодарили: sukhanchik (6). |
27.01.2021, 22:53 | #17 |
Участник
|
Это не о том
Здесь речь идет о выборе в головной таблице того ТИПА объекта с которым в дальнейшем будет осуществляться работа. Не фиксация уже свершившегося факта как с InventTrans.TransType, а именно выбор. Каким путем дальше пойдет работа Соответственно, на это завязано много "спец.эффектов". Когда переключая значение Base Enum автоматически переключаем и ряд функций, связанных с полем-ссылкой. Выпадающие списки, переход к основной таблице, контроль. И все это "автоматически". Без дополнительного кодирования У меня подозрение, что это сознательная политика, которая предполагает, что от подобной практики надо отказываться, поскольку она явным образом противоречит созданной логики ссылочной целостности в dax2012 и старше. Хотите работать с разными типами объектов - создавайте разные документы. Не надо смешивать в одном документе несколько типов объектов одновременно. Речь не идет о логах и проводках (итоговая "свалка"). Речь идет именно о самих исходных документах Ну, условно говоря, если стоит вопрос, с поставщиком или с клиентом будем создавать заказ, то это надо делать 2 разных типа документов (набора таблиц): заказы с поставщиком и заказы с клиентом. Не надо пытаться "впихнуть" это все в один набор таблиц с фильтром по Base Enum Если бы речь шла только и исключительно о ссылочной целостности, то это как раз показательный пример с InventTrans.Там же просто тупо выбросили TransType и все. Не проводка выбирает с кем будет работать, а проводку создают из заранее известного документа. Поэтому TransType в ней выполнял не управляющую, а информационную (справочную) функцию. Избыточно с точки зрения нормализации (лишнее поле). Вот его и выбросили. А что связи искать потребуется больше времени, так это не аргумент
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
28.01.2021, 13:40 | #18 |
Участник
|
Ну а как бы вы решили проблему описанную в заголовке темы ?
По другому спроектировали бы данные ? Обошли бы проверку? Как ? |
|
29.01.2021, 02:58 | #19 |
Участник
|
Если формально, то либо делать отдельные поля на каждую сущность, либо отдельные наборы таблиц/форм/меню.
Если сущности для выбора можно как-то объединить (например, клиента и поставщика можно "объединить" через ГАК), то сделать нечто вроде почтовых адресов. Список контрагентов, где идентификатор - это ссылка на ГАК, а клиент/поставщик - это уже реквизит выбранной записи Данный функционал явно противоречит новой идеологии. Нарушение принципов нормализации. Не должно быть поля, которое может содержать ссылки на разные таблицы. Думаю, будут по тихому "под коврик заметать" Обход проверки - это из разряда "хакерских трюков". Раз разработчики Axapta посчитали данный функционал не желательным, то пытаться его поддерживать своими силами, ну, можно, конечно, но за дополнительные деньги
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
Теги |
best practice, enforcefkrelation, forein key, relation |
|
|