ProgressBar или надпись Загрузка в BPMonline

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

Каким образом в 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 секунд, "тики" видно уже не будет. При старте действия - лейбл отображать.

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

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

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