Ограничение выборки отображаемых значений одного поля по условию выбора соответствующего значения в другом поле
Всем здравствуйте!
Есть карточка редактирования. В ней среди прочих полей есть поля "Плательщик" и "Платежные реквизиты".
Необходимо, чтобы при выборе плательщика в первом поле осуществлялось ограничение выборки для выбора значения во втором. То есть, чтобы отображались реквизиты только выбранного контрагента (плательщика). Как реализовать подобную логику? Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему. Но как это условие активировать (по какому событию? и какой функцией?)? Как заполнить атрибут значениями перед выборкой?
Есть-ли какая-то подробная инструкция? Очень хотелось бы её получить.
Нравится
Это называется фильтрация.
"Алейник Алексей Вадимович" написал:Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему.
Да. А потом у контрола, который нужно отфильтровать создаём обработчик события OnPrepareSelectWindow. Обработчик создаётся в левом нижнем блоке окна TSAdmin, на вкладке "События".
По клику создастся пустая функция. Там надо будет написать примерно такое, поменяйте названия полей на нужные:
[javascript]
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);
}
[/javascript]
Пример взят из scr_TaskEdit.
Возможно, не всё правильно в SelectQuery. Там должны быть и фильтр, и параметр с одинаковыми названиями.
"Зверев Александр" написал:А скрипт?
[javascript]
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);
}
[/javascript]
Исправил, но к сожалению, ошибка та же: необработанное исключение
Значит, что-то ещё не заметили. Можете в отладчике дойти до момента свала, последовательно заходя в функции и заметить, где "что-то пошло не так". Или в момент свала посмотреть стек вызова функций.
В тех. поддержке подсказали, в чём проблема. Я передавал в функцию ApplyDatasetFilter() вторым параметром название несуществующего параметра SQL-запроса. Первый параметр этой функции - это исходный датасет (в моём случае - AccounBilllingInfo), из которого выбирается параметр SQL-запроса (в моём случае - AccountID). А это значит, что текст моего скрипта должен был выглядеть вот так:[javascript]
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);
}
[/javascript]
А, тогда ясно. Вы мне показывали скриншоты одного датасета, а пытались наложить фильтр на другой.
Да, все равно, спасибо Вам большое, Вы мне очень помогли:twisted:
Стал переносить логику из тестовой конфигурации на рабочую. В результате заимел ошибки при добавлении новой заявки через действие "Резервирование/Заявка" в разделе счета и через добавление кнопкой "Добавить" из раздела "Заявки" (см. скриншот add.png). Скрипты тестовой и рабочей конфигураций полностью совпадают. Остальные сервисы также тщательно сверил, но ошибку найти никак не могу. Проблема ещё в том, что не до конца понятно, как пользоваться MS Editor для отладки. Документации по нему почти никакой нету.
Может кто поможет мне локализовать ошибку, где её искать? Заранее благодарен.
![]()
Судя по скриншоту, в SelectQuery не добавлена колонка DocumentName или в Dataset-е для этого поля не прописано значение колонки для отображения.
Действительно! Почему-то очистилось несколько полей отображения в датасете. Спасибо!
Аналогичную логику по созданию фильтрации данных необходимо выполнить для других полей:
При заполненном поле "Счет" отфильтровать поля "Договор" и "Документ".
Попытался сделать аналогично рекомендованным ранее вариантам.
К сожалению, реализованный вариант почему-то отсеивает абсолютно все записи.
[javascript]
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;
}
[/javascript]
"Алейник Алексей Вадимович" написал:
[javascript]
ApplyDatasetFilter(ContractDataset, 'ID', InvoiceID, IsEnabled);
[/javascript]
Вам нужен фильтр не '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, если там такого ещё нет.