Доброго дня.
Подскажите пожалуйста, не знаю как решить проблемку:
Делал автоматическую нумерацию задач и возникла необходимость пронумеровать все старые задачи (которые были созданы до автонумерации. Они имеют номер 0)
Если у меня последняя задача с номером 4000, то необходимо пронумеровать старые начиная с 4001+

Надеюсь на Вашу помощь.

Terrasoft XRM 3.3.2.43

Нравится

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

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

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

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

Да, значение счетчика хранится в системной настройке.
А автоматизировать каким-либо образом можно сие действие?

Вам же надо обновить 1 раз.

Можно написать SQL-скрипт и запустить.

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

Сделал следующим образом:
alter table [Table_name] drop column 'Colomn_Name'
alter table [Table_name] add 'Colomn_name' int identity

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

Здравствуйте.
Добавил в раздел "Задачи" новую колонку, однако при нажатии на элемент этой колонки выдает следующее предупреждение:
"Не удается найти карточку редактирования для выбранного элемента"
Я пытался сравнивать с другими колонками, на различия или может я что то упустил...но исправить так и не удалось.
Подскажите пожалуйста как исправить данную ошибку
Заранее спасибо.

Нравится

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

Возможно, справочник, на который ссылается поле, зарегистрирован неверно и в нём не указана карточка.

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

Доброе утро коллеги.
Подскажите какой скрипт необходимо написать, чтобы преобразовать тип данных "Уникальный идентификатор" в "Int" который выводиться в поле Целое число ?

Если есть шаблоны буду благодарен за ссылки.
Спасибо.

Нравится

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

А как вы себе представляете отображение в виде целого числа выражения '{2B885FFE-8226-4AAD-9468-64A0C50DA01B}' ?

Понял. Тогда как преобразование в String ?

с#
Variable.ToString()

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

Добрый день!
В бизнес-процессе есть автогенерируемая страница , в которой в качестве элементов созданы два поля типа дата: дата начала(NeedStartDate) и дата окончания(NeedEndDate).
Соответственно на данной странице необходимо будет заполнить эти два поля.

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

Нравится

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

Добрый вечер, Дарья!

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

В случае, если Вы хотите использовать введенные пользователем параметры в элементе "Задание-сценарий", тогда обратиться к параметру Вы можете следующим образом:
AutoGeneratedPageUserTask[N].FieldName,
где AutoGeneratedPageUserTask[N] - название автогенерируемой страницы в процессе (именно название, а не заголовок), а FieldName - код элемента на автогенерируемой странице (задается при создании).

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

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

  • Данными
  • Окнами
  • Бизнес процессы
  • И другие

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

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

function GetContactName(ContactID) {
        var Dataset = Services.GetNewItemByUSI('ds_Contact');
        ApplyDatasetFilter(Dataset, 'ID', ContactID, true);
        Dataset.Open();
        var Name = Dataset('Name');
        Dataset.Close();
        return Name;
}

function Main() {
        var SupervisorID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
        var Name = GetContactName(SupervisorID);
}

Но можно избежать написания функции GetContactName, используя GetDatasetValue,
тогда весь код для получения имени контакта станет вот таким

function Main() {
        var SupervisorID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
        var Name = GetDatasetValue('ds_Contact', SupervisorID, 'Name');
}

В GetDatasetValue написан уже код для получения значения.
Таким образом, мы сэкономили время на разработку и избавились от монотонной работы.

Для изменения контакту имени, мы будем использовать SetDatasetValue

SetDatasetValue('ds_Contact', ContactID, 'Name', NewName);

Здесь и фильтрация по ID записи и запись значения, все в одной строке.

Работа с окнами
При работе с окнами, часто возникает необходимость подключать детали в карточку редактирования.
Для этого, разработана функция которая это делает очень легко - IncludeDetailEdit
Для примера подключим деталь договоров в карточку продажи.
Все это опишем в одном методе IncludeDetails.

function IncludeDetails() {
        var Dataset = dlData.Dataset;
        var RecordID = Dataset('ID');  
        IncludeDetailEdit(wndContract, 'ds_Contract', 'OpportunityID', RecordID);
}

Нужно указать контейнер окна (WindowContainer) содержащий реестр договоров, датасет, поле для фильтрации договоров и ID записи по которой будем фильтровать.

Бизнес процессы
Работа каждого бизнес процесса начинается с его запуска, для этого будем использовать RunWorkflow

Запуск процесса с передачей в диаграмму контакта и контрагента.
Если вам ничего не потребуется передавать, тогда заполнять второй параметр не обязательно.

function StartProcess() {
        var Dataset = dlData.Dataset;
        var ContactID = Dataset('ContactID');
        var AccountID = Dataset('AccountID');
       
        RunWorkflow('wd_Sales', {
                'ContactID' : ContactID,
                'AccountID' : AccountID
        });
}

Нужно указать USI диаграммы и набор передаваемых параметров в диаграмму.
Параметры должны быть у виде объекта, где имя свойства будет равным имени параметра.

Это только маленькое описание по часто используемым функциям.

Нравится

Поделиться

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

а вообще, спасибо большое :twisted:

хотя и есть спорные моменты

Спасибо. Интересно было посмотреть на отправку почты через Thunderbird, работу с OpenOffice и отправка HTTP запросов и получение ответов (взял для себя на заметку).

"Андросов Дмитрий" написал:


Упс, точно. Исправлю.

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

А в чём разница с предыдущим сообщением?


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

Тогда ясно.

Библиотека полезная.
Не очень ясно только, зачем нужны GetDatasetValue и GetDatasetValues при наличии аналогичных GetDatasetFieldValueByID и GetDatasetFieldValuesByID.

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

BPM 5.4.0
Необходимо ставить в поле "Ответственный" в карточке Задачи не только контактов с типом "Сотрудник своей организации", но и с другим типом (допустим его id записан в переменную OtherTypeId)
В карточке задачи в скрипте ChildInitAfterParentScriptExecute есть такой код (наверняка он фильтрует)

Page.OwnerEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        var employersContactTypeUId = "60733efc-f36b-1410-a883-16d83cab0980";          
        CollectionDictionarystring, object>> filters = e.Filters;
        filters.Add(new Dictionarystring, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}}});       
};

Как добавить еще один фильтр с условием ИЛИ?

Нравится

3 комментария
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {otherTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 

Александр, думаю, вы немного ошиблись вместо FilterComparisonType.Or надо LogicalOperationStrict.Or.
Но все равно в результате этого у меня выводит пустой список.

Как часто: сам задал вопрос, сам ответил.
А все тупо:

filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId,otherTypeUId}},
});
Показать все комментарии

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

  • Данными
  • Окнами
  • Бизнес процессы
  • И другие

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

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

function GetContactName(ContactID) {
        var Dataset = Services.GetNewItemByUSI('ds_Contact');
        ApplyDatasetFilter(Dataset, 'ID', ContactID, true);
        Dataset.Open();
        var Name = Dataset('Name');
        Dataset.Close();
        return Name;
}

function Main() {
        var SupervisorID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
        var Name = GetContactName(SupervisorID);
}

Но можно избежать написания функции GetContactName, используя GetDatasetValue,
тогда весь код для получения имени контакта станет вот таким

function Main() {
        var SupervisorID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
        var Name = GetDatasetValue('ds_Contact', SupervisorID, 'Name');
}

В GetDatasetValue написан уже код для получения значения.
Таким образом, мы сэкономили время на разработку и избавились от монотонной работы.

Для изменения контакту имени, мы будем использовать SetDatasetValue

SetDatasetValue('ds_Contact', ContactID, 'Name', NewName);

Здесь и фильтрация по ID записи и запись значения, все в одной строке.

Работа с окнами
При работе с окнами, часто возникает необходимость подключать детали в карточку редактирования.
Для этого, разработана функция которая это делает очень легко - IncludeDetailEdit
Для примера подключим деталь договоров в карточку продажи.
Все это опишем в одном методе IncludeDetails.

function IncludeDetails() {
        var Dataset = dlData.Dataset;
        var RecordID = Dataset('ID');  
        IncludeDetailEdit(wndContract, 'ds_Contract', 'OpportunityID', RecordID);
}

Нужно указать контейнер окна (WindowContainer) содержащий реестр договоров, датасет, поле для фильтрации договоров и ID записи по которой будем фильтровать.

Бизнес процессы
Работа каждого бизнес процесса начинается с его запуска, для этого будем использовать RunWorkflow

Запуск процесса с передачей в диаграмму контакта и контрагента.
Если вам ничего не потребуется передавать, тогда заполнять второй параметр не обязательно.

function StartProcess() {
        var Dataset = dlData.Dataset;
        var ContactID = Dataset('ContactID');
        var AccountID = Dataset('AccountID');
       
        RunWorkflow('wd_Sales', {
                'ContactID' : ContactID,
                'AccountID' : AccountID
        });
}

Нужно указать USI диаграммы и набор передаваемых параметров в диаграмму.
Параметры должны быть у виде объекта, где имя свойства будет равным имени параметра.

Это только маленькое описание по часто используемым функциям.

Нравится

Поделиться

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

Как в Terrasoft проверить существует файл или директория на диске или сервере или же нет?
Ну и соответственно вернуть true или false.

Нравится

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

Что-то я рано о помощи просить стал.
Делается так:

var filepath='C:\\testfile.txt';
var fso=new ActiveXObject('Scripting.FileSystemObject');
if (fso.FileExists(filepath)) {
   //true
} else {
   //false
}
Показать все комментарии

Думал, что можно из отчета вызвать другой отчет. В документации вариантов решения не нашел. Если нельзя, жаль. Можно, конечно, запомнить работника, дату. Перейти в террасофт, ввести эти параметры и вызвать другой отчет. Но по нажатию на ячейку отчета было бы лучше.
Можно, вообще, хоть какой-то террасофтовский скрипт как-то запустить из кода фастрепорт? Например, открыть окошко с инструкцией. JScript работает вроде бы в фастрепорт. Но import "scr_DB.js" не работает, import "scr_DB" тоже. Эти файлы где-то под оболочкой и достать их невозможно? Можно ли хотя бы в кросс-репорт менять высоту полей и перерисовывать отчет, используя refresh?

Нравится

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

"Зеннюков В.Ю." написал:Думал, что можно из отчета вызвать другой отчет. В документации вариантов решения не нашел. Если нельзя, жаль. Можно, конечно, запомнить работника, дату. Перейти в террасофт, ввести эти параметры и вызвать другой отчет. Но по нажатию на ячейку отчета было бы лучше.

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

"Зеннюков В.Ю." написал:Можно, вообще, хоть какой-то террасофтовский скрипт как-то запустить из кода фастрепорт?

Посмотрите пример вызова во вложенном файле.

Спасибо за ответ. Правда, до цели я не добрался. В Pascal script не проходит даже первую строчку

procedure DBCross1Corner1OnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
var Connector: Variant;
var Window: Variant;

begin
Connector := ds_SocSor2.GetConnector();
// Window := Connector.Services.GetNewItemByUSI('wnd_myTestWindow');
// DBCross1Corner2.Text := Window.ScriptControl.Run('AmountToStr',
// FloatToStr(StrToFloat(DBCross1Cell22)), 'ua', 'UAH', true);
end;

Выдает на the OnBeforePrint - following error(s) have occured: script error at 58:23 Undeclared identifier: 'ds_SozSor2'
Думал, что-то не так с моим датасетом, заменил его на везде используемый ds_Call - та же ошибка.
На OnPreviewClick другая ошибка на первой строчке Invalid variant type (детали ошибки в прикрепленном файле)

Заменил тип скрипта на JScript.

var ii = "RUB";

function DBCross1CellHeader0OnPreviewClick(Sender, Button, Shift, &Modified)
{
var Connector = ds_SocSor2.GetConnector();
var Window = Connector.Services.GetNewItemByUSI("wnd_myTestWindow");
DBCross1Corner2.Text = Window.ScriptControl.Run("AmountToStr", FloatToStr(StrToFloat(DBCross1Cell22)),

"ua", "UAH", true);

}

function DBCross1Corner1OnPreviewClick(Sender, Button, Shift, &Modified)
{
var Connector = ds_SocSor2.GetConnector();
var Window = Connector.Services.GetNewItemByUSI("wnd_myTestWindow");
var ii = Window.ScriptControl.Run("AmountToStr", FloatToStr(StrToFloat("1.27")), "ua", "UAH", true);
}

function DBCross1Corner1OnBeforePrint(Sender)
{
var Connector = ds_SocSor2.GetConnector();
var Window = Connector.Services.GetNewItemByUSI("wnd_myTestWindow");
var ii = Window.ScriptControl.Run("AmountToStr", FloatToStr(StrToFloat("1.27")), "ua", "UAH", true);
}

function DBCross1OnPrintCell(Memo, RowIndex, ColumnIndex, CellIndex, RowValues, ColumnValues, Value)
{
if (CellIndex == 1)
if (ii == "RUB")
Memo.Color = clCream;
else
Memo.Color = clSilver;
}

Если присваиваю значение вызываемой функции ii, ошибок не выскакивает, но поставив debugger; в функцию, вижу, что программа туда не попадает. Если присваиваю значение вызываемой функции DBCross1Corner2.Text, выдает ошибку Could not convert variant of type (Null) into type (OleStr), что подтверждает предположение, что в функции программа не побывала. Подумал, что пятый параметр лишний, убрал его, но не помогло.

Как-то грустно, а этот механизм точно работает?

Сейчас проверил на простом отчете - работает, может быть, только на кросс-отчетах не работает.
Это уже легче, буду проверять дальше.

Все получилось. Спасибо!

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

BPM 5.4.0
Создал кнопку реестре, для обработки необходимо получить id и другие поля выделенной записи. Как это сделать?
И еще вопрос, как потом в эту запись что-то добавить или изменить?

Нравится

1 комментарий
Page.TreeGrid.SelectedNodes

вернет Вам выделенные клиентом в реестре записи как ObservableCollection
А свойство

SelectedNodePrimaryColumnValue

- Id той записи на которой находится курсор

Какой-то странный вопрос??? Как в уже существующую запись можно что либо добавить. Если Вам нужно изменить запись, то вот код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, Page.DataSource.Schema.Name);
esq.AddAllSchemaColumns();
var entity = esq.GetEntity(UserConnection, SelectedNodePrimaryColumnValue);
// код модификации записи
// entity.SetValueAndText("Id записи лукапного", "Текстовое представление лукапного поля");
entity.Save();

Для создания новой записи код:

var manager = UserConnection.EntitySchemaManager.GetInstanceByName(Page.DataSource.Schema.Name);
var entity = manager.CreateEntity(UserConnection);
entity.SetDefValues();
// код модификации записи см. выше
entity.Save();

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