Добрый день!



Столкнулись с ошибкой при импорте пакета.

Решение экспортировалось в ситеме с версией >8.0.

Импортируется в Creatio Sales 7.17.


Terrasoft.Core.Packages.Exceptions.InvalidDescriptorInFileSystemException: Invalid discripter: 
Чтение свойства "Type" не поддерживается
Путь: UsrTest ---> Terrasoft.Common.InvalidObjectStateException: Чтение свойства "Type" не поддерживается
   at Terrasoft.Core.Packages.PackageFileStorage.Read(DataReader reader, Package package) 
   at Terrasoft.Core.Packages.PackageFileStorage.b__201_0(JsonDataReader reader, Package package) 
   at Terrasoft.Core.Packages.PackageFileStorage.InitializeDescriptor[T](Action2 initializeDescriptor, String descriptorFilePath, T descriptor) 
   at Terrasoft.Core.Packages.PackageFileStorage.CreatePackageDescriptorBasedOnDirectory(String directoryPath, Action2 initializeDescriptor) 
   --- End of inner exception stack trace --- 
   --- End of inner exception stack trace --- 
   at Terrasoft.Core.AppInstallation.Packages.Operations.PackageZipOperations.ThrowIfPackageStorageItemErrorsExist(PackageStorage packageStorage) 
   at Terrasoft.Core.AppInstallation.Packages.Operations.PackageZipOperations.Load() 
   at Terrasoft.Core.AppInstallation.Packages.Backup.ZipPackageBackupManager.ComposePackages(String sourcePackagesPath, String tempFilesPath) 
   at Terrasoft.Core.AppInstallation.Packages.Backup.ZipPackageBackupManager.CreateBackup(String sourcePackagesPath, String tempFilesPath, String backupPath, String code) 
   at Terrasoft.Core.ServiceModelContract.PackageInstaller.PackageInstallerServiceInternal.<>c__DisplayClass25_0.b__0() 
   at Terrasoft.Core.ServiceModelContract.PackageInstaller.BaseInstallerServiceInternal.InvokeWithLogging(Action action) 



Это проблема внутри пакета или же про совместимость систем из которой экспортировали с в которую? Или настройки системы, в которую импортирем?

Как возможно исправить данную ошибку?



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

Прикрепленные файлы

Нравится

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

Добрый день!



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

Добрый день!

Обновила вопрос, прикрепила файл. 

Bogdan,

Добрый день!

Обновила вопрос, прикрепила файл. 

Здравствуйте. Как решили вопрос?

Столкнулись с такой-же ошибкой.

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

Можно ли каким-то образом не создавать новые значения справочников при импорте данных?



Это позволит точнее контролировать процесс импорта, избегая ситуаций, когда добавляются ошибочно написанные валюты, страны и тому подобное

Нравится

4 комментария
Лучший ответ

Доброе утро, Владимир!

 

Есть такой, не до конца протестированный, вариант:

- забрать права доступа на операцию "Создание" для юзеров/ролей в объекте "Справочник": https://prnt.sc/wljjrd. Это относится только к справочникам, т.е. тем объектам у кого родителем является "Базовый справочник". Ни поле "Контакт", ни "Контрагент" под эти правила уже не подойдут.

А, ну и при таком раскладе, ни в один справочник указанные юзеры/роли не смогут добавлять значения вообще.

 

Вариант нужно протестировать. У меня вышло так, что была лишь одна запись продажи, созданная Supervisor. Под тестовым юзером я, учитывая правила поиска дубля, залила файл и у меня создалась совершенно новая запись продажи с предзаполненными значениями, как и в файле. Плюс, что в справочниках не создались новые значения. Минус, наверное, в том, что стоило попробовать вытянуть Id продажи и учитывать его в правилах дублей.

Доброе утро, Владимир!

 

Есть такой, не до конца протестированный, вариант:

- забрать права доступа на операцию "Создание" для юзеров/ролей в объекте "Справочник": https://prnt.sc/wljjrd. Это относится только к справочникам, т.е. тем объектам у кого родителем является "Базовый справочник". Ни поле "Контакт", ни "Контрагент" под эти правила уже не подойдут.

А, ну и при таком раскладе, ни в один справочник указанные юзеры/роли не смогут добавлять значения вообще.

 

Вариант нужно протестировать. У меня вышло так, что была лишь одна запись продажи, созданная Supervisor. Под тестовым юзером я, учитывая правила поиска дубля, залила файл и у меня создалась совершенно новая запись продажи с предзаполненными значениями, как и в файле. Плюс, что в справочниках не создались новые значения. Минус, наверное, в том, что стоило попробовать вытянуть Id продажи и учитывать его в правилах дублей.

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

 

Также в стандартном механизме уже предусмотрено отсеивание некоторых случаев ошибочного добавления:

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

В файле импорта указан тип контакта “клиент”.
В справочнике [ Типы контактов ] содержится значение “Клиент”.

В этом случае импортированная запись связывается с существующим значением. Новая запись в справочник добавлена не будет.

В файле импорта указан тип контакта “«Клиент»”.
В справочнике [ Типы контактов ] содержится значение “Клиент”.

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

Ещё есть особенность, когда при импорте не работает поиск существующих записей по локализованным колонкам в справочнике, создаются дубли. В таком случае поможет обходное решение — выключить фичу HighestSpeedFileImport.

А как насчёт чистки данных перед импортом?) 

Или после, уже в базе. Или в момент, созданием своего специализированного механизма импорта, учитывающего все специальные случаи. До определённой версии была возможность запустить старое окно импорта с большим числом настроек, но в современных, где нет логики на основе 5.Х, такого, видимо, не выйдет.

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

Добрый день! Есть ли возможность настроить/изменить механизм импорта из Excel таким образом, чтобы в записях, помеченных как дубли, не переписывались существующие значения колонок, а только заполнялись те, которые ранее были пустыми?

Нравится

1 комментарий
Лучший ответ

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

Сделать это базовыми средствами импорта не получится.

Как вариант, писать свой пользовательский импорт.

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

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

Сделать это базовыми средствами импорта не получится.

Как вариант, писать свой пользовательский импорт.

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

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

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

Есть базовый функционал импорта из Excel который при каждом импорте запрашивает связку полей Excel документа и полей таблицы куда идет импорт. 

Можно ли сделать преднастройку связывания данных при импорте из Excel, что бы каждый раз не приходилось делать одни и те же настройки?

 

Нравится

8 комментариев
Лучший ответ

Посмотри пример добавления вложений в письмо EmailMessagePublisherPage

define("EmailMessagePublisherPage", ["EmailMessagePublisherPageResources", "LookupUtilities", "EmailImageMixin",
		 "ConfigurationConstants", "MaskHelper", "ExchangeNUIConstants", "EmailActionsMixin", "MacrosUtilities",
		"ExtendedHtmlEditModuleUtilities", "ExtendedHtmlEditModule", "MessagePublisherAttachmentUtilities",
		"MacrosHelperServiceRequest", "EntityResponseValidationMixin", "css!HtmlEditModule",
		"css!EmailMessagePublisherModule"],
		function(resources, LookupUtilities, EmailImageMixin, ConfigurationConstants, MaskHelper, ExchangeNUIConstants) {
			return {
				entitySchemaName: "Activity",
 
{
	"operation": "insert",
	"name": "AttachFileButton",
	"propertyName": "items",
	"parentName": "PublisherBottomContainer",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.DEFAULT,
		"iconAlign": this.Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"imageConfig": {
			"bindTo": "getAttachFileButtonImageConfig"
		},
		"tag": "attachFileButton",
		"fileUpload": true,
		"filesSelected": {"bindTo": "onAttachFileSelected"},
		"enabled": {
			"bindTo": "IsPublishButtonEnabled"
		},
		"click": {
			"bindTo": "onAttachFileButtonClick"
		},
 

В MessagePublisherAttachmentUtilities в методе onAttachFileSelected выполняется загрузка файла а метод onComplete вызывается после окончания загрузки вот туда можно вставить вызов твоего сервиса по импорту данных и передать ему fileId загруженного файла.

В более сложном варианте можно обойтись без загрузки файла в БД но для этого тебе нужно по аналогии с FileApiService написать свой сервис обработки файлового потока и вызывать его

 

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

Почти 2 года назад озвучивала здесь это пожелание Возможность сохранения настроек импорта из Microsoft Excel. Но из-за того, что потребность в данной функциональности у пользователей bpm'online crm низкая, она до сих пор не реализована.

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

Другой вариант, Вы можете реализовать свой преднастроенный импорт, например, через действие раздела. Посмотрите обсуждение здесь.

Если вы часто выполняете импорт может стоить подумать о других механизмах а не Экселе. Импорт из экселя задумывался для разового переноса/наполнения системы. Использование его оправадано если данных сравнительно немного и их вручную нужно просматривать/фильтровать менять.

Если вы постоянно выполняете обновления то можно использовать интеграции с вэб сервисами или инструменты интеграции на уровне БД (Например на основе мастера экспорта импорта MSSQL Managment Studio можно создать свой пакет сохранив туда все настройки и использовать его для автоматизации процесса переноса записей)

 

Григорий Чех,

Импорт с Экселя оправдан т.к. данные вносятся туда вручную и их не так уж и много. 

Что было бы лучше? 1. Копаться в базовом импорте с Эксель и пробовать через этот способ сделать. 2. Сделать программу которая импортировала данны прямо в БД, но тогда мне неизвестно будет ли отрабатываться процессы на уровне Entity. 3. Сделать все как в 2 пункте только в БД специально созданной для этого случая и потом как-то синхронизировать её(эту БД) с bpmonline.

Алла Савельева,

Идею поддержал.

По поводу своего преднастроенного импорта. Если делать его через отдельную программу на C# , то будет ли срабатывать событийные процессы на уровне Entity?

Андреев Андрей Сергеевич,

Я бы написал свой БП или лучше сервис для импорта данных в bpm. Чтобы срабатывали событийные процессы для вставки данных используй esq

Как то так

var _caseFile = new Terrasoft.Configuration.CaseFile(UserConnection);
    _caseFile.SetDefColumnValues();
    _caseFile.SetColumnValue("Name", url);
    _caseFile.SetColumnValue("TypeId", FileConsts.LinkTypeUId);
    _caseFile.Save();

 

Григорий Чех,

Возможно вы знаете как загрузить Excel файл с  карточки загрузки на стороне клиента и правильно передать его при вызове серверного кода, используя 

ServiceHelper.callService(config);

Что-бы там его получить и уже как-то занести в БД?

Посмотри пример добавления вложений в письмо EmailMessagePublisherPage

define("EmailMessagePublisherPage", ["EmailMessagePublisherPageResources", "LookupUtilities", "EmailImageMixin",
		 "ConfigurationConstants", "MaskHelper", "ExchangeNUIConstants", "EmailActionsMixin", "MacrosUtilities",
		"ExtendedHtmlEditModuleUtilities", "ExtendedHtmlEditModule", "MessagePublisherAttachmentUtilities",
		"MacrosHelperServiceRequest", "EntityResponseValidationMixin", "css!HtmlEditModule",
		"css!EmailMessagePublisherModule"],
		function(resources, LookupUtilities, EmailImageMixin, ConfigurationConstants, MaskHelper, ExchangeNUIConstants) {
			return {
				entitySchemaName: "Activity",
 
{
	"operation": "insert",
	"name": "AttachFileButton",
	"propertyName": "items",
	"parentName": "PublisherBottomContainer",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.DEFAULT,
		"iconAlign": this.Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"imageConfig": {
			"bindTo": "getAttachFileButtonImageConfig"
		},
		"tag": "attachFileButton",
		"fileUpload": true,
		"filesSelected": {"bindTo": "onAttachFileSelected"},
		"enabled": {
			"bindTo": "IsPublishButtonEnabled"
		},
		"click": {
			"bindTo": "onAttachFileButtonClick"
		},
 

В MessagePublisherAttachmentUtilities в методе onAttachFileSelected выполняется загрузка файла а метод onComplete вызывается после окончания загрузки вот туда можно вставить вызов твоего сервиса по импорту данных и передать ему fileId загруженного файла.

В более сложном варианте можно обойтись без загрузки файла в БД но для этого тебе нужно по аналогии с FileApiService написать свой сервис обработки файлового потока и вызывать его

 

Еще проще по нажатию кнопки вызвать

selectFile(event) {
    event.preventDefault();
 
    file_input = document.createElement('input');
    file_input.addEventListener("change", uploadFile, false);
    file_input.type = 'file';
    file_input.click();
},
 
uploadFile() {
    //отправка file_input.files[0]) например используя  XMLHttpRequest post
}

 

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

Доброго времени суток, есть вопрос следующего характера
У меня есть расширяющий модуль для FileDetailV2
Внутри него я получаю контент PDF документа (контент строкой)
Каким образом мне этот контент передать на FileApiService модуль в метод Upload что бы загрузить этот файл?
Если я загружаю руками документ то получаю в консоли POST запрос на

https://testDomain.bpmonline.com/0/rest/FileApiService/Upload?fileapi14996709535744&totalFileLength=47386&fileId=file_id&mimeType=application%2Fpdf&columnName=Data&fileName=20846491.pdf&parentColumnName=Document&parentColumnValue=parent_document_value&entitySchemaName=DocumentFile

И также интересно как в JS получить текущий entitySchemaName?

Нравится

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

Сформируйте аналогичный запрос со значениями колонок в url, и с данными файла в теле запроса средствами js.
Ответ на второй вопрос:

"Максим Шевченко" написал:file_id

Спаибо за Ваш ответ
Но в url есть значение file_id откуда мне его взять если файл еще не создан?

"Nickstery" написал:Но в url есть значение file_id откуда мне его взять если файл еще не создан?

Это просто новый рандомный гуид по которому далее файл можно будет получить, создать новый гуид можно следующим образом:
https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascri…

"Максим Шевченко" написал:
Nickstery пишет:

Но в url есть значение file_id откуда мне его взять если файл еще не создан?

Это просто новый рандомный гуид по которому далее файл можно будет получить, создать новый гуид можно следующим образом:

https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript

С формированием параметра понятно
Каким образом отправлять контент файла в теле запроса, это form-data по ключу определенному или передаеться как binary data?
Если я формирую запрос в Postman (приложение для отправки запросов) как приведено ниже

http://joxi.ru/V2VKJBwuxeDROA

Я получаю следующий ответ:

http://joxi.ru/L21bq0kh8Jx3dA

Есть где-то дока какой ендпоинт/модуль какие есть методы, и какие поля нужно отправлять что бы загрузить документ?
Не совсем понятно каким образом проиходит передача самого документа

Я набросал кусок кода, который получает контент файла, формирует BLOB и пытаеться отправить его на FilApiService Только я получаю ту же ошибку

window.console.log("Try to grab the file content");
var http = new XMLHttpRequest();
http.open("get", "https://b981fab7.ngrok.io/getPDF", true);
http.responseType = "arraybuffer";
http.onload = function(e) {
    if (this.status === 200) {
        var uInt8Array = new Uint8Array(this.response);
        var i = uInt8Array.length;
        var binaryString = new Array(i);
        while (i--)
        {
             binaryString[i] = String.fromCharCode(uInt8Array[i]);
         }
        var data = binaryString.join("");
 
        var http2 = new XMLHttpRequest();
        http2.open("post", "/0/rest/FileApiService/Upload?fileapi14998570381414&totalFileLength=47386&" +
        "fileId=*****&mimeType=application/pdf&columnName=Data" +
        "&fileName=20846491.pdf&parentColumnName=Document" +
        "&parentColumnValue=***&entitySchemaName=DocumentFile", true);
        http2.onload = function(e) {
             window.console.log("UPLOAD FILE OPERATION DONE");
             window.console.log(e);
        };
        http2.send(new Blob([data]));
 
        }
    };
http.send();

Разобрался:
Суть в том что при расширении FileDatailV2 (логично) мы унаследуем и методы оринильного модуля.
Можно не использовать FileApiService и не генерировать 100500 параметров а просто обойтись готовым решением, как это делает аплоад документа юзер, который находится в CRM.
Достаточно использовать FileDetailV2 -> onFileSelect метод и из строчного контента сгенерировать window.File
Пример как я это реализовал ниже:

window.console.log("Try to grab the file content");
var http = new XMLHttpRequest();
http.open("get", "https://b981fab7.ngrok.io/getPDF", true);
http.responseType = "blob";
var parent = this;
http.onload = function(e) {
    if (http.readyState === 4) {
    var blob = http.response;
    parent.onFileSelect([new window.File([blob], "UPLOADED.pdf")]);
    }
};
http.send();

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

У меня задача как раз стоит чтобы загрузить файл, но не из интерфейса приложения, а сторонним приложением. И мне необходимо использовать FileApiService. Как правильно им пользоваться? Может кто нибудь показать рабочий пример кода?

Руслан, пример есть здесь, а увидеть, какие запросы отправляются сервису можно в Fiddler и подобных инструментах.

Установил фидлер и при включенном захвате трафика выходит такая ошибка:

Зато удалось в консоли разработчика увидеть запрос отправленный на сервер:

https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…

При попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку: 

400 Bad request

Может, что-то не то с заголовками или content type содержимого, не знаю.  А если прямо в браузере отловить?

Отловил запрос прямо в браузере, вот:

https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…

Но при попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку: 

400 Bad request

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

Зверев Александр,

Так в том и вопрос, какой он нормально работающий запрос. Я ни как не могу его найти. Могли бы вы предоставить пример рабочего запроса? Буду очень признателен.

Нормальный запрос идёт из браузера при добавлении файла на деталь. Но Вы, видимо, его и так уже видели:

Request URL: https://0987561-se-m-se-demo.creatio.com/0/rest/FileApiService/Upload?fileapi16068281951725&amp;totalFileLength=42738&amp;fileId=0015222a-e192-4e2d-a305-7029653b76eb&amp;mimeType=image%2Fpng&amp;columnName=Data&amp;fileName=test.png&amp;parentColumnName=Contact&amp;parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&amp;entitySchemaName=ContactFile
Request Method: POST
Status Code: 200 
Remote Address: 40.91.213.136:443
Referrer Policy: strict-origin-when-cross-origin
cache-control: private
content-type: application/json; charset=utf-8
date: Tue, 01 Dec 2020 13:16:21 GMT
server: Microsoft-IIS/10.0
status: 200
x-aspnet-version: 4.0.30319
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-powered-by: ASP.NET
:authority: 0987561-se-m-se-demo.creatio.com
:method: POST
:path: /0/rest/FileApiService/Upload?fileapi16068281951725&amp;totalFileLength=42738&amp;fileId=0015222a-e192-4e2d-a305-7029653b76eb&amp;mimeType=image%2Fpng&amp;columnName=Data&amp;fileName=test.png&amp;parentColumnName=Contact&amp;parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&amp;entitySchemaName=ContactFile
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,uk;q=0.8,ru;q=0.7
bpmcsrf
content-disposition: attachment; filename=test.png
content-length: 42738
content-range: bytes 0-42737/42738
content-type: image/png
cookie: BPMSESSIONID=oq1w3q0l1yhedqm43aayja1a; _ga=GA1.2.656850260.1571905584; UserName=83|117|112|101|114|118|105|115|111|114; BPMLOADER=ytih30doaflbq4opdaauindd; _gid=GA1.2.1302014581.1606819455; .ASPXAUTH=0008CA5627819C22386A7FD7673D990C515D14E16AAA7C3E962C321AD5B73C8A2E390A6A6F5AE4DDD258B39ED90AE52BB05619534187DF76BBB1D1FF11B042E75619D72724CFE8E56619EEA9AC684DD352340A7212E60D621B3347E1116DE823140E48AE7FF68CE26734B92A9535C2C69D4BF9A6DE071595ECA44536D4EDF49958CBE863D46ABF8E86B2BAB87496310E5A25A03B4037A458240E6FAB1DFA93DE265821214B9C08D57C5CF3D2376E197C94AC1CF59BE9DA24BE2415465689C40BB1306488AB986D58ADCA8764F99566A0BCBB108248B7FB62678B541F509BC80525781C299A0A5FE2EB0F6997868942D0BD146D40C89B36E12CC760D7C05709175E01F26E6B67BF67846BE78BFE1E583A830ACFFF907A58B713DED3C10FC4E422C74DF27E792BADD1138259551A290978A88414B1CDC15E000D4A44B70BD9E296B74C0601BD3DDD315F2722EC95987F77427E73EB062C147611AD43A0DEE6B967AB07C932
origin: https://0987561-se-m-se-demo.creatio.com
referer: https://0987561-se-m-se-demo.creatio.com/0/Nui/ViewModule.aspx
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
x-requested-with: XMLHttpRequest
fileapi16068281951725: 
totalFileLength: 42738
fileId: 0015222a-e192-4e2d-a305-7029653b76eb
mimeType: image%2Fpng
columnName: Data
fileName: test.png
parentColumnName: Contact
parentColumnValue: eba7839a-6dff-430f-8325-fb8e02546348
entitySchemaName: ContactFile
‰PNG

 
IHDRТA7fœsRGB®ÎégAMA±üa

 

Если его, то видел. Но повторить и выполнить самому, для начала из POSTMAN, ни как не получается из-за ошибки 400 Bad request.

Руслан, можно в Fiddler сравнить все заголовки правильного и неправильного запросов, может чего-то не хватать.

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

Hello colleagues,

Usually we setup procedure, that automatically imports currency rates from bank.
I share the procedure for currency rates import from http://cbr.ru/ (http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx). Implemented call to the web service method GetCursOnDate.
Clr procedure is run at the MS SQL database level. There is no need to run Terrasoft application for such import.

For installing it You should do these steps:
1. Copy ClrBPMAExchangeRatesRU.dll and ClrBPMAExchangeRatesRU.XmlSerializers.dll to the MS SQL database server. (In the example the path is used: D:\BPMSolutions\Integrations\ExchangeRatesRU\)
2. Run scripts, located in the RecreateProcedures.sql file. Note: Check Microsoft documentation and make sure, these configuration changes will not affect Your DB negative.
3. Load TS service tbl_ExchangeRatesTmp.xml
4. Run bsp_ImportCurrencyRatesRU.sql for creating stored procedure, that imports data to Terrasoft currency table. You can modify it by Your needs.
5. Use ImportCurrencyRatesTask.sql and ImportCurrencyRatesTask.bat to setup MS Windows scheduled task for running the procedure or run it as database job.
All files ar attached: importcurrencyratesru.zip.

Solution is tested in TS 3.3.2, but can easy be modified for TS 3.4.0.

Нравится

Поделиться

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

Добрый день!

Подскажите, пожалуйста, как можно из дампа БД Oracle восстановить одну таблицу? Команда imp tables="tbl_TaskGroup" не проходит, говорит что таблица TBL_TASKGROUP не найдена. Я понимаю что Оракл криво работает с объектами в названии которых присутствуют не только прописные буквы. Но как есть, так есть. Есть ли выход из сложившейся ситуации кроме полного импорта?

Нравится

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

Попробуйте взять в скобки
imp tables=("tbl_TaskGroup")

К сожалению, не помогло. Еще есть варианты?

Есть решение.
Попробуйте это :wink:
imp tables=\"\""\""tbl_TaskGroup\""\""\""

Мощно! Спасибо, помогло. Один и два раза \" использовать пытался

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

Смысла вести дневник обо всем на свете особого не видел.
Но теперь, есть что имеет смысл выложить.
При импорте пользователя из АД в контакт копирутся его почта.

1. Необходимо выяснить ID типа средства связи для почты делается это запросом в SQL

SELECT ID
FROM tbl_CommunicationType
WHERE Name = 'E-mail'

2. Необходимо, на сервере разрешить выполнять команды с OpenRowset.

3. Изменить scr_DomainUsersUtils следующим образом:
После

ContactsDataset.Values('Name') = UserFullName;

Добавляется

ContactsDataset.Values('Communication1TypeID') = '{EmailID}';
ContactsDataset.Values('Communication1') = GetDomainContactMail(UserFullName);

Где EmailID - ID типа средства связи.

4. Добавить в scr_DomainUsersUtils следующую функцию:

function GetDomainContactMail(ContactName) {
         var Info = new ActiveXObject('ADSystemInfo');
         var Parameters = CreateSPParameters();
         var Email = CreateSPParameter(Parameters, 'Email', pdtGUID, '');
         Email.ParamType = 1;        
         var ComputerName = Info.ComputerName;
         var Index = ComputerName.match('DC').index;
         var Domain = ComputerName.substr(Index,ComputerName.length-1);
         var SQLCommand = 'select :Email = mail from OpenRowset(\'ADSDSOObject\' ';
         SQLCommand = SQLCommand + ',\'\',\'\/\/'+ Domain + '>;';
         SQLCommand = SQLCommand + '(objectCategory=Person);name,mail\')';
         SQLCommand = SQLCommand + ' where Name = \'' + ContactName + '\'';
         Connector.DBEngine.ExecuteCustomSQL(SQLCommand,Parameters);
         return Email.Value;
}

Нравится

Поделиться

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