Установка цвета для записи раздела происходит в функции 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 комментариев
Показать все комментарии

Настраивая механизм поиска дублей в проекте на Terrasoft 3.X, работающем на базе Oracle, для таблицы контактов получал ошибку при попытке объединить дубли. При автоматической генерации хранимых процедур для объединения дублей возникло несоответствие порядка двух полей в таблице, что и привело к проблемам. В сгенерированной серверной логике они были в одном порядке, а на стороне клиентского приложения они перебирались в другом. Поля назывались, для примера, Com1 и Communication.

При этом ошибка воспроизводилась, если поиск дублей настраивали из клиента Terrasoft на одном компьютере и не воспроизводилась, если настраивали на другом. К сожалению или к счастью, первым компьютером был мой.

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

 SELECT   column_name,
                 data_type,
                 data_precision,
                 data_scale,
                 char_length,
                 char_used
          FROM   all_tab_columns
         WHERE   table_name = 'tbl_Contact'
                 AND owner = SYS_CONTEXT ('USERENV', 'CURRENT_SCHEMA')
      ORDER BY   column_name;

На первый взгляд безобидная строка

ORDER BY column_name

сортирует различно в зависимости от локали на компьютере, откуда запускаем TSClient или Toad!

На моём ПК, если посмотреть:

 SELECT * FROM nls_session_parameters;

Получим:

Цитата:
NLS_LANGUAGE RUSSIAN
NLS_TERRITORY RUSSIA
NLS_CURRENCY р.
NLS_ISO_CURRENCY RUSSIA
NLS_NUMERIC_CHARACTERS ,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD.MM.RR
NLS_DATE_LANGUAGE RUSSIAN
NLS_SORT RUSSIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY р.
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

Вот из-за чего проблема! Надо использовать вместо RUSSIAN режим сортировки BINARY, где цифры расположены впереди латинских букв. А в RUSSIAN – позади. И в хранимке для объединения дублей передаются поля таблицы не в том порядке, что в ядре программы-клиента. Использование функции NLSSORT принудительно сортирует нужным образом.

Проблемная строка была заменена на:

      ORDER BY  NLSSORT(column_name, 'NLS_SORT=BINARY');

Модификации подверглись tsp_GenerateSearchSP, tsp_GenerateLiveSearchSP, tsp_GenerateDuplicateSearch, и tsp_GenerateDuplicateMerge. В новых версиях Terrasoft 3.X изменение внесено, остальным рекомендую исправить самостоятельно.

Нравится

Поделиться

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

Terrasoft 341 на Oracle

Хочется поделиться теми доработками, которые коснулись работы с СУБД Oracle в версии 341. Сделанные доработки - это самые кардинальные изменения с момента появления поддержки СУБД Oracle в Terrasoft 3.х.

Переработана почти половина всего взаимодействия с Oracle, оптимизирован раздел Администрирование, получение прав и раздача прав пользователей, сделано множество исправлений и существенно повышена безопасность.

Немного про оптимизацию

Для сравнения, например раздача прав на чтение одному пользователю на группу таблиц занимала более 30 секунд, в версии 341 раздача права чтения для группы пользователей с 500 пользователями занимает 3 секуды. Работа с разделом Администрирование стала гораздо комфортнее. Немного оптимизировано сохранение таблиц.

Системные объекты Oracle

Одной из основных задач стоял отказ от использования системных таблиц, представлений и ролей Oracle. Сейчас не используется ни один системный объект, пользователи и администраторы Terrasoft видят только объекты Terrasoft и не имеют никаких "опасных" прав. Другие пользователи Oracle также не имеют доступа к Terrasoft, ни одна привилегия не раздается на PUBLIC (для всех пользователей). Каждый пользователь Terrasoft получает только те права, которые ему необходимы, ни больше ни меньше.

Доработка скриптов поднятия БД

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

Список ключевых изменений:

  • Не используется системная роль DBA, не используется системный пользователь SYS
  • Не используются системные функции, пакеты, таблицы и представления
  • Администратор и Системный администратор не являются администраторами Oracle, соответственно не могут выполнять никаких лишних административных действий, не могут видеть и изменять никакую информацию из других схем БД Oracle
  • Все пользователям Террасофт доступны только объекты схемы Террасофт
  • Может быть множество администраторов и системных администраторов
  • Для групп таблиц не используются роли сервера
  • Оптимизирована раздача прав пользователям на группы таблиц
  • Оптимизация раздачи прав на не администрируемые объекты Террасофт
  • Повышена безопасность – не раздается доступ на PUBLIC, доступ дается только пользователям и ролям, которым он действительно нужен
  • Оптимизированы скрипты поднятия бэкапа

Нравится

Поделиться

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

Супер! Это отличная новость!

Александр, вы начали использовать RLS или так и остались представления?

"Осауленко Александр" написал:

Александр, вы начали использовать RLS или так и остались представления?


Используем представления, но не системные.

Саша, вы все молодцы, вы реально крутые!
Это то, что требуется нашим клиентам!!
Большое - пребольшое спасибо и респект!! :smile:

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

Добрый день.
Подскажите как выбрать данные из другой базы данных например Oracle, когда основная база на MySQL
Создаем ADOConnection, ADOCommand, ADODataset. Тест подключения проходит нормально...

Нравится

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

Здравствуйте.
Если тест проходит, то это значит, что параметры подключения заданы корректно и тестовая связь проходит успешно. Далее, исходя из поставленной задачи, используя ADOCommand, ADODataset и т. д. реализовываете логику. Обращаю Ваше внимание на то, что желательно использовать ODBC-драйвер от компании Oracle, а не стандарный от Microsoft, который встроен в Windows (там возникает ряд проблем при передаче параметров).
Terrasoft Support Team.

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

Добрый день!

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

Нравится

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

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

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

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

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

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

Существует ли в террасофт возможность вызова хранимых процедур для Oracle? Пытался использовать примеры с форума, используя ExecuteCustomSQL, но параметры не только не возвращаются, но даже не передаются в процедуру.

var Parameters = CreateSPParameters();
CreateSPParameter(Parameters, 'ID', pdtString, '1111111111111111');
CreateSPParameter(Parameters, 'POUT', pdtInteger, 0);
Parameters.ItemsByName('POUT').ParamType = 1;

тут Parameters.Items(0).Value в дебагере нормально '1111111111111111'
Parameters.Items(1).Value тоже нормально - 0

var SQL = 'BEGIN TSCRM.pa2_check_tbl_account(:ID,:POUT); END;';
Connector.DBEngine.ExecuteCustomSQL(SQL, Parameters);

После ExecuteCustomSQL в Parameters значение всех параметров неопределено.
При этом процедура запускается, raise оттуда идет, но raise_application_error (-20001, 'PID '||ID);
ID не вернет.

вот процедура:

create or replace procedure pa2_check_tbl_account
(
ID in "tbl_Account"."ID"%type,
POUT in out number
) is

begin
POUT := 5;
raise_application_error (-20001, 'PID '||ID);
end;

что не так?

Нравится

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

Илья, попробуйте запрос заменить на:

var SQL = 'BEGIN TSCRM.pa2_check_tbl_account(:pID,:pPOUT); END;';

Больше ничего не меняйте!

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

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

При зміні групи користувача в системі (Нпр: при звільненні і переході співробітника з одного відділу в інший) права попередньої групи, в якій користувач знаходився у нього не скасувались. Зате права нової групи для цього співробітника успішно додались.

З'ясувалося, що параметри авторизації користувача кешуються в таблиці tbl_UserAdminUnit і дані цієї таблиці не очищуються при зміні адміністратором групи користувача.

Щоб усунути цей негаразд потрібно в скрипт ds_UserInGroupScript додати функцію(для Oracle):

function DeleteAdminUnit(Dataset,UserName){
  try {
    var Cmd = 'begin delete from "tbl_UserAdminUnit" ';
    var Where = 'where (upper("tbl_UserAdminUnit"."UserName")='+"'"+UserName+"'"+');';
    var SQL = Cmd + Where + " end;";
    Connector.DBEngine.ExecuteCustomSQL(SQL, System.EmptyValue);
  } catch (e) {
    Log.Write(1, e.message);
  }
}

в датасеті ds_UserInGroup підписатись на подію OnDatasetAfterPost додати: 

function ds_UserInGroupOnDatasetAfterPost(Dataset) {
  var UserName = GetSQLObjectName('ds_User', Dataset.Values('UserID'));

  DeleteAdminUnit(Dataset,UserName);
}

а також додати визов функції в ds_UserInGroupOnDatasetAfterDelete:

function ds_UserInGroupOnDatasetAfterDelete(Dataset, KeyValue) {
  Connector.DBEngine.DeleteUserFromRole(UserInGroupScript.GroupName,
UserInGroupScript.UserName);

  DeleteAdminUnit(Dataset, UserInGroupScript.UserName);
}

Особисте спасибі Денису Масалову за допомогу у вирішені цієї проблеми.

Нравится

Поделиться

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

Юрий, а пользователь перелогинивался или продолжал работать?

Я звертався з цією проблемою в техпідтримку. На жаль, поки що ніякого рішення на заміну цьому рішенню я не маю.

Користувач продовжував працювати зі старими правами і новими правами навіть після повторного входу в систему :(

Функция DeleteAdminUnit лишняя, Вам необходимо посмотреть хранимую процедуру "tsp_LoadUserAdminUnit". В частности в конце нее идет очистка старых ролей - возможно в Вашей версии там ошибка. Эта "хранимка" всегда выполняется при логине пользователя, соответственно всегда приводит состояние tbl_UserAdminUnit в актуальное.

Нажаль, оновленої хранимки від техпідтримки не отримав. Сам їх не корегував, не маю досвіду і доступу. Рішення виконав доступними мені засобами.

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