ПРиветствую, не силен в js, подскажите как заполнить выходные дни на 3 года вперед, вот кусок кода, который делает это на текущий год.

//-----------------------------------------------------------------------------
// wnd_CalendarCelebrateGridAreaScript
//-----------------------------------------------------------------------------


function btnAddCelebrateOnClick(Control) {
        var Dataset = Services.GetNewItemByUSI('ds_CalendarCelebrate');
        var A = new Date();
        A.set
        var CurretYear = A.getYear();
        while (A.getYear() ==  CurretYear) {
                if ((A.getDay() == 0) || (A.getDay() == 6)) {
                        Dataset.Append();
                        Dataset.Values('Date') = ExtractDate(A).getVarDate();
                        Dataset.Values('Name') = 'Выходной';   
                        Dataset.Post();
                }
                A.setDate(A.getDate() +1)
        }
        Dataset.Close();
        dlData.Dataset.Close();
        dlData.Dataset.Open();    
}

Спасибо!

Нравится

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

Возможно, стоит поменять фрагмент:

 while (A.getYear() ==  CurretYear) {

на:

 while (A.getYear() <=  CurretYear + 3) {

Пробовал, так он не выполняет ничего при нажатии на кнопку.

Обманул Вас, надо было перезапустить клиентское приложение.
Спасибо!!!

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

В один плохой момент перестал сохранятся Dataset. на Post() вылетает ошибка: ReservedOfferingDataset.Post() Ошибка сохранения записи. Оригинальное сообщение об ошибке: '20,28' некорректное значение с плавающей точкой для поля 'ModifiedByID'. Допустимый размер 15, точность 0
сервисы резервирования
в последнее время не изменялись, в каких случаях появляется такая ошибка?

Нравится

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

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

Здравствуйте, Виталий!

Очень похоже, что описанная Вами проблема возникает из-за того, что где-то в скрипте полю ModifiedByID присваивается некорректное значение.

Для решения проблемы рекоммендую Вам отладиться.

1. С помощью SQL Profiler отследить, какой запрос поступает в этот момент в базу данных.
2. Отладить скрипты конфигурации с помощью Debugger'а.

В Debugger'е смотрел на то поле - обычное GUID, сделал запрос по нем - показало контакта, все хорошо, сейчас SQL Profiler посмотрю
Сейчас уже увидел, что не сохраняется уже сама карточка резервирования, просто не дебаггер вылетает а обычное предупреждение(и не срабатывает кнопка ОК)

в SQL Profiler нет даже запроса на обновление или добавление, просто 4 селекта

Нашел решение, ошибка совсем в другом поле, увеличил точность в поле DS с 0 до 4 и ошибка пропала...
Причем тут ModifiedByID так и не понял

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

Здравствуйте. Подскажите в чем может быть проблема: при входе в TS появляется ошибка (скрин в приложении) "Ошибка открытия конфигурации. TCP Provider: Этот хост неизвестен.". Хотя при входе в другие базы той же версии все нормально.

Версия TS и БД 3.4.0

Нравится

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

Это значит, что пытаетесь подключиться на сервер, которого не существует. Или он выключен, или в настройках подключения Terrasoft неправильно указан адрес.

Аналогичное подключение к тому же серверу, но другой БД работает. Куда еще стоит обратить внимание?

Такая ошибка говорит о невозможности подключиться к указанному серверу и базе на нём. Может, дело в самом сервере или в firewall. Если дело в конкретной базе, то если развернуть там же её копию, то подключится ли к ней?

В общем проблема была в том что лицензии конкурентные и был настроен сервер сессий. Через менеджер лицензий, попал в настройки сервера сессий и выбрал "Использовать текущее соединение."

Спасибо за информацию.

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

Здравствуйте! Подскажите пожалуйста, можно ли сделать двухстороннюю синхронизацию контактов gmail с террасофт и каким путем идти? Версия террасофт 3.4.0. Синхронизация контактов outlook и gmail работает через стороннее приложение, так что думаю на крайний случай можно подтягивать для синхронизации outlook. Спасибо!

Нравится

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

В Terrasoft есть интеграция контактов с Outlook. Как её настроить и использовать, см. обе инструкции на стр. 133.

спасибо! А именно для gmail есть варианты?

Есть интеграция с Outlook, а что там используется для наполнения контакктов, Gmail или Exchange — разницы нет.
Прямая интеграция с контактами Google есть только в полностью новой версии 7.Х (видео).

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

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

Есть ли возможность прикрепить событие первого шага к старту БП?

Нравится

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

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

Вот мне и надо чтоб со стартом (зеленым кружком) выполнилось действие со своим скриптом wa_MyScript. Сейчас на схеме есть старт-стрелочка -действие1 со скриптом wa_MyScript, но действие1 не выполняется если StartWorkflow выполняется с будущей датой.

А что мешает сделать отдельно старт, отдельно скрипт?

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

Вы можете запустить процесс и в его начале поставить задачу «Покрасить». Когда кто-то переведёт её в состояние «Выполнена», процесс пойдёт дальше.

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

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

Пожалуйста, подскажите ответ на следующий вопрос: как можно получить параметр bpResult строкового типа из бизнес-процесса UsrProcess1 (после его выполнения) в исходный код (JS) схемы раздела "Контрагенты" ?

То есть что-то вроде: string result = ProcessModuleUtilities.UsrProcess1.bpResult;

Нравится

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

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

var arrServices = GetSimpleSQLResult(sSQL);
тогда arrServices - одномерный массив, с длиной запрашиваемых столбцов.

а если sSQL возвращает несколько строк, можно объявить двумерный массив, где количвство столбцов = количеству запрашиваемых столбцов, а количвство строк = количество возвращаемых строк

Спасибо.

Нравится

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

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

Конечно, теоретически это сделать возможно, но при условии, что Вы модифицируете функцию GetSimpleSQLResult(sSQL) таким образом, что возвращаемый результат будет записан в двумерный массив.

т.е. такой встроенной функции нет ?
Есть ли в террасофт понятие resultSet ?

например:
set rs = ExecuteQuery("select столбец from таблица where условие")
Do While Not rs.EOF -- т.е пока не дошли до последней строки запроса(включительно), EOF-end of file

-- какой-то анализ

rs.MoveNext -- переход на следующую строку
Loop

Функции GetSimpleSQLResult в коробочной версии нет, это какая-то доработка.

Обычно в таком цикле перебирают Dataset с несколькими строками результатов, примерно так:

function GetAllRecordFieldsValues(Dataset, FieldNames, Result) {
	var Result = new Array();
	var i;
	var ResultItem;
	while(!Dataset.IsEOF) {
		Result[Result.length] = new Array();
		ResultItem = Result[Result.length-1];
		for (i=0;i<FieldNames.length;i++){
			ResultItem[FieldNames[i]] = Dataset.Values(FieldNames[i]);
		}
		Dataset.GotoNext();
	}
	return Result;
}

Это стандартная функция из scr_DB.
Она возвращает массив массивов.

Здравствуйте Александр.
Спасибо за пример, я попробовала.

И если я Вас правильно поняля, для этого надо было создать tbl_таблицу, sq_запрос, ds_датасет, что я и сделала.

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

Есть ли другой вариант ?

Спасибо.

Любые таблицы базы данных лучше создавать в системе как сервис tbl. А sq — это запрос, графическое представление sql-кода, которое может быть построен и по существующим таблицам. В принципе, если сильно нужно, то и sq, и ds по ней можно создать чисто программно, не в дизайнере. Примеры низкоуровневой работы с этими объектами — в том же scr_DB.

Здравствуйте Алла и Александр.
Спасибо за ответы !

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

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

Пожалуйста, подскажите, как решить следующую задачу.

В пользовательском пакете (управление конфигурацией) есть готовый исходный код веб-сервиса UsrSourceCode1. Как бизнес-процессу использовать написанный конфигурационный сервис и передать ему входные параметры?

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

Версия: bpm'online sales enterprise 7.8

Нравится

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

Здравствуйте,
Проверю кое-что и отвечу в соседней теме:
http://www.community.terrasoft.ru/forum/topic/24733
Незачем создавать дубли.

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

Пример вы можете посмотреть в процессе CreateInvoiceFromOrder (Создание счета на основании заказа). В элементе "Задание-сценарий" вызывается метод CreateInvoice(). Этот метод вызывает метод CreateEntity() схемы OrderInvoiceHelper. Создание счета реализовано в схеме OrderInvoiceHelper.

Спасибо большое за ответ. Буду разбираться. Извините за дубли.

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

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

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

Как бизнес-процессу использовать написанный конфигурационный сервис и передать ему входные параметры?

Например, нужно посчитать сумму счетов по контрагенту. В веб-сервисе эта сумма считается, принимая на вход id контрагента. То есть нужно передать бизнес-процессу идентификатор контрагента и запустить сервис.

Нравится

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

Какая версия?

Здравствуйте.
bpm'online sales enterprise 7.8 пробная

Здравствуйте,
Если сервис создан в той же bpm’online что в БП, то просто можно создать экземпляр класса, и вызвать нужный вам метод. Пример привели в соседней теме, в комментарии:
http://www.community.terrasoft.ru/forum/topic/24735#comment-65599

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

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

Есть sql Scalar-valued функция f, которая возвращает returns nvarchar(4000).
Я вызываю эту функцию в скрипте:

var sSQL = "select dbo.f(параметры) as message"
var Result = GetSimpleSQLResult(sSQL);

В GetSimpleSQLResult вызывается Connector.DBEngine.ExecuteCustomSQL(SQltext, Parameters);
Захватила SQL код через SQL Server Profiler

declare @p3 varchar(8000)
set @p3=' ?????? ????? ? ????? '
exec sp_executesql N' select top 1 @P1 = MESSAGE FROM f(параметры)',N'@P1 varchar(8000) OUTPUT',@p3 output
select @p3

и результат ??? знаки вместо букв

Вопрос:
можно ли изменить Connector.DBEngine.ExecuteCustomSQL(SQltext, Parameters); так чтобы параметр был
declare @p3 nvarchar(4000) а не varchar(8000), чтобы вместо ??? был текст

Спасибо.

Нравится

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

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

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

Вот сама функция:
CREATE function [dbo].[tsf_CalcBudgetFieldValueByBusinessTrip]
(@ProjectPassportID uniqueidentifier,
@CalculcatedFieldName nvarchar(50))
returns float
as
begin

declare @BudgetFieldValue float

/*to do something*/

return @BudgetFieldValue
end

function CreateSPParameters() {
return System.CreateObject('TSObjectLibrary.Parameters');
}

function CreateParam(Parameters, ParamName, ParamDataType) {
var Parameter = Parameters.CreateItem();
Parameter.Name = ParamName;
Parameter.DataType = ParamDataType;
Parameters.Add(Parameter);
return Parameter;
}

function GenNewKeyValueFromCollection(Collection, KeyValueCode) {
var ItemKeyValue;
for (var i = 0; i < Collection.Count; i++) {
ItemKeyValue = KeyValueCode + (i + 1).toString();
if (!Assigned(Collection.CoreItemsByKey(ItemKeyValue))) {
return ItemKeyValue;
}
}
return KeyValueCode;
}

function AddParameter(Parameters, ParamDataType, ParamValue, ParameterName) {
var ParamName = GenNewKeyValueFromCollection(Parameters, 'Parameter');
var Parameter = CreateParam(Parameters, ParamName, ParamDataType)
Parameter.Value = ParamValue;
if (!!ParameterName) {
Parameter.Name = ParameterName;
}
return Parameter;
}

function Calc() {
var Params = CreateSPParameters();
AddParameter(Params, pdtGUID, ProjectPassportID).Name = 'ProjectPassportID';
AddParameter(Params, pdtUnicodeString, CalculcatedFieldName).Name = 'CalculcatedFieldName';
var ResultParam = AddParameter(Params, pdtFloat, 0);
ResultParam.Name = 'BudgetFieldValue';
ResultParam.ParamType = pdtFloat;
var SQL =
'SET :BudgetFieldValue = dbo.tsf_CalcBudgetFieldValueByBusinessTrip(:ProjectPassportID, :CalculcatedFieldName)';
Connector.DBEngine.ExecuteCustomSQL(SQL, Params);
}

Здравствуйте, Алла.

Я попробовала, пока не получается. Правильно ли я все поняля ?

вот функция:

create function func_CheckNumber
(@Number as int,
@Service as int
)

returns nvarchar(4000)

as
begin

declare @msg as nvarchar(4000);
set @msg = N'';

-- логика

set @msg = N'Համար' -- текст на армянском языке, написано Номер
return @msg
end

go

скрипт:
var Params = CreateSPParameters();

AddParameter(Params, sdtInteger, '993976').Name = 'Number';
AddParameter(Params, sdtInteger, '32').Name = 'Service';

var ResultParam = AddParameter(Params, sdtUnicodeString, '');
ResultParam.Name = 'msg';
ResultParam.ParamType = sdtUnicodeString;

var sSQL = 'set :msg = [dbo].[func_CheckNumber](:Number, :Service)';

Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);

var Result = Params.ItemsByName('msg').Value;

ShowInformationDialog(IsEmptyValue(Result) ? '' : Result);

-- scr_SysEnums
sdtInteger = 0x00000001;
sdtUnicodeString = 0x00000008;

SQL Server Profiler:

exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 varchar(1),@P2 int,@P3 int',NULL,993976,32

Result = null, и тип @P1 varchar(1), несмотря на то, что написано ResultParam.ParamType = sdtUnicodeString;

Спасибо.

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

Попробуйте после запроса на выполнение проверить, какой результат содержится в ResultParam.Value, а не в Params.ItemsByName('msg').Value.

Также проверьте результат выполнения функции в SQL Management Studio, что в этом случае возвращается.

после
Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);
проверила дебаггером

ResultParam.Value
null

этот код взяла из SQL Server Profiler:
exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 varchar(1),@P2 int,@P3 int',NULL,993976,32

и чтобы заработало видоизменила чуть-чуть, добавила declare @p3 as nvarchar(50), OUTPUT и varchar(1) изменила на nvarchar(50)
declare @p3 as nvarchar(50)
exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 nvarchar(50) OUTPUT ,@P2 int,@P3 int',@p3 output,993976,32
select @p3

результат верен: Համար

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

Уточните, пожалуйста, какую версию Terrasoft 3.X Вы используете?

Также добавьте сервисы с реализованными функциями в Terrasoft и текст SQL-функции.

Версия: 3.2.0.90

SQL функция:
create function func_CheckNumber(@Number as int,
@Service as int
)

returns nvarchar(4000)

as
begin

declare @msg as nvarchar(4000);
set @msg = N'';

-- логика

set @msg = N'Համար' -- текст на армянском, написано Номер
return @msg
end

GO

скрипт:
function edt_NumberOnExit(Control)
{
debugger

if(dlData.Dataset.State == dstInsert)
{
if(Control.DataField.DisplayValue > 0)
{
var Params = CreateSPParameters();

AddParameter(Params, sdtInteger, '993976').Name = 'Number';
AddParameter(Params, sdtInteger, '32').Name = 'Service';

var ResultParam = AddParameter(Params, sdtUnicodeString, '');
ResultParam.Name = 'msg';
ResultParam.ParamType = sdtUnicodeString;

var sSQL = 'set :msg = [dbo].[func_CheckNumber](:Number, :Service)';

Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);

var Result = Params.ItemsByName('msg').Value;

ShowInformationDialog(IsEmptyValue(Result) ? '' : Result);

}
}
}

1. CreateSPParameters
2. CreateParam
3. GenNewKeyValueFromCollection
эти функции, которые Вы отправили, в точности совпадали, кроме 4. AddParameter, которую я скопировала у себя

Возможно, дело в том, что для линейки 3.Х полноценная поддержка Unicode появилась в 3.4.0. При необходимости можно попробовать обновится до 3.4.0, перезаказать лицензии (платно). Также см. обсуждение похожего случая.

Здравствуйте Александр. Обновиться вряд ли получится, вопрос решила без SQL функции, только скриптом.

Спасибо.

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