Вопрос

Сущности в системе идентифицируются Guid. который, будучи преобразованным в строку, имеет вид типа "846d8d33-004b-4a3e-b778-10cfd163f3bb" (буквы строчные, в таком виде он фигурирует, например, в параметрах запросов http)

С другой стороны в БД сущности хранятся с первичным ключем, построенным на id varchar2(38), но содержиное там заключено в фигурные скобки и буквы заглавные.

Есть ли стандартная функция преобразования одного в другое? В запрос нужно передать Id текущего контакта, но "{"+UserConnection.CurrentUser.ContactId.ToUpper()+"}" выглядит достаточно неуклюже.

У меня такой же вопрос

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

Могу предложить "элегантный костыль":
string contact = "846d8d33-004b-4a3e-b778-10cfd163f3bb";
string result = String.Join(String.Empty, "{", contact.ToUpper(), "}");

Если используете механизмы EntityShchemaQuery или Select/Insert/Update/Delete, то ничего преобразовывать не нужно, в функции передаётся переменная типа Guid и при генерации SQL в нужном формате подставится само. Если же самостоятельно создаёте SQL, воспользуйтесь своим кодом или советом выше.

Эелегантность костыля в виде сокращения записи обращения к переменной иррелевантна задаче :)

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

Причина в том, что основная поддерживаемая база  — MS SQL, где есть тип «uniqueidentifier» и база поймёт вставку в любом формате. А поддержка Oracle добавлена опционально.

В этом и была суть вопроса: если в Oracle используется просто текст, какая разница, что туда писать? Зачем эти скобочки? Чтобы что-то в базе посмотреть, скопировать Id из URL не получится, это минус. Как и при склеивании ESQ и Select. А плюсы вообще есть?

Этот текст, хоть и не является отдельным типом «uniqueidentifier», но служит в качестве первичного или внешнего ключа. Соответственно, если писать в двух полях один GUID разным способом, связи между ними не получится.

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

В каких 2-х полях??? Почему не писать ОДНИМ способом, в нижнем регистре и без скобок? Везде.

В версии для MS SQL пишите как вам нужно, а в Oracle — именно требуемым способом.

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

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

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

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

При обычной работе с форматом написания не сталкиваются никак, все C#-классы принимают значения типа Guid и преобразуют в нужный формат при генерации SQL автоматически. В чём именно негативное влияние фигурных скобок, Вы так и не объяснили. 

Вероятно, первоисточник именно такого написания — стандартная функция CreateGuid в Delphi, на котором была написана система Terrasoft 3.X. Она генерирует именно в таком формате. И в таблицу базы Firebird и Oracle, где нет встроенных типов для хранения GUID, так и записывали.

В Microsoft для C# рекомендуют для получения нужного формата использовать для переменной типа Guid метод ToString("N") в сочетании с String.ToUpper.

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

Выполняется интергация с другой системой. Нужно из трансферной таблицы которая находится в другой базе данных достать значения. Можно ли это сделать средствами BPM?

PS: БД Oracle Database 11g

У меня такой же вопрос

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

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

 

Все мощь .net (c#) к вашим услугам, вариантов подключения множетство. Наберите в гугле using C# without Oracle Client

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

 

Колодяжный Владислав Эдуардович,

так и решил сделать

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

Добрый день.

Нашли две ссылки на инструкции, которые отличаются довольно сильно:

https://academy.terrasoft.ru/documents/administration/7-12/nastroyka-gl…

https://academy.terrasoft.ru/documents/common/7-12/ustanovka-servisa-gl…

Начали настройку через docker. Хотелось бы получить подтверждение, что это рабочий вариант.

Также в ходе установки возникла ошибка при выполнении команды addSearch. Пишет что не может подключиться к серверу. При этом контейнеры es рабочие (проверено через docker ps -a). Через telnet можно подключиться к серверу по порту 9200. Причина ошибки непонятна.  Согласно инструкции в default-env в параметре GS_ES_URL нужно указывать IP-адрес сервера, на котором развернут docker (в нашем варианты все компоненты, Elastic, RabbitMQ, MySQL развернуты через docker). Так и настроено, но выдается ошибка при addSearch.

У меня такой же вопрос

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

Добрый день!

Для версии 7.11.2 и выше настройка выполняется через docker. Если проблема всё ещё сохраняется, создайте обращение в техническую поддержку. 

Как решили проблему?

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

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

BPM Online 7.12

СУБД Oracle 11g

Проблема в том, что большинство инструкций относятся к MS SQL. В Oracle просто не вижу большинство указанных хранимых процедур. Плюс просто не вижу раздела "Правила поиска дубликатов" в Дизайнере системы. Не вижу в БД процедур типа "tsp_FindAccountDuplicateByName", процедура tsp_FindAccountSimilarRecords есть, но там пустышка.

Если я правильно понял, то глобальный поиск дубликатов пока недоступен для Oracle. Нужно хотя бы настроить локальный поиск дубликатов. 

Изменение пакета tspkg_DuplicatesSearch (функции fn_GetAccountDuplicates и процедуры tsp_SearchForAccountDuplicates) результата не дало. 

Вторая проблема: в стандарте вижу, что дубликат проверяется по Name(по крайней мере одно из правил) при изменении карточка контрагента. При создании нового контрагента эта же логика почему-то не работает и можно легко создать дубликаты.

У меня такой же вопрос

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

Проверка на дубли при сохранении через миникарточку появилась в 7.12.3. В версии 7.12.3 появился поиск дублей на основании правил для Oracle. В будущих релизах планируется массовая дедупликация для данной СУБД + пользовательская настройка правил + уже можно технически с версии 7.12.3 для новой дедупликации добавить новое правило. Инструкция тут.

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

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

Спасибо за информацию. Один уточняющий вопрос. У нас на DEV не настроен GlobalSearch (BPM развернут on-site). Однако дедубликация по name срабатывает. Как это может быть?

Видимо, это предыдущая версия, без глобального поиска. Новый то добавили только в 7.12.3:

Для БД Oracle, появилась возможность поиска дублей лидов, а также локального поиска дублей контактов и контрагентов при сохранении. Базовый набор правил поиска можно включать по ссылке “Правила поиска дублей” в дизайнере системы. Для работы поиска дублей на Oracle необходимо настроить глобальный поиск и включить функциональность “ESDeduplication”.

Добрый день. Апдейт на 7.12.3 провели. Global Serach и ESDeduplication включили, правило новое настроили. Видим, что оно работает корректно в миникарточке.

НО при сохранении/изменении в обычной карточке поиск дублей не происходит. Этот функционал для Oracle еще не реализован?

P.S. Стандартные правила также не работают при сохранении/изменении через основную карточку.

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

Понятно. Спасибо

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

Здравствуйте! Пытался обновить верcию bpm'online bank customer jorney, с 7.11.0 до 7.11.1 (Oracle), после обновления попытался скомпилировать приложение, и в результате возник вот такой вот перечень ошибок, в результате чего могли возникнуть эти ошибки?

У меня такой же вопрос

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

Александр, здравствуйте!

Пришлите, пожалуйста, логи приложения за время обновления, по умолчанию хранятся по пути:C:\Windows\Temp\BPMonline\Site_Х.

Так же хочу уточнить, не было ли ошибок, при компиляции до обновления ? 

Maksym Naumovets,

До обновления ошибок не было, вот log 

https://yadi.sk/i/wpnUGfK23TKEiq

 

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

Не была выполнена генерация исходных кодов, компиляция, обновление структуры базы данных и т.д.

Попробуйте повторно выполнить обновление.

Maksym Naumovets,

"Utility finished working." разве не говорит о том, что утилита завершила свою работу?

.

Александр, говорит. Но не говорит что все было выполнено успешно.

Произошла ошибка и утилита завершила работу.

Посмотрел выполненные шаги, нет генерации исходных кодов, компиляции и остальных что я описал.

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

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

При открытии страницы логина в bpm получаем сообщение: "Unable to find the requested .Net Framework Data Provider. It may not be installed."

Для исправления проблемы устанавливаем компонент [ODAC XCopy version], необходимой битности и версии.
В реестре создаться ветка из версией ODAC компонента. Пример для ветки [HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0]:

После чего необходимо скопировать полную версию компонента и установить это значение атрибуту [Oracle Data Provider for .NET] в файле web.config загрузчика. Пример:

Поделиться

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

Установка цвета для записи раздела происходит в функции grdDataOnGetRowDrawInfo сервиса scr_UsersGridArea.

Пользователь отображается серым цветом, только в том случае, если значение поле [IsInDatabase] источника данных ds_UserScript содержит enmNo.

Установка значения вычисляемого поля [IsInDatabase] происходит в событии OnDatasetCalcFields источника данных ds_UserScript:

     var SQLObjectName = GetDatasetFieldValue(Dataset, 'SQLObjectName');
     if (IsEmptyValue(SQLObjectName)) {
        return;
    }
    var IsInDatabase = Connector.DBEngine.GetIsUserExists(SQLObjectName);
    if (IsInDatabase) {
        Dataset.Values('IsInDatabase') = enmYes;
    } else {
        Dataset.Values('IsInDatabase') = enmNo;
    }

Функция ядра Connector.DBEngine.GetIsUserExists(SQLObjectName) возвращает true, только при условии, что sql запрос вернет значение равное 1:

SQL:

SELECT count(*) FROM [sysusers] WHERE [name] = 'LoginName' AND [issqlrole] = 0

Oracle:

SELECT COUNT(*) AS CNT FROM ALL_USERS  WHERE UPPER(USERNAME) = (SELECT UPPER("tbl_AdminUnit"."SQLObjectName")as NM FROM "tbl_AdminUnit" WHERE "tbl_AdminUnit"."SQLObjectName"  = 'LoginName');

где LoginName - логин пользователя на сервере

Примечание
Если sql запрос в orcale вернул значение больше 1, необходимо проверить параметры сессии (скорей всего не учитывается регистр в условии):
NLS_COMP
NLS_SORT

Регистр не учитывается:
NLS_COMP=ANSI;
NLS_SORT=BINARY_CI;

Регистр учитывается:
NLS_COMP=BINARY;
NLS_SORT=RUSSIAN;

Установить параметры сессии можно таким запросом:

ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=RUSSIAN;

Поделиться

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

Коллеги, здравствуйте!

Посоветуйте оптимальный вариант интеграции (двусторонний обмен) BPMonline onsite со сторонней СУБД MS SQL / Oracle?

Если правильно понимаю, варианты:
1. BPM-oData / промежуточный шлюз / СУБД
2. BPM-СУБД / СУБД

Очень важно определить "подводные камни" (работа по процессам BPM, отказоустойчивость)

У меня такой же вопрос

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

В данном случае возможны оба варианта, но, на мой взгляд, более приемлемым является вариант через Odata, так как в варианте с СУБД-СУБД могут сильно отличаться модели данных. Более подробную информацию о возможностях интеграции платформы bpm`online через Odata можете узнать на нашем ресурсе http://academy.terrasoft.ru/documents/?/docs/technic/SDK/7.6.0/webtoc.h…

"Адасюк Валерий Викторович" написал:на нашем ресурсе

Валерий, спасибо, только не открывается страничка (открывается общее содержание)

Дмитрий, путь перехода к нужному разделу следующий
SDK bpm`online>Рекомендуемые средства интеграции>OData

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

Здравствуйте.
Проблема в синхронизации BPM на MS SQL Server c Oracle.
Как известно в Oracle пустая строка '' и null эквиваленты. При переносе данных в BPM, значения с null нужно преобразовывать т.к. в BPM cтроковые типы, на уровне БД, автоматически создаются с параметром not null.
Такие манипуляции с данными существенно замедляют синхронизацию, к тому же в Oracle пустые строки не проставишь.

Есть ли способ в BPM обойти вышеупомянутую неприятность? В объекте ничего похожего не нашел.

У меня такой же вопрос

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

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

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

Стандартными средствами базовой конфигурации приложения BPMonline , такой возможности нет. Но, насколько я понял задачу, то Вы пытаетесь перенести данные из Oracle в MS SQL. Действительно, при выполнении простой выборки из Oracle можно получить пустое значение. Но для того чтобы потом выполнить инсерт с этими данными в SQL, нужно приводить пустое значение в строку вида ' ', которая будет восприниматься в SQL. Например:

Select NVL(Description, ' ') from AccountCategory

То есть Вам необходимо воспользоваться nvl function in oracle

Здравствуйте, Сергей!

Тогда уже лучше использовать IsNull на уровне MS SQL Server, чем оттуда же использовать openquery с NVL.
Плюс на уровне SQL вставлять можно будет пустые строки, а не пробелы.
Вообщем костылей много, но все они замедляют обмен данными, а скорость очень критична.

А что насчет нестандартных средств? Или оно того не стоит?

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

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

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

Вниманию предлагается скрипт на Oracle SQL для генерации около 3 млн уникальных ФИО. Его можно использовать как для получения единичных записей, так и для вставки посредством INSERT SELECT всего массива. Результат работы скрипта может пригодиться для тестирования БД на больших объёмах данных или как "рыба" для демонстрационных версий программы.

Пример кода, генерирующий 27 записей:

 

SELECT "Name1". "Text" AS "Surname", "Name2". "Text" AS "FirstName", "Name3". "Text" AS "Patronymic", "Name1". "Text"||' '||"Name2". "Text"||' '||"Name3". "Text" AS "Name"  FROM
(
SELECT "Text" ,  "Row"  FROM
(
SELECT 'Иванов' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
UNION SELECT 'Петров' AS "Text" ,  rownum AS "Row"  FROM "tbl_DatabaseInfo"
UNION SELECT 'Сидоров' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
 )
ORDER BY dbms_random.value
)  "Name1"

INNER JOIN

(
SELECT "Text" ,  "Row"  FROM
(
SELECT 'Иван' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
UNION SELECT 'Пётр' AS "Text" ,  rownum AS "Row"  FROM "tbl_DatabaseInfo"
UNION SELECT 'Сидор' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
 )
ORDER BY dbms_random.value
)  "Name2"

ON  "Name2"."Row" =  "Name1"."Row"

INNER JOIN

(
SELECT "Text" ,  "Row"  FROM
(
SELECT 'Иванович' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
UNION SELECT 'Петрович' AS "Text" ,  rownum AS "Row"  FROM "tbl_DatabaseInfo"
UNION SELECT 'Сидорович' AS "Text" ,  rownum AS "Row" FROM "tbl_DatabaseInfo"
)
ORDER BY dbms_random.value
)  "Name3"

ON  "Name3"."Row" =  "Name1"."Row"

-- where  rownum = 1

 

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

 

WHERE  rownum <= 10

 

Во вложении - полная версия, включающая 251 наиболее популярную русскую фамилию, 113 мужских и 118 женских имён и 53 отчества.

Кроме того, для реалистичности стоит учесть частотность имён, ведь Александров и Сергеев больше, чем Фролов и Илларионов. Имена в скрипте расположены начиная с более популярных, поэтому достаточно скопировать в коде начало списка несколько раз.

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать