Добрый день, как можно c помощью entitySchemaQuery изменить значение колонки в детали на странице.

Есть страница, и на ней две детали в разных вкладках. Одна деталь - "позиции заказа", другая "Документы по заказу". В деталь "документы по заказу" добавила кнопку, при нажатии на которую, происходит update значения выбранной колонки(сделала через updateQuery по инструкции из документации). В этом же методе с помощью entitySchemaQuery создаю коллекцию с корневой схемой "позиции заказа". При обработке этой коллекции я пытаюсь поменять значение колонки с помощью инструкции this.set("NameColumn",value);

Однако это не работает, и значение колонки не меняется. 

Подскажите, пожалуйста, что я делаю не так и можно ли изменить значение колонки в детали через front-end?

Нравится

4 комментария
Лучший ответ

Здравствуйте,

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Добрый день,

Пожалуйста, предоставьте пример entitySchemaQuery, который вы настраиваете.

Viktoriia Hrynchuk,

Ниже код метода, который вызывается при нажатии кнопки. С таким подходом ошибок не возникает, но и значение StatusComponentOrder не проставляется. При отладке коллекция формируется. 

setStatusDetail:function()
{
    /* Получает массив идентификаторов выбранных записей. */
                var selectedRows = this.get("SelectedRows");
                /* Обработка запускается в случае, если выбрана хотя бы одна запись. */
                if (selectedRows.length > 0) {
                    /* Создает экземпляр класса пакетных запросов. */
                    var batchQuery = this.Ext.create("Terrasoft.BatchQuery");
                    /* Обновляет каждую из выбранных записей. */
                    selectedRows.forEach(function(selectedRowId) {
                        /* Создает экземпляр класса UpdateQuery с корневой схемой Activity. */
                        var update = this.Ext.create("Terrasoft.UpdateQuery", {
                            rootSchemaName: "DocumentComponent" // DocumentComponent - схема отвечающая за документы по заказу 
                        });
            //Далее я пытаюсь создать ещё одну коллекцию, на основе другой схемы и получить по связям колонку, которую также необходимо обновить, но уже в другой детали.
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery",{
                rootSchemaName: "OrderPosition"
            });
            esq.addColumn("StatusComponentOrder","StatusComponent");
            esq.addColumn("RowDocumentComponent.DocumentId","DocMoving"); 
            esq.esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
            "RowDocumentComponent.DocumentId", selectedRowId);
            esq.filters.add("esqFirstFilter",esqFirstFilter);
                esq.getEntityCollection(function(result)
            {
                if(result.success)
                {
                    result.collection.each(function(item)
                    {
                        this.set("StatusComponentOrder",ConstantJS.StatusComponent);
                    }
                    
                )}
            },this);
 
                        /* Применяет фильтр для определения записи для обновления. */
                        update.enablePrimaryColumnFilter(selectedRowId);
                        /* Для колонки [Status] устанавливается значение из файла с константами */
                        update.setParameterValue("Status", "ConstantJS.DocShipped", this.Terrasoft.DataValueType.GUID);
                        /* Добавляет запрос на обновление записи в пакетный запрос. */
                        batchQuery.add(update);
                    }, this);
                    /* Выполняет пакетный запрос к серверу. */
                    batchQuery.execute(function() {
                        /* Обновляет реестр. */
                        this.reloadGridData();
                    }, this);
                }

}

Здравствуйте,

 

Метод this.set("NameColumn",value) лучше заменить на обновление поля с помощью колл-бэк функции. Ниже представлен метод:

methodName: function() {
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "YourSchemaName"});
	var filters = updateQuery.filters;
	filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
	  this.Terrasoft.ComparisonType.EQUAL, "YourDetailColumnName", "YourColumnNameFromPageDesigner",));
	updateQuery.setParameterValue("YourColumnNameToUpdate",
"ValueToWriteInUpdate", this.Terrasoft.DataValueType.TEXT);
	updateQuery.execute(function(result){ 
	if(result.success) this.updateDetail({detail: "YourDetailCodeName"});}, this);  
}

Более подробное описание вы можете найти тут: https://community.terrasoft.ua/questions/ustanovka-znacheniy-kolonok-cherez-esq-na-klientskoy-chasti#comment-88853

 

С уважением,

Ангелина!

Anhelina,

спасибо за помощь! Помогло)

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

Всем привет.

7.11(onsite)

Пытаюсь через бизнес процесс поменять права доступа к лидам для одной учетки .

Но доступ к части лидов на просмотр остается, при этом если зайти в настройку "Установка прав доступа", конкретного лида, то в свойствах стоит запрет на просмотр для учетки. 

Подскажите в чем проблемма?

 

Бизнес процессИзображение удалено.

Учетка - marketing

Изображение удалено.

Нравится

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

Ну вы в элементе "настройках прав доступа" заполните блок "Какие права доступа забрать". И заберите доступ на чтение у той группы, которая необходима.

Роман, добрый день!

В случае использования запрещающих прав необходимо проверить, что для объекта Лид проставлен признак Использовать запрещающие права, как показано на скриншоте.

Но включение запрещающих прав приведет к ощутимому замедлению работы с записями, в связи с чем рекомендую просто отбирать право у данного пользователя (в первом блоке элемента после фильтрации).

Также, убедитесь, что учетка marketing не входит в роль Системные администраторы, т.к. у администраторов есть права на все записи.

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

Подскажите как в BPM 5.4 отслеживать изменение полей (журнал изменений):
- статус (значение справочника)
- дробного числа

Чтобы потом видеть какой сотрудник и когда менял статус объекта.

Нравится

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

Здравствуйте, Илья Андреевич!

Ознакомится с работой и настройкой раздела "Журнал изменений" Вы сможете в "Руководстве по настройке", раздел 7.5, стр. 297.

Приятного дня!

Илья, недавно публиковали также видео урок:

http://www.community.terrasoft.ru/blogs/10525

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

Доброго времени суток всем!

Возникла необходимость добавить поле "Код 1С" в Группу продуктов
В таблицы, датасеты, запросы все нормально добавилось а вот саму форму редактирования группы , чтобы добавить текстовый элемент я не нашел.
Подскажите пожалуйста где копать.

Terrasoft XRM 3.3.1 , MSSQL

Нравится

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

Здравствуйте, Евгений!

Уточните пожалуйста, Вам необходимо добавить поле "Код 1С" в карточку редактирования продуктов?
Или колонку в разделе "Продукты" в деталь "Группы"?

Здравствуйте Сергей.

В продукте это поле уже есть и в базе и на форме редактирования. Это было сделано ранее специалистами компании-интегратора.
А сейчас нужно добавить это поле в деталь Группы продуктов.
Объясню для чего это нужно - мы решили вести справочник продуктов только в 1С и далее синхронизировать группы и продукты в Террасофт.

А поскольку за 4 года работы в Террасофт там образовалась такая каша из групп и наименований продуктов, то для начала хочется привести в хоть какое-то соответсвие группы и продукты Террасофта и группы и продукты 1С с помощью кода 1С. А все остальное придется переносить в отдельную группу и добавлять поле типа IsVisible чтобы в старых документах наименование отображалось , но в самом справочнике и при подборе продуктов эти записи пропускались и не отображались. Как то так. Поправьте меня если где то я изобретаю велосипед.

Здравствуйте, Евгений.

Спасибо за уточнение информации.
Карточку редактирования группы Вы сможете найти в сервисе Common\Details\Groups\wnd_GroupsGridArea.

Спасибо, что воспользовались услугами Службы поддержки Terrasoft, если у Вас возникнут дополнительные вопросы, мы с удовольствием предоставим всю необходимую информацию.

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

В версии 3.4 появилась отличная возможность массового изменения записей.
При выделении нескольких записей одновременно и нажатии кнопки "Изменить" появляется окошко с предложением изменить все выделенные записи.

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

Для этого необходимо открыть скрипт scr_BaseGridAreaUtils и в функции EditGridAreaData необходимо закомментировать две строки, показанные на скриншоте:

1

Нравится

Поделиться

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

Будет ли работать в версии 3.3?

Если перенести руками всю логику массового изменения - то будет.

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

И все же в продолжение идеи о подсветке закладок предлагаю альтернативный вариант решения этой задачи. Все равно решение этой задачи востребовано среди пользователей. Согласна, реализация этой задачи абсолютно для всех закладок приведет к большому количеству запросов, отправляемых на сервер.
Но, как показывает практика, для пользователя важны не все, а лишь часть. Поэтому реализация подобного функционала не приведет к большой нагрузке сервера.

Предлагаю рассмотреть пример изменения Caption закладки "Адрес" раздела "Контрагенты" при наличии в ней записей на "Адрес*" (здесь можно придумать какие угодно варианты).
Итак, необходимо выполнить следующие действия:
1. Открываем сервис wnd_AccountsWorkspace, выделяем элемент деталей и переходим в обработчик события OnChangeActivePage.
2. В обработчике прописываем следующий код:

RefreshDetails();
 if (pcDetails.ActivePage.Name == pgAddressesDetail.Name) {   // вместо pgAddressesDetail нужно вставить название //Вашей закладки
  if (!IsDatasetEmpty(wndAddressesDetail.Window.ComponentsByName('dlData').Dataset)) { // вместо wndAddressesDetail нужно вставить название окна //закладки
   pgAddressesDetail.Caption = 'Адреса';
  } else {
   pgAddressesDetail.Caption = 'Адреса*'
  }
 }

Вышеприведенный код реализует смену Caption закладки при смене активной закладки в менеджере деталей.
3. Затем откройте закладку "Невизуальные", выделите датасет dlAccounts и перейдите в обработчик события OnDatasetAfterPositionChange.
4. Вставьте в обработчик события следующий код:
if (Dataset.Attributes('IsNew') != true) {
  RefreshDetails();
 }
 Dataset.Attributes('IsNew') = false;
 var AccountID = Dataset.Values('ID');
 var AddressDataset = Services.GetNewItemByUSI('ds_AccountAddress'); // вместо //ds_AccountsAddress нужно указать датасет соответсвующей //закладки
 ApplyDatasetFilter(AddressDataset, 'AccountID', AccountID, true);
 AddressDataset.Open();
 var AddressDatasetIsEmpty = IsDatasetEmpty(AddressDataset);
 AddressDataset.Close();
 if (!AddressDatasetIsEmpty) {
  pgAddressesDetail.Caption = 'Адреса';
 } else {
  pgAddressesDetail.Caption = 'Адреса*'
 }

Вышеприведенный код реализует смену Caption закладки при переходе по записям в основном реестре.
5. Сохраните все внесенные изменения. Перезапустите рабочее приложение Terrasoft CRM и протестируйте работоспособность системы.

По аналогии с этим примером у Вас будет возможность реализовать подобный функционал для необходимого Вам раздела и нужной детали.

Желаю удачи!

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

Нравится

Поделиться

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

А зачем код в OnChangeActivePage?

Код в OnChangeActivePage реализует смену Caption закладки при смене активной закладки в менеджере деталей. Конкретный пример: у пользователя активна одна запись в реестре и какая-то закладка в менеджере деталей. В этот момент другой пользователь может добавить записи на закладку, которая сейчас у первого не активна. Таким образом, при переходе на эту закладку первым пользователем - Caption меняется.

Так основной смысл был знать наличие записей до перехода на закладку. После перехода и так понятно есть они там или нет.

"Underscore a.k.a. _" написал:Так основной смысл был знать наличие записей до перехода на закладку

До перехода и будем знать, если перейдем не в Адреса, а в любую другую. В любом случае необходимы события, не вешать же для этого таймер.

"Ключник Алексей" написал:До перехода и будем знать

Я так понимаю, OnChangeActivePage вызывается непосредственно в момент перехода.

В данном случае не важно когда. Если мы переходим с детали Средства Связи на деталь Группы, то все равно увидим актуальную информацию по детали Адреса относительно наличия данных в ней.

Алексей, посмотрите, пожалуйста, внимательно на код, который предлагается разместить в OnChangeActivePage.

Я бы убрал проверку на название активной закладки. Такой вариант представляется мне более логичным.

Я думаю логичнее убрать вообще этот усок. При переходе на запись раздела заголовок уже правильный.
Кроме того если просто убрать проверку, то датасет адресов не будет переоткрываться при переходе со Средств связи на Группы.

Вообще предложенный функционал не говорит нам однозначно есть ли на данный момент записи в детали или нет. Он говорит, что они там были когда-то (или их там не было). Получается такое полурешение.

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

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

В приложении Terrasoft CRM есть возможность изменить стандартные графики: оси, параметры осей, их визуальное отображение.
Для этого необходимо сделать видимой кнопку amiSettings на закладке невизуальных компонент сервиса wnd_GraphDetail (присвоить свойству IsVisible = true). После сохранения внесенных изменения, перезапуска приложения Terrasoft CRM, на закладке "Графики" в любом из реестров отобразится кнопка "Свойства". Нажав на нее Вы увидите окно со множеством опций, предназначенных для редактирования графиков в системе.

Желаю удачи!

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

Нравится

Поделиться

1 комментарий

Спасибо!

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

Для того, чтобы изменить динамически Caption формы отчета, Вам необходимо внести изменения в обработчик события OnPreview формы отчета.

А именно,

ReportPreviewer.ParentComponent.ParentWindow.WindowCaption = "Test";

Вместо "Test" нужно внести требующееся название формы отчета.
Сохраните внесенные изменения, протестируйте работоспособность системы.

Данный функционал можно использовать, например в том случае когда возникает необходимость реализовать зависимость названия генерируемого отчета от пользователя в системе. Например, "Отчет по контрагентам Мельниковой Екатерины" или "Отчет по контрагентым Иванова Ивана"...

Желаю удачи!

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

Нравится

Поделиться

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

Конечно это громко сказано, но в случае, если Вам необходимо изменить заголовки сервисов по всей системе, а именно заголовки датасетов, названия окон, элементов окон и т.п., то для этих нужд можно воспользоваться разработанной функцией (см. ниже). Как пример, допустим нам нужно изменить название раздела с "Контрагенты" на "Юр. лица", кроме того, необходимо внести эти изменения во все карточки, во все реестры и т.д.

function ReplaceCaption(FromCaption, ToCaption) {
 try {
  System.BeginProcessing();
  Log.Write(1, "Старт: " + (new Date()).toLocaleString());
  var ServiceCount = Services.InformationsCount;
  var LoadedCount = 0;
  var ChangedCount = 0;
 
  System.ProcessMessages();
  var RE = new RegExp(FromCaption, 'g');
  for (var i = 0; i ServiceCount; i++) {
   System.ProcessMessages();
   var Info = Services.Informations(i);
   var ServiceTypeCode = Info.ServiceTypeCode;
   var ToLoad = IsStringInArray(ServiceTypeCode, ['DBDataset', 'Window']);
   if (ToLoad) {
    try {
     if (Info.USI.substring(0, Info.USI.indexOf('\\')) == 'Call Centre') {
      continue;
     }
     var Service = GetSingleItemByCode(Info.USI);
    } catch(e) {
     continue;
    }
    LoadedCount++;
    // Изменяем заголовок самого сервиса
    Service.Caption = Service.Caption.replace(RE, ToCaption);
    if ((ServiceTypeCode == 'DBDataset') && (Assigned(Service.DataFields))) {
     var Count = Service.DataFields.Count;
     // Изменяем заголовки датафилдов
     for (var j = 0; j Count; j++) {
      var Item = Service.DataFields.Items(j);
      Item.Caption = Item.Caption.replace(RE, ToCaption);
     }
     Services.SaveItem(Service, sdoaSave);
     ChangedCount++;
    } else if ((ServiceTypeCode == 'Window') && (Service.ComponentCount > 0)) {
     if (Service.Name == 'wnd_Main') {
      // Отключить таймер
      var Timer = Service.ComponentsByName('Timer');
      Timer.IsEnabled = false;
     }
     if (Service.Name == 'wnd_CallCentreClient') {
      // Отключить таймер
      var Timer = Service.ComponentsByName('tmrRefreshCallList');
      Timer.IsEnabled = false;
     }
     var Count = Service.ComponentCount;
     // Изменяем заголовки контролов
     for (var j = 0; j Count; j++) {
      var Item = Service.Components(j);
      if (!IsEmptyValue(Item.Caption)) {      
       Item.Caption = Item.Caption.replace(RE, ToCaption);
      }
     }
     Services.SaveItem(Service, sdoaSave);
     ChangedCount++;
    }
   }
  }
 } finally {
  System.EndProcessing();
  Log.Write(1, "Финиш: " + (new Date()).toLocaleString());
 }
 Log.Write(1, "Всего сервисов: " + ServiceCount +
        " Рассмотрено сервисов: " + LoadedCount +
        " Изменено сервисов: " + ChangedCount);
}

function Main() {
        ReplaceCaption('Контрагенты', 'Юр. лица');
}

Параметры функции ReplaceCaption():
FromCaption - фраза, которую нужно найти и заменить
ToCaption - фраза, на которую нужно заменить

Небольшие рекомендации:
1. Перед использованием сделать ОБЯЗАТЕЛЬНО бекап, "дабы не было мучительно больно..."
2. При установке параметров функции нужно помнить, что функция ищет любые совпадения, т.е. если мы хотим заменить "Контрагент" на "Юр.лицо", то при обнаружении слова "Контрагенты" будет сделана некорректная замена на "Юр.лицоы". Поэтому запускать ее нужно сначала для самых длинных склонений, далее для множественного числа и т.д.

Пример: нужно заменить все упоминания "проектов" на "сделки". Для этого запускаем функцию поэтапно со следующими параметрами:
Проектами - Сделками
проектами - сделками
Проектов - Сделок
проектов - сделок
Проекты - Сделки
проекты - сделки
Проектом - Сделкой
проектом - сделкой
Проекта - Сделки
проекта - сделки
Проект - Сделка
проект - сделка

и т.д.

Как видите, приведенная функция не универсальна. Т.е. ее можно доработать, добавив дополнительные параметры замены (учет регистра символов, можно "прикрутить" какой-то алгоритм склонения слов и т.п.). Следовательно, есть поле для полета "программерской" фантазии.

В принципе, у меня все. Юзайте!

Нравится

Поделиться

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