Фильтры
Разработка

Фильтр по значению другого поля

Совсем недавно на форуме, поэтому попытаюсь описать проблему более подробно.

Есть два поля Группы сервисов и Сервисы. Оба на основе созданных для них словарей.
Датасеты словарей ds_dicMyServiceGroup и ds_dicMyService. В ds_dicMyService есть поле UPID, которое ссылается на поле ID в ds_dicMyServiceGroup.
В запросе sq_dicMyService есть фильтр сравнения по полю UPID.

В скрипте, привязанном к окну при изменении значения поля Группа сервисов по срабатыванию dlDataOnDatasetDataChange делаю следующее:

var groupID = DataField.Value;
var dsMyService = GetSingleItemByCode('ds_dicMyService');
EnableDatasetFilters(dsMyService, false);
ApplyDatasetFilter(dsMyService, 'UPID', groupID, true);

При первом изменении значения в поле Сервисы меняются, в дальнейшем не изменяются.
Подебажил, в датасете содержимое меняется, а в элементе окна остаются значения отфильтрованные в первый раз.

Если что-то невнятно объяснил, просьба указать на это, а не ругать.
Заранее спасибо.

Нравится

8 комментариев

"theimp" написал:var dsMyService = GetSingleItemByCode('ds_dicMyService');

здесь вы берете некий экземпляр датасета сервисов, а надо брать именно существующий экземпляр LookupDataset назначенного для поля ServiceID (или как там оно названо) в карточке

[javascript]
var LookupDataset = edtServiceID.DataField.LookupDataset;
[/javascript]
- так например, здесь edtServiceID - название контрола для ServiceID

потом именно его фильтровать

так тоже пробовал, то же самое.

"theimp" написал:а в элементе окна остаются значения отфильтрованные в первый раз

в смысле при открытии справочника? или просто значение в поле?

честно говоря, по другому бы сделал - назначил фильтрацию на открытие именно нужного справочника аналогично
(на событие OnPrepareSelectWindow)
[javascript]
function edtContactOnPrepareSelectWindow(LookupDataControl) {
var Dataset = dlData.Dataset;
var LookupDataset = LookupDataControl.DataField.LookupDataset;
var AccountID = Dataset.Values('CustomerID');
var IsAccountIDFilterEnabled = !IsEmptyGUID(AccountID);
ApplyDatasetFilter(LookupDataset, 'AccountID', AccountID,
IsAccountIDFilterEnabled);
}
[/javascript]
-цитата:smile: фильтруем справочник контактов по значению из поля CustomerID

и потом OnDataChange - если меняем поле groupID то обнулял бы значение поля ServiceID

"Александр Кудряшов" написал:в смысле при открытии справочника? или просто значение в поле?

имею в виду что отражается в элементе окна

"Александр Кудряшов" написал:честно говоря, по другому бы сделал

сейчас попробую, отпишусь

function edtMyServiceOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
var Dataset = dlData.Dataset;
var LookupDataset = LookupDataControl.DataField.LookupDataset;
var groupID = Dataset.Values('ServiceGroupID');
var IsFilterEnabled = !IsEmptyGUID(groupID);
ApplyDatasetFilter(LookupDataset, 'UPID', groupID,
IsFilterEnabled);
}

то же самое. элементы в выпадающем списке Сервис изменяются только один раз, после этого не обновляются

"Александр Кудряшов" написал: обнулял бы значение поля ServiceID

Александр, здесь что имелось в виду. просто присвоить '' ?

ну да, что то вроде Dataset('ServiceID') = null;

"theimp" написал:элементы в выпадающем списке Сервис изменяются только один раз, после этого не обновляются

так там у вас список выпадающий:smile:
тогда обязательно
[javascript]
edtMyService.UnprepareDropDownList();
[/javascript]
можно там же на OnDataChange

спасибо большое, Александр. знал бы, раньше бы здесь отписался. столько времени убито зря.

Показать все комментарии