Ограничение выборки отображаемых значений одного поля по условию выбора соответствующего значения в другом поле
Всем здравствуйте!
Есть карточка редактирования. В ней среди прочих полей есть поля "Плательщик" и "Платежные реквизиты".
Необходимо, чтобы при выборе плательщика в первом поле осуществлялось ограничение выборки для выбора значения во втором. То есть, чтобы отображались реквизиты только выбранного контрагента (плательщика). Как реализовать подобную логику? Я так понимаю: нужно добавить в соответствующий SelectQuery атрибут типа "ПлательщикID" и условие отбора по нему. Но как это условие активировать (по какому событию? и какой функцией?)? Как заполнить атрибут значениями перед выборкой?
Есть-ли какая-то подробная инструкция? Очень хотелось бы её получить.
Нравится
Это называется фильтрация.
"Алейник Алексей Вадимович" написал:Я так понимаю: нужно добавить в соответствующий 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.
Возможно, не всё правильно в 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); }
Исправил, но к сожалению, ошибка та же: необработанное исключение
Значит, что-то ещё не заметили. Можете в отладчике дойти до момента свала, последовательно заходя в функции и заметить, где "что-то пошло не так". Или в момент свала посмотреть стек вызова функций.
В тех. поддержке подсказали, в чём проблема. Я передавал в функцию 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, если там такого ещё нет.