Эх, а вот не сделать же в администраторе left join T1 on T1.A=T2.B and T1.C = 'Value'...
И в блок where это условие не перетащить - пресловутая "галочка" для фильтра сравнения должна быть проставлена и в запросах глобально используемых типа sq_Document уже нельзя такие вольности допускать.
Снова делаем вьюху на сервере с выборкой по нужному условию, цепляем ее как сервис таблицы и используем в join... громоздко
Александр, можно при создании экземпляра запроса динамически создавать дополнительные условия и даже менять логический оператор между ними.
Пока решил через view - динамически лень-матушка не позволила, хотя идея хорошая. Если б экземпляр нужен был единожды - для определенного типа документа надо хитро подтянуть значения нескольких полей...
Пока писал вспомнил про вычисляемое поле в датасете - может быть потом переделаю, заодно посмотрю что быстрее функционирует:smile:
Если надумаете переделывать :) вот как у меня было:
function AddCompareFilterToJoin(Filters, Code, Field1, Field2, CompareOperatorType) { var CompareFilter = Filters.CreateCompareFilter(); Filters.Add(CompareFilter); CompareFilter.Code = Code; if (!IsEmptyValue(CompareOperatorType)) { CompareFilter.CompareOperator = CompareOperatorType; } var TestExpression = CompareFilter.CreateFieldFilterExpression(); var ValueExpression = CompareFilter.CreateFieldFilterExpression(); TestExpression.Field = Field1; ValueExpression.Field = Field2; CompareFilter.TestExpression = TestExpression; CompareFilter.ValueExpression = ValueExpression; return CompareFilter; }
Вызов:
var RelationMembersSQ = RelationDiagram.RelationMembersSQ; var RelationTable = RelationMembersSQ.Items(0).Joins.ItemsByLeftTableAlias('tbl_Relation'); if (RelationTable.Filters.Count == 0) { ContactAIDField = RelationTable.LeftField.ParentFields.ItemsByName('ContactAID'); ContactBIDField = RelationTable.LeftField.ParentFields.ItemsByName('ContactBID'); AccountBIDField = RelationTable.LeftField.ParentFields.ItemsByName('AccountBID'); RelationTable.LogicalOperator = lotOr; RelationTable.Filters.LogicalOperator = lotOr; var RelationMembersTable = RelationMembersSQ.Items(0).FromTable; AccountIDField = RelationMembersTable.Fields.ItemsByName('AccountID'); ContactIDField = RelationMembersTable.Fields.ItemsByName('ContactID'); AddCompareFilterToJoin(RelationTable.Filters, 'ContactAID', ContactAIDField, ContactIDField); AddCompareFilterToJoin(RelationTable.Filters, 'ContactBID', ContactBIDField, ContactIDField); AddCompareFilterToJoin(RelationTable.Filters, 'AccountBID', AccountBIDField, AccountIDField); }