Создаю фильтр для отчета. Необходимо иметь возможность выбрать несколько значения для одного поля. Вставила в окно фильтра WindowContainer, и указала тип wnd_MultiSelectData.
Как теперь обработать это WindowContainer? Как указать ему, какой ДатаСет использовать? Как считать оттуда данные?
Нравится
Наталия, а Вам обязательно делать именно так, с отображением 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_, который производит выборку данных для построения отчета. После небольших поправок, судя по всему, все заработало.
Приятной работы!
Павел, еще раз огромное Вам спасибо за такую качественную работу и суппорт!
Все работает так как надо.