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

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

Нравится

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

Тоже долго бился над эти вопросом, и вот ответ:

выбрать галочку "отображать загрузку" у события.

Премного благодарен!

А кто нибудь пробовал сделать прогресс бар для длительных операций хотя бы в духе "Обработано хх из уу записей" (чтобы число обновлялось по мере выполнения обработки)?
В 3.х для того чтобы прорисовывалось изменяющееся число в окне при выполнении цикла можно было использовать System.ProcessMessages.
А то при длительной обработке (массовая операция с записями в моем случае) висящее сообщение "загрузка" как то некрасиво выглядит... пользователю гораздо приятнее будет видеть прогресс выполнения.

Александр, можно поступить также как реализован поиск дублей: в MessagePanel в реестре данных выводится сообщение, которое обновляется по мере выполнения процесса:

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

Дмитрий, спасибо за ответ! Сейчас посмотрю реализацию

Сделал вроде бы аналогично, но выдается сообщение только в самом конце - 100% :smile:
Проблемка как бы осталась - очень хочется получить "бегущие" значения от 0 до 100... в 3ке повторюсь это решалось путем добавления System.ProcessMessages, в результате перерисовывался в цикле текст сообщения. Тут нужно что-то похожее - перерисовка визуального компонента происходит уже после срабатывания всего цикла (он естественно в элементе задание-сценарий), и несмотря на наличие в сценарии throwevent, оно может и пробрасывается, но вот именно экранная форма и не перерисовывается...

Александр, UpdateMessagePanel там вызывается вручную при клике на "Обновить".
Попробуйте генерировать это сообщение, к примеру, после каждого десятого прохода цикла, чтобы перерисовать messagePanel.

Если не получится - думаю нужно посмотреть в сторону запуска клиентских javascript функций (по работе с элементами страницы), с помощью которой (getElementById) менять значение label'a.

"Олейник Дмитрий" написал:Если не получится - думаю нужно посмотреть в сторону запуска клиентских javascript функций (по работе с элементами страницы), с помощью которой (getElementById) менять значение label'a.

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

Александр, вот здесь я вызываю alert по нажатию на "ОК" в карточке:

http://www.community.terrasoft.ru/forum/topic/9711#comment-41436

Дмитрий, получилось написать функцию, поменять с помощью свойства innerHTML значение Label на странице.
И вновь та же проблема - вызываю смену текста Label внутри скрипта в цикле, но срабатывает оно не в цикле, а в самом конце происходит прорисовка единственный раз нового (последнего) значения:cry:

Думаю, причина в том, что запрос(POST back) на клиент отправляется не после каждого прохода цикла, а после завершения всего метода. Наверное стоит попробовать добавить call-back в js функцию, т.е. написать еще одну функцию, которая будет выполнятся после выполнения первой. Можно Ваш код на js-e что-бы протестировать.

на Init окна:

Page.AddScript("function UpdateProgress(ProgressValue) {document.getElementById(\"PageContainer_Label1\"").innerHTML = ProgressValue;}"");

Александр, у меня получилось так:

Init:

Page.AddScript("function test(param) { alert(\"Hello World!\"" + param); } "");

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

Александр, суть в том, что функция все таки вызывается 10 раз.
Вот так сделайте:

Ext.get('ext-gen847').dom.innerText = 'тест';

можно так:

Page.AddScript("function UpdateProgress(ProgressValue) {Ext.get(\"PageContainer_Label1\"").dom.innerText = ProgressValue;}"");

Где ext-gen847 id label (там не должно быть Page_Container).

Дело в том, что:

Page.AddScript("function UpdateProgress(ProgressValue) {Ext.get(\"ext-gen55\"").dom.innerText = ProgressValue;}"");

Я не добавлял "тяжелый" цикл. Просто добавил console.log:

for (int i = 0; i < 10; i++)
{
	Page.AddScript("test("+i+");");
	Page.AddScript("console.log("+i+");");
}

И получил:

Так что должно перерисовывать...

Тяжелый цикл я так и не придумал, сделал на js-e чтобы тикала точка каждые 0,5 сек в течении 5 сек, может пригодится.

Init:

Page.AddScript("function progress() { 	var i = true; 	var doProgress = setInterval(function() { 		if(i) { 			Ext.get('ext-gen847').dom.innerText += '.'; 		} 	}, 500); 	setTimeout(function() { i = false; }, 5000); } ");

ButtonOKClicked:

Page.AddScript("Ext.get('ext-gen847').dom.innerText = '';");
 
Page.AddScript("progress()");

Внутри видео:
23-01-2014_17-34-09.rar

Спасибо, Дмитрий! Буду разбираться, видео увидел.... у меня пока не заработало...

Заодно вопрос такой, чтобы не создавать новую тему - при длительном исполнении скрипта несколько раз "ловил" в конце выполнения штатное окно "Внимание" - В работе приложения возникла ошибка.... Время ожидания выполнения запроса истекло. ActionId: Click; ControlId: PageContainer_ButtonStart; SubmitAjaxEventConfig: {"config": {"viewStateMode": "include", "extraParams":{}}}
Контрол тот, клик по которому вызывает выполнение длинного скрипта... При этом скрипт насколько я понял отрабатывает полностью. Можно ли как то избежать появления этого окна?

Александр, не думаю. Это окно - ядровая обработка "клиентских" свалов. При этом они могут быть и не критичными (т.к. 99% логики - серверная).
По поводу загрузки, можно написать мой вариант (с точками полностью на js), к примеру на 20 секунд, а по окончании выполнения скрипта, скрывать этот лейбл. Даже если он выполнится за 12 секунд, "тики" видно уже не будет. При старте действия - лейбл отображать.

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

Александр, если возникнут доп. вопросы - обращайтесь!

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

В системе BPMonline On-Demand реализована функция поиска контактов на фейсбук. Только с некоторой категорией контактов необыкновенная магия - выкидавет огромные списки, но ни один не подходит. Причем что человек может уже быть у меня в друзьях и его легко можно найти через строку поиска в фейсбук http://screencast.com/t/HrDXPF7TO
И тут начинаются танцы: перестановка местами имени, фамилии, пробел после фамилии, поиск только по фамилии и т.д. и т.п.

Это все занимает много времени и часто не приносит никаких успехов.

Если у кого есть более успешные методы - напишите.
Буду благодарна!

Нравится

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

Юлия, добрый день!

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

BPMonline использует для интеграции Facebook API, который не предусматривает оптимизацию поиска, а лишь выводит все возможные варианты, учитывая поисковый запрос.

Я понимаю, что Вы ищите по API.
Но Вы выдали функцию, которая работает недосконально. Если осуществляется поиск по API, почему не искать сразу же нужную страницу - вписывая аккаунт ID ?

Юлия, Facebook для интеграции с другими приложениями предоставляет свой API. BPMonline для поиска использует Facebook API, т.е. использует методы, предоставленные Facebook для интеграции с другими приложениями. Поэтому, со стороны BPMonline, мы не влияем на результаты поиска, а выводим данные, которые предоставил Facebook.

"Резвов Роман" написал:

Юлия, Facebook для интеграции с другими приложениями предоставляет свой API. BPMonline для поиска использует Facebook API, т.е. использует методы, предоставленные Facebook для интеграции с другими приложениями. Поэтому, со стороны BPMonline, мы не влияем на результаты поиска, а выводим данные, которые предоставил Facebook.

С уважением,

Роман Резвов

Специалист службы поддержки II линии

Группа компаний Terrasoft

То есть, вы не можете найти пользователя по его адресу в Facebook?
Или отобразить в списке найденных результатов этот адрес (или фото и другие данные)?

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

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

Добрый день!!!
У меня сразу три вопроса:
1. Я изменил содержимое страници в студии и хотел сохранить, но мне сказало что файл только для чтения, но я всеравно его изменил, после зафиксировал изменения в хранилище и в бд, но после. отключения useFileContent изменений в бд не произошло. Как дебажить ? Так как и в 5-ке только JavaScript ?
2. Добавлять ивенты к контролам ? какие контролы есть ? Где это можна посмотреть? Есть что-то наподобие БП как было в 5 к страницам ?
3. Как правильно просмотреть свойства объекта, методы ? В VS не то показывает

Нравится

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

Добрый день.

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

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

Отладка и просмотр свойств объектов происходит на клиенте в консоли браузера.

Процессов для страниц как в 5.4. нет. Вся логика в *.js файле страницы. Ивенты на контролы можно добавлять. К примеру OnChange:

{
	type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
	name: 'JobTitle',
	columnPath: 'JobTitle',
	dataValueType: Terrasoft.DataValueType.TEXT,
	visible: true,
	dependencies: ['Job'],
	methodName: 'jobChanged'
}
...
this.methods.jobChanged = fucntion { }

Контролы:

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

У меня стоит задача сделать список более ранних продаж со схожей спецификацией.
Нужно вывести следующий список для % совпадения > 30% отсортированный по %совпадения+Дата создания:
Номер продажи / Дата созд / Заказчик / Состояние / Сумма / %совпадения

Я составил такой вот запрос на выборку, который возвращает нужные мне данные:

declare @OpportunityID uniqueidentifier

SET @OpportunityID = '{DF213AAF-393D-434F-B0F0-E3E1F614C8D6}'

SELECT O.ID, O.OpportunityNumber, O.CreatedOn, O.CustomerID, C.Name, S.Name, O.BasicAmount, T.PercentW
FROM tbl_Opportunity O
LEFT OUTER JOIN
(SELECT T.OpportunityID AS OpportunityID, SUM(T.PercentWeight) AS PercentW
FROM
(SELECT OpportunityID, (100 / (SELECT COUNT(ID) FROM tbl_OfferingInOpportunity WHERE OpportunityID = @OpportunityID)) AS PercentWeight
FROM tbl_OfferingInOpportunity
WHERE OfferingID IN (SELECT OfferingID FROM tbl_OfferingInOpportunity WHERE OpportunityID = @OpportunityID) AND
        OpportunityID > @OpportunityID) AS T
GROUP BY T.OpportunityID
HAVING SUM(T.PercentWeight) > 30) T ON T.OpportunityID = O.ID
LEFT OUTER JOIN tbl_Account C ON C.ID = O.CustomerID
LEFT OUTER JOIN tbl_OpportunityStatus S ON S.ID = O.StatusID
ORDER BY T.PercentW DESC, O.CreatedOn DESC

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

Вопрос в том, как в Террасофт создать Select Query, чтобы его можно было подключить к датасету?

Пытался создать Custom Query, но он не возвращает данные как Select Query и, соответственно, его нельзя использвать для датасета:
Custom Query

SQL код:

SELECT O.ID, O.OpportunityNumber, O.CreatedOn, O.CustomerID, C.Name, S.Name, O.BasicAmount, T.PercentW
FROM !tbl_Opportunity!> O
LEFT OUTER JOIN
(SELECT T.OpportunityID AS OpportunityID, SUM(T.PercentWeight) AS PercentW
FROM
(SELECT OpportunityID, (100 / (SELECT COUNT(ID) FROM !tbl_OfferingInOpportunity!> WHERE OpportunityID = :OpportunityID)) AS PercentWeight
FROM !tbl_OfferingInOpportunity!>
WHERE OfferingID IN (SELECT OfferingID FROM !tbl_OfferingInOpportunity!> WHERE OpportunityID = :OpportunityID) AND
        OpportunityID > :OpportunityID) AS T
GROUP BY T.OpportunityID
HAVING SUM(T.PercentWeight) > 30) T ON T.OpportunityID = O.ID
LEFT OUTER JOIN !tbl_Account!> C ON C.ID = O.CustomerID
LEFT OUTER JOIN !tbl_OpportunityStatus!> S ON S.ID = O.StatusID
ORDER BY T.PercentW DESC, O.CreatedOn DESC

Написал для теста Custom Query такую функцию, но в конце переменная Result содержит значение 0, а не выборку данных:

function SimilarSpecification(OpportunityID) {
        OpportunityID = '{DF213AAF-393D-434F-B0F0-E3E1F614C8D6}';
        var cq_SimilarSpecification =
                Services.GetNewItemByUSI('cq_SimilarSpecification');                           
        SetParameterValue(cq_SimilarSpecification.Parameters, 'OpportunityID',
                OpportunityID);
        var Result = cq_SimilarSpecification.Execute();
        debugger;
}

function Main() {
        SimilarSpecification();
}

Нравится

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

В Select Query можно впихнуть произвольный код, вплоть до вызова функции, с помощью некоторых махинаций.

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

В Select Query можно впихнуть произвольный код, вплоть до вызова функции, с помощью некоторых махинаций.


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

select query

Первая колонка содержит вот такой sql код:

O.ID AS ID, O.OpportunityNumber AS OpportunityNumber, O.CreatedOn AS CreatedOn,
O.CustomerID AS CustomerID, C.Name AS CustomerName, S.Name AS StatusName,
O.BasicAmount AS BasicAmount, CAST(T.PercentW AS FLOAT) / 100 AS PercentW,
CASE WHEN O.ID = :OpportunityID THEN N'СРАВНИВАЕМАЯ' ELSE N'' END AS Descr
FROM (SELECT T.OpportunityID as OpportunityID, SUM(T.PercentWeight) as PercentW
FROM 
(SELECT OpportunityID, (CONVERT(FLOAT, 10000) / (SELECT COUNT(ID) FROM [dbo].[tbl_OfferingInOpportunity] WHERE OpportunityID = :OpportunityID)) AS PercentWeight
FROM [dbo].[tbl_OfferingInOpportunity]
WHERE OfferingID IN (SELECT OfferingID FROM [dbo].[tbl_OfferingInOpportunity] WHERE OpportunityID = :OpportunityID)) AS T
GROUP BY T.OpportunityID
HAVING SUM(T.PercentWeight) > 30) T
LEFT OUTER JOIN [dbo].[tbl_Opportunity] O ON T.OpportunityID = O.ID 
LEFT OUTER JOIN [dbo].[tbl_Account] C ON C.ID = O.CustomerID
LEFT OUTER JOIN [dbo].[tbl_OpportunityStatus] S on S.ID = O.StatusID
ORDER BY T.PercentW DESC, O.CreatedOn DESC /*

Посоздавал соответствующие колонки с таким же названием как в запросе, только пустые (как в Вашем примере).
Добавил параметр OpportunityID.

Остальне - как Вы написали.

Далее я создал датасет и окно с гридом, и - работает :smile:

Еще раз благодарю :twisted:

Пожалуйста.
Также замечу ещё об одном способе, «полуподпольном» для 3.Х и штатном для BPM – сервисе таблицы на основе view в БД.

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

Какой то бред происходит.
Создаю объект для справочника от базового.
Создаю страницу редактирования для этого объекта справочника от базовой.
Создаю реестр тоже от базового реестра справочника.
Прописываю все это в разделе "Справочники", получаю вопрос добавить ли его в текущую группу, отвечаю Да и......справочника нет.
Нигде, ни в какой группе, вообще нет в справочниках.
А в БД в представлении [VwSysLookup] есть.
Это как понимать?

Нравится

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

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

А по поводу проблемы: в другом браузере смотреть не пробовали?
Если добавить повторно такую же запись, система ругается на дубликат?

Это все лирика к делу не относится.
Смотрел в др бразуерах то же самое.
Если повторно добавить такой же, не ругается, но и не создает тоже ничего, а в БД в таблице SysLookup появляется еще одна запись с таким же значением столбца Name.

И кстати, так оно себя ведет с любым справочником......они в SysLookup появляются, а в Справочниках не показываются. При этом при создании колонки объекта типа справочник, этот справочник можно выбрать списке.

Короче, глюк конкретный.

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

Кстати, такой вопрос:
- таблицу SysLookup вижу
- таблицу SysLookupFolder вижу
А вот таблицу SysLookupInFolder не вижу......
Так надо?

Да, это нормально - в SysLookup есть колонка SysLookupFolder.

Запрос

select a.Name, b.Name from SysLookup a
inner join SysLookupFolder b
on a.SysFolderId = b.Id
where a.Name = 'Ваш справочник'

возвращает результаты?

SELECT a.Name, b.Name FROM SysLookup a
INNER JOIN SysLookupFolder b
ON a.SysFolderId = b.Id
WHERE a.Name = 'Состояния заявки'

возвращает:
Состояния заявки Все справочники
Состояния заявки Заявки

Т.е. в базе в нужной Вам группе этот справочник присутствует?
Попробуйте почистить кэш браузера, кэш редиса, перезайти в систему.
Попробуйте упорядочить все справочники по дате создания...
Если справочник не найдете - сообщите когда с Вами можно будет связаться для проведения удаленного подключения.

Все это уже делал.
Жду подключения.

Александр, в продолжение удаленного подключения, проблема была в том, что схемы объекта не существовало в основной(default) конфигурации.

Спасибо большое за помощь.

НО!
Проблема, по большей части, была в том, что нигде написано, что справочники надо регистрировать в основной конфигурации, что в свою очередь автоматически подразумевает наличие объекта.

Не передергивайте. Это все к больному:wink: вопросу о документации...

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

Хорошо. Уточнение принято. Но про это тоже не написано. :smile:

Александр, спасибо. Передам информацию документаторам :)

Я рад :smile: Искренне, за идущих за нами....

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

Здравствуйте
создаю новый раздел в BPMonline 7.0.0.167, не отображаются данные в разделе.
карточка есть, заполняю, сохраняю, в разделе не отображаются, хотя в БД записи создаются

делал по схеме:
1. Создать объект раздела.
2. Создать схему представления раздела (название - [ИмяОбъекта]Section, к примеру ProductSection);
3. Создать схему представления карточки (название - [ИмяОбъекта]Page, к примеру ProductPage);
4. Выполнить скрипт по регистрации раздела

прилагаю скрины






Нравится

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

Добрый день.

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

Проблему решил сам, нужно было создать еще объекты [ИмяОбъекта]Folder и [ИмяОбъекта]InFolder :cool:

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

Нигде не могу найти описание метода. Хотелось бы увидеть его - какие параметры, примеры и так далее...

Или это какой-то созданный метод? Он используется в очень многих местах.

AccountPage.js

callServiceMethod.call(scope, scope.ajaxProvider, 'FindAccountDuplicates', function(responce) { .... }

CardViewModelGenerator.js

this.callServiceMethod.call(this, 'SysSettingsService', 'GetIncrementValueVsMask', function(responce) {.... }

Нравится

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

День добрый, Коллеги!

После обновления BMPonline 7 (бинарники и пакеты через консоль) с 138 версии на 206, при попытке зайти на сайт CRM вылазит ошибка:

"Ошибка сервера
500 - внутренняя ошибка сервера.
Проблема с запрашиваемым ресурсом; ресурс не может быть отображен."

Судя по описанию ошибки в инете проблема скорей всего с правами на сервере или настройками IIS, но пока устранить не получилось...

Может кто сталкивался? или сможет подсказать куда копать хотя бы?
Самое странное что это произошло после обновления террасофта (настройки iis не менялись, папка тоже =\ просто тупо заменили файлы в старой папке на новые и отредактировали файлы Web.config и ConnectionString в корне и после накатили пакеты через консоль)
*возможно кроме Web.config'а и ConnectionString'а в корневой папке нужно править еще какие-нить файлы?

Буду раз за любую информации по данному вопросу!

Заранее спасибо!

Нравится

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

Добрый день!
давайте по порядку.

сейчас, постараюсь описать все, что не касается самих бинарников, а только IIS, предполагаю, что Вы все сделали правильно и загвоздка именно в нем.

1) Пул приложений

2) Handler Mappings

3) Authentication

4) проверить привязки сайта, ссылаются ли они в нужные места:

кажется все.
Перепроверьте, проблема должна уйти, если нет - жду скрин-шот :)

Тему можно закрывать
Спасибо за ответ Сергей, но мы как оказалось сами накосячили...
когда файл новой версии редактировали с настройками Web.config в Notepade++ сохранили его не посмотрев КАК он его сохранил ) в итоге сохранение файла прошло в ANSI, вместо Unicode и строчка

<add name="UserNameMask" value="Пользователь {0}" />

превратилась в

<add name="UserNameMask" value="???????? {0}" />

и сервер воспринимал это как ошибку в структуре xml =\ о чем и написал нам при попытке посмотреть настройки приложения в IIS

отлично! приятной работы ;)

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

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

Я хотел бы узнать, могу ли я сам поменять текст добавление фильтра или это вшито в ядро ?

Спасибо!

Нравится

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

Добрый день!

Artūrs, к сожалению, данный элемент действительно является частью ядра. Изменить сам текст средствами конфигурации невозможно.

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

У меня задача – при добавлении контагента в целевую аудитории, в модуле Campaign, создавать для этого контагента активность. При условии отпределенного типа записи модуля Campaign.
Я добавила этот скрипт к методу CampaignTargetSaved

Вот такой код у меня работает :

Guid accountId = Entity.GetTypedColumnValueGuid>("AccountId");
Guid campaignId = Entity.GetTypedColumnValueGuid>("CampaignId");

var campaignESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Campaign");
campaignESQ.AddAllSchemaColumns();
var campaign = campaignESQ.GetEntity(UserConnection, campaignId);

if (campaign != null) {
      var campaignType = campaign.GetTypedColumnValueGuid>("TypeId").ToString();
      if (campaignType == "c755b13f-dbac-445e-b74b-33221b8ce6da") {
            var ownerId = campaign.GetTypedColumnValueGuid>("OwnerId").ToString();
            DateTime StartDate = campaign.GetTypedColumnValueDateTime>("StartDate");
            DateTime DueDate = campaign.GetTypedColumnValueDateTime>("DueDate");
            var Title = campaign.GetTypedColumnValuestring>("Title");
     
            var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
            var entity = schema.CreateEntity(UserConnection);
            entity.SetDefColumnValues();
            entity.SetColumnValue("AccountId", accountId);
            entity.SetColumnValue("OwnerId", ownerId);
            entity.SetColumnValue("CampaignId", campaignId);
            entity.SetColumnValue("Title", Title);
            entity.SetColumnValue("StartDate", StartDate);
            entity.SetColumnValue("DueDate", DueDate);
            Guid category = new Guid("9D7EF44F-8E46-481D-9300-0A2E6559263F");
            entity.SetColumnValue("ActivityCategoryId", category);
            entity.Save();
      }
}
return true;

Но мне надо проверить – не существует ли уже в активностях запись для этого контагента и этой кампании. И если такая запись есть, то ее следует исправить – пересохранить определенные поля. Если записи нет – создать ее.
Потому я переписала код :

Guid accountId = Entity.GetTypedColumnValueGuid>("AccountId");
Guid campaignId = Entity.GetTypedColumnValueGuid>("CampaignId");

var campaignESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Campaign");
campaignESQ.AddAllSchemaColumns();
var campaign = campaignESQ.GetEntity(UserConnection, campaignId);

if (campaign != null) {
      var campaignType = campaign.GetTypedColumnValueGuid>("TypeId").ToString();
      if (campaignType == "c755b13f-dbac-445e-b74b-33221b8ce6da") {
            var ownerId = campaign.GetTypedColumnValueGuid>("OwnerId").ToString();
            DateTime StartDate = campaign.GetTypedColumnValueDateTime>("StartDate");
            DateTime DueDate = campaign.GetTypedColumnValueDateTime>("DueDate");
            var Title = campaign.GetTypedColumnValuestring>("Title");  
                       
            var esqActivity = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity");
            esqActivity.AddColumn("AccountId");
            esqActivity.AddColumn("CampaignId");
            var esqFirstFilter = esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "AccountId", accountId);
            var esqSecondFilter = esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "CampaignId", campaignId);
            esqActivity.Filters.LogicalOperation = LogicalOperationStrict.And;
            esqActivity.Filters.Add(esqFirstFilter);
            esqActivity.Filters.Add(esqSecondFilter);
            var entities = esqActivity.GetEntityCollection(UserConnection);
            if (entities == null) {
                  var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
                  var entity = schema.CreateEntity(UserConnection);
                  entity.SetDefColumnValues();
                  entity.SetColumnValue("AccountId", accountId);
                  entity.SetColumnValue("OwnerId", ownerId);
                  entity.SetColumnValue("CampaignId", campaignId);
                  entity.SetColumnValue("Title", Title);
                  entity.SetColumnValue("StartDate", StartDate);
                  entity.SetColumnValue("DueDate", DueDate);
                  Guid categoryId = new Guid("9D7EF44F-8E46-481D-9300-0A2E6559263F");
                  entity.SetColumnValue("ActivityCategoryId", categoryId);
                  entity.Save();
            }
else {
                  Guid ActivityId = entities[0].GetTypedColumnValueGuid>("Id");
var update = new Update(UserConnection, "Activity").Set("Title", Column.Parameter(Title)).Set("StartDate", Column.Parameter(StartDate)).Set("DueDate", Column.Parameter(DueDate)).Set("OwnerId", Column.Parameter(ownerId)).Where("Id").IsEqual(Column.Parameter(ActivityId));
                  update.Execute();
            }
      }
}
return true;

И этот метод уже не работает. Причем даже не сохраняет изменения в модуле CampaignTarget. Где я ошиблась?

Нравится

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

Наталия, не так:

esqActivity.AddColumn("AccountId");
esqActivity.AddColumn("CampaignId");

а так:

esqActivity.AddColumn("Account.Id");
esqActivity.AddColumn("Campaign.Id");

Не так:

esqActivity.AddColumn("AccountId");
esqActivity.AddColumn("CampaignId");

а так:

var AccoutnColumn = esqActivity.AddColumn("AccountId");
var CampaignColumn = esqActivity.AddColumn("CampaignId");

плюс добавить:

var Id = esqActivity.AddColumn("Id");
 if (entities == null)

>>>>>

 if (entities.Count == 0)
Guid ActivityId = entities[0].GetTypedColumnValue<Guid>("Id");

>>>>

Guid ActivityId = entities[0].GetTypedColumnValue<Guid>(Id);

А где я потом буду использовать AccoutnColumn, CampaignColumn и Id?

var AccoutnColumn = esqActivity.AddColumn("AccountId");
var CampaignColumn = esqActivity.AddColumn("CampaignId");
var Id = esqActivity.AddColumn("Id");

Вот такой код у меня вообще не компилируется :

Guid accountId = Entity.GetTypedColumnValue<Guid>("AccountId");
Guid campaignId = Entity.GetTypedColumnValue<Guid>("CampaignId");
 
var campaignESQ = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Campaign");
campaignESQ.AddAllSchemaColumns();
var campaign = campaignESQ.GetEntity(UserConnection, campaignId);
 
if (campaign != null) {
	var campaignType = campaign.GetTypedColumnValue<Guid>("TypeId").ToString();
	if (campaignType == "c755b13f-dbac-445e-b74b-33221b8ce6da") {
		var ownerId = campaign.GetTypedColumnValue<Guid>("OwnerId").ToString(); 
		DateTime StartDate = campaign.GetTypedColumnValue<DateTime>("StartDate");
		DateTime DueDate = campaign.GetTypedColumnValue<DateTime>("DueDate");
		var Title = campaign.GetTypedColumnValue<string>("Title");	
 
		var Id = esqActivity.AddColumn("Id");
		var AccoutnColumn = esqActivity.AddColumn("AccountId");
		var CampaignColumn = esqActivity.AddColumn("CampaignId");		
		var esqFirstFilter = esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "Account.Id", accountId);
		var esqSecondFilter = esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "Campaign.Id", campaignId);		
		esqActivity.Filters.Add(esqFirstFilter);
		esqActivity.Filters.Add(esqSecondFilter);
		var entities = esqActivity.GetEntityCollection(UserConnection);
		if (entities.Count == 0) {
			var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
			var entity = schema.CreateEntity(UserConnection);
			entity.SetDefColumnValues();
			entity.SetColumnValue("AccountId", accountId);
			entity.SetColumnValue("OwnerId", ownerId);
			entity.SetColumnValue("CampaignId", campaignId);
			entity.SetColumnValue("Title", Title);
			entity.SetColumnValue("StartDate", StartDate);
			entity.SetColumnValue("DueDate", DueDate);
			Guid categoryId = new Guid("9D7EF44F-8E46-481D-9300-0A2E6559263F");
			entity.SetColumnValue("ActivityCategoryId", categoryId);
			entity.Save();
		}
		else {
			Guid ActivityId = entities[0].GetTypedColumnValue<Guid>(Id);
			var update = new Update(UserConnection, "Activity").Set("Title", Column.Parameter(Title)).Set("StartDate", Column.Parameter(StartDate)).Set("DueDate", Column.Parameter(DueDate)).Set("OwnerId", Column.Parameter(ownerId)).Where("Id").IsEqual(Column.Parameter(ActivityId));
			update.Execute();
		}		
	}
}
return true;

Вот ошибка :

Как я понимаю, ругается именно на строку

Guid ActivityId = entities[0].GetTypedColumnValue<Guid>(Id);

Если я хочу взять значение колонки Id, разве это не должно выглядеть так :

Guid ActivityId = entities[0].GetTypedColumnValue<Guid>("Id");

?

var accountPhone = query.AddColumn("Phone").Name;
var queryResult = query.GetEntityCollection(UserConnection);
string PPhone = queryResult[0].GetTypedColumnValue(accountPhone));

Просто колонки в EntitySchemaQuery именуются произвольно. Поэтому нужно определять её имя в коде, и обращаться по нему.

Такой вопрос этот код Вы пишете в процессе объекта ? или где ?. Или как-то можна С# связать с траницей ?

"Ильюша Сергей Николаевич" написал:Такой вопрос этот код Вы пишете в процессе объекта ? или где ?

В процессе объекта CampaignTarget (Целевая аудитория воздействия).

"Ильюша Сергей Николаевич" написал:Или как-то можна С# связать с траницей ?

Не понятен вопрос.

Спасибо.

"Бондарь Наталия" написал:Не понятен вопрос.

как можна вызвать код C#(методы/объекты) из страницы ? Например зделать постбэк выполнить чтото и передать назад какое-то значение

Сергей, нужно написать web-сервис и вызывать его. Пример можно посмотреть в схеме ColumnHelper, function applyChange (вызов происходит в строке callServiceMethod.call(scope, ajaxProvider, 'ApplyChanges', function(responce)...). Обратите внимание на реализацию function callServiceMethod.

Такой вопрос - как получить ID только что созданной записи, если запись создается так:

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
var entity = schema.CreateEntity(UserConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("Name", ContactName);
entity.SetColumnValue("Phone", ContactPhone);
entity.Save();
return true;

?

Как вариант - явно задать значение колонки.

Guid g = Guid.NewGuid();
entity.SetColumnValue("Id", g);
Показать все комментарии