Помогите сделать динамический запрос

Добрый день! Хочу сделать след. фичу в террасофте, для слияния одинаковых значений в справочниках: Вызывается окно

где выбирается в первой строке таблица, например 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);
}

Верхняя часть окна работает нормально, т.е. контрол "поле" фильтруется в зависимости от значения в контроле "Таблица". Как быть со второй частью окна не знаю :( .Собственно вопрос "Как динамически подключить справочник к окну?" т.е. например если выбрать справочник должностей в контроле "значения" выпадали все значения справочника должности.
И второй вопрос: "как создать динамически запрос на обновление полей?"
Заранее спасибо!

Нравится

3 комментария

Здравствуйте!
После анализа необходимой Вам функциональности мы можем Вам сообщить, что реализация подобного функционала не является тривиальной и требует добавления значительных изменений в стандартную конфигурацию приложения. К сожалению, предоставить Вам детальные рекомендации по реализации данного функционала будет довольно-таки сложно, поскольку есть большая вероятность упустить важные пукнты. Поэтому во вложении к сообщению высылаем Вам сервисы, в которых рассмотрен пример реализации необходимого Вам функционала (запускать на выполнение Вы можете прямо из 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. Что касается дублирующихся значений, то физически добавить в перечисления новое значение Вам удасться, но к сожалению, реализовать необходимые функциональности - не представится возможным (по причине возникновения ошибок).

Желаем Вам удачи!

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