RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)

Действия для ускорения работы с FileStream

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

Оригинальная статья http://msdn.microsoft.com/ru-ru/library/dd206979%28SQL.100%29.aspx
  1. Отключить на диске с Filestream генерацию файлов в формате 8.3 (Volume_path – опциональный параметр): FSUTIL BEHAVIOR SET DISABLE8DOT3 1
    Об утилите FSUTIL
  2. Отключить обновление времени последнего доступа к файлу на сервере с Filestream: FSUTIL BEHAVIOR SET DISABLELASTACCESS 1
  3. Отключить на диске с Filestream индексирование операционной системы
  4. Добавить логический диск с Filestream в исключения антивирусных программ
  5. Дефрагментировать логический диск с Filestream
  6. Рекомендуемый размер кластера в NTFS – 64 Кб
  7. Не использовать RAID-5 для размещения Filestream
  8. Отключить опции AutoShrink и AutoClose в базе данных
Читать дальше

Оставить комментарий (всего: 0)

Програмное выделение номера в карточках конструктора решений

В карточках конструктора решений есть свойство типа "Нумератор". Оно позволяет пользователю выделить номер. Но как решить задачу автоматического выделения номера, например, при открытии карточки?

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


Обработчик события AfterActivate - будет выполнен сразу после открытия карточки.

на С#
// обработчик события AfterActivate - будет выполнен сразу после открытия карточки
private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
{
// получаем свойство типа "Нумератор". Нужно указать название свойства
var numeratorProperty = GetCardProperty("Регистрационный номер");
// если номер уже задан, то выходим из метода, ничего не делая
if (numeratorProperty.Value != null)
return;
// получаем атрибут правила и его значение (идентификатор)
var ruleAttribute = numeratorProperty.Description.GetAttribute("Rule");
Guid? ruleId = (Guid?)ruleAttribute.Value;
// с помощью преобразователя данных создаем новый номер по правилу
var numeratorMapper = new DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(
Session, CardData.Id, DomainObject.NumbersSectionId.Value);
var number = numeratorMapper.Create(ruleId.Value);
// устанавливаем новое значение свойства
numeratorProperty.Value = number;
// обновляем элементы карточки, чтобы отобразить новое значение
RefreshControls();
}

// вспомогательный метод поиска элемента по названию
private CardProperty GetCardProperty(string propertyName)
{
foreach (CardProperty property in PropertyController.CardProperties)
{
if (property.Name == propertyName)
return property;
}
return null;
}

Vb.net

Private Sub cardControl_AfterActivate(sender As System.Object, e As System.EventArgs)
 
  ' получаем свойство типа "Нумератор"
  Dim numeratorProperty AS DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty  = GetCardProperty("Регистрационный номер")
  ' если номер уже задан, то выходим из метода, ничего не делая

  If numeratorProperty.Value IsNot Nothing Then
   Return
  End If
  ' получаем атрибут правила и его значение (идентификатор)
  Dim ruleAttribute as DocsVision.BackOffice.Model.Layouts.Entities.PropertyAttribute = numeratorProperty.Description.GetAttribute("Rule")
  
  Dim ruleId As System.Nullable(Of Guid) = CType(ruleAttribute.Value, System.Nullable(Of Guid))
  ' с помощью преобразователя данных создаем новый номер по правилу
  Dim numeratorMapper as DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper  = New DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(me.Session, CardData.Id, DomainObject.NumbersSectionId.Value)
  Dim number as DocsVision.BackOffice.Model.CardProperties.Entities.NumeratorNumber  = numeratorMapper.Create(ruleId.Value)
  ' устанавливаем новое значение свойства
  numeratorProperty.Value = number
  ' обновляем элементы карточки, чтобы отобразить новое значение

  me.PropertyController.RefreshControls
  
    End Sub


 ' вспомогательный метод поиска элемента по названию
 Private Function GetCardProperty(propertyName As String) As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty 
  For Each [property] As DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty In PropertyController.CardProperties
   If [property].Name = propertyName Then
    Return [property]
   End If
  Next
  Return Nothing
 End Function
Читать дальше

Оставить комментарий (всего: 0)

Ctrl-C

Так получилось, что под конец года совсем нет времени писать новые статьи в наш блог. В четвертом квартале сдается много проектов, и обычно количество инцидентов становится чуть больше (о распределении инцидентов в течение года расскажу позже :).
В этом есть плюс: по окончании решения будет много полезной информации из опыта.

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

[Window Title]
Trusted sites

[Content]
Sites added to this zone must use the  https:// prefix. This prefix assures a secure connection.

[OK]

p.s. В окнах сообщений DocsVision есть кнопка "Больше" и "Скопировать текст сообщения" Читать дальше

Оставить комментарий (всего: 0)

Значения по умолчанию в поле типа Дата

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

Для этого достаточно указать значение

Сегодня+NД

где N - нужное количество дней Читать дальше

Оставить комментарий (всего: 0)

Планирование ресурсов

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

Ответ в первом приближении можно найти достаточно просто. Для этого необходимо замерить использование 3х классических ресурсов: используемое процессорное время, используемая память, обращение к системе ввода-вывода.

Рассмотрим конфигурацию, которая описана здесь http://dvprofessionals.blogspot.com/2009/08/blog-post_21.html
Основные процессы:
  1. sqlservr
  2. DocsVision StorageServer
  3. DocsVision Workflow Server
  4. ExecLogic
  5. ExecLogic*32
  6. w3wp

Распределение процессорного времени 
Счетчик: Process | % processor time




Что видно. Основной потребитель - сервер баз данных. Особой постоянной нагрузки нет, только пики. Но если нужно оптимизировать этот ресурс, то MS SQL Server можно перенести на другой сервер.

Использование памяти.
Счетчик: Process | Working Set




Основной потребитель - процесс ExecLogic*32 (это процесс, который непосредственно обрабатывает функции бизнес-процессов. В данном случае 32 разрядные функции).
Это не критично - данному процессу можно ограничить память при помощи настройки в Консоли настройки.
Помимо этого, следующим процессам можно ограничить объем потребляемой памяти:
ExecLogic - в консоли настройки
w3wp - настройка рециклинга (Recycling) в пуле приложений IIS (Application pool)
sqlservr - настройкой памяти в свойствах сервера MS SQL Server.

Использование системы ввода-вывода
Счетчик: Process | IO Data operations /sec


Данный счетчик фиксирует не только обращения к диску, но и сетевые операции. И тут лидерами будут ExecLogic32 и DocsVision StorageServer, из-за частых сетевых вызовов.

Отдельно полезно будет посмотреть длину средней очереди к диску. Но этот счетчик не относится к конкретному процессу, а характеризует производительность в целом.

Какой можно сделать вывод. Для данной конкретной конфигурации не требуется разделения на несколько серверов. Однако, при росте первым кандидатом на переезд будет MS SQL Server.

Будет полезно, если кто-либо из гуру по системному администрированию покритикует методики измерения в комментариях. Читать дальше

Оставить комментарий (всего: 4)

Контроль за временем отклика сервера.


В версии DocsVision 4.5 есть встроенный функционал проверки длительности выполнения определенных операций. Настройка выполняется, как обычно, в консоли, параметр "Время отклика сервера"

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

Как быть пользователям предыдущих версий. Конечно, переходить на 4.5 :)
Но можно также сделать подобный функционал проверки в виде внешней утилиты.

Каким функционалом должен обладать данный инструмент.
1. Проверять время создания сессии
2. Проверять длительность получения данных карточки
3. Проверять время выполнения поиска и т.п.

В случае невыполнения указанных параметров сигнализировать о проблеме.

Пример подобной утилиты я выложил на ftp. В архиве утилита, скомпилированная для DocsVision 4.1, инструкция, и исходный код.


Комментарий для желающих доработать. Основные методы проверки реализованы в библиотеке DVCheckObjects. Т.е. можно написать, например, консольное приложение, которое будет использовать данную библиотеку, и назначить это приложение как задачу в Task Scheduler на сервере. Читать дальше

Оставить комментарий (всего: 0)

Вынос Workflow сервиса на отдельную машину


При решении задачи отделения сервиса DocsVision Worklow Service на отдельную машину ранее предлагался следующий способ
1. установка еще одного сервиса Workflow (обозначим его как W2)
2. объединение сервиса, который работает вместе с сервером DocsVision (обозначим его как W1) и внешнего сервиса СУБП в один кластер
3. установка доли процесса в 1% для сервиса W1, для того, чтобы он не обрабатывал бизнес-процессы.

Наличие работающей службы W1 было необходимо для того, чтобы пользователи смогли запускать бизнес-процессы. Без работающей службы этого сделать нельзя, хотя и не всегда требуется.
Данный способ вполне легален, но требует наличия возможности создания кластера, которая включена в лицензию.

В данной статье я расскажу о способе, как вынести только один сервер. Способ не является официальным, однако прекрасно работает.

Обозначим S1 - машина на которой установлен сервер DocsVision, S2 - машина, на которой установлен только сервис Workflow.
  • На S1 останавливаем сервис DocsVision Workflow Service
  • На S1 и S2 создаем значение MachineName  (строка) в ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\DocsVision\Workflow\4.5\WorkflowServer
  • На S2 в ключе реестра  HKEY_LOCAL_MACHINE\SOFTWARE\DocsVision\Workflow\4.5 указываем адрес соединения с сервером S1 и название базы в BaseName
  • Выполняем два скрипта на базе данных
    DELETE FROM dvsys_sessions where AppID='20F4B6CD-B2F6-4702-BB13-ADF848A4F66F'
    UPDATE dvsys_workflow_services SET ServiceID = 'имя сервера S2, на котором работает WF'
    Данные скрипты очищают открытые сессии от сервиса Worklfow, и указывают новое имя сервиса Workflow (Это все можно сделать и через консоль настройки)
  • Перезапускаем IIS и DocsVision StorageServer Service на S1 и DocsVision Workflow Service на S2. Помним, что на S1 DocsVision Workflow Service должен быть остановлен - он нам не нужен
Готово, после перезапуска служб будем иметь конфигурацию, при которой сервис управления бизнес-процессами будет работать на отдельном сервере.
Читать дальше

Оставить комментарий (всего: 2)

Програмное завершение задания бизнес-процесса

Програмно завершить задание бизнес-процесса можно следующим образом

1. В секции "Performing"  установить
    а) в поле TaskState значение 5 (исполнено)
    б) в поле ActualEndDate текущую дату (дату завершения)
2. В секции "CurrentPerformer" установить
    а)  в поле PerformerState значение 5 (исполнено), если задание было делегировано, то 13 (возврат с делегирования)

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

Так же нужно завершить задания контроллеров, если такие есть. Читать дальше

Оставить комментарий (всего: 3)

Поддержим по особому

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

  1. Расширенное время работы 8:00-20:00 (МСК)
  2. Улучшенные сроки создания исправлений. Исправление может быть создано в не зависимости от наличия обходного сценария.
  3. Возможность работы по выходным и праздничным дням
  4. Уведомления об обнаруженных ошибках и исправлениях
  5. Закрепленный менеджер
Помимо этого инциденты с критическим и высоким приоритетами могут решаться специалистами службы технической поддержки непосредственно на сервере заказчика через удаленный доступ.

Подробнее об этой поддержке http://www.docsvision.com/support/rasshirennaya/

Таблица сравнения http://www.docsvision.com/support/ Читать дальше

Оставить комментарий (всего: 0)

Пользовательские настройки в представлениях

Начиная с версии 4.3 появилась возможность сохранения пользовательских настроек представлений (сортировка, группировка, порядок, размеры столбцов и т.п.).

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

Для удаления пользовательских настроек определенного представления и возврата его к настройкам по умолчанию необходимо обновить папку с данным представлением (кнопка Обновить на панели инструментов), удерживая при этом нажатой клавишу Shift, либо открыть представление для редактирования и сохранить его, ничего не меняя.

Для сброса всех пользовательских настроек всех представлений можно воспользоваться следующим скриптом:

UPDATE [dbo].[dvtable_{f94300eb-284e-4ab4-88ad-1e1d34d88f70}_userdependent]
SET UserLayout = NULL,
UserLayoutState = NULL

Если вы неуверены в своих действиях, перед выполнением скрипта рекомендуется сделать бэкап базы или сохранить настройки в другой таблице:

CREATE TABLE user_settings_copy
(
RowID uniqueidentifier NOT NULL,
UserLayout varbinary(max) NULL,
UserLayoutState int NULL
)

INSERT user_settings_copy
(
RowID,
UserLayout,
UserLayoutState
)
SElECT RowID, UserLayout, UserLayoutState
FROM [dbo].[dvtable_{f94300eb-284e-4ab4-88ad-1e1d34d88f70}_userdependent] Читать дальше

Оставить комментарий (всего: 1)

Выбор темы

Относительно недавно Blogger прикрутил функциональность статистики для блога. Теперь в деталях видно, например, что искал пользователь переходя по ссылке на этот блог.
Например, данные за последние сутки.
Следовательно статьи можно делать более актуальными. А можно и спросить прямо. Какая тема интересна? Читать дальше

Оставить комментарий (всего: 3)

Два нововведения в системе обработки обращений

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


Вашему обращению присвоен новый приоритет или изменен ответственный.
Приоритет: Плановый
Ответственный: Zakharov Mikhail
Состояние: Ожидает ответа инженера технической поддержки

Your incident has a new priority or a new responsible person.
Priority: Planned
Responsible: Zakharov Mikhail
State: Waiting for solution

29.09.2010 17:47


Какие бывают состояния, и что они означают?

Инцидент может иметь следующие состояния:
  1. Открыт - устанавливается при регистрации нового обращения на время до взятия его в работу. 
  2. Ожидает ответа инженера технической поддержки - это означает, что инцидент поставлен в очередь и ждет рассмотрения инженером
  3. Ожидает ответа инженера технической поддержки. Требуется консультация разработчика - инцидент был рассмотрен инженером, но потребовались уточнения разработчика, и ему отправлен вопрос.
  4. Ожидает ответа от вас - ответ был отправлен вам
  5. Решен - ответ был отправлен вам, мы считаем, что он полностью отвечает на вопрос и ждем соответствующего подтверждения
  6. Закрыт - инцидент был закрыт.

Необходимо помнить, что вне зависимости от статусов 1,2 и 3. наш ответ всегда будет отправлен в соответствии с регламентом и приоритетом.

Нет, штука в том, что теперь можно отправить на ящик службы ТП письмо с темо

?[Incident 12345]

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

Сервис №2. Отправив запрос с темой
??[Incident 12345]

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

Оставить комментарий (всего: 4)

Сохранение данных карточки в скрипте конструктора решений.

Задача сохранения данных карточки бывает двух видов: сохранение данных из контролов в CardData, и сохранение CardData на сервер.

Решением первого случая будет вызов
this.PropertyController.Save();
Для сохранения данных на сервер нужно воспользоваться неким трюком. Для решения подошел бы метод SaveData, используемый внутри карточки, но он не является открытым (вероятно, это будет изменено в следующих версиях). Сейчас им можно воспользоваться следующим способом:
typeof(BaseCardControl).GetMethod("SaveData", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).Invoke(CardControl, null);
Читать дальше

Оставить комментарий (всего: 1)

Новая версия мастера сбора данных при сбоях

Немного обновлен мастер сбора данных при сбоях.

Скачать можно по ссылке.
Либо воспользовавшись кнопкой "Проверить наличие обновлений"

Все функции работают только при анализе сбоев DocsVision 4.1. На всех остальных версиях можно собирать дамп.

Поддерживается Windows 7 Читать дальше

Оставить комментарий (всего: 0)

Получаем список открытых сессий при помощи скрипта Powershell

Многие операции я предпочитаю делать из командной строки, для чего использую консоль Powershell. О перезагрузке сервисов я уже писал ранее.
Теперь поговорим об операциях с сессиями.

Частой задачей является просмотр идентификатора сессии и получение списка открытых сессий. Напишем для этого соответствующий скрипт.

В объектной модели DocsVision уже есть соответствующий класс DocsVision.Platform.ObjectManager.SessionManager. А в его объекте метод GetOpenSessions. Поэтому вся задача разбивается на три:
  • Подключение сборки к скрипту PowerShell
  • Создание сессии и получение списка сессий
  • Вывод данных
 Поскольку сборка зарегистрирована, то подключать её будем по имени
[System.Reflection.Assembly]::LoadWithPartialName("DocsVision.Platform.ObjectManager")   
На вход наш скрипт будет принимать два аргумента: адрес сервера и имя базы.
[string]$ConnStr=$args[0]
[string]$Base=$args[1]
Есть поле для доработок - эти данные можно читать прямо из реестра.

Полный текст скрипта:
[System.Reflection.Assembly]::LoadWithPartialName("DocsVision.Platform.ObjectManager")        
[string]$ConnStr=$args[0]
[string]$Base=$args[1]

write-host($ConnStr)

# Создаем сессию
$SM = [DocsVision.Platform.ObjectManager.SessionManager]::CreateInstance()
$SM.Connect($ConnStr,$Base)
[DocsVision.Platform.ObjectManager.UserSession]$US=$SM.CreateSession()
Write-Host ("--------------------------------------------------------------------------------------")
write-host "YOUR SESSION ID: ", $US.ID
Try
{
    # Получаем открытые сессии
    [DocsVision.Platform.ObjectManager.InfoRowCollection]$Sessions = $SM.GetOpenSessions()
    write-host "SESSION COUNT: ", $Sessions.Count
    write-host ("Session ID`t`t`t","Account`t","Login time`t","Last access`t","Computer","IP") -Separator "`t"
    foreach ($Row in $Sessions)
    {
        write-host ($Row.Item(0),$Row.Item(1),$Row.Item(2),$Row.Item(3),$Row.Item(4),$Row.Item(5)) -Separator "`t"

    }
}
Finally
{
    $SM.CloseSession($US.ID)
}

Скачать скрипт

UPD: Будет работать на 4.5 и 4.3. На машине, на которой запускается скрипт как минимум должны стоять клиентские компоненты DocsVision.
UPD2: Пример запуска скрипта: get-dv45-sessions http://server/DocsVision/StorageServer/StorageServerService.asmx dv1966
Читать дальше

Оставить комментарий (всего: 3)

64 битная версия Microsoft Office

Используется ли в вашей компании (если вы пользователь DocsVision), или у компании заказчика 64 битная версия Microsoft Office?
Речь не идет о единичных пользователях, или админах. А о рядовых сотрудниках. Планируете ли переход на данную редакцию Office?

Опрос включен в левой колонке, сверху. Читать дальше

Оставить комментарий (всего: 1)

Конструктор решений. Запуск бизнес-процесса из скрипта на событие

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

Оставить комментарий (всего: 0)

Работа DocsVision 4.5 через ISA сервер

 В прошлом посте я описал случаи возникновения ошибки "Не удалось разобрать SOAP сообщение, полученное от сервера". В версии DocsVision 4.5 мы столкнулись с еще одним случаем, который связан с настройкой ISA сервера.

Началось все с инцидента, в котором была описана вроде бы типичная ситуация. Пользователь при входе получает данное сообщение об ошибке. Отличие было в том, что пользователь был внешний, а HTTP трафик от клиента (Навигатора) шел ко внутреннему серверу DocsVision через ISA сервер.

Исследование было начато по привычному плану: запущен HTTP отладчик Fiddler и открыт Навигатор. Далее при исследовании ответа от сервера (я то ожидал в логе увидеть что-нибудь вида ошибки 403) было обнаружено, что пакет приходит вполне обычный.
Тогда возник вопрос. Может сам пакет каким-либо образом поврежден, что не дает возможности правильно его интерпретировать. И точно. Выяснилось следующее.
В версии DocsVision 4.5. для оптимизации производительности и ускорения передачи данных по пути клиент-сервер, сервером DocsVision производится сжатие пакетов по протоколу deflate.
Таким образом в заголовке HTTP пакета установлен флаг "Content-Encoding: deflate" (см. верхний скриншот). Выявлено, что при прохождении данного пакета через ISA сервер происходит его изменение. Флаг "Content-Encoding: deflate" установлен, но при этом само содержимое пакета не сжато.

Анализируем содержимое пакета. Видно что его текст легко читается, т.е. он не сжат. Тем не менее Fiddler (и соответственно DocsVision тоже) читая значение флага показывает, что текст необходимо раскодировать.

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

На данный момент нам неизвестно, какие настройки ISA сервера влияют на это. Прошу специалистов в данной области дать ответ. Читать дальше

Оставить комментарий (всего: 7)

Не удалось разобрать SOAP сообщение, полученное от сервера

При открытии Навигатора, либо при программном соединении с сервером вы можете встретить сообщение об ошибке "Не удалось разобрать SOAP сообщение, полученное от сервера". В чем может быть причина.

Данное сообщение об ошибке отображается в случае если ожидается ответ от сервера в определенном формате, а приходит что-то другое.




В каких случаях это может быть?
1. Сервер возвращает какую-либо страницу об ошибке: 403, 404
2. Подключение идет по неверному адресу (к другому сайту и т.п.)

Для проверки нужно под пользователем, под которым производится соединение открыть страницу http://server/DocsVision/StorageServer/StorageServerService.asmx

Либо можете другим способом. Переведите транспортный протокол в консоли настройки на HTTP+SOAP. Затем запустите на машине, на которой работает ваш код какой-либо HTTP отладчик. Например Fiddler. И посмотрите, какой ответ возвращает сервер.

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

Оставить комментарий (всего: 0)

Особенности обновления скриптов карточек при переходе на 4.5

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

1. Из скрипта на событие "изменение свойства" записать новое состояние невозможно, т.к. оно всегда перезаписывается на то, что в данный момент выбрано в UI.
Смену состояния надо делать в скрипте кнопки тулбара (функция), сохранения или закрытия.
Для кнопки тулбара есть специальный флаг DoEvent = 1024 показывающий то, что состояние было изменено.

2. При возврате DoEvent=16 - сохранение изменений, значения из вкладки "Основная" будут записаны из UI в CardData. Т.е. если вы в скрипте на кнопку-функцию изменили, например Название карточки, а затем вернули DoEvent=16, то ваши изменения будут затерты значениями из UI. Решением для такого случая будет перенос кода, который изменяет поля, на событие "сохранение". Событие "Сохранение" теперь вызывается каждый раз при возврате DoEvent=16

3. Если карточка только что создана, а в скрипте на кнопку-функцию вы возвращаете флаг DoEvent=64 (установка признака сохранения), то при первом закрытии так же будет отображаться диалог с предложением сохранить карточку. Дело в том, что в 4.5 при первом сохранении создается ярлык на карточку (чего не делается при указании флага 64). Следовательно появляется данный диалог Читать дальше

Оставить комментарий (всего: 3)

Представления по свойствам карточки

Для вывода в представление значений пользовательских свойств карточки самый простой способ - это выбрать тип колонки Свойство карточки и указать название свойства.



При этом в представлении выводится Отображаемое значение, т.е. значение типа Строка.
Однако при таком способе возможны проблемы с корректным отображением (применение формата, сортировка и т.п.) значений свойств типа Дата/Время, дробное и т.п.
В таких случаях необходимо выбрать тип колонки Поле раздела и выводить Значение свойства из секции Свойства.



Для свойств-коллекций (если нужно каждое значение вывести в отдельной строке) необходимо присоединить к секции Свойства раздел Выбранные значения (RowID - ParentRowID) и использовать Выбранное значение из данного раздела.



Тип данных колонки должен соответствовать типу данных свойства, иначе возможны SQL ошибки, связанные с преобразованием типов данных.
Читать дальше

Оставить комментарий (всего: 0)

Две новости

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

Появился новый модуль: Кластер баз данных. Предназначен для распределения нагрузки между несколькими серверами MS SQL Server. Для крупных решений самое то. Подробнее смотрите по ссылке. Читать дальше

Оставить комментарий (всего: 0)

Установка DocsVision на 64-битный сервер

Очень часто при установке DocsVision на 64-битный сервер при открытии навигатора пользователи сталкиваются с ошибками

Невозможно открыть сессию. Проверьте правильность соединения и работоспобность сервера
Указанная база не существует
или
DocsVision Server has incorrect license key

Причина ошибки в том, что IIS (пул приложений) работает не в соответствующем разрядности приложения режиме и данные читаются не из той ветки реестра (HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\DocsVision для 32-битных приложений или HKEY_LOCAL_MACHINE\SOFTWARE\DocsVision для 64-битных).

Как решить проблему?
Если устанавливается 32-битная версия DocsVision на 64-битный сервер необходимо:

- для IIS6 (WinXP, Server 2003) выполнить действия, описанные в статье
http://support.microsoft.com/default.aspx?scid=kb;en-us;894435
раздел ASP.NET 2.0, 32-bit version
Проверить правильность выполненных действий можно следующим образом: в IIS Manager - Web Service Extensions должна быть запись ASP.NET v2.0.50727 (32-bit) Allowed



- для IIS7 (Vista, Server 2008) — изменить настройку в пуле, для чего последовательно выполнить: открыть Internet Informational Services Manager —> перейти к Application Pools —> выбрать пул в котором работает DocsVision —> открыть окно расширенных настроек Advanced Settings, в этом окне установить значением поля Enable 32-bit Applications True.



Если же устанавливается 64-битная версия DocsVision на 64-битный сервер и возникла подобная ошибка необходимо:

- для IIS6 (WinXP, Server 2003) выполнить действия, описанные в статье
http://support.microsoft.com/default.aspx?scid=kb;en-us;894435
раздел ASP.NET 2.0, 64-bit version

- для IIS7 (Vista, Server 2008) — изменить настройку в пуле, для чего последовательно выполнить: открыть Internet Informational Services Manager —> перейти к Application Pools —> выбрать пул в котором работает DocsVision —> открыть окно расширенных настроек Advanced Settings, в этом окне установить значением поля Enable 32-bit Applications False. Читать дальше

Оставить комментарий (всего: 2)

Програмный запуск бизнес-процессов

Симптом.
После обновления на DocsVision 4.5 перестал работать скрипт, создающий по шаблону экземпляр бизнес-процесса. После выполнения скрипта сервис Workflow перестает обрабатывать бизнес-процессы. Помогает только остановка экземпляра и его повторный запуск.

В чем причина.
Вероятная причина ошибки - некорректный скрипт, если в данном скрипте используется какая-либо собственная процедура запуска процесса, и в данной процедуре не заполняется поле  DateBegin из основной секции процесса. Необходимо обязательно заполнять это поле в текущее значение времени (Now). Значение этого поля важно для сортировки активных процессов в очереди на обработку.

Единственный штатный способ программно запустить процесс с клиента с использованием  COM-компонент -это использование UserSession.WorkflowManager.GetProcess(processID).Start()

Что нужно сделать.
Если причина подтвердилась, то необходимо. Всем экземплярам процессов у которых поле DateBegin = null нужно прописать дату.

После исправления процессов и скрипта, надо перезапустить службы DocsVision Workflow, DocsVision StorageServer и IIS. Читать дальше

Оставить комментарий (всего: 0)

Инцидент №50000

Именно с таким номером сегодня зарегистрирован инцидент в нашей службе поддержки. Даёт ли это какую-нибудь оценку? Да в общем нет :)

Нумерация у нас идет по порядку вперед. Если номер освобожден, то он занят не будет. Но, тем не менее, это признак того, какое количество запросов, включая спам, мы обработали.

Наша техподдержка самая открытая в мире. Не скрываем от вас, что
- всего зарегистрировано инцидентов (если исключить весь спам и пр.) у нас 34655.
- сейчас приходит около 100 различных обращений в неделю - лето же :)

Посмотрим на самый низкий приоритет в нашей иерархии: "Плановый". Какое среднее время ответа будет по этому приоритету?
Ответ: 7.2 часа (ср. с максимальным возможным 32 часа http://www.docsvision.com/index.phtml?Name=support1).

Возьмем выборку из 200 инцидентов и взглянем на график среднего времени ответа по каждому инциденту:

Есть пики, но в основном значения гораздо ниже нормативного значения времени реакции. Читать дальше

Оставить комментарий (всего: 0)

DocsVision на iPad.

Интригует? Компания Digital Design, премиум партнер компании DocsVision, сообщила об открытии Центра разработки решений для iPad. Одной из задач нового Центра является намеченный на сентябрь 2010 года выпуск мобильного клиента под iPad для системы электронного документооборота DocsVision.
Как отметил  Сергей Курьянов, директор по развитию компании DocsVision:- «Взрывной рост спроса на бизнес-решения на базе планшетов и смартфонов отражает не просто моду на гаджеты, а растущий спрос пользователей на индивидуальную информационную среду, соответствующую не только должности и обязанностям человека, но и его личным вкусам и склонностям. Недавно мы выпустили новый инструмент для создания решений, поддерживающих индивидуальные конфигурации рабочих мест – Конструктор Решений DocsVision. Безусловно, в ближайшее время планшетных устройств станет много, и работать они будут на разных операционных системах. Но формфактор планшета, как персональной рабочей станции, останется надолго. Уверен, что опыт, полученный Digatal Design в пилотных разработках на базе iPad, вскоре станет с нашей помощью доступен всей партнерской сети и всем заказчикам DocsVision, использующим, или собирающимся использовать устройства этого класса»

Пресс-релиз компании Digital Design и скриншоты прототипа МРМ DocsVision на iPad доступны по ссылке:
http://www.digdes.ru/news/innovacionnyj_centr_razrabotki_reshenij_dlya_ipad/


Если вы разрабатываете новые решения на платформе DocsVision, расскажите об этом. Есть статья об этом? Публикуйте на нашем блоге. Читать дальше

Оставить комментарий (всего: 3)

Установка DocsVision 4.5 на одном сайте с SharePoint

В руководстве по установке и настройке есть уточнение: если мы хотим установить DocsVision в тот же сайт, что и SharePoint, то достаточно исключить сайт DocsVision из управляемых путей (более подробнее см. руководство). На практике этого оказалось недостаточно.
Рассмотрим два случая: установка в один сайт с SharePoint 2007, и SharePoint 2010. Тестовая установка и моделирование ситуации производилось на следующих машинах

1. SharePoint Server 2007+ Windows Server 2008R2
2. SharePoint Server 2010+ Windows Server 2008R2

Рассмотрим первый случай.
Перед началом моделирования, на машине уже был установлен MOSS 2007 и DocsVision 4.5. Причем DocsVision был размещен на отдельном сайте, и порту. Так же оба приложения работали в раздельных пулах.

Шаг 1. Переносим DocsVision в сайт MOSS 2007

Для этого в консоли настройки, ветка "Сервер", указываем сайт на котором установлен SharePoint. Сохраняем настройки. Сайт сконфигурирован.

После этого, если открыть сайт по ссылке http://server/DocsVision45, то будет отображаться сообщение об ошибке.


Чтобы его обойти нужно открыть файл Web.config, который находится в папке DocsVision и закоментировать строчку (при помощи <!-- -->):
<sessionState mode="SQLServer" timeout="60" allowCustomSqlDatabase="true" partitionResolverType="Microsoft.Office.Server.Administration.SqlSessionStateResolver, Microsoft.Office.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
(EditWebConfig.jpg)


Шаг 2.Перезапуск IIS
Перезапустите IIS. Далее при открытии http://server/DocsVision45, было уже другое сообщение Server Application Unavailable.

Данная ошибка связана с тем, что сам сайт работает в пуле, в котором включен режим Classic, а пул DocsVision работает в Integrated. Меняем режим.

Перезапускаем IIS. Все. после этого сайт DocsVision заработал

Второй случай: SharePoint 2010.
К началу эксперимента DocsVision на сервере  не был установлен. Поэтому при инсталляции сразу указываем, что установка должна производится в тот же сайт, где находится SharePoint.

После установки пробуем открыть Навигатор, ожидая поведения как в первом случае. Но натыкаемся на совершенно другую ошибку:

При открытии Навигатора ошибка 500.19

Module IIS Web Core
Notification BeginRequest
Handler Not yet determined
Error Code 0x800700b7
Config Error There is a duplicate 'system.web.extensions/scripting/scriptResourceHandler' section defined 
Config File \\?\C:\Program Files\DocsVision\Platform\4.5\Server\Site\web.config

Проблема обнаружилась в конфликте конфигурационных файлов сайта SharePoint и приложения DocsVision. Придется выполнить хак, немного модифицировав web.config сайта DocsVision:

1. закомментировать ConfigSection раздел, и Pages/Controls.

2. после этого перевести пул DocsVision в режим Classic.

После этого Навигатор откроется успешно. Читать дальше

Оставить комментарий (всего: 1)

Настройка дайджеста с помощью XSLT

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

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


Чтобы вывести в дайджест значение поля, необходимо написать конструкцию вида:
<xsl:value-of select="//Имя_секции/@Имя_поля"/>

А для вывода в дайджест значения свойства:

<xsl:value-of select="//CustomPropertiesRow[@Property_Name='Имя свойства']/@Value"/>



Теперь продемонстрируем пример дайджеста,
выводящего данные о названии маршрута и его типе из карточки Маршрута:

Маршрут "<xsl:value-of select="//CustomPropertiesRow[@Property_Name='Название маршрута']/@Value"/>". Тип: <xsl:value-of select="//Main/@RouteType"/>

Результат настройки дайджеста будет выглядеть так:

Маршрут "Для согласования юр.док-ов". Тип: последовательный
Читать дальше

Оставить комментарий (всего: 3)

Редактирование данных в связанных полях

В Конструкторе есть простой и эффективный механизм связанных полей, позволяющий автоматически подтягивать значения по ссылке из других карточек и справочников.
Однако этот механизм позволяет лишь показывать данные из других объектов, не позволяя их отредактировать и сохранить.
Если стоит задача вытащить данные по ссылке в контролы, чтобы позволить затем пользователю их редактировать, то придется немного потрудиться...

Задача.
Предположим, у нас есть карточка маршрута согласования и карточка документа, где это маршрут используется. Карточка маршрута служит для описания типовых маршрутов и содержит список согласующих лиц, тип маршрута (последовательный, параллельный) и другие параметры. В документе, после выбора типового маршрута хочется дать пользователю возможность отредактировать список согласующих лиц и тип маршрута.

Решение.
В карточке документа размещаем 3 основных контрола:
- Выбор маршрута (контрол типа Ссылка на карточку)
- Тип маршрута (контрол типа Группа радиокнопок)
- Согласующие лица (контрол типа Сотрудники)
а также 2 вспомогательных контрола:
- Тип маршрута Вспомогательный (контрол типа Группа радиокнопок)
- Согласующие лица Вспомогательный (контрол типа Сотрудники)
Вспомогательные контролы делаем невидимыми (устанавливая атрибут Visibility в Invisible или EmptySpace) и привязываем по ссылке к соответствующим полям карточки маршрута согласования, выбираемой в контроле Выбор маршрута (как это сделать, описано в руководстве администратора).
Затем пишем следующий скрипт для события ControlValueChanged контрола Выбор маршрута:

using System;
using System.Windows.Forms;
using DocsVision.Platform.ObjectManager;
using DocsVision.BackOffice.View.WinForms;
using DocsVision.BackOffice.Model;
namespace ScriptNamespace
{
public class ScriptClass
{
public void Execute(UserSession session, CardData cardData, baseCardControl cardControl)
{
// Получение значения связанного свойства, которое на форме сделано невидимым.
// Его единственная задача - получить значение по ссылке
object propertyValue = cardControl.PropertyController.GetPropertyValue("Тип маршрута Вспомогательный");
// Запись значения в свойство
cardControl.PropertyController.UpdateProperty("Тип маршрута", propertyValue);
// То же для контрола типа Список сотрудников
object propertyValue2 = cardControl.PropertyController.GetPropertyValue("Согласующие лица Вспомогательный");
cardControl.PropertyController.UpdateProperty("Согласующие лица", propertyValue2);
// Обновление элементов управления
cardControl.PropertyController.RefreshControls();
}
}
}

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

Оставить комментарий (всего: 0)

Загрузка библиотек карточек при помощи CardManager

Есть одна особенность использования утилиты CardManager при загрузке карточек в базу.

При загрузке карточек CardManager получает версию библиотеки DocsVision.Platform.Data.dll. И эту версию указывает в поле SysVersion при генерации скрипта.

Следовательно, если CardManager запускается не на сервере DocsVision, а на другом, где установлена другая версия DocsVision, то и в базу карточки будут загружены с указанием той версии сервера, на котором запускался CardManager.

Это может привести к тому, что карточки будут не видны в Навигаторе Читать дальше

Оставить комментарий (всего: 0)

Действия с разработанными библиотеками при обновлении базы.

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

Делается это просто. Необходимо прописать в поле SysVersion таблиц dvsys_libraries и dvsys_carddefs текущую версию БД. Естественно нужно это делать только для своих библиотек и карточек.

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

UPDATE dvsys_libraries SET SysVersion='1964' WHERE Alias='DVManagement'
UPDATE dvsys_carddefs SET SysVersion='1964'
Читать дальше

Оставить комментарий (всего: 0)

Регулярный опрос о работе службы технической поддержки.


Завершился второй квартал, и мы в очередной раз спрашиваем – как вам работа нашей службы технической поддержки. Ссылка на опрос отправляется всем тем, кто открывал у нас инциденты этот период. Но активности маловато: на 349 адресов было отправлено письмо, а результатов всего 44. Почему так мало-то? Если вы обращались к нам во втором квартале, но никакого письма с приглашением принять участие в опросе не получали, сообщите нам. Лучше стандартным путем – письмо на ящик технической поддержки. В комментариях оставлять свои адреса не нужно, спамеры замучают.

Интересно, что больше всего ответов на опрос дали наши любимые клиенты: 24, а от партнеров меньше – соответственно 20. При этом, что гораздо больше инцидентов открывается партнерами во время внедрения, когда активно идет настройка и модификация.

Самый частый вопрос, который мне задают, – почему нет поддержки по ICQ? Задам встречный вопрос, - чем, для вас, отличается поддержка по ICQ от поддержки по телефону?
Ответы жду в комментариях.

p.s. Да, опрос анонимный. Мы специально не собираем никаких данных о тех, кто ответил. Читать дальше

Оставить комментарий (всего: 6)

Партнерский форум 2010.


Завершился 5-й Партнерский форум DocsVision.
Как и в прошлые годы форум был насыщен интересными докладами.

Кто не смог приехать в этом году – может приобщиться к нему посредством выложенных на нашем сайте материалов и фотографий.


http://partners.docsvision.com/V%20%20%20DocsVision/Forms/AllItems.aspx
ftp://ftp.docsvision.com/Forum2010/Foto/1/
ftp://ftp.docsvision.com/Forum2010/Foto/2/ Читать дальше

Оставить комментарий (всего: 0)

Скрипт для переноса базы DocsVision 4.5 с редакции Enterprise на другую

В продолжение статьи.

Для переноса базы DocsVision 4.5 с MS SQL Enterprice (Developer), на редакцию MS SQL Standart. Необходимо предварительно выполнить специальный скрипт, а затем создавать и переносить бекап.

Скачать скрипт для DocsVision 4.5

Скрипт для предыдущих версий 4.1 и 4.3 Читать дальше

Оставить комментарий (всего: 0)

Поиск по свойству-коллекции

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


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





Читать дальше

Оставить комментарий (всего: 1)

Пример разработки собственного отчета на Silverlight

В этой статье я бы хотел показать, как можно быстро создать гибкий и красивый (зависит от фантазии дизайнера) отчет с применением технологии Silverlight. К числу преимуществ WEB-отчета (Silverlight в частности) можно вписать:
  • Простота развертки (не надо каждый раз при обновлении разворачивать на клиентах msi'ники)
  • Возможность просмотра как в навигаторе (настроив папку на отображения отчета по URL), так и вне его (просто в браузере).
  • Так как физически отчет находится на сервере – это значит, что удобно использовать MSSQL Server напрямую для выборки данных для отчета (хотя никто не мешает задействовать и DV API)

Silverlight предоставляет возможность создавать действительно «богатые» интерфейсы (rich UI) декларативно на языке XAML (так же, как и в WPF). Например, небольшими усилиями можно сделать таблицу, похожую на ту, что используется в навигаторе: 

При том, что исходный код страницы на C# выглядит очень минималистично:


using System.Windows.Data;

namespace IDoc.DvWebReports
{
public partial class MainPage
{
public MainPage()
{
InitializeComponent();
//генерация набора тестовых данных:
Tasks = new PagedCollectionView(TaskInfo.GetTaskInfoForTest());
//группировка:
Tasks.GroupDescriptions.Add(new PropertyGroupDescription("Author"));
Tasks.GroupDescriptions.Add(new PropertyGroupDescription("Executer"));
}

///
/// Поручения
///

public PagedCollectionView Tasks { get; set; }
}
}

А представление этих тестовых данных (через Binding) полностью настраивается декларативно в XAML по средствам дизайнера в Visual Studio или такого интересного инструмента, как Expression Blend. На создание такого «фейкового» отчета у меня ушло меньше часа. 

Теперь перейдем к «реальным отчетам». В качестве примера, рассмотрим отчет о кол-ве созданных в системе карточек (в виде круговой диаграммы). Silverlight – это, по сути, клиентская часть, поэтому в проекте SL приложения мы не можем получить прямой доступ к данным (например, по средствам ADO.NET). Поэтому нам необходима отдельная служба, которую очень просто реализовать, используя технологию WCF. Ну и наконец, нам нужен ASP.NET проект, который будет хостом для нашего клиентского xap пакета (Silverlight приложения) и нашей службы WCF (с basicHttpBinding, т.к. только этот вид привязки поддерживается сильверлайтом). Структура солюшна в VS выглядит следующим образом:

Для развертки всего решения достаточно воспользоваться командой Publish и опубликовать на удаленном сервере прямо с машины разработчика.
В качестве доступа к данным в своём примере я использовал “недо-ОRM” LINQ to SQL, в котором накидал в дизайнере пару нужных для отчета таблиц и составил вот такой запрос:

    /// 
/// Получить информацию по кол-вам карточек в системе
///

public static CardsCountInfoRow[] GetCardCountsInfo(string connectionString,
DateTime rangeStart, DateTime rangeEnd)
{
using (var dataContext = CreateDataContext(connectionString))
{
var result =
from instancesGroup in
(from instance in dataContext.dvsys_instances
join instanceDate in dataContext.dvsys_instances_dates
on instance.InstanceID equals instanceDate.InstanceID
where
//Не удалена
(!instance.Deleted.HasValue || !instance.Deleted.Value) &&
//Не шаблон
(!instance.Template.HasValue || !instance.Template.Value) &&
//создана в указанный период
instanceDate.CreationDateTime >= rangeStart &&
instanceDate.CreationDateTime <= rangeEnd
group instance by instance.CardTypeID into g
select new { CardTypeID = g.Key, Count = g.Count()})
join def in dataContext.dvsys_carddefs
on instancesGroup.CardTypeID equals def.CardTypeID
select new CardsCountInfoRow(instancesGroup.Count, def.Icon,
def.CardTypeID, def.XMLSchema);
return result.ToArray();
}
}

Исходный код страницы отчета:

using System;
using System.Windows;
using DvReports.Reporting;

namespace DvReports
{
public partial class MainPage
{
public MainPage()
{
InitializeComponent();
RangeStart = new DateTime(DateTime.Now.Year, 1, 1);
RangeEnd = DateTime.Now;
}

///
/// Начало периода создания карточек
///

public DateTime RangeStart { get; set; }

///
/// Окончание периода создания карточек
///

public DateTime RangeEnd { get; set; }

private void btShowData_Click(object sender, RoutedEventArgs e)
{
var client = new ReportServiceClient();
client.GetCardCountsInfoCompleted += GetCardCountsInfoCompleted;
//посылаем запрос службе
client.GetCardCountsInfoAsync(RangeStart,
RangeEnd == DateTime.MinValue ? DateTime.MaxValue : RangeEnd);
}

//пришел ответ
private void GetCardCountsInfoCompleted(object sender, GetCardCountsInfoCompletedEventArgs e)
{
pieChart.Visibility = Visibility.Visible;
//отдаем данные диаграмме
pieChart.DataContext = e.Result;
}
}
}

Далее на XAML описал представление, развернул сайт на IIS и указал в одной из папок дв его отображение по URL:


На этом не остановился, и там же сделал ещё один отчет – отчет по продолжительностям сессий у сотрудников:


Тут используется обычный компонент ListBox с применением такой интересной "фичи", как DataTemplate – шаблон представления данных элемента, который удобно создавать в Expression Blend:

Для исполнения Silverlight приложений на клиентах, у них должен быть установлен Silverlight Runtime (~9mb), при этом наличие исполняемой среды .NET какой-либо версии не обязательно. Cовместимость Silverlight с различными операционными системами можно увидеть в таблице тут

Некоторые ссылки по теме:


  1. Step by step руководство по созданию Silverlight + WCF приложения 
  2. Видео-доклады на techdays.ru по Silverlight и WCF 

Исходники демонстрационных приложений: DvReportsSample и DataGridSample Читать дальше

Оставить комментарий (всего: 3)

Релиз конструктора решений

Эта новость прошла незаметно для нашего блога. Состоялся долгожданный релиз конструктора решений. Скачать можно из раздела "Загрузки" нашего сайта. Напомню, Конструктор решений отличный высокоуровневый инструмент для разработки собственных карточек, и не только. Причем разрабатывать карточки можно как средствами настроек (включая создание интерфейса), так и программируя действия на определенные события. Читать дальше

Оставить комментарий (всего: 0)

Создание ярлыка для DocsVision Навигатор как RemoteApp

Начиная с Windows Server 2008 в службе терминалов появилась возможность создавать ярлыки для приложений терминального сервера. Так называемые RemoteApp (http://technet.microsoft.com/ru-ru/library/cc731340%28WS.10%29.aspx). Это позволяет работать в терминальной сессии с одним определенным приложением. Я опишу как создать такой ярлык для Навигатора DocsVision, тем более, что в этом случае есть особенности.

1. Открываем консоль RemoteApp Manager на сервере терминалов (в данном примере это Windows 2008 R2)


2. В данной консоли выбираем Add RemoteApp Programs


3. В списке приложений нам предлагаю указать нужное. И тут есть одна особенность. Логичным выглядит выбор ярлыка DocsVision Навигатор (C:\Program Files\DocsVision\Platform\4.5\Client\Navigator.url). Однако, здесь поджидает сюрприз. Если создать таким образом RemoteApp, то при открытии пользователем, оно будет закрываться автоматически через 10 - 15 секунд. Эта особенность не связана с ярлыком Навигатора, а происходит с любыми ярлыками на интернет ресурсы. Для проверки можете создать ярлык (*.url) на сайт, например, dvprofessionals.blogspot.com. Разверните его как RemoteApp. Как только пользователи откроют его, он через 10 секунд закроется.

Поэтому в списке приложений нужно указать Internet Explorer (iexplore.exe). Причем, если сервер 64 битный, то нужно выбирать 32 разрядную версию Internet Explorer, которая находится в папке C:\Program Files (x86)\Internet Explorer.


3. После выбора приложения Internet Explorer мастер создания завершит работу. Дальше в списке приложений находим только что созданное и вызываем в контекстном меню свойства.


4. В свойствах указываем опцию Always use the following command-line arguments, и в строке параметров указываем адрес сервера DocsVision


5. Все, осталось только создать ярлык. В свойствах выбираем Create .rdp File


Файл появится в папке C:\Program Files\Packaged Programs. Теперь достаточно передать его пользователям и они смогут работать в терминальной сессии с Навигатором, как с RemoteApp
Читать дальше

Оставить комментарий (всего: 0)

Загрузка файла имеющего две точки перед расширением в SharePoint

Если через "Универсальную функцию / Шлюз SharePoint / Элемент общего списка / Добавить вложение из файловой системы" попытаться добавить файл у которого есть две точки перед расширением (например test..txt), то при добавлении будет ошибка:

"При выполнении универсальной функции 'Добавить файловое вложение из файловой системы' произошла ошибка.
Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."

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

Оставить комментарий (всего: 0)

Утилита построения CAML запросов к SharePoint

Шлюз в SharePoint позволяет выполнять фильтрацию в соответствии с запросом на CAML языке.

В помощь рекомендую отличную утилиту U2U Caml Query Builder:
http://www.u2u.net/res/Tools/wincamlquerybuilder/CamlQueryBuilder.aspx Читать дальше

Оставить комментарий (всего: 1)

Странная ошибка при открытии pdf файлов из DocsVision

В нашу службу технической поддержки пришло несколько инцидентов связанных со следующим поведением. При открытии файла *.pdf из карточки документа возникает ошибка (информационное сообщение) - "Невозможно открыть файл, возможно он был удален".
В этом случае, как ни странно, помогает тривиальный способ - переустановка Acrobat Reader на этой машине. Так, что если вы столкнетесь с подобным инцидентом, попробуйте это выполнить. Читать дальше

Оставить комментарий (всего: 2)

Заполнение описания в поле типа "Гиперссылка", элемента общего списка SharePoint

В SharePoint у элемента общего списка может быть поле типа "Гиперссылка". У данного поля есть два свойства: URL и описание.

Как при помощи бизнес-процесса заполнить это описание?

Ответ можно получить, попробовав прочитать это поле. Если значение из данной колонки записать в строковую переменную, то можно увидеть что оно будет сохранено в виде "URL, Описание". Значит, чтобы добавить описание нужно точно такую же строку записать в поле этой колонки.

Воспользуемся ф-цией универсального обмена данными. Источник строка вида "http://docsvision.com, DocsVision". Приемник элемент общего списка документов. В качестве свойства указываем название колонки:

Читать дальше

Оставить комментарий (всего: 0)

Заполнение свойств при открытии карточки, созданной в конструкторе решений.

Рассмотрим пример заполнения свойства типа "Текст" при открытии карточки.
При помощи утилиты CardGenerator создано описание библиотеки и карточки. Описание библиотеки загружено в базу. В конструкторе решений на нашу карточку добавляем несколько полей. Пусть это будет карточка сообщения, у которой будут поля "От", типа "Сотрудник", "Кому", типа "Сотрудник", и "Текст", типа "Текст".



Для того, чтобы назначить скрипт на открытие необходимо в окне "Структура разметки" выбрать узел с карточкой, и открыть вкладку "Свойства".
У карточки довольно много свойств и событий. Это может ввести в заблуждение. Например, какое событие использовать для создания скрипта на открытие: CardActivating, CardActivated, или AfterActivate? Для подобного скрипта нужно использовать событие AfterActivate - оно в списке выделено.

Кликаем на это поле, и открывается окно редактирования скрипта.

Разработчики скриптов карточек и сценариев БП, часто просили реализовать подсветку. И при создании Конструктора решений эти пожелания учтены. В нашем редакторе скриптов есть не только подсветка, но и InteliSense!

Для заполнения поля "Текст" пишем такой сценарий.
using System;
using System.Windows.Forms;
using DocsVision.Platform.ObjectManager;
using DocsVision.BackOffice.View.WinForms;
using DocsVision.BackOffice.Model;

namespace ScriptNamespace
{
    public class ScriptClass
    {
        public void Execute(UserSession session, CardData cardData, BaseCardControl cardControl)
        {
            cardControl.PropertyController.UpdateProperty("Текст","Салют!");
            cardControl.PropertyController.RefreshControls();
        }
    }
}
"Refresh" нужен, чтобы поля обновились.
Важно. После внесения изменений в карточку необходимо перезапустить сервисы DocsVision.
Готово. При открытии карточки наше поле заполняется.


Читать дальше

Оставить комментарий (всего: 0)

Жизненный цикл инцидента. Регистрация и первый ответ.

Продолжаем пятничную тему.

Что происходит с инцидентом после того, как вы отправили письмо на адрес supрort@dосsvision.com.

Шаг 1. Автоматическая регистрация.
После того, как письмо попадает в наш ящик, его подхватывает наш бизнес-процесс. Бизнес-процесс начинает разбирать его по частям: отправители, получатели в копии, тема, тело сообщения, вложения.
При регистрации есть одна особенность - скриншоты, которые вставлены в тело письма не попадают в список приложенных файлов, и мы их не видим. Поэтому все файлы надо прикреплять как вложения.

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

Шаг 2. Распределение.
После автоматической регистрации, инциденту должен быть назначен ответственный инженер. Но перед этим ему вручную проставляется еще несколько параметров: модуль, версия платформы, приоритет. И уже после этого назначается ответственный.

После назначения ответственного отправляется второе информационное сообщение.

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

Шаг 4. Отправка ответа
Ответ заносится в ту же карточку "обращение" с которой связан инцидент. И после того, как ответ записан и сохранен, карточку подхватывает специальны бизнес-процесс отправки.
Этот процесс формирует письмо: в начало письма вставляет последний ответ, а затем несколько записей из предыдущей истории переписки. Указывает всех адресатов, прикрепляет файлы и отправляет письмо. После этого меняет состояние в карточке обращения, и устанавливает дату напоминания.  Если до этой даты не будет ответа, то будет автоматически отправлено напоминание. Читать дальше

Оставить комментарий (всего: 2)

Обновление состояния сессий пользователей. Время бездействия

В окне "Открытые сессии" (Навигатор / Сервис / Сессии)  можно посмотреть список открытых сессий, а так же время бездействия.
На данном параметре я сейчас хочу остановиться подробнее.
За обновление времени последнего доступа в сессии отвечает процедура dvsys_session_touch. Она вызывается после получения объекта сессии из кэша сервера, если со времени последнего вызова dvsys_session_touch прошло более 5 минут.

Следовательно, если по какой-то причине StorageServer перезапускается чаще 5 минут, то данный параметр не будет никогда обновлен. И следовательно, время бездействия будет увеличиваться, при том, что пользователь будет работать.
В каких случаях это может происходить. Например, в настройках пула приложений Application Pool в IIS, установлен параметр - предел при котором наступает рециклинг (Recycling), который достигается чаще чем 1 раз в 5 минут. Например, установлено правило - перезапускаться при достижении 512 Мб занятой физической памяти.
Читать дальше

Оставить комментарий (всего: 0)