+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 93.44 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

TASK_RTF_NOTES в MS Project или RTF в MS SQL. Как его победить и готовить кубы в SSAS

12.12.2013 16:24
GarbageIntegrator

Имеется довольно наболевшая для программистов организаций-пользователей MS Project задачка - получение заметок ответственных лиц. Заметки имеют значительную ценность (при правильной постановке задачи управления), потому что без исходной информации проблемы не классифицировать и правильное решение не принять. Их, заметки, конечно, надо выводить в отчеты.

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

Не претендую на оригинальность, однако аналоги данного решения почему-то не нашел, пришлось собирать самому. Кроме того, я не очень глубокий спец по MS SQL, поэтому, буде возникнут дельные комментарии - прошу комментировать.


Заметки, очевидно, хранятся в поле с названием TASK_RTF_NOTES. Поле заполняется пользователем при передаче отчетов по задачам, за которые он отвечает. Тут вроде бы нет особой необходимости в средствах разметки, более того, они, эти средства, от пользователя скрыты, но уважаемые (хоть и не понимаемые) мною индусы зачем-то сохраняют эту информацию в формате RTF. Все бы ничего, но надо подготавливать отчеты, в том числе не по одному проекту, а по куче разом. Хорошим инструментом для подготовки отчетов является SSAS в совокупности, например, с MS Excel.

Да, в MS Project Professional, конечно, имеется "построитель отчетов". Но это не кубы, это куча запросов с выводом в табличку. И поменять "на ходу" разрезы, даже если очень хочется, у вас не получится. И еще вы этот отчет должны будете переслать куче народа вместо того, чтобы они сами взяли его в любой момент времени.

Т.е., предположительно, схема примерно такая:
1) Извлечь значение поля
2) Передать значение в измерение куба
3) Получить красивый отчет в MS Excel (например)

Т.е. как-то так:

Но не тут-то было.

Первый сюрприз - это то, что поле имеет тип image . Зачем? Непонятно. Почему я на этой мелочи остановился - будет понятно далее. Преобразовали в varbinary(MAX) , поехали дальше.
Второй сюрприз - собственно, RTF. что же с ним делать? Лезем в сеть и обнаруживаем пачку советов, которые я разбил на 2 категории:

1) Воспользоваться объектом RTFTextBox.
Совет лежит прямо в MSDN! Это, видимо, официальная позиция MS по этому поводу! Закрадывается даже смутное сомнение, а не заложили ли эту фичу в MSP специально, дабы иметь возможность продавать построители отчетов?

2) Не морочить голову людям проблемами и использовать поле TASK_NOTES.
Здорово. Особенно, если дальше почитать. А дальше написано, что тут хранятся только обрезки поля TASK_RTF_NOTES.

И все. Есть еще советы разбирать RTF при помощи регулярных выражений. Но регулярные выражения в MS SQL тоже как бы скорее нет, чем есть, для их реализации надо еще и "функцию среды CLR" добавить… Что делать-то?

Пришлось поискать еще. Теперь я уже имел более широкие возможности - т.к. без addon'а явно не обойтись, я подумал-подумал и решил написать addon конкретно для разбирания RTF. Думаете, я воспользовался советом №1? Да, правильно, им я и воспользовался. Но SQL почему-то пожевал мою dll-ку и выплюнул ее с фразой "не верю я System.Drawing, кривая она, плохо написана и есть в ней куча уязвимостей". Забавно, В MS, оказывается, таки пишут кривые dll-ки!

Тогда я окончательно понял, что без парсинга RTF тут не обойтись и, наконец, наткнулся вот на это место:
NRTFTRee by Oliver

Здесь, конечно, ни слова про TASK_RTF_NOTES. Да еще и комменты на испанском. Однако тут я увидел реальную возможность собрать исходники парсера, что и было сделано.

Подробности по части сборки без System.Drawing я опущу - достаточно немного фантазии и понимания, что на самом деле все эти классы для данной задачи не очень нужны, а незаменимых нет.

Пример SQL-скрипта, который теперь действительно работает:

SELECT TOP 1000 [TASK_UID] ,[TASK_NAME] ,[PROJ_UID] ,convert(varchar(max),[dbo].ConvertFromRTF(convert(varbinary(max),[TASK_RTF_NOTES]))) ,[TASK_NOTES] FROM [ProjectServer2010_Published].[dbo].[MSP_TASKS] where not [TASK_RTF_NOTES] is null

На вопрос "ЗАЧЕМ covert так много раз???" отвечу - почему-то функции CLR не поддерживают передачу image и varchar (по крайней мере, в 2005-м MS SQL).

Да, есть еще нюанс - кодировка в нашем MSP почему-то не 1251, а 1252 (но не всегда, т.к. часть проектов перенесена), поэтому сама функция конвертирования написана так:
[SqlFunction(DataAccess = DataAccessKind.Read)] public static SqlBytes ConvertFromRTF(SqlBytes bytes) { if (bytes == null) return null; if (bytes.IsNull) return null; if (bytes.Length == 0) return null; MemoryStream strm = new MemoryStream(bytes.Value); byte[] buff = new byte[4096]; int rd = strm.Read(buff, 0, buff.Length); RtfTree tree = new RtfTree(); string s1 = Encoding.Default.GetString(buff); tree.LoadRtfText(s1); string text = tree.Text; SqlBytes res; if (s1.IndexOf("ansicpg1252") > -1) { res = new SqlBytes(Encoding.GetEncoding("Windows-1252").GetBytes(tree.Text)); } else if (s1.IndexOf("ansicpg1251") > -1) { res = new SqlBytes(Encoding.GetEncoding("Windows-1251").GetBytes(tree.Text)); } else { res = new SqlBytes(Encoding.Default.GetBytes(tree.Text)); } return res; }

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года