| 
			
			 | 
		#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). | |
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Видимо, по новой идеологии AX2012 в таких случаях нужно делать двух наследников от базовой таблицы. В одной таблице-наследнике делать поле со связью на клиентов, а во второй на поставщиков.  
		
		
		
		
		
		
		
	 
		 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			ну можно и просто 3 поля сделать - код клиента, код поставщика и тип. 
		
		
		
		
		
		
		
	Т.е. получается это такой мягкий намек - не использовать Relation вида Field fixed. все бы хорошо если бы они сами это повсеместно не использовали  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В макросе SysBPCheckIgnore нет InventPosting => где-то в логике бестпрактисов зашиты различия (может там RelationType какой установить надо). Можно поставить breakpoint в \Classes\SysBPCheck\addError и посмотреть в чем разница
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сейчас подумалось, наверное при использовании наследования можно попробовать поле с контрагентом оставить в базовой таблице, а в дочерние таблицы вообще никакие поля не добавлять, а использовать их только для размещения на них Relation. Получится?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			дебагинг выявил следующее 
		
		
		
		
		
		
		
	у таблицы есть невидимое св-во EnforceFKRelation(можно увидеть в xpo). если оно в 0, то данная ошибка не возникает. по умолчанию оно стоит в 1. просто поменять его в xpo и загрузить таблицу с перезаписью не получится, оно игнорируется. если удалить таблицу и загрузить заново, то да, меняется. К сожалению в моем варианте таблица много где используется, да и данные есть, т.е. вариант с удалением не проходит  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (1). | |
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
да и непонятно, как работать с такими таблицами - все переводить на View? т.е. простейший while select не сделаешь  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			EnforceFKRelation устанавливается на таблицах, импортированных из 2009. 
		
		
		
		
		
		
		
	Мне кажется, с наследованием правильно сделать два наследника с двумя разными полями.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Боец 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я очень надеюсь, что это недоразумение пофиксят\переделают в ближайших релизах. Я так и не нашел, как это зарезолвить по-человечески. 
		
		
		
			А пока я делаю так, : 
  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3), wojzeh (1). | |
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Интересно а как теперь в стандарте реализуется механизм связи с использованием перечисления TableGroupAll?  | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3). | |
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Думаю все зависит от наличия или отсутствия заполненного поля LegacyID  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 MCT 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
X++: LegacyId #1517 
				__________________ 
		
		
		
		
	Axapta book for developer  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вряд ли как-то проверяет. 
		
		
		
		
		
		
			
		
		
		
		
	Возможно только такие банальности, как отсутствие дублей и т.п.  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Я тоже с этой проблемой столкнулся, тоже докопался до этого EnforceFKRelation и забил в итоге 
		
		
		
		
		
		
		
	Так до сих пор и выдает эту ошибку BP при компиляции.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Есть макрос SysBPCheckIgnore, куда можно добавлять пути, которые не надо проверять на специфические ошибки
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: trud (1), S.Kuskov (1), Logger (1). | |
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			up-ну тему. 
		
		
		
		
		
		
		
		
			Поделитесь, спустя 7 лет. Как вы решали проблему? Отрубали EnforceFKRelation на таблице ? Добавляли в макрос SysBPCheckIgnore ? Проектировали по-другому структуру данных ? А как ? P.S. Как я понимаю, в 365-й аксапте все аналогично. Т.е. вопрос не устарел. Последний раз редактировалось Logger; 27.01.2021 в 17:53.  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Возьмем связку 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). | |
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Это не о том 
		
		
		
		
		
		
			Здесь речь идет о выборе в головной таблице того ТИПА объекта с которым в дальнейшем будет осуществляться работа. Не фиксация уже свершившегося факта как с InventTrans.TransType, а именно выбор. Каким путем дальше пойдет работа Соответственно, на это завязано много "спец.эффектов". Когда переключая значение Base Enum автоматически переключаем и ряд функций, связанных с полем-ссылкой. Выпадающие списки, переход к основной таблице, контроль. И все это "автоматически". Без дополнительного кодирования У меня подозрение, что это сознательная политика, которая предполагает, что от подобной практики надо отказываться, поскольку она явным образом противоречит созданной логики ссылочной целостности в dax2012 и старше. Хотите работать с разными типами объектов - создавайте разные документы. Не надо смешивать в одном документе несколько типов объектов одновременно. Речь не идет о логах и проводках (итоговая "свалка"). Речь идет именно о самих исходных документах Ну, условно говоря, если стоит вопрос, с поставщиком или с клиентом будем создавать заказ, то это надо делать 2 разных типа документов (набора таблиц): заказы с поставщиком и заказы с клиентом. Не надо пытаться "впихнуть" это все в один набор таблиц с фильтром по Base Enum Если бы речь шла только и исключительно о ссылочной целостности, то это как раз показательный пример с InventTrans.Там же просто тупо выбросили TransType и все. Не проводка выбирает с кем будет работать, а проводку создают из заранее известного документа. Поэтому TransType в ней выполнял не управляющую, а информационную (справочную) функцию. Избыточно с точки зрения нормализации (лишнее поле). Вот его и выбросили. А что связи искать потребуется больше времени, так это не аргумент  
		
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну а как бы вы решили проблему описанную в заголовке темы ? 
		
		
		
		
		
		
		
	По другому спроектировали бы данные ? Обошли бы проверку? Как ?  | 
| 
	
 | 
| Теги | 
| best practice, enforcefkrelation, forein key, relation | 
| 
	
	 | 
	
		
		
  |