Добрый день!

Подскажите, как лучше выполнить импорт данных из Access. Кроме обычных данных, таблицы содержат BLOB-поля. Каким образом их лучше всего перенести в bpm'online?

Спасибо!

Нравится

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

Если у Вас on-site, то можно в SQL Management Studio подключиться к Access как к linked-серверу и перенести данные SQL-запросами.

Владимир,

В случае наличия в Access только обычных данных, достаточно выполнить экспорт в MS Excel и последующих пользовательский импорт из MS Excel в bpm'online.
Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

"Бондарь Наталия" написал:Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

А если это on-demand, то можно подключиться к СУБД через какой-нибудь VPN или еще как?

"Владимир Соколов" написал:
Бондарь Наталия пишет:

Если есть BLOB, тогда нужно переносить данные через интеграцию средствами СУБД либо по ODATA.

А если это on-demand, то можно подключиться к СУБД через какой-нибудь VPN или еще как?

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

Можно залить данные в свою базу с копией таблиц боевой базы с идентичной структурой. А потом передать её и попросить перенести, приложив SQL-запросы с Insert-Select по этим таблицам.

"Зверев Александр" написал:Можно залить данные в свою базу с копией таблиц боевой базы с идентичной структурой. А потом передать её и попросить перенести, приложив SQL-запросы с Insert-Select по этим таблицам

Да, при первоначальном импорте так и поступим - попросим базу, проимпортируем, вернем обратно. Спасибо за помощь!

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

Доброго дня.
Столкнулся с проблемой:
Необходимо перегнать значения из строкового поля в blob поле, но при запуске скрипта выдает ошибку
"Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом"

function Main()
{  
        var TaskDataset = Services.GetNewItemByUSI('ds_Task');
        EnableDatasetFilters(TaskDataset, false);
        var ID = '{332C64BC-245B-4A08-B345-C392F4A8FCFF}';
        ApplyDatasetFilter(TaskDataset, 'ID', ID, true);
        TaskDataset.Open();
        while(!TaskDataset.IsEOF)
        {
                var Detalization = TaskDataset('Detalization');
                var Stream = new ActiveXObject('ADODB.Stream');
                Stream.CharSet = 'windows-1251';
                Stream.Mode = 3;        
                Stream.Type = 2;
                Stream.Open(Detalization);
                var Field = TaskDataset.DataFields.ItemsByName('DetalizationRich');
                Field.SetValAsBlob(Stream);
                Stream.Close();        
                TaskDataset.GotoNext();        
        }      
        TaskDataset.Post();
        TaskDataset.Close();
}

В чем может быть проблема? Заранее спасибо

Нравится

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

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

Сообщение говорит, что не правильно открываете Stream.

Пример записи значения поля [ФИО] Контакта на деталь [Описание] раздела Контакты:

	var ID = '{251FB9AC-C17E-4DF7-A0CB-D591FDB97462}';
 
	var ContactDataset = Services.GetNewItemByUSI('ds_Contact');
	EnableDatasetFilters(ContactDataset, false);    
    ApplyDatasetFilter(ContactDataset, 'ID', ID, true);
    ContactDataset.Open();
 
    var DescriptionDataset = Services.GetNewItemByUSI('ds_Description');
	ApplyDatasetFilter(ContactDataset, 'ID', ID, true);
 
	var SubjectSelectQuery = ContactDataset.SelectQuery;
	var DetailSelectQuery = DescriptionDataset.SelectQuery;
	var FromTable = SubjectSelectQuery.Items(0).FromTable;
	DetailSelectQuery.Items(0).FromTable = FromTable;
	DescriptionDataset.Open(); 
 
    var FieldName = ContactDataset.DataFields.ItemsByName('Name');
    var FieldDescription = DescriptionDataset.DataFields.ItemsByName('Description');
 
 
    var Stream = new ActiveXObject('ADODB.Stream');
	Stream.CharSet = 'windows-1251';
    Stream.Mode = 3;
    Stream.Type = 2;
	Stream.Open();
    Stream.Position = 0;
    Stream.WriteText(FieldName.Value); 
 
    DescriptionDataset.Edit();
    FieldDescription.SetValAsBlob(Stream);
    Stream.Close();
    DescriptionDataset.Post();
 
    DescriptionDataset.Close();
    ContactDataset.Close();

Результат:

Cпасибо большое!
Теперь все работает, правда если я хочу перегнать все записи, то выдает ошибку "Out of memory"
Можно с этим как то бороться?

Попробуйте вызывать функцию CollectGarbage(0.001);
Выполняйте Post() в цикле, а также создание Strem-а вне цикла.

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

Добрый день!

Никто не сталкивался с такой проблемой:
Есть хранимая процедура, которая возвращает в параметре XML и BLOB (в примере сделано так, что возвращает varbinary)
Есть примерно такой код:

var Parameters = System.CreateObject('TSObjectLibrary.Parameters');
CreateSPParameter(Parameters, 'Result', pdtBlob, null);
Parameters.ItemsByName('Result').ParamType = 1; //Output
Connector.DBEngine.ExecuteCustomSQL("exec dbo.MySP '2012-01-01','2014-01-01', :Result OUTPUT", Parameters);
var BlobStream = GetBlobStream();
BlobStream.Open();
try {
Parameters.ItemsByName('Result').GetValAsBlob(BlobStream);
} finally {
BlobStream.Close();//В BlobStream Ничего нет
}

var Result = Parameters.ItemsByName('Result').Value;//=== null

Как мне вернуть значение параметра? На БД запрос выполняется и возвращает результат.
Спасибо!

Нравится

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

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

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

komgbu, а параметр создается?
Попробуйте создавать параметры так
Посмотрите в режиме отладки что возвращает строка
Parameters.ItemsByName('Result').GetValAsBlob(BlobStream);

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

Здравствуйте У меня проблемы с выводом текста, который храниться в BLOB, в FastReport. В RichDataControl ничего не отображается. Так же пробовал получить текст из blob\'а как описано здесь https://community.terrasoft.ru/blogs/8544 , но выбрасывает ошибку(скрин в комментарии к статье). До события OnDatasetCalcFields не доходит, устанавливал debugger в начало обработчика.

Нравится

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

Проблема решена. Был неправильно привязан MasterData. Спасибо тех. помощи. В версии, которую я использовал, 3.4.0 "вытаскивать" текст из blob'а в отдельное вычисляемое поле, все корректно отображается в RichDataControl.

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

Недавно появилась задача отобразить в отчете FastReport содержимое BLOB поля, которое заполняется в MemoDataControl.
Оказалось это задача требует определенных преобразований. Опишу алгоритм реализации на примере добавления в отчет поля «Детальное решение» из карточки [Инцидент].
Последовательность действий:
1. Открыть датасет отчета. Добавить вычисляемое поле с типом строка. Указать название, например, Solution:
/system/files/1_92.png
2. Создать обработчик события OnDatasetCalcFields:
/system/files/2_53.png
В теле функции обработки события необходимо прописать код:

var Stream = new ActiveXObject("ADODB.Stream");
        Stream.Open();
        Stream.Type = 2;
        var DataField = Dataset.DataFields('DetailedSolution');
        DataField.GetValAsBlob(Stream);
        Stream.Position = 0;
        var Text = Stream.ReadText();
        Stream.Close();
        Dataset.ValAsStr('Solution') = Text;

Где 'DetailedSolution' - BLOB поле, 'Solution' – вычисляемое поле.

/system/files/3_27.png

3. Отрыть сервис отчета. Добавить Text Object, связать его с вычисляемым полем:
/system/files/4_16.png
4. Сохранить изменения. Проверить работу отчета.

Нравится

Поделиться

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

Пригодилось решение. Спасибо, Наталия.

Сделал все как описано, но вылетает ошибка:
Ошибка
В чем может быть проблема?
Terrasoft CRM_v3.4.0.130

Ошибка устранена в ходе сеанса удаленного доступа. Причина ошибки: был добавлен компонент MasterData с привязкой к одному датасету, а поле внутри MasterData обращалось к другому датасету.

"Бондарь Наталия" написал:

Ошибка устранена в ходе сеанса удаленного доступа. Причина ошибки: был добавлен компонент MasterData с привязкой к одному датасету, а поле внутри MasterData обращалось к другому датасету.


Спасибо за помощь :)

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

Выгрузить XML-содержимое из базы данных в лог можно следующим образом:

DECLARE @tmp varchar(8000);

SELECT @tmp = cast(substring(QueryData, 1, 8000) AS varchar(8000)) FROM tbl_Query WHERE Name = 'Динамика резервирования'

PRINT @tmp

Когда это может быть полезно?

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

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

Нравится

Поделиться

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

Следует отметить, что для получения содержимого сервисов (таблиц, запросов, датасетов и т.д) в виде XML в версиях 3.3.2 и 3.4 этот способ не подходит: они хранятся сжатыми. В 3.3.1 и более ранних - ещё работает.

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

Добрый день.

Подскажите, как можно реализовать такую функциональность:

Я создал подраздел "Заметки", , который состоит из названия и текст заметки в формате RTF (отображается в виде RichDataControl)

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

Я подключил поле типа BLOB (RichDataControl). Если я ввожу ее в карточке, то работает ввод, но как это сделать в реестре - не могу найти. В самом реестре введенное значение сохраняется, но теряется после ввода.

Я сделал это через MemoControl - т.е запись в MemoControl.Value при событии DataGridOnSelectionChange в реестре и запись в Dataset при событии mmNoteBodyOnExit в MemoControl, такой подход работает. Но после замены MemoControl на RichDataControl запись в свойство Value выдает ошибку "Обьект не поддерживает это свойство или метод"

Прошу вашей помощи

Нравится

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

Дмитрий, почему не использовать для внесения и отображения текста заметок отдельный WindowContainer с окном wnd_Description (аналогично детали [Описание]). Во вложении прилагаю набор модифицированных сервисов. Ознакомьтесь с вариантом решения.

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

Здравствуйте, уважаемые коллеги!

Столкнулся с ситуацией: требуется вставить в ImageDataСontrol на карточке картинку из буфера обмена. Не важно, напрямую или через временный файл. Я испытал три различных способа, но все три - безуспешно:

http://community.terrasoft.ua/blogs/6286

Подскажите, пожалуйста, где я ошибся; возможно, кто-то уже решил подобную задачу. Версия 3.2.1.58

Нравится

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

Судя по Вашему блогу, данные в датасет записались. А если попробовать переприсвоить DataField для контрола картинки?

edtScreenShot.DataField = System.EmptyValue;
edtScreenShot.DataField = Dataset.DataFields('ScreenShot');

Идея интересная, только, конечно, не датафилд обратить в Null, а просто поле отключить-подключить. Вот так:

edtScreenShot.DataFieldName = '';
edtScreenShot.DataFieldName = 'ScreenShot';

Но толку никакого. Мне кажется, что картинка не отрисовывается не из-за отсутствия данных, а именно из-за того, что двоичный Stream не содержит правильного заголовка картинки. Контрол просто не знает, что от него ожидают. Сунули, мол, каких-то каракатиц, а к чему они - неизвестно.

По идее, все дело в том, как сохраняется в буфер обмена само изображение. Думаю, нужно ждать совета разработчиков ядра, которые бы объяснили происходящее с точки зрения контрола.

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

Здравствуйте, уважаемые коллеги!

Столкнулся с ситуацией: требовалось вставить в ImageDataСontrol на карточке картинку из буфера обмена. К примеру, нажал пользователь PrintScreen, щёлкнул на карточке кнопку, картинка и вставилась. Казалось бы, чего проще... А не тут-то было!

Самый очевидный способ не сработал. Пишет в ответ: "Разрушительный сбой":

var Stream = System.CopyClipboardToStream();
edtScreenShot.DataField.SetValAsBlob(Stream);

Stream этот какой-то странный, ни свойств, ни методов, просто кусок двоичного кода. Я этот код увидел, когда сделал так:

System.StreamToMime(Stream);

На восемь мегабайт каракатиц. Но где наша не пропадала! Есть ведь путь посложнее, взять ImageList, и через Image прочитать картинку из Stream, сохранить в файл, а потом этот файл автоматически открыть методом поля типа Blob.

Написал так:

var Stream = System.CopyClipboardToStream();
var ImageList = Services.CreateItem('ImageList');  
var Image = ImageList.CreateImage();
Image.ImageType = 1;
Image.LoadFromStream(Stream);
Image.SaveToFile('c:\Temp.bmp');

Система всё это лихо выполнила, ни разу не кашлянула. Но файл получился нулевой длины. Так что вставлять в Blob после этой операции уже было нечего...

Наконец (верно от отчаяния) я решил подсунуть вместо этого таинственного Stream известный и понятный ADODB.Stream. Только как бы в него засунуть то, что в буфере обмена? Я написал такое:

var Stream = System.CopyClipboardToStream();
var Mime = System.StreamToMime(Stream);
var ADODBStream = new ActiveXObject('ADODB.Stream');
ADODBStream.Mode = 3;//Кстати, кто знает, что означают эти числа?
ADODBStream.Type = 1;//Расскажите, а то я просто скопировал из другого примера...
ADODBStream.Open();
System.MimeToStream(Mime, ADODBStream);
ADODBStream.SaveToFile('c:\Temp1.bmp');

Способ сработал, все весемь мегабайт каракатиц выгрузились в Temp1.bmp, только файл был не в формате BMP, а именно в виде строки Mime. Естественно, картинку прочитать невозможно.

Итак, у меня ничего не получилось. Но, может быть, я просто пошёл неправильным путём? Кто подскажет, вдруг эта задача уже решалась? Кто что знает о сохранении картинок из буфера обмена, либо об их вставке в Blob-поле? Использовал версию 3.2.1.58.

Нравится

Поделиться

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

"Будак Анатолий Васильевич" написал:Пишет в ответ: "Разрушительный сбой":

Анатолий, а вы уверены что контрол подключен к DataSet, в корректном состоянии?

Спасибо, Саша, что обратили моё внимание на этот момент! Действительно, здесь стоит посмотреть внимательно. Вот, что я выяснил. Если ставить в контроле по умолчанию ImageType = itBMP, то сообщение о разрушительном сбое пропадает. Его нет и при использовании itJPG (хотя скриншот явно не в виде jpg попадает в Stream). Сообщение о разрушительном сбое бывает только при itPNG. Однако вставки картинки всё равно не происходит, хотя сообщение об ошибке я убрал, принудительно устанавливая ему itBMP перед вставкой. Так что мы на правильном пути!

Датасет, по-видимому, подключен корректно. Рядом с кнопкой "Вставить из буфера" размещена кнопка "Вставить из файла". Там стоит такая конструкция для того же поля того же датасета:

edtScreenShot.DataField.LoadFromFile(FilePath);

Работает безупречно, картинка загружается.

Но ни в чём нельзя быть уверенным до конца. С моим-то склерозом :) Для эксперимента попробовал и такое обращение:

var Dataset = dlData.Dataset;
Dataset.DataFields('ScreenShot').LoadFromFile(FilePath);

Тоже отлично работает.

Ну, и чем чёрт не шутит:

var Dataset = dlData.Dataset;
var Stream = System.CopyClipboardToStream();
Dataset.DataFields('ScreenShot').SetValAsBlob(Stream);

Увы, хоть сообщения об ошибке нет, картинка не видна...

Однако самое поразительное - вот что! Хоть картинки в контроле и не видно, если сделать

Dataset.DataFields('ScreenShot').SaveToFile('c:\Test3.bmp');

то по указанному пути появится восьмимегабайтный файл, со структурой, похожей на bmp (куча каракатиц стройными рядами), но без характерного bmp-заголовка. Который, увы, ни одна графическая программа не считает bmp-файлом. Удивительно ещё и то, что запись сохраняется, и в blob двоичные данные попадают, это видно как в таблице, так и при открытии карточки (ощутимо замедленном из-за такого объёма картинки). Но саму картинку по-прежнему не видно.

Мне кажется, что добавив в Stream правильный заголовок bmp проблема бы решилась. Он явно идёт без него, хотя структура bmp-шная. Но как бы его добавить?

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

Здравствуйте, реально ли отобразить Blob поле в FastReport корректно? я пытаюсь отобразить такими элементами как Memo, RichText, но выводятся только каракули(

Нравится

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

Если в Blob картинка, то в отчете можно использовать Picture Object

К сожалению это текст..

В запрос добавил поле Description (типичный Blob), в датасет - строковое поле.
В отчет добавляем RichEdit - прекрасно отображается текст из Description...

Спасибо, Александр, буду пробовать!)

Николай, поле типа BLOB должно нормально отображаться в компоненте RichText object. Уточните Вашу версию Terrasoft.

Версия 3.3.1.67, у меня почему то не хочет в нем отобржать.

Только что проверил на Вашей версии, текст отображается корректно. Каким образом Вы отображаете значение в поле: указываете в нём [Dataset."FieldName"] или устанавливаете для контрола свойства DataSet и DataField? Попробуйте разные варианты, возможно, какой-то отобразит значение верно.

Спасибо, Олег, буду пробовать.

Та же проблема.
Пробовал по совету Олега отобразить Rich Text/Memo разными способами. Не помогло.
TS XRM 3.3.2.165, Oracle 11g

Вместо:
Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства.

Выводит:
яю(_8_@_>_:_0_O_

Здравствуйте Ринат
Данная проблема воспроизводится на всех компьютерах ?
Выводится не корректно только русский текст или английский тоже ?

Воспроизводил данную проблему на XRM 3.3.2.165. Проверял, добавив в sq_Account, поле Описание (Description), его же добавил в ds_Account. Далее отображал в отчете способом редактирования свойства RichTexBox'а DataField = "Description" . При этом вывод данных в FastReport был корректен.

Предлагаю вам написать на support@tscrm.com с пометкой "Для Алексея". Будем рассматривать вариант удаленного подключения для решения проблемы.

Алексей, спасибо, но я уже разобрался, подставив вместо типа данных BLOB - строку unicode.

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