• Авторизация


Фильтрация лукапов в Terrasoft CRM 23-10-2008 08:15 к комментариям - к полной версии - понравилось!


Очень часто встречается ситуация, когда необходимо фильтровать лукапы - всплывающие окошки с данными из какого то справочника. Особенно когда они связаны друг на друге.
Например у вас есть справочник отраслей, а для каждой отрасли завязаны свои виды деятельности.
Соотвественно при выборе отрасли в карточке контрагента, вам в последующем надо выбирать только те деятельности которые к ней относятся.

Что же нужно?
1. Создать фильтр и параметр по нужному полю в запросе для нижнего справочника (вид деятельности)
2. Обработать событие вызова лукапа, суть в том чтобы применить функцию ApplyDataset, описаную в скрипте по работе с данными, она просто включает фильтр в запросе, и подставляет переданное вами значение в параметр
3. Обработать события смены значения поле вышестоящего справочника (отрасли). Если отрасль изменилась то нужно сбросить на ноль вид деятельности. Если отрасль == null, то нужно заблокировать поле вид деятельности, чтобы его нельзя было видеть. Лучше эту проверку выделить в отдельную функцию (3b)
4. При загрузке формы вызывать функцию проверки отрасли (3b), для блокировки поля вид деятельности.


//(работа с лукапами)
//при вызове лукапа для вида деятельности применяем параметр по отрасли
function FilterLookupDataControlLookupDatasetByIndustry(LookupDataControl, FieldDataFieldValue)
{
    var Dataset = LookupDataControl.DataField.LookupDataset;
    if (FieldDataFieldValue != null) {
        ApplyDatasetFilter(Dataset, 'FieldID', FieldDataFieldValue, true);
    } else {
        ApplyDatasetFilter(Dataset, 'FieldID', 0, false);
    }

}


//обрабатываем изменения полей рубрикатора
function dlDataOnDatasetDataChange(DataField) {
    if(DataField.Name == 'FieldID')
    {
        edtActivity.DataField.Value = null;
        InitEnabledFields();
        return;
    }
}

//инициируем доступность полей рубрикатора
function InitEnabledFields()
{
        //если отрасль указана то делаем вид деятельности доступным
        edtActivity.IsEnabled = (edtField.DataField.Value  != null);
        //далее остальные поля...

}

и наконец, подписываемся на событие вызова лукапа:

function edtActivityOnPrepareSelectWindow(LookupDataControl) {
    FilterLookupDataControlLookupDatasetByIndustry (LookupDataControl, edtField.DataField.Value);

}

В общем действуйте по аналогии.
Хочу заметить что если вы создаете фильтры по определенному правилу, например фильтр называется так же как поле которое фильтруется то можно сделать универсальный обработчик,
например

function edtActivityOnPrepareSelectWindow(LookupDataControl) {
    FilterLookupDataControlLookupDatasetByField (LookupDataControl, edtField.DataField);

}

//при вызове лукапа для вида деятельности применяем параметр по отрасли
function FilterLookupDataControlLookupDatasetByField (LookupDataControl, FieldDataField)
{
    var Dataset = LookupDataControl.DataField.LookupDataset;
    if (FieldDataFieldValue != null) {
        ApplyDatasetFilter(Dataset, FieldDataField.Name, FieldDataField.Value, true);
    } else {
        ApplyDatasetFilter(Dataset, FieldDataField.Name, 0, false);
    }

}

функцию FilterLookupDataControlLookupDatasetByField  можно будет применять для всех лукапов, она будет просто искать в запросе датасета лукапа фильтр с названием поля по которому идет фильтрация.





 

вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник Фильтрация лукапов в Terrasoft CRM | Чарубаэль - Дневник | Лента друзей Чарубаэль / Полная версия Добавить в друзья Страницы: раньше»