Добрый день! Хочу сделать след. фичу в террасофте, для слияния одинаковых значений в справочниках: Вызывается окно
где выбирается в первой строке таблица, например tbl_Contact(Контакты), во второй указывается поле, например JobID(должность), в третем поле вручную пишется слово для фильтрации, например "Директор", в поле справочник выбирается например справочник должностей(tbl_Job),а в поле значения - список значений этого справочника, например. "Ген. директор". После чего нажимается кнока "применить" и происходит следущее: таблица контактов фильтруется по полю должность = директор, все поля "Должность" отфильтрованых записей заменяются на ID - "Ген. директор" из справочника. т.е. было сто записей контактов с должностями "Директор" стали "ген. директор" :)
Вот скрипт окна, который я уже написал:
// wnd_MergerScript
//-----------------------------------------------------------------------------
function CloseForm(Control) {
var DestTableID = edtDestTable.Value;
var DestFieldName = edtDestFieldName.Value ;
var Filter = edtFilter.Value ;
SetAttribute(Self, 'DestTableID', DestTableID);
SetAttribute(Self, 'DestFieldName', DestFieldName);
SetAttribute(Self, 'Filter', Filter);
}
function dlDataOnDatasetDataChange(DataField) {
if (!Assigned(DataField)) {
return;
}
var Dataset = dlData.Dataset;
var DataFieldName = DataField.Name;
switch (DataFieldName){
case ('DestTableID'): // Контрол "Таблица"
var DestTableID = Dataset.Values('DestTableID');
var AddedFields = new Array();
edtDestFieldName.Enum = TableFieldsToEnum(DestTableID, false, AddedFields);
break;
case ('DictionaryID'): //Контрол "справочник"
var DictionaryID = Dataset.Values('DictionaryID');
var AddedFields2 = new Array();
edtDictionaryValue.Enum = TableFieldsToEnum(DictionaryID, false, AddedFields2);
break;
}
}
// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------
function btnOKOnClick(Control) {
CloseForm(Control);
}
Верхняя часть окна работает нормально, т.е. контрол "поле" фильтруется в зависимости от значения в контроле "Таблица". Как быть со второй частью окна не знаю :( .Собственно вопрос "Как динамически подключить справочник к окну?" т.е. например если выбрать справочник должностей в контроле "значения" выпадали все значения справочника должности.
И второй вопрос: "как создать динамически запрос на обновление полей?"
Заранее спасибо!
Нравится
Здравствуйте!
После анализа необходимой Вам функциональности мы можем Вам сообщить, что реализация подобного функционала не является тривиальной и требует добавления значительных изменений в стандартную конфигурацию приложения. К сожалению, предоставить Вам детальные рекомендации по реализации данного функционала будет довольно-таки сложно, поскольку есть большая вероятность упустить важные пукнты. Поэтому во вложении к сообщению высылаем Вам сервисы, в которых рассмотрен пример реализации необходимого Вам функционала (запускать на выполнение Вы можете прямо из Terrasoft CRM Administrator).
Желаем удачи!
Спасибо!
Хотел уточнить пару моментов:
1. Как я понимаю это код для версии 3.2, т.к. в нём используется пользовательский SQL фильтр, а как быть с версией 3.1.0.23, ведь в ней нет Пользовательского SQL фильтра :( ?
2. В функции function edtFieldOnChange(EnumControl) в
фрагменте кода:
while (!Dataset.IsEOF) { var EnumItem = edtDictionary.Enum.CreateItem(); EnumItem.ID = Dataset.ValAsGUID('ID'); EnumItem.Code = Dataset.ValAsStr('Name'); EnumItem.Caption = Dataset.ValAsStr('Name'); edtDictionary.Enum.Add(EnumItem); Dataset.GotoNext(); }
на строке edtDictionary.Enum.Add(EnumItem)вылазит ошибка если дублируются значения справочника, например если в справочнике должностей 2 раза дублируется должность Бухгалтер, то вылазит ошибка:
ошибка TSObjectLibrary.Enum: Дублируется значение свойства 'Code'. Значение 'Бухгалтер' уже существует
Возможно ли как-то добавлять в перечисления enum дублирующиеся значения? Заранее спасибо!
Добрый день!
Для того, чтобы избежать использования колонки с текстом sql для реализации необходимой Вам функциональности, мы можем Вам предоставить следующие рекомендации:
1. Мы советуем Вам получать в поле "Таблица" не таблицу, а датасет необходимого раздела. Это позволит получить доступ к необходимым полям на следующих этапах разработки.
2. Затем в поле "Поле" Вы можете получить необходимое поле используя Datafields.Items
3. По полученному полю Вы сможете получить датасет. А затем путем стандартного открытия датасета (Dataset.Open) открыть этот датасет со значениями.
4. Для того, чтобы реализовать обновление данных и полей, Вам необходимо создать хранимую процедуру на сервере, которая и будет обновлять эти данные.
5. Что касается дублирующихся значений, то физически добавить в перечисления новое значение Вам удасться, но к сожалению, реализовать необходимые функциональности - не представится возможным (по причине возникновения ошибок).
Желаем Вам удачи!