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

Нравится

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

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

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

Алексей, добрый день.
Подскажите каким образом?

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

Антонина, текущая логика формирования списка деталей в карточке реализована в BaseModuleEditPage, где на Init вызывается специальное действие InitializeDetails.Насколько понимаю, текущая их реализация вообще не проверяет Id открываемой записи (и, соответственно, тип) и в момент Init, скорее всего, это значение ещё неизвестно. Возможно, стоит уже на PageLoadComplete проверить тип и в зависимости от этого скрыть те или иные вкладки, задав им свойство Hidden, но такие доработки ранее не встречались, нужно экспериментировать.

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

Доброго времени суток.
Воникла проблема с BPMonline Service Desk. Заходя во вкладку Инструменты - Администрирование - Пользователи портала, система выдает сообщение ошибки:

В работе приложения BPMonline возникла ошибка.
Exception Message: Невозможно получить экземпляр схемы типа "Terrasoft.Configuration.SysSSPUserQSchema"
Exception Type: Terrasoft.Common.NullOrEmptyException
Exception Source: Terrasoft.Core

Нравится

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

Стандартно в конфигурации нет схемы с названием «SysSSPUserQSchema». Возможно это какая-то доработка?
Что пишет в полном тексте сообщения?
Какая у Вас используется версия системы?

Exception Stack Trace:
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.UI.WebControls.Controls.EntityDataSource.get_Schema()
   at Terrasoft.UI.WebControls.Controls.DataSourceStructure.TryAddColumnByMetaPath(String schemaColumnMetaPath)
   at Terrasoft.WebApp.PortalUsersGridPageSchema.UpdateDataSource()
   at Terrasoft.WebApp.BaseGridPageSchema.InitializeControls()
   at Terrasoft.WebApp.PortalUsersGridPageSchema.InitializeControls()
   at Terrasoft.UI.WebControls.PageSchema.get_TopLevelControl()
   at Terrasoft.UI.WebControls.PageSchema.InitializeLocalizableValues(String resourceManagerName, String resourceGroupName)
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.PageControl.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.Controls.Container.AfterItemAdd(Component item)
   at Terrasoft.UI.WebControls.Utilities.ItemsCollection`1.Add(T item)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.PageControl.AddedControl(Control control, Int32 index)
   at Terrasoft.UI.WebControls.Controls.Container.AfterItemInsert(Int32 position, Component item)
   at Terrasoft.UI.WebControls.Utilities.ItemsCollection`1.Insert(Int32 index, T item)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.InitScriptTaskExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.WebApp.MainPageEventsProcessSchema`1.ThrowEvent(ProcessExecutingContext context, String message)
   at Terrasoft.UI.WebControls.PageSchemaUserControl.ThrowEvent(String message)
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly()
   at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl()
   at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Application Version: 5.4.0.1315

А у Вас в разделе «Конфигурация» есть схема, называющаяся «SysSSPUserQSchema» или «SysSSPUserQ»?
Судя по коду, логика системы обращается к схеме по имени и не находит. Возможно, она не перенесена в корневую конфигурацию из другой или на основной сервер с сервера разработки.
Или где-то в коде портальной страницы допущена опечатка, вместо «SysSSPUser» написали «SysSSPUserQ».

При попытке открыть метаданные SysSSPUserQ выдало ошибку. (см. скриншоты)

Exception Message: Невозможно получить экземпляр схемы типа "Terrasoft.Configuration.SysSSPUserQSchema"
Exception Type: Terrasoft.Common.NullOrEmptyException
Exception Source: Terrasoft.Core
 
Exception Stack Trace:
   at Terrasoft.Core.SchemaManager`1.InitializeSchema(ISchemaManagerItem schemaManagerItem, Assembly assembly)
   at Terrasoft.Core.SchemaManagerItem`1.get_Instance()
   at Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   at Terrasoft.Core.SchemaManager`1.GetReadableSchemaMetaData(Guid schemaUId, UserConnection userConnection)
   at Terrasoft.WebApp.SolutionExplorerModule.OnViewMetaDataMenuItemClick(Object sender, AjaxEventArgs e)
   at Terrasoft.UI.WebControls.Controls.ScriptManager.RaisePostBackEvent(String eventArgument)
   at Terrasoft.UI.WebControls.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
 
Form:
	submitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{"tag":""}}}
	__EVENTTARGET: ScriptManager
	__EVENTARGUMENT: ViewMetaDataMenuItem|event|Click
	__VIEWSTATEFIELDCOUNT: 13
	__VIEWSTATE0: /wEPGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYWBQ1TY3JpcHRNYW5hZ2VyBRlTeXNTY2hlbWFGb2xkZXJEYXRhU291cmNlBRNTeXNTY2hlbWFEYXRhU291cmNlBQlNYWluUGFuZWwFCUxlZnRQYW5lbAUPQWN0aW9uc1RhYlBhbmVsBQdGb.....................

Возможно, стандартную схему «SysSSPUser» кто-то пытался доработать и переименовать и сломал.
Посмотрите у неё значения «Изменено» и «Изменил».
Можно накатить схему, взятую с тестового (или наоборот, основного) сайта.
Ещё можно удалить самую свежую запись в таблице SysSchemaInSolution, где SysSchemaId равно Id этой схемы. Это вернёт предыдущую версию.

Exception Message: Элемент коллекции с идентификатором "{2BCBE4B8-FD0E-4CC6-A979-93574A377150}" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

Часто бывает и такое.

Это означает что не найден элемент с определенным идентификатором. Как пример, удалили поле в объекте, затем его добавили, но ранее уже была выполнена привязка к полю.

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

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

Я создал новый стандартный раздел(3 объекта и 3 страницы) в котором отображаю выборку данных из БД. Задаю фильтр и у меня выбираются определенные данные. Но когда я делаю двойной клик по этим данным, мне открывается новая вкладка с ошибкой. Возможно ли отключить открытие новой вкладки(возможно разрешить только чтение)? И как это сделать? Спасибо...

Нравится

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

Чтобы на странице реестра отключить обработку двойного клика, достаточно в БП страницы в функции GetRegisterTreeGridDblClickScript заменить содержимое на:

return string.Empty;

"Зверев Александр" написал:

Чтобы на странице реестра отключить обработку двойного клика, достаточно в БП страницы в функции GetRegisterTreeGridDblClickScript заменить содержимое на:

return string.Empty;


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

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

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

В разделе администрирования ---> Доступ к объекту ----> Выбрал объект, раздал права по умолчанию для всех пользователей. Но ошибка осталась. Подскажите как устранить ошибку. Спасибо...

Нравится

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

Добрый день Александр!!!

подскажите пожалуйста в схеме таблицы, что вы создали ранее, какие галочки установлены "Администрирование по операциям", "Администрирование по записям"? Так же рекомендую ознакомиться с документацией по администрированию, что находится на Академии Террасофт. Вот ссылки: Раздел [Доступ к объектам], Раздел [Доступ к операциям]

"Власов Михаил Викторович" написал: Здравствуйте Михаил. Установил галочку для "Администрирование по операциям" для всех пользователей. Галочка в "Администрирование по записям" тоже не принесла никаких результатов. Спасибо.

Так вам как требуется в вашей задачи? Администрировать по операциям или Администрировать по записям. Я вам не просто так дал ссылку на документацию. Чтобы вы прочитав поняли, для чего придумано понятие Администрирование по операциям, А для чего придумано понятие Администрирование по записям. И далее вы бы уже решили как правильно вам требуется. И уже от этого как написано в документации настроили бы свою таблицу. Прочтите документацию, вам сразу больше ясности появиться в голове.

"Власов Михаил Викторович" написал:

Так вам как требуется в вашей задачи? Администрировать по операциям или Администрировать по записям. Я вам не просто так дал ссылку на документацию. Чтобы вы прочитав поняли, для чего придумано понятие Администрирование по операциям, А для чего придумано понятие Администрирование по записям. И далее вы бы уже решили как правильно вам требуется. И уже от этого как написано в документации настроили бы свою таблицу. Прочтите документацию, вам сразу больше ясности появиться в голове.


Спасибо большое. Проблема была в валидации колонки в БД. А именно превысил лимит символов(>22)

"Ивченко Александр Сергеевич" написал:Спасибо большое. Проблема была в валидации колонки в БД. А именно превысил лимит символов(>22)

Добрый день Александр!!!

видимо я вас неправильно понял, и повел совсем в другом направлении. По "Валидации" могу сказать только одно, BPMOnline на уровне "Модели" сначала проводит Валидацию, проверяет правильность типов колонок. Проверке здесь подлежат все колонки, созданные в схеме Таблицы, созданные "как Виртукльные" на схемах страниц. Многие как я заметил не обращают внимание на Типы виртуальных колонок, что создают, а зря система Именно из-за Типов колонок иногда появляются ошибки в консоли. Так как при валидации еще раз повторюсь, сначало идет проверка на уровне Модели, а уже потом система поднимаемся выше на уровень Страниц. Так что прошу на это обратить внимание. Спасибо!!!

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

Агенты-->Контрагенты. При нажатии на контрагента в контекстном меню правой кнопкой мышки открывается окно с функционалом(отправить е-mail, позвонить, объединить записи ........).
При наведении на отправить е-mail появляется окно(ответственный, создал, изменил). В это открытое окно надо добавить поле контакт. То есть должно появиться окно вида: отправить е-mail --> (контакт, ответственный, создал, изменил). Подскажите пожалуйста как найти функционал где реализован этот выпадающий список. Спасибо

Нравится

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

Мы уже обсуждали вопрос тут. Логика наполнения списка находится на базовой странице реестра и должна искать подходящие колонки в любом разделе.

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

Агенты-->Контакты. При нажатии на контакт в контекстном меню правой кнопкой мышки открывается окно с функционалом(отправить е-mail, позвонить, объединить записи ........).
При наведении на отправить е-mail появляется окно(ответственный, создал, изменил). В это открытое окно надо добавить поле контакт. То есть должно появиться окно вида: отправить е-mail --> (контакт, ответственный, создал, изменил). Подскажите пожалуйста как найти функционал где реализован этот выпадающий список. Спасибо

Нравится

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

Он заполняется в скрипте CreateEmailCustomContextMenu_ScriptTask в БП страницы BaseGridPage.
Там перебираются все колонки объекта и для тех, что ссылаются на справочники «Контакт» и «Сотрудник» вызаывается функция EmailContextMenuItem, создающая пункт меню. Теоретически, можно попробовать доработать, чтобы в этот список попадала и колонка «Id» раздела.

"Зверев Александр" написал:

Он заполняется в скрипте CreateEmailCustomContextMenu_ScriptTask в БП страницы BaseGridPage.

Там перебираются все колонки объекта и для тех, что ссылаются на справочники «Контакт» и «Сотрудник» вызаывается функция EmailContextMenuItem, создающая пункт меню. Теоретически, можно попробовать доработать, чтобы в этот список попадала и колонка «Id» раздела.


Извини может глупый вопрос, но возможно ты знаешь где я допустил ошибку или как можно решить эту проблему. Весь функционал работает для контакта. Но когда сделал для контрагента, окно тоже появляется но при нажатии на функционал(отправить на Email) в открывшем окне не подставляется Email контрагента в поле Кому. Все изменения в скриптах которые вносил отмечены /*add*/... Спасибо большое.
CreateEmailCustomContextMenu_ScriptTask в пакете BaseGridPage

var contactSchemaId = new Guid("16be3651-8fe2-4159-8dd0-a803d4683dd3");
var employeeSchemaId = new Guid("fb1c2bed-91d4-4b06-a28c-621a3d187008");
/* +Add IdAccount --   var accountSchemaId = new Guid("25d7c1ab-1de0-4501-b402-02e0e5a72d6e");

    +Add -- Реализована логика проверки наявности заполненного поля в объектах контакта и контрагента. Если поле заполнено то отобразить дополнительный функционал.
var ContactEmail = "";
var AccountEmail = "";

ContactEmail = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Contact", "Email", Page.DataSource.ActiveRowPrimaryColumnValue);

if (email != "" && Page.DataSource.Schema.UId == contactSchemaId) {
	var menuItem = EmailContextMenuItem(Page.DataSource.Schema.Caption, GetSchemaTag("Contact", Page.DataSource.ActiveRowPrimaryColumnValue));
	(Page.TreeGrid.Menu[0] as MenuItemBase).Menu.Add(menuItem);
	(Page.AspPage as Terrasoft.UI.WebControls.Page).RegisterClientSpecialInitScript(string.Format("{0} = {{}};{0}.setImage = Ext.emptyFn;", menuItem.ClientID));
	(Page.TreeGrid.Menu[0] as MenuItemBase).Menu.AddCaptionItem(menuItem);
}

AccountEmail = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Account", "InvoicesEmail", Page.DataSource.ActiveRowPrimaryColumnValue);

if (AccountEmail != "" && Page.DataSource.Schema.UId == accountSchemaId) {
	var menuItem = EmailContextMenuItem(Page.DataSource.Schema.Caption, GetSchemaTag("Account", Page.DataSource.ActiveRowPrimaryColumnValue));
	(Page.TreeGrid.Menu[0] as MenuItemBase).Menu.Add(menuItem);
	(Page.AspPage as Terrasoft.UI.WebControls.Page).RegisterClientSpecialInitScript(string.Format("{0} = {{}};{0}.setImage = Ext.emptyFn;", menuItem.ClientID));
	(Page.TreeGrid.Menu[0] as MenuItemBase).Menu.AddCaptionItem(menuItem);
} 
 --add 
*/

ProcessEmailContextMenuClick_ScriptTaskExecute в пакете BaseGridPage

var extraParams = context.ThrowEventArgs as Dictionary;
string tag = extraParams["tag"].ToString();
OpenEmailEditPage_BaseGridPage_UserTask.OpenerInstanceId = Page.Process.InstanceUId;
OpenEmailEditPage_BaseGridPage_UserTask.PageUId = new Guid("DCDDA065-321B-4560-AACB-05F6CC72CD80");
Dictionary  parameters = new Dictionary () {
	{"ContactId", ReadIdFromTag(tag, "ContactId").ToString()},
	{"TemplateId", ReadIdFromTag(tag, "TemplateId").ToString()},
/* +add 
        {"AccountId", ReadIdFromTag(tag, "AccountId").ToString()},
*/ -add
	{"customClosedEvent", "EmailEditPageClosed"}
};
OpenEmailEditPage_BaseGridPage_UserTask.PageParameters = parameters;
return true;

Александр, во втором фрагменте Вы передаёте дополнительный параметр AccountId в карточку нового письма, которая должна открыться. Чтобы он обрабатывался, нужно в БП той страницы внести дополнительную логику, аналогично тому, как сделано для ContactId. См. в БП страницы EmailEditPage скрипт EnableSendButton, а конкретно строки:

var parameterContactId = GetIdFromParameter("ContactId");
	if (!parameterContactId.Equals(Guid.Empty)) {
		dataSource.ActiveRow.SetColumnValue("Recepient", GetRecipientByContact(parameterContactId));
	}

Для функции GetRecipientByContact (в дереве функций этой же страницы), которая получает адрес по Id контакта, тоже придётся написать аналог для схемы контрагента.

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

Добрый день коллеги! Подскажите пожалуйста, где найти "кусок кода" который отвечает за генерацию исходного кода страницы, на основании того, что мы "нарисовали" в дизайнере страницы. (Наподобии того, как ViewGenerator.js в 7х).
Ситуация следующая: после добавлении на страницу поля с типом "дата", связывании с DataSource, и компиляции - если отрыть страницу на клиенте - начинают не корректно работать остальные поля.
Если сравнивать исходный код рабочей страницы и "не рабочей" - то в последнем варианте для добавленного поля(контрол называется DateShowedEdit), в методе:

 protected virtual Terrasoft.UI.WebControls.Controls.DateTimeEdit CreateDateShowedEdit(){
        _dateShowedEdit= new Terrasoft.UI.WebControls.Controls.DateTimeEdit();
                        _dateShowedEdit.UId = new Guid("eeb97a42-0dfd-4403-b26c-1404462054a0");
                        _dateShowedEdit.Name = "DateDescr";
                        _dateShowedEdit.CreatedInSchemaUId = new Guid("18696044-f617-4347-8ec0-da74ef4166da");
                        _dateShowedEdit.ModifiedInSchemaUId = new Guid("18696044-f617-4347-8ec0-da74ef4166da");
                        _dateShowedEdit.CreatedInPackageId = Guid.Empty;
                        _dateShowedEdit.Tag = "";
                        _dateShowedEdit.CaptionColor = System.Drawing.Color.FromArgb(0,2,77,156);
                        _dateShowedEdit.Width = System.Web.UI.WebControls.Unit.Percentage(100);
                        _dateShowedEdit.DataSource = "DataSource";
                        _dateShowedEdit.ColumnUId = new Guid("a7a265bd-c473-48cf-aa29-4aee72410f18");
                        return _dateShowedEdit;
}

отсутствует свойство Kind - которое есть во всех других полях с типами дата:
например для поля EndDate:

_endDateEdit.Kind = Terrasoft.Common.DateTimeValueKind.Date;

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

Нравится

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

В 5.Х генерация происходит на уровне ядра системы, без исходников ядра её так просто не посмотреть.

Возможно, в этом случае поможет правка вручную метаданных.

Эта строка со свойством Kind в метаданных соответствует таким:

Метаданные для чтения:

"Kind": 1,

Реальные метаданные:

"AQ1": 1,

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

Александр, Добрый день!
Судя по всему я ошибся в том - что причиной ошибки может быть отсутствие свойства Kind (метаданные сгенерились по принципу который Вы написали - но на неправильную работу контрола это не повлияло). Временно, я обошел эту проблему с помощью "костыля" - поле не связывал с DataSource - но при инициализации страницы если данные в DataSource есть - вручную сетил в value контрола - а при сохранении - инсерт напрямую в БД.
Возможно Вы подскажете, какие варианты можно попробовать чтобы найти причину ошибки?
И еще интересует вопрос - если смотреть код на клиенте через консоль браузера, он весь в сжатом виде. В 7й версии такое сжимание js кода можно откючить в webConfig, есть ли похожие настройки для 5-ки?
Спасибо за помощь!:smile:

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

"Повалий Влад" написал:И еще интересует вопрос - если смотреть код на клиенте через консоль браузера, он весь в сжатом виде. В 7й версии такое сжимание js кода можно откючить в webConfig, есть ли похожие настройки для 5-ки?

Такой возможности нет. Разработка под 5.X — это больше серверная логика.

Спасибо, попробую создать заново.

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

Коллеги, добрый день! Ситуация следующая - был создан простой объект, и в момент компиляции вывалилась ошибка - "ссылка на объект не указывает на экземпляр объекта" - поэтому решил удалить его, и создать заново. Подскажите пожалуйста, с каких sql таблиц надо поудалять информацию об этом объекте, чтобы можно было создавать новый с таким же именем, и как быть, если я не знаю какой у него ID (так как при нажатии "открыть метаданные" тоже вылетает ошибка как выше).
Спасибо!

Нравится

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

Нужно удалить записи из таблиц SysSchema и SysSchemaInSolution. Во второй находите все записи по названию или заголовку (для одной схемы может быть несколько версий), смотрите идентификатор SysSchemaId и по нему находите запись в первой.

Александр, Вы как обычно - выручаете!:smile: Спасибо!

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

Добрый день коллеги! Подскажите пожалуйста, как правильно переложить данную sql конструкцию под запрос на new Select() версии 5x?
Интересует именно реализация EXISTS

 AND (
        EXISTS(
                SELECT Id FROM CampaignTarget
                WHERE cardId = 'F9ED80C6-1575-4757-83B1-2A7B32B85AA1'
                AND CampaignId = [Campaign].[Id]
        )
        OR NOT EXISTS(
                SELECT Id FROM CampaignTarget
                WHERE CampaignId = [Campaign].[Id]     
        )
 )

Спасибо!

Нравится

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

Влад, вот пример запроса с Exists и Not Exists:

	Select select = new Select(UserConnection)
		.Column("DestinationRecordId")
		.Column("Id")
		.From("LookupConflict")
		.Where("LookupSchemaName").IsEqual(Column.Parameter(node.Values["Lookup"]))
		.And("LookupSchemaDisplayColumnName").IsEqual(Column.Parameter(node.Values["Column"]))
		.And("LookupSchemaDisplayColumnValue").IsEqual(Column.Parameter(node.Values["FileName"]))
		.And().Exists(
			new Select(UserConnection)
				.Column("Id")
				.From("Contact")
				.Where("Contact", "Id").IsEqual("DestinationRecordId"))
		.And().Not().Exists(
			new Select(UserConnection)
				.Column("ContactId")
				.From("Employee")
				.Where("Employee", "ContactId").IsEqual("DestinationRecordId")) as Select;

У Вас структура аналогична, только Or вместо And.

Большое спасибо!:twisted:

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

Добрый день

Просьба подсказать, где находится процесс по копированию карточки е-мейл? Имеется в виду процесс, к-ый происходит при нажатии на кнопку "Копировать" . Я хотела бы посмотреть, как описаны действия по копированию данных из "старой" е-мейл в новую? Заранее спасибо

Нравится

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

Это не процесс, а логика в нескольких карточках.

Базовая для всех разделов логика копирования полей записи находится в «BaseModuleEditPage» в скрипте «ScriptPageLoadComplete» после строки «if (IsCopy)».
Для Email также есть отдельно логика копирования файлов в «EmailEditPage» в скрипте «FilesCopyScriptTask».

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

Подскажите, пожалуйста, как лучше сделать процесс пересылки е-мейл активности? Новую кнопку "Переслать" (здесь нужно скопировать данные е-мейл-активности в новую е-мейл активность, перед этими данными написать, как в outlook
From:
Sent:
To:
Cc:
Subject: .
в полях карточки е-мейл Кому и копия = скопированные адреса) ?
Или же модифицировать имеющиеся скрипты?

Татьяна, такое можно сделать и с новой кнопкой, аналогичной кнопке копирования, и с переделкой логики существующей кнопки.

Вы можете заказать такие доработки у компании Terrasoft или кого-то из партнёров.

Спасибо, я хочу сама попробовать это сделать

"Зверев Александр" написал:Для Email также есть отдельно логика копирования файлов в «EmailEditPage» в скрипте «FilesCopyScriptTask».

не нашла такого скрипта в EmailEditPage

А он есть.

Можете выслать, что именно написано в FilesCopyScriptTask?
ВОзм-но, в EmailEditPage этот скрипт не так называется.

public virtual bool FilesCopyScriptTaskExecute(ProcessExecutingContext context) {
			var targetGuid = Page.DataSource.ActiveRow.PrimaryColumnValue;
var srcGuid = new Guid(Page.GetParameterValue("recordId").ToString());
CopyFiltes(UserConnection, Page.DataSource.ActiveRow, srcGuid, targetGuid, "Activity", string.Empty, true);
return true;
		}

Из неё вызывается:

public virtual void CopyFiltes(UserConnection userConnection, Entity activeRow, Guid srcGuid, Guid targetGuid, string srcSchema, string targetSchema, bool isChangeHtmlBody) {
			if(string.IsNullOrEmpty(targetSchema)){
	targetSchema = srcSchema;
}
var targetEntitySchema = userConnection.EntitySchemaManager.GetInstanceByName(string.Format("{0}File", targetSchema));
Dictionary<Guid, Guid> fileList = new Dictionary<Guid, Guid>();
 
var srcESQ = new EntitySchemaQuery(userConnection.EntitySchemaManager, string.Format("{0}File", srcSchema));
srcESQ.IsDistinct = true;
var idColumn =srcESQ.AddColumn(srcESQ.RootSchema.GetPrimaryColumnName());
var nameColumn = srcESQ.AddColumn("Name");
var dataColumn = srcESQ.AddColumn("Data");
var notesColumn = srcESQ.AddColumn("Notes");
var versionColumn = srcESQ.AddColumn("Version");
var sizeColumn = srcESQ.AddColumn("Size");
var typeColumn = srcESQ.AddColumn("Type");
srcESQ.Filters.Add(srcESQ.CreateFilterWithParameters(FilterComparisonType.Equal, srcSchema, srcGuid));
var srcList = srcESQ.GetEntityCollection(userConnection);
foreach(var src in srcList) {
	var idSchemaColumn = src.Schema.Columns.GetByName(idColumn.Name);
	var fileId = src.GetTypedColumnValue<Guid>(idSchemaColumn.ColumnValueName);
 
	var nameSchemaColumn = src.Schema.Columns.GetByName(nameColumn.Name);
	var fileName = src.GetTypedColumnValue<String>(nameSchemaColumn.ColumnValueName);
 
	var dataSchemaColumn = src.Schema.Columns.GetByName(dataColumn.Name);
	var fileData = src.GetBytesValue(dataSchemaColumn.ColumnValueName);
 
	var notesSchemaColumn = src.Schema.Columns.GetByName(notesColumn.Name);
	var fileNotes = src.GetTypedColumnValue<String>(notesSchemaColumn.ColumnValueName);
 
	var versionSchemaColumn = src.Schema.Columns.GetByName(versionColumn.Name);
	var fileVersion = src.GetTypedColumnValue<System.Int32>(versionSchemaColumn.ColumnValueName);
 
	var sizeSchemaColumn = src.Schema.Columns.GetByName(sizeColumn.Name);
	var fileSize = src.GetTypedColumnValue<System.Int32>(sizeSchemaColumn.ColumnValueName);
 
	var typeSchemaColumn = src.Schema.Columns.GetByName(typeColumn.Name);
	var fileTypeId = src.GetTypedColumnValue<Guid>(typeSchemaColumn.ColumnValueName);
 
	var targetEntity = targetEntitySchema.CreateEntity(userConnection);
	targetEntity.SetDefColumnValues();
	Guid newGuid = targetEntity.PrimaryColumnValue;	
	targetEntity.SetColumnValue(string.Format("{0}Id", targetSchema), targetGuid);	
	targetEntity.SetColumnValue("Name", fileName);
	targetEntity.SetColumnValue("Data", fileData);
	targetEntity.SetColumnValue("Notes", fileNotes);
	targetEntity.SetColumnValue("Version", fileVersion);
	targetEntity.SetColumnValue("Size", fileSize);
	targetEntity.SetColumnValue("TypeId", fileTypeId);
	if(targetEntity.Save()){
		fileList.Add((Guid)fileId, newGuid);
	}
}
 
if(isChangeHtmlBody && fileList.Count > 0){		
	string columnName = "Body";
	if(activeRow.Schema.Columns.FindByName("HtmlBody") != null){
		columnName = "HtmlBody";
	}
	string messageBody = activeRow.GetTypedColumnValue<string>(activeRow.Schema.Columns.GetByName(columnName));	
	messageBody = messageBody.Replace(srcGuid.ToString(), targetGuid.ToString());
	foreach(var item in fileList){
		messageBody = messageBody.Replace(item.Key.ToString().ToLower(), item.Value.ToString().ToLower());
	}
	var update = new Update(userConnection, activeRow.Schema.Name)
    				.Set(columnName, Column.Parameter(messageBody))
    				.Where("Id").IsEqual(Column.Parameter(activeRow.PrimaryColumnValue));
	update.Execute();
}
		}

А схема процесса какая?

EmailEditPage.
схема БП карточки

Добрый день
подскажите, пожалуйста, где в системе указывается, что при нажатии на кнопку "Копировать" срабатывает условие IsCopy ? т.е. где связь кнопки и условия?

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

Добрый день

Создала параметр my (логический), который при нажатии на кнопку "Переслать" принимает значение true.

Опубликовывает без ошибок, но файлы не копируются при нажатии на "Переслать".

// в Скрипте подготовки процесса действия Открыть карточку указано:
my = true;
var defValuesId = Guid.NewGuid();
var defValues = new Dictionary ();

defValues.Add("Contact", Page.ContactEdit.Value.ToString());
defValues.Add("Account", Page.AccountEdit.Value.ToString());
defValues.Add("CopyRecepient", Page.CopyRecepientEdit.Value.ToString());
defValues.Add("Title",Page.TitleEdit.Value.ToString());

if (new Guid (Page.IncidentEdit.Value.ToString()) != Guid.Empty)
{defValues.Add("Incident",Page.IncidentEdit.Value.ToString());}

Guid contactId = UserConnection.CurrentUser.ContactId; //id контакта текущего пользователя
string contactName = UserConnection.CurrentUser.ContactName; //имя контакта текущего пользователя
string contactmail = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Contact", "Email", contactId);
string contactdol = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Contact", "JobTitle", contactId);
string contactphone = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Contact", "Phone", contactId);
string contactMobilePhone = Terrasoft.Configuration.CommonUtilities.GetEntityTypedColumnValue(UserConnection, "Contact", "MobilePhone", contactId);

string s6 = "


С уважением,
"+ contactName + "
" + contactdol + "
Департамент информационных технологий
АО «ДКС»"+ "

Tel :"+ contactphone + ", " + contactMobilePhone + "
e-mail :"+ contactmail +" , www.dkc.ru";

string text1 = Page.RecepientEdit.Value.ToString();
text1 = text1.Replace(",", "");
text1 = text1.Replace("", "");
text1 = text1.Replace("'СТП'", "");
text1 = text1.Replace("СТП", "");
string text2 = Page.SenderEdit.Value.ToString();
text2 = text2.Replace("support.it@dkc.ru", "");
string text = text2 + "," + text1;
defValues.Add("Recepient", text);

string s1 = "
From :"+ Page.SenderEdit.Value.ToString();
string s2 = "
Sent :"+ (DateTime)Page.DueDateEdit.Value +"(мск)";
string s3 = "
To :" + Page.RecepientEdit.Value.ToString()+"
Cc :"+ Page.CopyRecepientEdit.Value.ToString();
string s4 = "
Subject :"+Page.TitleEdit.Value.ToString()+"


";
string s5 = "


______________________________________________________________________________________________________________
";

string s = s6 + s5 + s1 + s2 + s3 + s4;
string html = Page.DataSource.ActiveRow.GetTypedColumnValue("HtmlBody");
string str = String.Concat(s,html);
defValues.Add("HtmlBody", str);

var ActivityId = Guid.NewGuid();

UserConnection.SessionData[defValuesId.ToString()] = defValues;
var parameters =
new Dictionary {
{"createWithUId", ActivityId.ToString()},
{"entitySchemaUId", "c449d832-a4cc-4b01-b9d5-8a12c42a9f89"},
{"defValuesId", defValuesId.ToString()}
};
OpenTaskEditPage1.OpenerInstanceId = InstanceUId;
OpenTaskEditPage1.UseCurrentActivePage = true;

OpenTaskEditPage1.PageUId = new Guid("dcdda065-321b-4560-aacb-05f6cc72cd80");
OpenTaskEditPage1.PageParameters = parameters ;

return true;

Безусловно, это печально.
Попробуйте отладиться, посмотреть, в какие элементы процесса происходит заход. Может, по этой стрелке движения нет.

Ну не расстраивайтесь, есть многое, чему можно и радоваться :wink: Если хотите порассуждать на эту тему - я еще тот психолог :idea:

Да, зато опубликовалось без ошибок!:mrgreen:

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