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

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

Нравится

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

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

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

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

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

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

обратится к датасету окна можно примерно так:

WindowContainer.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_yourDS');

заполнить его лучше на онПрепаре "главного" окна.

"Наталия П." написал:Как считать оттуда данные?

попробуйте так:

var KeyValues = GetAttribute(WindowContainer.Window, 'KeyValues');

тут WindowContainer -- название этого окна выбора в карточке.
кнопки "ок" и "отмена", наверное, лучше скрыть.

вообще, по-хорошему, на онПрепаре главного окна, пропишите функцию инициализации этого "контейнера", код такой:

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');
}

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

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

Я изменила

WindowContainer.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_yourDS');

на

wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');

и поставила это в событии
function lcAssortimentOnChange(LookupControl)
- это LookUp, после выбора значения которого я могу определить параметры для выбора ДатаСета ds_ShopForAssortiment. На форме ему соотвествует dlShop.
Но в результате после выбора значения lcAssortiment получаю ошибку :

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

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

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

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

выше в коде я написала:

//скрытие кнопок -- название фрейма перепроверьте
    wndCashflowGridArea.Window.ComponentsByName('frmButtons').IsVisible = false;

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

Так. Кнопки я убрала! И строку поиска тоже :

wndMultiShopChoise.Window.ComponentsByName('fgDataButtons').IsVisible = false;
wndMultiShopChoise.Window.ComponentsByName('fgSearch').IsVisible = false;

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

Что теперь с этой ошибкой делать?
При строке

wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_ShopForAssortiment');

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

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

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

Методом заглушек в файле scr_MultiSelectData
я нашла место ошибки.
Оно возникает тут :

function UpdateButtonsVisible() {      /*MessageBox('edit');*/
	var EditWindowUSI = GetEditWindowUSIByDatasetUSIDef(MultiSelectData.Dataset.USI);
	if (IsEmptyValue(EditWindowUSI)) {
		btnNew.IsVisible = false;
		btnEdit.IsVisible = false;
		btnDelete.IsVisible = false;
	}
}

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

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');   
}

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

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);
}

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

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);
 
}

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

Проверяю заполненность Датасета - все в порядке.
Для проверки добавила такой код :

var Dataset =  wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset;	
	Dataset.Open();
	Dataset.GotoFirst();
	while(!Dataset.IsEOF)
	{
		MessageBox(Dataset('ShopName'));
		Dataset.GotoNext();
	}
	Dataset.Close(); 

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

Возможно вывод данных в MultiselectData надо как-то отдельно указывать? К вышескопированному добавила

SetAttribute(wndMultiShopChoise.Window, 'DisplayFieldName', 'ShopName');
	SetAttribute(wndMultiShopChoise.Window, 'KeyFieldName', 'ID');

перед

wndMultiShopChoise.Window.Prepare(); 

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

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

Попробуйте так:

  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';

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

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

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; 
}

Поля не видны в 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()

function ReturnSelectedValue() {   
 
	var grdTarget = wndMultiShopChoise.Window.ComponentsByName('grdTarget');  
	grdTarget.SelectAllRows();	  
	var SelectedIDs = grdTarget.SelectedIDs;  
 
	MessageBox('1'); 
	MessageBox(SelectedIDs);   
	MessageBox('2');

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

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

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

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

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