задача
нумерация
скрипт
Скрипты
Разработка

Доброго дня.
Подскажите пожалуйста, не знаю как решить проблемку:
Делал автоматическую нумерацию задач и возникла необходимость пронумеровать все старые задачи (которые были созданы до автонумерации. Они имеют номер 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 комментарий

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

Показать все комментарии
преобразование
скрипт
тип данных
Технические вопросы
7.x

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

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

Нравится

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

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

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

с#
Variable.ToString()

Показать все комментарии
бизнес-процесс
параметры
скрипт
элемент
Технические вопросы
7.x

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

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

Нравится

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

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

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

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

Показать все комментарии
OpenOffice
thunderbird
Бизнес Технологии
скрипт
Скрипты

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

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

Работа с данными
При работе с данными основными операциями являются - получить данные и записать.
Что бы каждый раз не писать для этого код, встречайте:
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.

Показать все комментарии
ответственный
скрипт
фильтрация
Технические вопросы
5.x

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}},
});
Показать все комментарии
OpenOffice
Бизнес Технологии
скрипт
Скрипты

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

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

Работа с данными
При работе с данными основными операциями являются - получить данные и записать.
Что бы каждый раз не писать для этого код, встречайте:
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), что подтверждает предположение, что в функции программа не побывала. Подумал, что пятый параметр лишний, убрал его, но не помогло.

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

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

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

Показать все комментарии
ID
выделенная запись
скрипт
Технические вопросы
5.x

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();

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