Постоянно пытаюсь собрать коляску,
Jul. 8th, 2007 11:21 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
а получается то автомат, то пулемет, то, идрить его налево, термоядерная боеголовка.
Есть задание - переписать в старой системе ведомость. Использовать встроенный в нее редактор меня давно задрало, глючен, неудобен в обслуживании и язык кривой и не объектный. Но ведомость была на нем написана, года три как уже и даже работала, с определенными ограничениями. Но не всех устраивала, сложно обслуживалась, etc. В общем, задрала вусмерть.
В процессе надстраивания над старой системой новой для сбора сводных отчетов появилась какая-никакая инфраструктура, позволяющая реализовать эту ведомость более по-человечески.
И начал я ее делать. Изначально собирался наполовину в лоб, наполовину обобщить - т.е. все обертку (подключение к базам старой системы, выбор рабочих параметров, GUI) сделать обобщенным, а к ней подгружать
закодированный в виде наследника от простого базового класса в лоб написанный алгоритм расчета этой ведомости. Базовый класс совсем тупой, виртуальные методы типа SetDBPaths, SetLoadParams, Load.
В лоб делал, потому что система не имеет sql запросов и базы обрабатываются тупым перебором. И то это получается быстрей, чем внутри нее самой делать. И парсера-движка SQL я готового так и не нашел.
Короче, не знаю я, что на меня нашло, похоже переработался совсем, но в процессе написания получилось следующее:
Наследник базового класса грузит другой класс, непосредственно выполняющий всю работу и служит для него фасадом. При этом класс загружается указанный в конфиге и все общение с тем классом идет через интерфейс. При этом оный класс может быть как влинкован в исполняемый файл программы, так и загружаться из заданной в конфиге dll. Сделано так для упрощения отладки, когда класс влинкован в прогу, и для упрощения обновления проги(класс будет грузится из dll). Эксперимент с двойным вариантом загрузки класса увенчался успехом. Это еще ладно.
Внутри загружаемого класса реализован безумный язык запросов к базам старой системы на базе XML. Умом понимаю, что бред, но ничего поделать не могу - так получилось :) Из набора таблиц старой системы генерит датасет с объектами, в том числе вложенными(произвольного уровня), типа "шапка документа-строки документа", поддерживает группировку и аггрегатные функции типа min,max,total,list. Причем выходной датасет может быть не один, а несколько, т.е. фактически выполняется несколько запросов за один проход по таблице.
В итоге получился более-менее универсальный импортер данных из старой системы, а до самой ведомости я еще так и не добрался.
Вывод: надо идти в отпуск, иначе я скоро на просьбу сложить 2+2 буду выводить с нуля теорию чисел.
Есть задание - переписать в старой системе ведомость. Использовать встроенный в нее редактор меня давно задрало, глючен, неудобен в обслуживании и язык кривой и не объектный. Но ведомость была на нем написана, года три как уже и даже работала, с определенными ограничениями. Но не всех устраивала, сложно обслуживалась, etc. В общем, задрала вусмерть.
В процессе надстраивания над старой системой новой для сбора сводных отчетов появилась какая-никакая инфраструктура, позволяющая реализовать эту ведомость более по-человечески.
И начал я ее делать. Изначально собирался наполовину в лоб, наполовину обобщить - т.е. все обертку (подключение к базам старой системы, выбор рабочих параметров, GUI) сделать обобщенным, а к ней подгружать
закодированный в виде наследника от простого базового класса в лоб написанный алгоритм расчета этой ведомости. Базовый класс совсем тупой, виртуальные методы типа SetDBPaths, SetLoadParams, Load.
В лоб делал, потому что система не имеет sql запросов и базы обрабатываются тупым перебором. И то это получается быстрей, чем внутри нее самой делать. И парсера-движка SQL я готового так и не нашел.
Короче, не знаю я, что на меня нашло, похоже переработался совсем, но в процессе написания получилось следующее:
Наследник базового класса грузит другой класс, непосредственно выполняющий всю работу и служит для него фасадом. При этом класс загружается указанный в конфиге и все общение с тем классом идет через интерфейс. При этом оный класс может быть как влинкован в исполняемый файл программы, так и загружаться из заданной в конфиге dll. Сделано так для упрощения отладки, когда класс влинкован в прогу, и для упрощения обновления проги(класс будет грузится из dll). Эксперимент с двойным вариантом загрузки класса увенчался успехом. Это еще ладно.
Внутри загружаемого класса реализован безумный язык запросов к базам старой системы на базе XML. Умом понимаю, что бред, но ничего поделать не могу - так получилось :) Из набора таблиц старой системы генерит датасет с объектами, в том числе вложенными(произвольного уровня), типа "шапка документа-строки документа", поддерживает группировку и аггрегатные функции типа min,max,total,list. Причем выходной датасет может быть не один, а несколько, т.е. фактически выполняется несколько запросов за один проход по таблице.
В итоге получился более-менее универсальный импортер данных из старой системы, а до самой ведомости я еще так и не добрался.
Вывод: надо идти в отпуск, иначе я скоро на просьбу сложить 2+2 буду выводить с нуля теорию чисел.
no subject
Date: 2007-07-08 09:53 pm (UTC)no subject
Date: 2007-07-09 06:23 am (UTC)no subject
Date: 2007-07-09 08:33 am (UTC)