Публикация

И снова про запросы

Эх, а вот не сделать же в администраторе left join T1 on T1.A=T2.B and T1.C = 'Value'...
И в блок where это условие не перетащить - пресловутая "галочка" для фильтра сравнения должна быть проставлена и в запросах глобально используемых типа sq_Document уже нельзя такие вольности допускать.
Снова делаем вьюху на сервере с выборкой по нужному условию, цепляем ее как сервис таблицы и используем в join... громоздко:cry:

Нравится

Поделиться

3 комментария

Александр, можно при создании экземпляра запроса динамически создавать дополнительные условия и даже менять логический оператор между ними.

Пока решил через 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);
	}
Показать все комментарии