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

  • Tutorial

Продолжаю повествовать о жизни с 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

Также есть обучающие ролики на youtube по работе и правильной выгрузке. Вообще там очень много инфы в этих роликах по миграции на SQL.

CLDUMP

Данная программа конвертирует данные из *.dat файла в csv таблицы готовые для загрузки через скрипт BULK. Достоинство этой программы - скорость. Она может сконвертировать таблицу накладных за 10 лет за 15-20 секунд. Главная проблема данной утилиты в том, что она доступна только в репозиториях Linux, в частности debian. Пришлось на основе этой команды создать микро-сервис, который на входе принимает post запрос, а на выходе выдает ссылку для скачивания данного файла в виде csv таблицы.

Также одна из проблем была в том, что часть таблиц лежит в папках с "годами" то есть данные каждый год начинаются в таблице заново, например таблица с заказами, ей требуется уникальная идентификация накладных внутри года, в таком случае таблицу кладут в отдельную папку соответствующую "году" происходящего в этой таблице. Чтобы посмотреть заказы "другого года" надо выйти из программы и "зайти в другой год". Такова архитектура приложения. Этот ньюанс тоже надо проработать, поэтому для каждой таблицы есть свой признак, лежит она в общей папке или папке с "годом".

Программу cldump можно скачать командой в любой 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:

Также при установке внутри шаблонов есть "пасхалка" от автора, как решить квест описывается по ссылке.

Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 12

    0

    Скажите, а вот этот clarion - это тот же самый (пусть и сильно более современный) clarion, на котором под dos в далёком 1994-1997 годах писали свякие складские программы?

    Сталкивался с ним в те времена будучи ещё школьником - очень удобный генератор форм, но собственный формат БД и категорическое неумение работать по сети (в отличии от уже появившегося mssql).

      0

      Да.

      И Clarion всегда, по крайней мере, начиная с Clarion 2.X for DOS умел ( и работал) "по сети".

        0

        Был зелёным и глупым, "сеть" обеспечивали драйвера от Novell Netware (или нет, за давностью лет уже совершенно всё забыл), которые позволяли через сетевухи с коаксиалом монтировать каталог (или весь диск) одной машины на другой. В общем, что-то очень похожее на NFS.

        На чтение все работало на отлично, а при попытке записи с двух машин начинались проблемы - то индексы корраптились, то вообще данные не добавлялись. Причём вероятность проблем напрямую зависела от интенсивности работы - могло неделю работать без проблем, а при нагрузке (два оператора одновременно вбивают накладные) почти гарантированно всё портилось ;(

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

          0

          Насколько помню, достаточно было программировать "по документации".

          Часто просто использовали Btrieve.

          Но это уже CDD 3.X

          +1
          Подтверждаю. Мы уже больше 25 лет эксплуатируем одну систему на Clarion 2.0. Программа успешно и без особых проблем пережила переезд с 286-го компа на сервер с Xeon и с монопольного доступа на сетевой. За все годы не произошло ни одного случая разрушения данных. Редкие сбои лечились простой переиндексацией. Единственная проблема на данный момент — требует 32-битной версии ОС. Выкручиваемся стареньким Win2003Srv и RDP.
          0
          Да, о нем речь, сейчас также хорошо позволяет создавать небольшие складские программы наподобие тех, которые я сейчас обслуживаю. В целом знаю пример использования в компании с оборотом более 2млрд руб в год. Там правда работает на sql.
            0

            Поправка: кларион с 1992 года уже был "на слуху" и востребован в рф

            0
            Стандартные ABC-шаблоны все равно очень проблемно работают с MS SQL (правильно выше написано — 100500 строк кода на простое действие, а сколько в итоге запросов посылается на сервер...), писать свои… мы в итоге написали, но не стал бы этот путь советовать. А выгрузку в 1С: Бухгалтерию проще всего написать через OData
              0
              Двенадцать простейших строк кода это «Сущий ад просто.»? Куда мир катится!? ;)
                0
                С учетом нагрузки, которая у меня была до того как мне передали эти программы, которая никуда не делась, каждая строка и минута на счету, поэтому очень не хочется делать лишних движений.
                  0
                  Тем не менее, путь выбран странный, вся статья по сути о «лишних движениях». Ничего не меняя глобально, написали бы быстрее. Все эти 12 строк можно обернуть в одну процедуру на указателях, куда например передавать идентификатор файла и номер, вернет имя
                    0
                    Я думаю, что при написании этой статьи, вы совершили куда больше лишних движений, нежели, написав вручную 12 строк кода, однако ж вы нигде не упомянули, что написание статей на хабре это «сущий ад», или у вас теперь существенно снизилась нагрузка? ;)

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

                Самое читаемое