[Data Engineering] Clarion. Процесс миграции Clarion приложения на Microsoft SQL 2019

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
30-Май-2021 19:31

Продолжаю повествовать о жизни с Clarion. В этом посте я опишу свой путь решения одной из частых задач, стоящих перед Clarion разработчиками, это миграция Clarion программы на СУБД Miscrosoft SQL.
Так получилось что несколько месяцев назад мне на обслуживание передали 2 программы на технологии Clarion, повод грустный, уходит старое поколение, так и случилось с моим научным руководителем. Несколько лет я вместе с ним работал программистом на Clarion, далее я потерял интерес к этой технологии и наши пути разошлись. А сейчас, по прошествии лет передо мной стоит необходимость поддерживать и изредка развивать 2 программы.ПроблематикаГлавная на мой взгляд проблема и сложность это работа программы только с нативной СУБД Clarion, доступ к данным при таком подходе очень неудачный, требуется большой объем кода для написания даже простейших задач, которые решаются отправкой на сервер простейшего Update или Insert в Clarion это десятки строчек кода по открытию файла, получению доступа к инфе и его последующего закрытия. Ниже пример:
Access:Agent.Open           !Открываем файл
       Access:Agent.UseFile        !Открываем файл
       clear(AGN:Record)          !Делаем очистку записи на всякий случай
       AGN:ID_AGENT = some_id     !Присваиваем ключу значение
       set(AGN:BY_ID,AGN:BY_ID)    !Устанавливаем "каретку" на первое значение ключа
       next(agent)                !Встаем на первую запись удовлетворяющую ключу
       IF errorcode() or AGN:ID_AGENT <> some_id  !Проверяем не вышла ли каретка за область ключа
            RETVAL = 'Контрагент не найден'        !Выкидываем ошибку
          ELSE
            RETVAL = AGN:N_AGENT                  !Возвращаем имя агента
       .
       Access:Agent.Close                          !Закрываем файл
Вот столько действий надо сделать чтобы просто получить запись, далее если записей пачка, то надо запустить цикл и прогнать цикл до конца и "по дороге" контролировать чтобы "каретка" не выбежала за требуемые условия обработки данных. Сущий ад просто. Это можно заменить одним запросом SQL вида:
select agent.name where id = some_id
ЗадачаПервые задачи передо мной встали очень грустной перспективой, одна из них звучала как "написать модуль выгрузки данные в 1С Бухгалтерию", я сразу представил алгоритм длиной в пару тысяч строк, который можно заменить на один запрос SQL, и вопрос перехода на SQL уже был решен. Речь конечно не о полном переходе, а только о частичной замене части таблиц на версию SQL и поэтапной миграции системы в SQL.Характеристики системыОбе системы примерно схожие по объему кодовой базы и по количеству пользователейОбщее количество пользователей: около 80Общее количество таблиц: около 250Сфера деятельности: Торговля + Сфера обслуживания (Салоны красоты)Подразделения:3 Салона красоты5 Подразделений торговых предприятий - мелкооптовая торговляИспользуемые инструменты
  • Самодельная программа миграции
  • DCT2SQL
  • Cldump
  • BULK insert
  • UltimateSQL & Ultimate Debug
Самодельная программа миграции
Программа предназначена для автоматизации хранения скриптов по созданию, удалению, очистке таблиц и прочих действий полезных в процессе переноса данных. Также можно запустить произвольный скрипт. Помимо этого программа отправляет post запросы для конвертации dat файлов с их последующей загрузкой в соответствующие таблицы.DCT2SQLДанный компонент позволяет генерировать скрипты для экспорта структуры БД из Dictionary в SQL, поддерживает экспорт всех возможных типов данных, также экспортирует индексы и foreign keys. Очень удобно работает, все импортируется в пару кликов. Данные скрипты я храню в таблице миграций.Можно скачать на Github - https://github.com/RobertArtigas/DCT2SQLТакже есть обучающие ролики на youtube по работе и правильной выгрузке. Вообще там очень много инфы в этих роликах по миграции на SQL.https://www.youtube.com/watch?v=MjMgQYMc_xYhttps://www.youtube.com/watch?v=bAolfvrz2oE&t=7067sCLDUMPДанная программа конвертирует данные из *.dat файла в csv таблицы готовые для загрузки через скрипт BULK. Достоинство этой программы - скорость. Она может сконвертировать таблицу накладных за 10 лет за 15-20 секунд. Главная проблема данной утилиты в том, что она доступна только в репозиториях Linux, в частности debian. Пришлось на основе этой команды создать микро-сервис, который на входе принимает post запрос, а на выходе выдает ссылку для скачивания данного файла в виде csv таблицы.Также одна из проблем была в том, что часть таблиц лежит в папках с "годами" то есть данные каждый год начинаются в таблице заново, например таблица с заказами, ей требуется уникальная идентификация накладных внутри года, в таком случае в такую таблицу кладут в отдельную папку соответствующую "году" происходящего в этой таблице, далее чтобы посмотреть заказы другого года надо выйти из программы и "зайти в другой год". Такова архитектура приложения. Этот ньюанс тоже надо проработать, поэтому для каждой таблицы есть свой признак, лежит она в общей папке или папке с "годом". Эту программу можно скачать командой в любой debian подобной системе:
apt-get install cldump
BULK insertЗа доли секунд втягивает таблицу из csv в SQL. В данном случает, т.к. связки данных уже настроены на существующие ID, но при этом надо чтобы работал автоинкремент, поэтому его временно надо отключить, также потратил довольно много времени чтобы подобрать подходящие разделители:
BULK INSERT dbo.%table_name%
FROM table_name.csv WITH (
FORMAT = 'CSV',
FIELDQUOTE = '',
FIRSTROW = 1,
FIELDTERMINATOR = '0x3b',
ROWTERMINATOR = '0x0a',
CODEPAGE='65001',
TABLOCK,
KeepIdentity)
UltimateSQL & Ultimate DebugДанные компоненты позволяют загружать данные из SQL в QUEUE примерно таким образом:
SQL_Result = sql.query('
select id, path_to_result
from dbo.export_tasks as et
where
(status_complete = 0 or status_complete = 2)
and export_table_id = '& exp:id
,qexport_tasks)
Выполнять запросы без возвращаемых значений:
sql.Query('Update export_tasks set status_complete = 2 where id = ' & qexport_tasks.id)
Есть отличное описание как использовать на youtube:https://www.youtube.com/watch?v=RVit-5RPncs&t=2259sТакже при установке внутри шаблонов есть "пасхалка" от автора, как решить квест описывается по ссылке:https://clarionhub.com/t/need-some-help-with-ultimatesql-error-when-trying-to-include-it-in-my-project/4182
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_data_engineering, #_mssql, #_clarion_11, #_database, #_subd (субд), #_data_engineering
Профиль  ЛС 
Показать сообщения:     

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

Текущее время: 22-Ноя 21:13
Часовой пояс: UTC + 5