Ограничение выборки отображаемых значений одного поля по условию выбора соответствующего значения в другом поле

Всем здравствуйте!

Есть карточка редактирования. В ней среди прочих полей есть поля "Плательщик" и "Платежные реквизиты".
Необходимо, чтобы при выборе плательщика в первом поле осуществлялось ограничение выборки для выбора значения во втором. То есть, чтобы отображались реквизиты только выбранного контрагента (плательщика). Как реализовать подобную логику? Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему. Но как это условие активировать (по какому событию? и какой функцией?)? Как заполнить атрибут значениями перед выборкой?
Есть-ли какая-то подробная инструкция? Очень хотелось бы её получить.

Нравится

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

Это называется фильтрация.

"Алейник Алексей Вадимович" написал:Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему.

Да. А потом у контрола, который нужно отфильтровать создаём обработчик события OnPrepareSelectWindow. Обработчик создаётся в левом нижнем блоке окна TSAdmin, на вкладке "События".

По клику создастся пустая функция. Там надо будет написать примерно такое, поменяйте названия полей на нужные:

function edtOpportunityOnPrepareSelectWindow(LookupDataControl) {
	var TaskDataset = dlData.Dataset;
	var AccountID = GetFieldValueFromDisabledField(TaskDataset, 'AccountID');
	var OpportunityDataset = LookupDataControl.DataField.LookupDataset;
	var IsEnabled = (!IsEmptyValue(AccountID));
	ApplyDatasetFilter(OpportunityDataset, 'CustomerID', AccountID, IsEnabled);
}

Пример взят из scr_TaskEdit.

Сделал всё по аналогии. В результате: при вызове функции ApplyDatasetFilter() ошибка небработанного исключения (см. приложенный скриншот).

Возможно, не всё правильно в SelectQuery. Там должны быть и фильтр, и параметр с одинаковыми названиями.

Взгляните пожалуйста на скриншоты SelectQuery, может быть это внесёт ясность и поможет найти у меня ошибку

Вроде бы правильно. А скрипт?

"Зверев Александр" написал:А скрипт?

function edtPaymentsDetailIDOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
	//TODO
	var OrderDataset = dlData.Dataset;
    var ConsigneeID = GetFieldValueFromDisabledField(OrderDataset, 'ConsigneeID');
    var PaymentsDetailDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(ConsigneeID));
    ApplyDatasetFilter(PaymentsDetailDataset, 'CustomerID', ConsigneeID, IsEnabled);
}

А почему фильтр 'CustomerID', а не 'ConsigneeID'?

О, не заметил, спасибо!

Исправил, но к сожалению, ошибка та же: необработанное исключение

Значит, что-то ещё не заметили. Можете в отладчике дойти до момента свала, последовательно заходя в функции и заметить, где "что-то пошло не так". Или в момент свала посмотреть стек вызова функций.

В тех. поддержке подсказали, в чём проблема. Я передавал в функцию ApplyDatasetFilter() вторым параметром название несуществующего параметра SQL-запроса. Первый параметр этой функции - это исходный датасет (в моём случае - AccounBilllingInfo), из которого выбирается параметр SQL-запроса (в моём случае - AccountID). А это значит, что текст моего скрипта должен был выглядеть вот так:

function edtPaymentsDetailIDOnPrepareSelectWindow(LookupDataControl) {
    var OrderDataset = dlData.Dataset;
    var ConsigneeID = GetFieldValueFromDisabledField(OrderDataset, 'ConsigneeID');
    var PaymentsDetailDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(ConsigneeID));
    ApplyDatasetFilter(PaymentsDetailDataset, 'AccountID', ConsigneeID, IsEnabled);
}

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

Да, все равно, спасибо Вам большое, Вы мне очень помогли:twisted:

Стал переносить логику из тестовой конфигурации на рабочую. В результате заимел ошибки при добавлении новой заявки через действие "Резервирование/Заявка" в разделе счета и через добавление кнопкой "Добавить" из раздела "Заявки" (см. скриншот add.png). Скрипты тестовой и рабочей конфигураций полностью совпадают. Остальные сервисы также тщательно сверил, но ошибку найти никак не могу. Проблема ещё в том, что не до конца понятно, как пользоваться MS Editor для отладки. Документации по нему почти никакой нету.
Может кто поможет мне локализовать ошибку, где её искать? Заранее благодарен.

Судя по скриншоту, в SelectQuery не добавлена колонка DocumentName или в Dataset-е для этого поля не прописано значение колонки для отображения.

Действительно! Почему-то очистилось несколько полей отображения в датасете. Спасибо!

Аналогичную логику по созданию фильтрации данных необходимо выполнить для других полей:
При заполненном поле "Счет" отфильтровать поля "Договор" и "Документ".
Попытался сделать аналогично рекомендованным ранее вариантам.
К сожалению, реализованный вариант почему-то отсеивает абсолютно все записи.

function edtContractIDOnPrepareSelectWindow(LookupDataControl) {//обработчик поля "Договор"
	//TODO
	var OrderDataset = dlData.Dataset;
    var InvoiceID = GetFieldValueFromDisabledField(OrderDataset, 'InvoiceID');
	var InvoiceID = OrderDataset.Values('InvoiceID');
    var ContractDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(InvoiceID));
    ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled);   
//    debugger;
}
 
function edtDocumentIDOnPrepareSelectWindow(LookupDataControl) {//обработчик поля "Документ"
	//TODO
	var OrderDataset = dlData.Dataset;
    var InvoiceID = GetFieldValueFromDisabledField(OrderDataset, 'InvoiceID');
    var DocumentDataset = LookupDataControl.DataField.LookupDataset;
    var IsEnabled = (!IsEmptyValue(InvoiceID));
    ApplyDatasetFilter(DocumentDataset, 'ID', InvoiceID, IsEnabled);
//    debugger;
}

"Алейник Алексей Вадимович" написал:

ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled); 


Вам нужен фильтр не 'ID', а какой-то другой. Возможно, 'InvoiceID'.

"Зверев Александр" написал:
Алейник Алексей Вадимович пишет:

ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled);

Вам нужен фильтр не 'ID', а какой-то другой. Возможно, 'InvoiceID'.


Взгляните сами - все эти поля есть в стандартной конфигурации. Я попробовал заменить 'ID' на 'InvoiceID' и, как я и предполагал, террасофт выдал ошибку о том в SelectQuery запрашиваемого датасета (в моём случае, как видно из скриншота invoice2.png этим датасетом является ds_Invoice, а SelectQuery - sq_Invoice) нет такого параметра.

Фильтр 'ID' - это фильтр по ID, как это ни странно. Сейчас вы хотите найти те документы, у которых ID совпадает с ID выбранного счёта. Естественно, таких нет.

Нужно добавить фильтр 'InvoiceID' в sq_Contract и sq_Document, если там такого ещё нет.

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