8 февраля 2009 г.

Microsoft Excel как средство генерации кода

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

Предположим, нам требуется изменить данные так называемых справочников (dictionaries). Приведу простой пример, нужно заполнить справочник стран согласно стандарту ISO 3166. Их всего-ничего: 246 штук. Т.е. нам нужно подготовить SQL скрипт по вставке данных для этих стран. В простом случае у нас получиться около 246 строк SQL кода вида INSERT INTO countries (id, code) values ('UA', 'Ukraine'). Для автоматизации процесса генерации SQL кода я предлагаю использовать Microsoft Excel.

В данном примере нам потребуется три колонки: Код, Текст и SQL. В колонку SQL добавляем код вида =СЦЕПИТЬ("INSERT INTO countries (id, code) values ('";A2;"', '";B2;"')") (да, у меня Русский Microsoft Excel и я так и не научился использовать в нем английские названия функций). В результате получаем нужный нам SQL и копируем данную формулу для всех остальных значений колонки SQL.

Возможен и более сложный случай, например, названия стран у Вас локализируемые и тексты хранятся в отдельной таблице, тогда вставка должна проводиться в две таблицы: таблицу справочника вида id (integer), код (char) и таблицу текстов id(integer), язык (char) и текст (varchar). Итак, приступим к подготовке данных: добавим колонку id до code, переименуем колонку Text в EN и добавим колонку RU, переименуем SQL в SQL Countries и добавим справа от нее колонки SQL EN и SQL RU. Далее проставляем числовые коды в колонке id (1, 2, 3 и т.д.). Для этого используем возможность заполнения смежных ячеек. Меняем значение первой строки колонки SQL Countries на =СЦЕПИТЬ("INSERT INTO countries (id, code) values ('";A2;"', '";B2;"')"), колонки SQL EN на =СЦЕПИТЬ("INSERT INTO countries_test (id, lang, text) values ('";A2;"', '";$C$1;"', '";C2;"')") и колонки SQL RU на =СЦЕПИТЬ("INSERT INTO countries_test (id, lang, text) values ('";A2;"', '";$D$1;"', '";D2;"')"). Копируем формулы колонок SQL Countries, SQL EN и SQL RU для всех строк таблицы. Итак, за пару минут мы подготовили SQL для двух таблиц 246 * 2 = 492 строк кода.

Что еще можно делать с помощью этого подхода? Многое. Например, мой коллега генерировал части XML файлов, я - куски кода на Java. Недавно использовал этот подход для более сложной задачи: миграции данных плоских справочников в иерархические (около 10 таблиц, порядка 2000 строк SQL кода).

С моей точки зрения, огромное преимущество данного подхода заключается в возможности быстро перегенерировать полученный ранее код. Например, решили Вы нумеровать строки в справочнике стран не по порядку, а через 10 - изменили значения в колонке id, и вуаля - скрипты готовы. Или другой пример, в процессе тестирования решили мы перенести часть данных иерархических справочников из одних веток в другие, некоторые объединить и кое-что удалить. Делать это вручную в SQL-е долго и вероятность возникновения ошибок достаточно велика, а с помощью Excel-a это изменение заняло несколько минут.

Еще одним плюсом данного подхода является возможность генерации на основании одних и тех же данных кода для разных систем-платформ-версий: например, генерации SQL скриптов для Microsoft SQL Server, Oracle и MySQL, исходного кода на Java и C#, bat и sh файлов и пр.

Комментариев нет:

Отправить комментарий