переезжаем с LotsiaPDM4.4 (15 лет/25 лицензий)->LotsiaPDM5.8 (2 года/10 лицензий)(текущая LotsiaPDM6.1)(MSSQL Server2005/WinServer2003) на PostgreSQL16-17 (Windows8 потом Linux)
1. LotsiaPDM4.4->LotsiaPDM5.8.
Продолжая использовать LotsiaPDM4.4 устанавливаем на часть клиентов LotsiaPDM5.8 (со своим ключем) - убеждаемся что все работает (в рамках одной БД): !!ничего не меняем в настройках LotsiaPDM5.8 - меняя интерфейс если нужно только в LotsiaPDM4.4. Мы отработали в этой сдвоенной схеме (в одной БД) 1 год
2. отказ от LotsiaPDM4.4 в пользу LotsiaPDM5.8
в интерфейсе LotsiaPDM5.8 на всех формах убрать старые tooltip (очень много неприятностей) и переопределить их в свойсвах: если не чистить - формы дают ошибки. После настройки LotsiaPDM4.4 перестает отображать формы - отключаем ее, переходим полностью на работу в LotsiaPDM5.8
3. Устанавливаем БД PostgreSQL и создаем пустую БД.
Через CreateDB (не требует ключа) от последней доступной версии LotsiaPDM - подключаемся к созданной БД PostgreSQL и импортируем туда текущую БД MSSQL - у нас данная процедура занимает 4 часа (выходные когда в БД не поступает новая инфа). Мы использовали CreateDB от LotsiaPDM6.1 (хотя лицензии у нас LotsiaPDM5.8 - но CreateDB от нее некорректно создавал пользователей lsdbo в PostgreSQL)
4. Подключаемся в клиенте LotsiaPDM5.8 к базе PostgreSQL. С этого момента у нас две разные БД MSSQL и PostgreSQL в рамках одной версии LotsiaPDM и ее ключа
5. Активируем в PostgreSQL нужных юзеров через клиента LotsiaPDM5.8
6. Сервер. Переписываем все пользовательские функции и хранимые процедуры БД от MSSQL в PostgreSQL (отличия по синтаксису небольшие (null - заменить на coalesce, + заменить на ||, вызов хп заменить exec на call, чуствительно к регистру, ilike и т.д. dateadd https://www.sqlines.com/sql-server-to-postgresql) - плюсом есть много готовых расширений, но обратите внимание на возвращаемые типы данных, - немного отличаются от MSSQL и в скриптах действий LotsiaPDM - требуют более четкого контроля типов возвращаемых значений).
У нас порядка 50 функций. - Пара недель. Убеждаемся в очень низкой скорости PostgreSQL - оптимизируем функции и настройки БД (в общем то безрезультатно = железо под сервер в данном случае решающий фактор) - + 2 месяца
7. LotsiaPDM. SQL запросы на Формах, Действиях, Скриптах, Отчетах - два варианта по переходу
7.1. отдельно в новой БД PostgreSQL настроить и проверить весь функционал LotsiaPDM5.8
+ купить модуль репликации настроек (деньги смешные но их нет)) )
+ выгрузить настройки из тестовой PostgreSQL + импортировать текущую БД MSSQL в новую PostgreSQL + реплицировать в нее сверху настройки тестовой PostgreSQL
7.2. не покупать модуль репликации настроек
+ максимально подготовить БД MSSQL на работу в мульти базовом режиме)) - чтобы после импорта сразу перевести сотрудников на работу в новой базе PostgreSQL
идем по этому варианту - недостаток один - отчеты если они на динамических SQL придется вручную переписать (если отчеты на пользовательских функция БД - ничего делать не нужно)
8. настраиваем мульти базу на основе LotsiaPDM MSSQL = кроссплатформенные кастомные настройки БД
мы ведем БД с 2006 года за это время в плане кастомизации накопилось более 200 форм + более 600 действий + более 100 отчетов, из особенностей есть быстрый пользователь (права на чтение SQL всех объектов БД минуя права LotsiaPDM)
- на одном компьютере открываем два клиента LotsiaPDM5.8/PostgreSQL и LotsiaPDM5.8/MSSQL + два IDE MSSQL Studio и PgAdmin PostgreSQL (клиенты запущенные на одном компьютере захватывают только одну лицензию Guardant)
- на LotsiaPDM5.8/PostgreSQL тестируем основные/базовые (не все) действия и формы
- на LotsiaPDM5.8/MSSQL - правим - копируем в LotsiaPDM5.8/PostgreSQL - тестируем ошибку и дальше по кругу
9. кастомная кроссплатформенность БД
9.1. для использования на формах объектов и действий
- создаем (у одного из своих системных объектов LotsiaPDM) - строковый атрибут - тип БД (значения например mssql или pstgr)
- создаем пользовательскую функцию БД (и в MSSQL и в PostgreSQL) возвращающую это значение, например в PostgreSQL
Код: Выделить всё
CREATE OR REPLACE FUNCTION lsdbo.ric_get_type_bd(
)
RETURNS text
LANGUAGE 'sql'
COST 100
IMMUTABLE SECURITY DEFINER PARALLEL UNSAFE
SET search_path=party_user
AS $BODY$
/*
2025 05 31
получить тип бд mssql или pstgr
*/
SELECT vv.value
FROM lsdbo.value_string vv left join lsdbo.attrib_value av on vv.id = av.Value_ID
where vv.attrib_id = 3000000000121 and
av.object_id = 100002307000000
$BODY$;
Код: Выделить всё
f_ExecSQLSelect_3( 'select LSDBO.Ric_Get_Type_bd()','','','char(15)',10)
Код: Выделить всё
if((find<>'' or find<>'Выберите запись') and suggested<>'',
case(type_db
when "mssql" then
f_ExecSQLSelect_3( 'exec LSDBO.Ric_Get_XmlParser_ForForms ~'' + suggested + '~', ~'/'+'/sg[i1="' + find + '"]/i2~'','','','char(255)',10)
when "pstgr" then
f_ExecSQLSelect_3( 'call LSDBO.Ric_Get_XmlParser_ForForms(~''+ suggested + '~', ~'/'+'/sg[i1="' + find + '"]/i2~',~'~')','','','char(255)',10)
),
'')
9.2 для использования в действиях (скрипты)
- мы используем свое подключение к БД из скриптов (поскольку работаем из старых версий и много всего уже написано), например так
- в модуле(скрипте vbscript) по работе с БД добавляем константу (обратите внимание для PostgreSQL увеличиваю время на ожидание ответа от запроса)
Код: Выделить всё
Option Explicit 'требование объявления переменных
Const pstgr=true 'если true работаем в синтаксисе postgresql
' функция создания и открытия подключения к базе данных
Function ADODB_Connected
If IsObject(cn) And TypeName(cn) = "Connection" Then
ADODB_Connected=True
' msgbox "Соединение уже существует"
Exit Function
Else
On Error Resume Next
set cn = CreateObject("ADODB.Connection")
'--POSTGRESQL--
if not pstgr then
cn.Open "Provider=SQLOLEDB;Data Source=win2003;Initial Catalog=crm;User ID=имя быстрого пользователя;Password=его пароль;"
cn.CommandTimeout=30 ' !!! 30 секунд на выполнение запроса к БД
' msgbox cn.CommandTimeout
else
cn.Open "Driver={PostgreSQL UNICODE};Server=web-crm;Port=5432;Database=crm_580_new;UID=имя быстрого пользователя;PWD=его пароль;"
cn.CommandTimeout=60*10 ' !!! 10 минут на выполнение запроса к БД
end if
'--POSTGRESQL--
If Err.Number = 0 Then
ADODB_Connected = True
' msgbox "Новое соединение"
Exit Function
Else
' ShowError ("Подключение к БД")
ShowCnError ("Подключение к БД")
ADODB_Connected = False
If Not cn Is Nothing Then Set cn = Nothing
End If
End If
End Function
Код: Выделить всё
' Прочтем Инфу из БД
If DataBase.ADODB_Connected Then ' если подключиться удалось работаем иначе нет
If DataBase.ADODB_RecordSet Then ' если удалось создать recordset тоже работаем
'--POSTGRESQL--
if not DataBase.pstgr then
sql = "select convert(varchar,rdStatus,104), " & _
"rExecuter, " & _
"rType, " & _
"rName, " & _
"rCompany " & _
"from LSDBO.Ric_Get_attrRequest(0,100004487800000,'Деп,Подч,ПлРб,Req','','',0,'') " & _
"where rStatus='подтверждено' and ((DATEDIFF(day, rdStatus, GETDATE())= 1) " & _
"or (rdStatus BETWEEN DATEADD (day, 42 , rdStatus) and DATEADD (day, 48 , rdStatus )) " & _
"or (rdStatus BETWEEN DATEADD (day, 115 , rdStatus) and DATEADD (day, 125 , rdStatus )) " & _
"or (DATEDIFF(month, rdStatus, GETDATE())>6)) " & _
"and isobject_id in (select rw.id From lsdbo.object_type tw inner join lsdbo.object_reference rw on rw.type_id = tw.id and rw.author_id=" & cStr(idDB) & ") " & _
"order by rcDate desc" 'rCompany, rcDate desc"
else
sql = "select TO_CHAR(rdStatus, 'dd.mm.yyyy'), rExecuter, rType, rName, rCompany from LSDBO.Ric_Get_attrRequest(0,100004487800000,'Деп,Подч,ПлРб,Req','','',0,'') where " & _
"rStatus='подтверждено' and ((abs(DATE_PART('day',rdStatus-CURRENT_DATE))=1) or (rdStatus BETWEEN (rdStatus + INTERVAL '42 day') and (rdStatus + INTERVAL '48 day')) or (rdStatus BETWEEN (rdStatus + INTERVAL '115 day') and (rdStatus + INTERVAL '125 day')) " & _
"or (abs((DATE_PART('YEAR', rdStatus) - DATE_PART('YEAR', CURRENT_DATE)) * 12 + (DATE_PART('Month', rdStatus) - DATE_PART('Month', CURRENT_DATE)))>6)) and isobject_id in (select rw.id From lsdbo.object_type tw inner join lsdbo.object_reference rw on rw.type_id = tw.id and rw.author_id=" & cStr(idDB) & ") " & _
"order by rcDate desc"
end if
'--POSTGRESQL--
...
9.3.1 пустые атрибуты EMPTY в MSSQL сохраняются нормально в виде AttribSet ( a_Object , LinkID_0 , fTel , trim(tel))
теже пустые атрибуты в PostgreSQL не сохраняются в EMPTY, нужен явно NULL - делаем универсальное решение
AttribSet ( a_Object , LinkID_0 , fTel , if (tel="",Null_S(),trim(tel)) )
9.3.2 если у вас есть парсинг xml через xpath по условию "//name переписываем как "/"+"/name (чтобы не воспринималось LotsiaPDM как комментарий //)
может еще что всплывет - напишу
День переезда
1. создать пустую рабочую БД PostgreSQL
2. импортировать текущую 'мульти' БД MSSQL в PostgreSQL
3. из тестовой БД PostgreSQL выгрузить все свои пользовательские процедуры и функции например так у нас все имена с префиксом
Код: Выделить всё
=# SELECT pg_get_functiondef(oid) FROM pg_proc p WHERE p.pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'lsdbo' and proname LIKE 'ric_%');
4. сопоставить/юзеров из клиента LotsiaPDM
5. поменять в БД только два значения
-значение атрибута с типом БД
-константу с типом БД в скриптах
и все.... )) я так предполагаю
морально быть готовым к моментальному (пока мало данных успеет поступить до первой ошибки) 'откату' = просто переключению клиента обратно на MSSQL, или быстрой быстрой фиксации ошибки в уже новой боевой БД PostgreSQL
)))