Вопрос

Подскажите как правильно про инициализировать данные для wnd_MultiSelectData помещенный в WindowsContainer. У меня все время появляется такая ошибка: 'MultiSelectData.Dataset.USI' - есть null или не является объектом

У меня такой же вопрос

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

Валентин, ознакомьтесь с примерами в темах:
http://www.community.terrasoft.ua/developer/faq/4155
http://www.community.terrasoft.ua/forum/topic/9236

Чтобы определить причину возникающей у Вас ошибки, нужно видеть выполненную реализацию.
Если не получится разобраться используя предложенные темы, направьте сервисы либо вложите код.

Спасибо. Второй топик интересный. Что удалось узнать:
вот эта функция
function wnd_MultiSelectDataExOnShow(Window) {
UpdateButtonsVisible();
SetFocusToEdit();
}
Вызывается почему-то до того как окно MultiSelectData проинициализировано. Т.е. на момент ее вызова MultiSelectData = null.
Т.е. событие OnShow окна MultiSelectData находящегося в контейнере вызывается до того как это окно создано?
Более того это событие вызывается до события onPrepare родителькского окна!!!!

Собственно главная проблема не в этом.
Я закоментировал UpdateButtonsVisible(); и ошибка не появляется. мне не понятно почему в датасет данные не отображаются? Когда я его открываю то строки появляться но они почему то не отображаются в дата гриде. Вернее отображается какие-то строки но все значения пустые

Валентин, нужны сервисы или бекап базы чтобы понять причину и предоставить рекомендации.

сервисы это что?

Сервисы - это файлы конфигурации, в которые Вы вносите изменения.
Чтобы их выгрузить, выберите название сервиса в дереве сервисов приложения Terrasoft Administrator и вызовите команду контекстного меню "Сохранить в файл".

Добавил

Я уже ничего не понимаю :-(
вот CallStack (см. аттач)
Объясните мне какого после вызова ShowWindowEditEx вызывается wnd_MultiSelectDataExOnShow???

Валентин, сервисы скачала, после тестирования напишу Вам результат.

Валентин, для корректной работы логики приведите код по окну wndTeam в функции wnd_ProjectEditOnPrepare к виду:

wndTeam.Window.ComponentsByName('dlData').Dataset = Services.GetNewItemByUSI('ds_Staff');
wndTeam.Window.ComponentsByName('fgSearch').IsVisible = false;
wndTeam.Window.ComponentsByName('fgDataButtons').IsVisible = false;
SetAttribute(wndTeam.Window, 'DatasetUSI', ExtractUSICodeEx(Services.GetNewItemByUSI('ds_Owner').USI));
wndTeam.Window.Attributes('DisplayFieldNames') = 'ContactID';
wndTeam.Window.Attributes('DisplayFieldName') = 'ContactID';
wndTeam.Window.Attributes('SearchFieldName') = 'ContactID'; 
wndTeam.Window.Attributes('KeyFieldName') = 'ID';
wndTeam.Window.Attributes('KeyValue') = '';
wndTeam.Window.Prepare();
var Dataset =  wndTeam.Window.ComponentsByName('dlData').Dataset;   
Dataset.Open();

Что касается Вашего комментария

"Хуторный Валентин Петрович" написал:Объясните мне какого после вызова ShowWindowEditEx вызывается wnd_MultiSelectDataExOnShow???

При изменении записи в разделе [Проекты] происходит вызов функции function EditProjectRecord. Окно редактирования вызывается посредством функции ShowEditWindowEx, согласно передаваемым параметрам которой не следует выполнять Prepare перед Show.
Чтобы это изменить, замените строку

ShowEditWindowEx('wnd_ProjectEdit', Attributes);

На:

ShowEditWindowEx('wnd_ProjectEdit', Attributes, undefined, undefined, true);
SetAttribute(wndTeam.Window, 'DatasetUSI', ExtractUSICodeEx(Services.GetNewItemByUSI('ds_Owner').USI));

наверное все таки:

SetAttribute(wndTeam.Window, 'DatasetUSI', ExtractUSICodeEx(Services.GetNewItemByUSI('ds_Staff').USI)); 

и еще добавил

wndTeam.Window.Attributes('SearchFieldNames') = 'ContactID'; 

т.к. ругалась функция AddSearchFields()

и конечно

var Dataset =  wndTeam.Window.ComponentsByName('dlData').Dataset;   
Dataset.Open();

можно убрать т.к. если нормально отрабатывает onPrepare() то датасет будет отккрыт

"Хуторный Валентин Петрович" написал:наверное все таки:
SetAttribute(wndTeam.Window, 'DatasetUSI', ExtractUSICodeEx(Services.GetNewItemByUSI('ds_Staff').USI));

Вы правы, так как в коробочной версии нет ds_Staff, тестировала на ds_Owner. Пропустила внести изменения в данной строке при подмене.

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Рассмотрим задачу: необходимо реализовать множественный выбор, а именно, данные записываются из окна MultiSelectData в поле Lookup в виде строки String через запятую. Затем при открытии окна MultiSelectData - эти данные из строки отображаются в окне в виде списка StringList.

Наиболее правильным решением поставленной Вами задачи будет следующий алгоритм:

1) Создать 2 поля с типом строка, в которой необходим множественный выбор, в одном хранить IDs (ExtraOfferingIDs), в другом Имена (ExtraOfferingName).

2) В окне редактирования записи создать управляющий элемент (контрол) с типом LookupControl, например edtExtraOfferingName.

3) При инициализации окна (например, функция Initialize), необходимо считывать данные из Датасета и записывать их в созданный управляющий элемент, например:

edtExtraOfferingName.Value = Dataset.Values('ExtraOfferingIDs');
edtExtraOfferingName.Text = Dataset.ValAsStr('ExtraOfferingName');

4) На событии управляющего элемента OnPrepareSelectWindow необходимо этому окну передавать следующие атрибуты – KeyValues, DisplayFieldValues:
Self.Attributes('KeyValues') = Dataset.Values('ExtraOfferingIDs');
Self.Attributes('DisplayFieldValues') = Dataset.ValAsStr('ExtraOfferingName');

5) В окне MultiSelectData хранятся значения типа StringList (список). Следовательно, заполнение Вашего окна полученными значениями предусматривает предварительного создания функции, которая будет преобразовывать строку (с несколькими данными, приписанных например через запятую) в список. Иначе в окно MultiSelectData Вы не сможете поместить никаких значений.
В том случае если подобной функции Вы не реализовывали, то ниже высылаю Вам пример подобной функции. Реализовать необходимую Вам функцию Вы можете по аналогии с предоставленным примером:

function CreateStringListByCommaString(CommaString) {
var StringsList = System.CreateObject('TSObjectLibrary.StringsList');
if (CommaString != null) {
var StringDataArray = CommaString.split(',');
for (var i in StringDataArray) {
var StrData = StringDataArray[i];
StringsList.Add(StrData);
}
}
return StringsList;
}

6) На событии OnNotify необходимо обработать полученные из wnd_MultiSelectData значения, и записать их в таблицу. Примерный программный код приведен ниже:

eyValues = Sender.Attributes('KeyValues');
KeyValuesStr = KeyValues.CommaText;
DisplayFieldValues = Sender.Attributes('DisplayFieldValues');
DisplayFieldValuesStr = DisplayFieldValues.CommaText;
Dataset.Values('ExtraOfferingIDs') = KeyValuesStr;
Dataset.Values('ExtraOfferingName') = DisplayFieldValuesStr;
edtExtraOfferingName.Text = DisplayFieldValuesStr;

Желаю удачи!

С уважением,
Мельникова Екатерина

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать