|
|
|||||||||||||||||||||||||||||
|
TASK_RTF_NOTES в MS Project или RTF в MS SQL. Как его победить и готовить кубы в SSASИсточник: habrahabr GarbageIntegrator
Имеется довольно наболевшая для программистов организаций-пользователей MS Project задачка - получение заметок ответственных лиц. Заметки имеют значительную ценность (при правильной постановке задачи управления), потому что без исходной информации проблемы не классифицировать и правильное решение не принять. Их, заметки, конечно, надо выводить в отчеты. С точки зрения пользователя все вроде бы просто - отчет он и есть отчет, но с технической точки зрения открывается масса нюансов и вопросов. В этой статье я привожу свое решение, основанное на некоторых кусках кода, раскиданных то тут, то там, по сети, и надеюсь, что оно пригодится моим коллегам. Не претендую на оригинальность, однако аналоги данного решения почему-то не нашел, пришлось собирать самому. Кроме того, я не очень глубокий спец по MS SQL, поэтому, буде возникнут дельные комментарии - прошу комментировать.
Да, в MS Project Professional, конечно, имеется "построитель отчетов". Но это не кубы, это куча запросов с выводом в табличку. И поменять "на ходу" разрезы, даже если очень хочется, у вас не получится. И еще вы этот отчет должны будете переслать куче народа вместо того, чтобы они сами взяли его в любой момент времени. Т.е., предположительно, схема примерно такая: Т.е. как-то так: Но не тут-то было. Первый сюрприз - это то, что поле имеет тип image . Зачем? Непонятно. Почему я на этой мелочи остановился - будет понятно далее. Преобразовали в varbinary(MAX) , поехали дальше. 1) Воспользоваться объектом RTFTextBox. 2) Не морочить голову людям проблемами и использовать поле TASK_NOTES. И все. Есть еще советы разбирать RTF при помощи регулярных выражений. Но регулярные выражения в MS SQL тоже как бы скорее нет, чем есть, для их реализации надо еще и "функцию среды CLR" добавить… Что делать-то? Пришлось поискать еще. Теперь я уже имел более широкие возможности - т.к. без addon'а явно не обойтись, я подумал-подумал и решил написать addon конкретно для разбирания RTF. Думаете, я воспользовался советом №1? Да, правильно, им я и воспользовался. Но SQL почему-то пожевал мою dll-ку и выплюнул ее с фразой "не верю я System.Drawing, кривая она, плохо написана и есть в ней куча уязвимостей". Забавно, В MS, оказывается, таки пишут кривые dll-ки! Тогда я окончательно понял, что без парсинга RTF тут не обойтись и, наконец, наткнулся вот на это место: Здесь, конечно, ни слова про TASK_RTF_NOTES. Да еще и комменты на испанском. Однако тут я увидел реальную возможность собрать исходники парсера, что и было сделано. Подробности по части сборки без System.Drawing я опущу - достаточно немного фантазии и понимания, что на самом деле все эти классы для данной задачи не очень нужны, а незаменимых нет. Пример SQL-скрипта, который теперь действительно работает:
На вопрос "ЗАЧЕМ covert так много раз???" отвечу - почему-то функции CLR не поддерживают передачу image и varchar (по крайней мере, в 2005-м MS SQL). Да, есть еще нюанс - кодировка в нашем MSP почему-то не 1251, а 1252 (но не всегда, т.к. часть проектов перенесена), поэтому сама функция конвертирования написана так: Ссылки по теме
|
|