Создаю фильтр для отчета. Необходимо иметь возможность выбрать несколько значения для одного поля. Вставила в окно фильтра WindowContainer, и указала тип wnd_MultiSelectData. Как теперь обработать это WindowContainer? Как указать ему, какой ДатаСет использовать? Как считать оттуда данные?
К сожалению, вышестоящий коллега требует именно так. Так как я начинающий разработчик именно в области Terrasoft, приходится подчиняться.
Тем более что с первой из указанных Вами ссылок я работала пол дня, и честно сказать, сие у меня не заработало. Во-первых, у меня датасет формируется только в процессе выбора значения из другого поля (взаимосвязанные данные), и в вышеуказанном примере просто вылетает ошибка. Когда я поменяла датасет на изначально жестко указанный - данные отобразились, но после их выбора и нажатия на кнопку ОК, ничего не произошло (работаю с версией 3.3).
Ну и плюс "не нравится (не мне) отдельно открываемое окно.
Наталия, тогда опишу "ориентировочно", по аналогии работы с виндовс-контейнерами вообще. возможно, некоторые моменты не совсем верны, нужно проверять/тестировать.
"Наталия П." написал:Как указать ему, какой ДатаСет использовать?
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-е. При таком условии, на каком событии мне лучше указывать на заполнение ДатаСета?
и поставила это в событии
function lcAssortimentOnChange(LookupControl)
- это LookUp, после выбора значения которого я могу определить параметры для выбора ДатаСета ds_ShopForAssortiment. На форме ему соотвествует dlShop.
Но в результате после выбора значения lcAssortiment получаю ошибку :
нажимаю Continue, данные для множественного выбора не показываются. Но активируются кнопки перехода по записям на множественном выборе.
dlData в окне МультиСелекта есть "по умолчанию" -- Вы ведь используете уже готовое окно Common\Window Templates\MultiSelectData\wnd_MultiSelectData, верно? поэтому именно в длДату этого окна нужно подставить нужный Вам датасет.
dlShop -- это в невизуальных компонентах "главного" окна? если да, то к МультиСелекту она не имеет отношения.
ошибка -- видимо, возникает именно из-за того, что МультиСелект не знает, какой датасет "грузить" (не определена длДата окна).
"Наталия П." написал:>> кнопки "ок" и "отмена", наверное, лучше скрыть.
а это как сделать?
выше в коде я написала:
//скрытие кнопок -- название фрейма перепроверьте
wndCashflowGridArea.Window.ComponentsByName('frmButtons').IsVisible=false;
"Наталия П." написал:ошибка 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 :
Проверяю заполненность Датасета - все в порядке.
Для проверки добавила такой код :
var Dataset = wndMultiShopChoise.Window.ComponentsByName('dlData').Dataset;
Dataset.Open();
Dataset.GotoFirst();while(!Dataset.IsEOF){
MessageBox(Dataset('ShopName'));
Dataset.GotoNext();}
Dataset.Close();
Теперь, именно в момент открытия Датасета я вижу, что в MultiSelectData появляются строчки, в нужном количестве. Но как только я закрываю Датасет, все пропадает.
Добрый день, Наталия!
Предлагаю направить нам сервисы MultiShopChoise на support или сюда через прикрепленный архив.
По тексту кода тяжело ориентироваться, нужна отладка.
Наталия , мне кажется вам поможет скрипт wnd_MutualSettlementsScript в TSXRM D, если у вас не та версия то посмотрите реализацию данного функционала в Демо версии XRM D
Частично я уже разобралась сама. На данный момент у меня мой 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_, который производит выборку данных для построения отчета. После небольших поправок, судя по всему, все заработало.