Коротко — да, вы правильно поняли смысл связей: в таблице b_uts_crm_deal поле VALUE хранит идентификатор сделки (b_crm_deal[ID]), а в том же b_uts_crm_deal поле «№ ЗК» хранит номер документа, который соответствует doc_Sales[Number]. Важно только проверить два момента перед созданием мер и связей в модели:
- типы данных в полях совпадают (строка/число) — иначе связь не создастся или будет некорректна;
- уникальность значений на «one»-стороне связи. Если doc_Sales[Number] уникален — то логично делать связь doc_Sales (one) → b_uts_crm_deal (many). Если b_crm_deal[ID] уникален — связь b_crm_deal (one) → b_uts_crm_deal (many).
Однако важно понимать поведение фильтров: если обе связи направлены «на» b_uts_crm_deal (т.е. doc_Sales (one) → b_uts_crm_deal (many) и b_crm_deal (one) → b_uts_crm_deal (many)), то фильтр от b_crm_deal не будет автоматически распространяться на doc_Sales через b_uts_crm_deal. Чтобы фильтр проходил по цепочке b_crm_deal → b_uts_crm_deal → doc_Sales у вас есть варианты:
1) Сделать вторую связь так, чтобы фильтр шел от b_uts_crm_deal к doc_Sales (если это логично по cardinality), либо установить Cross filter direction = Both для второй связи (или для обеих) — но с осторожностью (может вести к двусмысленным фильтрам и проблемам с производительностью).
2) Не менять направление связей, а в мере явно передавать набор «№ ЗК» в doc_Sales с помощью TREATAS или фильтрации — это наиболее безопасный и контролируемый способ.
Примеры мер.
A) Простая мера через TREATAS (если в визуале b_uts_crm_deal фильтруется связью от b_crm_deal):
Sales by ZK (TREATAS) =
CALCULATE(
SUM(doc_Sales[Amount]),
TREATAS( VALUES(b_uts_crm_deal[№ ЗК]), doc_Sales[Number] )
)
Если b_uts_crm_deal уже отфильтрован по текущей сделке (через связь b_crm_deal → b_uts_crm_deal), то TREATAS передаст эти номера в doc_Sales.
B) Мера, устойчиво связывающая по цепочке без изменения направлений связей (использует проверку в фильтре):
Sales for selected deal (robust) =
CALCULATE(
SUM(doc_Sales[Amount]),
FILTER(
doc_Sales,
COUNTROWS(
FILTER(
b_uts_crm_deal,
b_uts_crm_deal[№ ЗК] = doc_Sales[Number]
&& b_uts_crm_deal[VALUE] IN VALUES(b_crm_deal[ID])
)
) > 0
)
)
Эта мера для каждой строки doc_Sales проверяет, есть ли в b_uts_crm_deal связь между текущим doc_Sales[Number] и любой из выбранных сделок. Работает, даже если направление связей не позволяет автоматически распространять фильтр.
C) Альтернатива с LOOKUPVALUE (подходит, если для doc_Sales[Number] максимум одна запись в b_uts_crm_deal):
Sales by lookup =
CALCULATE(
SUM(doc_Sales[Amount]),
FILTER(
doc_Sales,
LOOKUPVALUE(b_uts_crm_deal[VALUE], b_uts_crm_deal[№ ЗК], doc_Sales[Number]) IN VALUES(b_crm_deal[ID])
)
)
Замечания и рекомендации:
- Проверьте уникальность и cardinality перед настройкой связей. В модельных связях правильно указывать одну сторону (one) для уникальных полей.
- Если возможно корректно настроить направление связей так, чтобы фильтр из b_crm_deal доходил до doc_Sales (через b_uts_crm_deal), то наиболее простые меры будут работать без дополнительных TREATAS/FILTER.
- Если связи сложные/многие-ко-многим — используйте явные DAX-ограничения (TREATAS, FILTER, виртуальные таблицы) или создайте промежуточную таблицу-справочник.
Если хотите, пришлите примеры нескольких строк из таблиц (поля ID, VALUE, № ЗК, Number и сумму в doc_Sales) — помогу написать точную меру под вашу структуру и подскажу, как правильно настроить связи в модели.