Множественный фильтр wnd_MultiSelectData
Фильтры
Разработка

Множественный фильтр - как заполнить данные

Создаю фильтр для отчета. Необходимо иметь возможность выбрать несколько значения для одного поля. Вставила в окно фильтра WindowContainer, и указала тип wnd_MultiSelectData.
Как теперь обработать это WindowContainer? Как указать ему, какой ДатаСет использовать? Как считать оттуда данные?

Нравится

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

Наталия, а Вам обязательно делать именно так, с отображением cписка возможного выбора и т.д.
можно ведь просто сделать лукапным полем.
подробно описано здесь
http://www.community.terrasoft.ua/developer/faq/4155
и здесь:
http://www.community.terrasoft.ua/blogs/2956

К сожалению, вышестоящий коллега требует именно так. Так как я начинающий разработчик именно в области Terrasoft, приходится подчиняться.

Тем более что с первой из указанных Вами ссылок я работала пол дня, и честно сказать, сие у меня не заработало. Во-первых, у меня датасет формируется только в процессе выбора значения из другого поля (взаимосвязанные данные), и в вышеуказанном примере просто вылетает ошибка. Когда я поменяла датасет на изначально жестко указанный - данные отобразились, но после их выбора и нажатия на кнопку ОК, ничего не произошло (работаю с версией 3.3).
Ну и плюс "не нравится (не мне) отдельно открываемое окно.

Наталия, тогда опишу "ориентировочно", по аналогии работы с виндовс-контейнерами вообще. возможно, некоторые моменты не совсем верны, нужно проверять/тестировать.

"Наталия П." написал:Как указать ему, какой ДатаСет использовать?

обратится к датасету окна можно примерно так:
[javascript]
WindowContainer.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_yourDS');
[/javascript]
заполнить его лучше на онПрепаре "главного" окна.
"Наталия П." написал:Как считать оттуда данные?

попробуйте так:
[javascript]
var KeyValues = GetAttribute(WindowContainer.Window, 'KeyValues');
[/javascript]
тут WindowContainer -- название этого окна выбора в карточке.
кнопки "ок" и "отмена", наверное, лучше скрыть.

вообще, по-хорошему, на онПрепаре главного окна, пропишите функцию инициализации этого "контейнера", код такой:
[javascript]
function PrepareCashflowGridAreaWindow() { //onprepare
//установка атрибутов, если нужно
SetAttribute(WindowContainer.Window, 'ParentItemFieldName', 'ParentItemFieldName');
WindowContainer .Window.Prepare();
//скрытие кнопок -- название фрейма перепроверьте
wndCashflowGridArea.Window.ComponentsByName('frmButtons').IsVisible = false;
//подстановка нужного датасета
WindowContainer.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_yourDS');
}
[/javascript]

Спасибо.
>> кнопки "ок" и "отмена", наверное, лучше скрыть.
а это как сделать? (я бы там вообще хотела бы все кнопки убрать)

И еще хочу уточнить. Я использую это фильтр - как фильтр для отчета. Потому dlData у меня отсутствует. И я формирую ДатаСет для множественного выбора по результата выбора в другом LookUp-е. При таком условии, на каком событии мне лучше указывать на заполнение ДатаСета?

Я изменила
[javascript]
WindowContainer.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_yourDS');
[/javascript]
на [javascript]
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
[/javascript]
и поставила это в событии
function lcAssortimentOnChange(LookupControl)
- это LookUp, после выбора значения которого я могу определить параметры для выбора ДатаСета ds_ShopForAssortiment. На форме ему соотвествует dlShop.
Но в результате после выбора значения lcAssortiment получаю ошибку :

нажимаю Continue, данные для множественного выбора не показываются. Но активируются кнопки перехода по записям на множественном выборе.

dlData в окне МультиСелекта есть "по умолчанию" -- Вы ведь используете уже готовое окно Common\Window Templates\MultiSelectData\wnd_MultiSelectData, верно? поэтому именно в длДату этого окна нужно подставить нужный Вам датасет.
dlShop -- это в невизуальных компонентах "главного" окна? если да, то к МультиСелекту она не имеет отношения.

ошибка -- видимо, возникает именно из-за того, что МультиСелект не знает, какой датасет "грузить" (не определена длДата окна).

"Наталия П." написал:>> кнопки "ок" и "отмена", наверное, лучше скрыть.
а это как сделать?

выше в коде я написала:
[javascript]
//скрытие кнопок -- название фрейма перепроверьте
wndCashflowGridArea.Window.ComponentsByName('frmButtons').IsVisible = false;
[/javascript]

Да. dlShop на dlData я уже исправила. Потому исправила и свой пост. Вторая ошибка исчезла, осталась только вышеуказанная.

Так. Кнопки я убрала! И строку поиска тоже :
[javascript]
wndMultiShopChoise.Window.ComponentsByName('fgDataButtons').IsVisible = false;
wndMultiShopChoise.Window.ComponentsByName('fgSearch').IsVisible = false;
[/javascript]

Спасибо! И прощу прощения за невнимательность.

Что теперь с этой ошибкой делать?
При строке [javascript]
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
[/javascript]

ошибка MultiSelectData.Dataset.USI все еще присутствует.

"Наталия П." написал:ошибка MultiSelectData.Dataset.USI все еще присутствует.

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

Методом заглушек в файле scr_MultiSelectData
я нашла место ошибки.
Оно возникает тут :
[javascript]
function UpdateButtonsVisible() { /*MessageBox('edit');*/
var EditWindowUSI = GetEditWindowUSIByDatasetUSIDef(MultiSelectData.Dataset.USI);
if (IsEmptyValue(EditWindowUSI)) {
btnNew.IsVisible = false;
btnEdit.IsVisible = false;
btnDelete.IsVisible = false;
}
}
[/javascript]

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

[javascript]
function wnd_myNewReportOnPrepare(Window) {
PrepareCashflowGridAreaWindow();
}

function PrepareCashflowGridAreaWindow() {
wndMultiShopChoise.Window.Prepare();
wndMultiShopChoise.Window.ComponentsByName('fgDataButtons').IsVisible = false;
wndMultiShopChoise.Window.ComponentsByName('fgSearch').IsVisible = false;
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
}

function lcAssortimentOnChange(LookupControl) {
wndMultiShopChoise.IsVisible = true;
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
}
[/javascript]

У меня есть подозрения, что это происходит из-за того, что я формирую ДатаСет в процессе выбора тех или иных данных. Например, у меня на форме 3 Lookupa и 1 MultiSelectData.
Первый Lookup (lcTradeCentre) я заполняю изначально, конкретным ДатаСетом, далее, на основе выбранных в нем данных я заполняю второй Lookup (lcAssortiment) :

[javascript]
function lcTradeCentreOnChange(LookupControl) {
lcAssortiment.Value = null;
lcAssortiment.UnprepareDropDownList();

lcTopTenantShop.Value = null;
lcTopTenantShop.UnprepareDropDownList();
}

function lcAssortimentOnPrepareSelectWindow(LookupControl, SelectWindow) {
ApplyDatasetFilter(LookupControl.LookupDatasetLink.Dataset, 'TradeCentreID', lcTradeCentre.Value, true);
}
[/javascript]

И далее, на основе данных, выбранных в lcAssortiment, мне надо заполнить одинаковыми данными третий Lookup (lcTopTenantShop) и MultiSelectData :

[javascript]
function lcAssortimentOnChange(LookupControl) {
lcTopTenantShop.Value = null;
lcTopTenantShop.UnprepareDropDownList();

ApplyDatasetFilter(wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset, 'TradeCentreID', lcTradeCentre.Value, true);
ApplyDatasetFilter(wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset, 'AssortimentID', lcAssortiment.Value, true);
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
}

function lcTopTenantShopOnPrepareSelectWindow(LookupControl, SelectWindow) {
ApplyDatasetFilter(LookupControl.LookupDatasetLink.Dataset, 'TradeCentreID', lcTradeCentre.Value, true);
ApplyDatasetFilter(LookupControl.LookupDatasetLink.Dataset, 'AssortimentID', lcAssortiment.Value, true);

}
[/javascript]

С lcTopTenantShop проблем нет - он заполняется.
Может я как-то не так оформляю ДатаСет для MultiSelectData?

Проверяю заполненность Датасета - все в порядке.
Для проверки добавила такой код :
[javascript]
var Dataset = wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset;
Dataset.Open();
Dataset.GotoFirst();
while(!Dataset.IsEOF)
{
MessageBox(Dataset('ShopName'));
Dataset.GotoNext();
}
Dataset.Close();
[/javascript]

Теперь, именно в момент открытия Датасета я вижу, что в MultiSelectData появляются строчки, в нужном количестве. Но как только я закрываю Датасет, все пропадает.

Возможно вывод данных в MultiselectData надо как-то отдельно указывать? К вышескопированному добавила
[javascript]
SetAttribute(wndMultiShopChoise.Window, 'DisplayFieldName', 'ShopName');
SetAttribute(wndMultiShopChoise.Window, 'KeyFieldName', 'ID');
[/javascript]

перед
[javascript]
wndMultiShopChoise.Window.Prepare();
[/javascript]

Может еще какие аттрибуты надо указать?

Добрый вечер, Наталия!

Попробуйте так:
[javascript]
wndMultiShopChoise.Window.Attributes('DisplayFieldNames') = 'ShopName';
wndMultiShopChoise.Window.Attributes('SearchFieldNames') = 'ShopName';
wndMultiShopChoise.Window.Attributes('KeyFieldName') = 'ID';
wndMultiShopChoise.Window.Attributes('KeyValue') = null;
wndMultiShopChoise.Window.Attributes('SearchFieldName') = 'ShopName';
[/javascript]

По этой этому поводу я проводил эксперименты здесь.

Добавление аттрибутов не помогло.

[javascript]
function PrepareMultiShopChoise() {

SetAttribute(wndMultiShopChoise.Window, 'DisplayFieldNames', 'ShopName');
SetAttribute(wndMultiShopChoise.Window, 'SearchFieldNames', 'ShopName');
SetAttribute(wndMultiShopChoise.Window, 'SearchFieldName', 'ShopName');
SetAttribute(wndMultiShopChoise.Window, 'KeyFieldName', 'ShopName');
SetAttribute(wndMultiShopChoise.Window, 'KeyValue', null);

wndMultiShopChoise.Window.Prepare();
wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');
wndMultiShopChoise.Window.ComponentsByName('fgDataButtons').IsVisible = false;
wndMultiShopChoise.Window.ComponentsByName('fgSearch').IsVisible = false;
}
[/javascript]

Поля не видны в MultiDataSelect'e

Добрый день, Наталия!
Предлагаю направить нам сервисы MultiShopChoise на support или сюда через прикрепленный архив.
По тексту кода тяжело ориентироваться, нужна отладка.

Я высылала все данные Анне Алимовой. В конце прошлой недели (зарегистрирован №0149022)

Наталия, добрый день, еще раз.
Я до завтра дам ответ. Мне немного времени потребуется проанализировать сервисы и код.

Спасибо. Буду ОЧЕНЬ ждать. Потому как завтра (26-го) мне надо сдать отчет. И он готов (отчет очень сложный), за исключением этого момента.

Наталия , мне кажется вам поможет скрипт wnd_MutualSettlementsScript в TSXRM D, если у вас не та версия то посмотрите реализацию данного функционала в Демо версии XRM D

Без отладки кода не разберемся.
Необходимый минимум: Script Dedugger, но лучше среда разработки MS Visual Studio 2008 или выше.

Частично я уже разобралась сама. На данный момент у меня мой MultiSelectData даже заполняется данными. Но как их теперь считать оттуда?
"Родная" кнопка "OK" MultiSelectData скрыта. У меня идет одна кнопка "Ок" на весь Cusom Filter. Какую из функция (из скрипта scr_MultiSelectData) надо перекопировать/переделать? На данный момент я пытаюсь запустить ReturnSelectedValue()

[javascript]
function ReturnSelectedValue() {

var grdTarget = wndMultiShopChoise.Window.ComponentsByName('grdTarget');
grdTarget.SelectAllRows();
var SelectedIDs = grdTarget.SelectedIDs;

MessageBox('1');
MessageBox(SelectedIDs);
MessageBox('2');
[/javascript]

Но MessageBox('2') я уже не вижу, а на MessageBox(SelectedIDs) ошибка не выдается.

Добрый день.
Отладка показала, что необходимо было еще донастроить Include фильтр в сервисе sq_, который производит выборку данных для построения отчета. После небольших поправок, судя по всему, все заработало.

Приятной работы!

Павел, еще раз огромное Вам спасибо за такую качественную работу и суппорт!
Все работает так как надо.

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