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)
Показаны сообщения с ярлыком Карточки DocsVision. Показать все сообщения
Показаны сообщения с ярлыком Карточки DocsVision. Показать все сообщения

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

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

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

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

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

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

Отладка скриптов в карточках

На днях случайно обнаружилась возможность отладки скриптов карточек DV в отладчике MS Visual Studio. Думаю что многим пригодится такой функционал в неравной борьбе с кодом :) Всё довольно просто:

1. Активируем возможность отладки скриптов:

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings]
"JITDebug"=dword:00000001


2. В скрипте карточки ставим точку останова с помощью оператора "stop" в нужном месте. На выполнении этой команды выскакивает окно выбора отладчика.


Ну и далее запускаем студию и отлаживаем.

"Брякнулись":


IntelliSense в действии:



Если окно выбора отладчика не появляется, то удостоверьтесь, что в настройках MSVS: Options -> Debugging -> Just-in-Time стоит галочка "Script".
Для отладки скриптов также есть отладчик Microsoft Script Debugger, но он совсем уж простой, даже функционал watches отсутсвует, что сводит его полезность почти на нет. Также есть инструмент Microsoft Script Editor, но его поддержка ограничивается 2003-им офисом, что тоже является проблемой.
Поэтому лучше всё-таки использовать полноценную среду MSVS. Подойдёт даже бесплатная Express-редакция.
Читать дальше

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

Еще один пример работы с правами

Еще один пример работы с правами и DocsVision API. Приложение которое ищет карточки бизнес-процесса, на которые исполнитель не имеет прав, и назначает соответствующие права.
Ссылки установлены на библиотеки DocsVision 3.6

Скачать (VS 2008, vb.net) Читать дальше

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

Синхронизация данных карточки и формы InfoPath

Продолжая тему интеграции с офисными приложениями из VBS-скриптов (см. пост про работу с Word), привожу скрипт, работающий с формой InfoPath, вложенной в карточку документа в виде файла. Пафос слова "интеграция" несколько спадает если вспомнить, что форма InfoPath - это всего лишь XML файл.
Итак, что требовалось от скрипта:
  • записывать значения заданных полей карточки документа в файл формы;
  • записывать значения заданных полей формы InfoPath в карточку;
  • производить указанные действия при открытии карточки и ее сохранении.
Алгоритм работы скрипта прост:
  1. получить первый вложенный в карточку документа файл и выгрузить его на файловую систему во временный файл;
  2. прочитать из файла значения заданных полей формы и записать их в поля (и/или пользовательские свойства) карточки документа;
  3. записать в файл значения других заданных полей карточки в поля формы;
  4. сохранить файл в карточке и удалить его с файловой системы.
Соответствие полей карточки и полей формы задается в скрипте в виде двух массивов (ReadMappings и WriteMappings). Поля формы задаются с помощью выражений XPath (что дает некоторую гибкость и универсальность). Поля карточки задаются по именам, которые интерпретируются в скрипте в функциях GetPropValue, GetPropDisplayValue и процедурах SetPropValue, SetPropDisplayValue. В этой интерпретации допущен некоторый произвол, благодаря которому в скрипте появились "псевдополя" типа поля "текущий пользователь открывший карточку" (@CurrentUser).
Для пользовательских свойств карточки отдельно синхронизируется значение и отдельно отображаемое значение.
А вот, собственно, и сам скрипт:


Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
StoreProps CardData, UserSession
LoadProps CardData, UserSession
DoEvent = 1
End Function


' Синхронизировать свойства из файла в карточку
Sub LoadProps(CardData, UserSession)
Dim File, Path
Set File = FirstFile(CardData, UserSession)
If FIle Is Nothing Then Exit Sub
Path = SaveFileOnFs(File)
ReadPropsFromFile Path, CardData
DeleteFileFromFs Path
End Sub

' Синхронизировать свойства из карточки в файл
Sub StoreProps(CardData, UserSession)
Dim File, Path
Set File = FirstFile(CardData, UserSession)
If FIle Is Nothing Then Exit Sub
Path = SaveFileOnFs(File)
WritePropsToFile UserSession, Path, CardData
File.Upload Path
DeleteFileFromFs Path
End Sub

' Соответствие свойста карточки и полей xml-файла
Class PropMapping
Public PropName
Public ValueXPath
Public DisplayValueXPath
End Class

' Создать соответствие свойста карточки и полей xml-файла
Function Map(PropName, ValueXPath, DisplayValueXPath)
Set Map = New PropMapping
With Map
.PropName = PropName
.ValueXPath = ValueXPath
.DisplayValueXPath = DisplayValueXPath
End With
End Function

' Соответствия свойств карточки и полей xml-файла для передачи из файла в карточку
Dim ReadMappings : ReadMappings = Array( _
Map("Тема", "/my:Protocol/my:Subject", "/my:Protocol/my:Subject"), _
Map("Номер", "/my:Protocol/my:Number", "/my:Protocol/my:Number"), _
Map("Место совещания", "/my:Protocol/my:Place", "/my:Protocol/my:Place"), _
Map("Подписанты", "/my:Protocol/my:AllSigners", "/my:Protocol/my:AllSigners"), _
Map("Участники", "/my:Protocol/my:AllAttendees", "/my:Protocol/my:AllAttendees"), _
Map("Присутствовали от контрагентов", "/my:Protocol/my:AllContragents", "/my:Protocol/my:AllContragents"), _
Map("Дата", "/my:Protocol/my:Date", "/my:Protocol/my:Date"), _
Map("Филиал", "/my:Protocol/my:BranchID", "/my:Protocol/my:BranchName") _
)

' Соответствия свойств карточки и полей xml-файла для передачи из карточки в файл
Dim WriteMappings : WriteMappings = Array( _
Map("Регистратор", "/my:Protocol/my:RegistratorID", "/my:Protocol/my:RegistratorName"), _
Map("Состояние", "/my:Protocol/my:State", "/my:Protocol/my:State"), _
Map("Вид протокола", Null, "/my:Protocol/my:Type"), _
Map("ConfirmationStartProcessTempl", "/my:Protocol/my:ConfirmationStartProcessTempl", Null), _
Map("ConfirmationStartProcessFolder", "/my:Protocol/my:ConfirmationStartProcessFolder", Null), _
Map("ResolutionTemplateID", "/my:Protocol/my:ResolutionTemplateID", Null), _
Map("ResolutionFolderID", "/my:Protocol/my:ResolutionFolderID", Null), _
Map("DeliveryStartProcessTempl", "/my:Protocol/my:DeliveryStartProcessTempl", Null), _
Map("DeliveryStartProcessFolder", "/my:Protocol/my:DeliveryStartProcessFolder", Null), _
Map("@Card", "/my:Protocol/my:CardID", Null), _
Map("@CurrentUser", "/my:Protocol/my:CurrentUserID", Null) _
)

' Прочитать свойства из xml-фала в карточку
Sub ReadPropsFromFile(Path, CardData)
Dim XDoc, Mapping, CardProp
Set XDoc = CreateObject("Msxml2.DOMDocument.3.0")
XDoc.async = False
XDoc.load Path
For Each Mapping In ReadMappings
If Not IsNull(Mapping.ValueXPath) Then
SetPropValue CardData, Mapping.PropName, XDoc.selectSingleNode(Mapping.ValueXPath).Text
If Not IsNull(Mapping.DisplayValueXPath) Then
SetPropDisplayValue CardData, Mapping.PropName, XDoc.selectSingleNode(Mapping.DisplayValueXPath).Text
End If
End If
Next
End Sub

' Записать свойства из карточки в xml-файл
Sub WritePropsToFile(UserSession, Path, CardData)
Dim XDoc, Mapping, CardProp
Set XDoc = CreateObject("Msxml2.DOMDocument.3.0")
XDoc.async = False
XDoc.load Path
For Each Mapping In WriteMappings
If Not IsNull(Mapping.ValueXPath) Then
XDoc.selectSingleNode(Mapping.ValueXPath).Text = GetPropValue(UserSession, CardData, Mapping.PropName)
End If
If Not IsNull(Mapping.DisplayValueXPath) Then
XDoc.selectSingleNode(Mapping.DisplayValueXPath).Text = GetPropDisplayValue(UserSession, CardData, Mapping.PropName)
End If
Next
XDoc.save Path
End Sub

' Получение первого приложенного к карточке файла
Function FirstFile(CardData, UserSession)
Dim FileList, FileRefs, VerFile, VersionID, FileID
Set FileList = UserSession.CardManager.CardData(MainInfo(CardData).Value("FilesID"))
Set FileRefs = Sect(FileList, "FileReferences")
If FileRefs.Rows.Count = 0 Then
Set FirstFile = Nothing
Exit Function
End If
Set VerFile = UserSession.CardManager.CardData(FileRefs.Rows(0).Value("FileID"))
VersionID = Sect(VerFile, "MainInfo").FirstRow.Value("CurrentID")
FileID = Sect(VerFile, "Versions").GetRow(VersionID).Value("FileID")
Set FirstFile = UserSession.FileManager.File(FileID)
End Function

' Сохранение файла на файловой системе во временный файл (возвращает путь к файлу)
Function SaveFileOnFs(File)
Dim Fso, Fld
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fld = Fso.GetSpecialFolder(2)
SaveFileOnFs = Fso.BuildPath(Fld.Path, Fso.GetTempName)
File.Download SaveFileOnFs
End Function

' Удаление файла с файловой системы
Sub DeleteFileFromFs(Path)
Dim Fso
Set Fso = CreateObject("Scripting.FileSystemObject")
Fso.DeleteFile Path, True
End Sub

' Получение секции карточки по имени
Function Sect(CardData, Alias)
Set Sect = CardData.Sections(CardData.Type.AllSections.GetByAlias(Alias).ID)
End Function

' Нулевая строка секции MainInfo
Function MainInfo(CardData)
Set MainInfo = Sect(CardData, "MainInfo").FirstRow
End Function

' Строка свойства
Function Prop(CardData, Alias)
Set Prop = Nothing
Dim Row: For Each Row In Sect(CardData, "Properties").Rows
If Row.Value("Name") = Alias Then
Set Prop = Row
Exit Function
End If
Next
End Function

' Получение значения свойства
Function GetPropValue(UserSession, CardData, PropName)
Select Case PropName
Case "@Card"
GetPropValue = CardData.ID
Case "@CurrentUser"
GetPropValue = StaffObject(UserSession).GetCurrentUserID
Case Else
Dim PropRow
Set PropRow = Prop(CardData, PropName)
GetPropValue = PropRow.Value("Value")
End Select
End Function

' Получение отображаемого значения свойства
Function GetPropDisplayValue(UserSession, CardData, PropName)
Select Case PropName
Case "@Card"
GetPropDisplayValue = CardData.Description
Case "@CurrentUser"
Dim Staff
Set Staff = StaffObject(UserSession)
GetPropDisplayValue = Staff.GetEmployeeName(Staff.GetCurrentUserID)
Case Else
Dim PropRow
Set PropRow = Prop(CardData, PropName)
GetPropDisplayValue = PropRow.Value("DisplayValue")
End Select
End Function

' Установка значения свойства
Sub SetPropValue(CardData, PropName, Value)
Select Case PropName
Case "Дата"
Value = CDate(Value)
End Select
Dim PropRow
Set PropRow = Prop(CardData, PropName)
PropRow.Value("Value") = Value
End Sub

' Установка отображаемого значения свойства
Sub SetPropDisplayValue(CardData, PropName, DisplayValue)
Select Case PropName
Case "@Card"
CardData.Description = CStr(DisplayValue)
Case Else
Select Case PropName
Case "Дата"
DisplayValue = FormatDateTime(CDate(DisplayValue), 2)
End Select
Dim PropRow
Set PropRow = Prop(CardData, PropName)
PropRow.Value("DisplayValue") = CStr(DisplayValue)
End Select
End Sub

' Получение StaffObject
Function StaffObject(UserSession)
Set StaffObject = CreateObject("TOHelperObjects.StaffObject")
Set StaffObject.UserSession = UserSession
End Function
Читать дальше

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

Получение значения из справочника в XSLT преобразовании

В DocsVision существует возможность создавать XSLT преобразования для создания печатной формы - диалог "Экспорт и печать" карточки. Принцип работы таков. Печатная форма - это HTML документ, который получается следующим образом:
XML карточки + XSLT преобразование = HTML.
При этом нужно отметить, что для формирования печатной формы берется не просто XML карточки, а XML карточки + связанные карточки + связанные строки из справочников.


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




Итак:
1. Присоединяются только карточки на которые ссылается поле типа refcardid
 




2. Присоединяются строки из справочников, на которые ссылается поле типа refid



Рассмотрим как получить данные из справочника. Пример, необходимо вывести имя и учетную запись регистратора карточки внутреннего документа. Поскольку строка из справочника сотрудников есть в xml то нужно получить её данные по идентификатору. XPath адрес должед быть таким:


//EmployeesRow[@RowID=//CardOrd[1]/MainInfo/@RegisteredBy]/@AccountName
Т.е. получаем строку из данных справочника, у которой RowID = значению из поля RegisteredBy.

Полный текст шаблона:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/">
  
   
    <link href="%ServerUrl%/StorageServer/Fetch.aspx?BaseName=%BaseName%&amp;TransformID=B5344DA1-D28F-4024-8798-3FC3992C94B7" rel="stylesheet" type="text/css"></link>
    <title>&lt;xsl:value-of select="//CardOrd[1]/MainInfo/@Name"/&gt;</title>
   
   
     <xsl:value-of select="//EmployeesRow[@RowID=//CardOrd[1]/MainInfo/@RegisteredBy]/@AccountName">
     <xsl:value-of select="//EmployeesRow[@RowID=//CardOrd[1]/MainInfo/@RegisteredBy]/@LastName">
 
   
  
 </xsl:value-of>
</xsl:value-of>
</xsl:template></xsl:stylesheet>

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

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

Получение идентификатора пользователя, который открыл карточку

Пример скрипта, который получает идентификатор пользователя из справочника сотрудников, который открыл карточку


Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)

        'ID Справочника сотрудников и секции "Сотрудники"
        Const DIC_STAFF = "6710B92A-E148-4363-8A6F-1AA0EB18936C"
        Const SEC_STAFF = "DBC8AE9D-C1D2-4D5E-978B-339D22B32482"
        
        Dim Groups, oRows, FindUserID

        'Получаем пользователя, который открыл карточку
        Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF)
        Set oRows = RefStaff.Sections.Item(SEC_STAFF).FindRows( _
         "AccountNameSTREQ'" & _
         UserSession.Properties("AccountName") & "'")

        If oRows.Count = 0 Then
            'Не найден
            MsgBox ("ОШИБКА! Невозможно найти вашу учетную запись в справочнике")
            Exit Function
        End If
    
        'Это ID пользователя, открывшего карточку
        FindUserID = oRows.Item(0).ID
End Function



Развитие темы. Определение, входит ли пользователь в определенную группу.
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
'ID Справочника сотрудников и секции "Сотрудники"
Const DIC_STAFF = "6710B92A-E148-4363-8A6F-1AA0EB18936C"
Const SEC_STAFF = "DBC8AE9D-C1D2-4D5E-978B-339D22B32482"

Dim Groups, oRows, FindUserID

'Получаем пользователя, который открыл карточку
Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF)
'Поиск по справочнику сотрудников
Set oRows = RefStaff.Sections.Item(SEC_STAFF).FindRows( _
"AccountNameSTREQ'" & _
UserSession.Properties("AccountName") & "'")
If oRows.Count = 0 Then
'Не найден
MsgBox ("ОШИБКА! Невозможно найти вашу учетную запись в справочнике")
Exit Function
End If

'Это ID пользователя, открывшего карточку
FindUserID = oRows.Item(0).ID

'Поиск в группах
Dim StaffObject
Set StaffObject = CreateObject("TOHelperObjects.StaffObject")
Set StaffObject.UserSession = UserSession

Const GROUPID = "ID группы"
If StaffObject.IsEmployeeInGroup(FindUserID, GROUPID) = True Then
'Пользователь, открывающий карточку - в группе.
End If
Set StaffObject = Nothing
End Function

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

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

Открытие приложенного документа Word и перенос некоторых полей в документ

Данный скрипт был создан еще для 3.6. Думаю он будет полезен и сейчас.

Пример взаимодействия с внешним приложением MS Word. Рассматриваемый скрипт карточки открывает приложенный файл *.doc, и производит вставку значений полей секции «Основная информация» в текст документа.
Вставка производится следующим образом: В тексте документа размещены названия полей в виде @Name или @Digest – т.н. теги. Скрипт производит замену этих тегов на значения из полей с таким же названием.



Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
    'Открываем файл, присоединенный к карточке
    
    'Создается объект FileList
    Dim sFilesID
    sFilesID = CardDa-ta.Sections.Item(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("FilesID") & ""
    If sFilesID = vbNullString Then Exit Function
    Dim oFileList
    Set oFileList = CreateObject("TOFileList.FileList")
    Set oFileList.UserSession = UserSession
    
    Dim rows
    Set rows = CardDa-ta.Sections.Item(CardData.Type.Sections.GetByAlias("Properties").ID).rows
    Set oFileList.PropertyRows = rows
    
    oFileList.ID = sFilesID
    
    'Количество файлов
    Dim n: n = oFileList.FileRefs.Count
    
    'Если нет файлов, то выход
    If n = 0 Then
        Exit Function
    End If

    'Открытие файла
    Dim oFile
    Set oFile = oFileList.FileRefs.Item(1)
    oFile.OpenFile

    'Получаем объект WORD
    Dim objWord
    Set objWord = GetObject(, "Word.Application")
    
    'Меняем
    Dim arrFields, strField, oFlag
    arrFields = Array("Name", "Digest") 'Здесь перечислены все теги и поля
    Dim rngStory
    Dim oMainRow
    Set oMainRow = CardData.Sections.Item(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
        
    Do
        oFlag = False
        For Each strField In arrFields
            objWord.Selection.Start = 0
            objWord.Selection.End = 0
            objWord.Selection.Find.Forward = True
            If objWord.Selection.Find.Execute("@" & strField) = True Then
                If IsNull(oMainRow.Value(strField)) Then
                    objWord.Selection.TypeText (" ")
                Else
                    objWord.Selection.TypeText (oMainRow.Value(strField))
                End If
              oFlag = True
            End If
        Next
    Loop Until oFlag = False

  
    Set oFileList = Nothing
End Function


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

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

Пример. Получение пользователей, которые подписали файл.

Небольшой пример на VB. Получение пользователей, которые подписали файл.

Set m_oAccessManager = UserSession.AccessManager
Set m_oFile = UserSession.FileManager.File(FileID)

' oSignRows - DVObjectManager.InfoRowCollection
Set oSignRows = m_oAccessManager.ListCryptObjects(m_oFile.ID, 0)

For Each oSignRow In oSignRows
    ' кто подписал?
    MsgBox oSignRow.Value("AccountName")

Next oSignRow

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

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

Получение поля FullNumber из скрипта карточки на событии сохранение в DocsVision 4.3

Обращаю внимание разработчиков. В DocsVision 4.3. поле FullNumber и NumberRef переносится в CardData только после события "Сохранение". Следовательно получить данные из этого поля в скрипте на данном событии нельзя. Сделано это для еще большего улучшения стабильности работы с нумераторами.
Поэтому если есть необходимость работы с номером у только что созданной карточки, то нужно реализовывать логику в скрипте на событие "Выделение номера"

1. Создается скрипт на событие "Выделение номера"
2. В данном скрипте номер записывается и производятся необходимые действия с ним, например, запись в свойства. Читать дальше

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

Настройки карточек в Справочнике типов

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

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


p.s. А как все таки добавить новое свойство в ранее созданные карточки?
Сделать это можно, например, бизнес-процессом. Читать дальше

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

Ограничение на размер прикрепляемых к карточке файлов

Часто приходит вопрос - можно ли ограничить размер прикрепляемого к карточке файла? Цель понятна. Даже если используется FileStream администрировать базу в сотни гигабайт, большую часть из которых составляют отсканированные в 2400 dpi *.bmp картинки мягко говоря не удобно.

В текущих версиях через настройки такого ограничения выставить нельзя (требование зафиксировано). Однако, почему бы не попробовать делать проверку в скрипте на какое-либо событие?

Итак, где же хранится размер файла? Структура прикрепления файлов к карточкам документов (внутренний, входящий, исходящий, универсальный) следующая:

Карточка документа -- Список файлов -- Карточка файла -- Карточка файла с версиями -- Файл.

чертой обозначена ссылка.

Карточка "Список файлов" хранит ссылки на карточки файлов, поэтому в ней навряд-ли хранится размер. Поэтому, смотрим на схему карточки файла. Вот удача! В секции "Основная информация" есть поле FileSize. Обытным путем устанавливаем, что это поле хранит размер в килобайтах. Остается только написать скрипт, который будет по ссылкам из списка файлов получать карточки файлов и суммировать размер.



Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
' Check size of all files

MaxSize = 1024 ' max size of files in KB

' Get FileList Card
Set MainRow = CardData.Sections(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
If Not IsNull(MainRow.Value("FilesID")) Then
FilesID = CStr(MainRow.Value("FilesID")) ' if card has a FileList
Else
Exit Function ' exit
End If
Set FileList = UserSession.CardManager.CardData(FilesID)

' Get FileCard and size

Set FileRefs = FileList.Sections(FileList.Type.Sections.GetByAlias("FileReferences").ID).Rows

SummSize = 0
For Each SingleRow In FileRefs
CardFileID = CStr(SingleRow.Value("CardFileID"))
Set CardFile = UserSession.CardManager.CardData(CardFileID)
Set CardFileMainRow = CardFile.Sections(CardFile.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
SummSize = SummSize + CInt(CardFileMainRow.Value("FileSize"))
Next

If SummSize > MaxSize Then
DoEvent = -1

CardFrame.ShowMessage "Внимание", "Превышен допустимый размер приложенных файлов", , 3
End If
End Function


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

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

Как назначить права в скрипте карточки

Пример назначения прав на карточку из скрипта карточки (через ADSI):

' Rights
iRights = &H1 + &H2 ' read+change!
aEmpl = Array ("DOMAIN\User1","DOMAIN\User2")

' Get secure object
Set oSecureObj = UserSession.AccessManager.GetSecureCard(CardData.ID)
Set oSD = oSecureObj.ADsSecurityDescriptor
Set oDACL = oSD.DiscretionaryAcl

' remove old ace's
Do
bFlag = False
For Each oACE In oDACL
oDACL.RemoveAce (oACE)
bFlag = True
Next
Loop Until bFlag = False

' Add Rights
For n = 0 To iCount
sEmpl = aEmpl(n)
If CStr(sEmpl) <> "" Then
Set oNewAce = CreateObject("AccessControlEntry")
oNewAce.AccessMask = iRights
oNewAce.AceType = 0 ' allowed
oNewAce.AceFlags = 2 'inherit
oNewAce.Trustee = sEmpl
oDACL.AddAce oNewAce
End If
Next
Set oSecureObj.ADsSecurityDescriptor = oSD



Список прав (все значения являются битовой маской и могут суммироваться):

"000F001F"
Полный доступ

"00000001"
Чтение данных объекта

"00000002"
Изменение данных объекта

"00000004"
Создание дочерних объектов

"00000008"
Удаление дочерних объектов

"00000010"
Копирование объекта

"00010000"
Удаление объекта

"00020000"
Чтение разрешений

"00040000"
Изменение разрешений

"00080000"
Смена владельца

"00020001"
Чтение

"0000001E"
Изменение

"00010000"
Удаление

"000C0000"
Владение


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

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

Использование XSLT преобразований в нумераторах DocsVision 4.1

В версии 4.1. появилась возможность для создания полного номера документа использовать xslt преобразование. Преобразование задается в "Справочнике нумераторов" / "Свойство нумератора"

Xslt шаблон применяется к xml карточки, для которой выделяется номер. Таким образом, в полном номере можно вывести данные из полей карточки.

В шаблоне так же можно использовать ряд тегов:

[Number] - номер
[DepPref], [DepSuff] - префикс, суфикс подразделения
[TypePref], [TypeSuff] - префикс, суфикс вида
[CasePref], [CaseSuff] - префикс, суфикс дела
[CasePrefPar], [CaseSuffPar] - префикс, суфикс дела с учетом родителей
[FolderPref], [FolderSuff] - префикс, суфикс папки
[FolderPrefPar], [FolderSuffPar] - префикс, суфикс папки с учетом родителей

Пример XSLT шаблона:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="//CardInc[1]/MainInfo/@Name"/>-[Number]+[TypePref]
</xsl:template>
</xsl:stylesheet>

Данный шаблон формирует номер по принципу:
имя карточки-номер+префикс вида Читать дальше

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

Программное выделение полного номера карточки DocsVision

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

Итак будем делать скрипт для версии DocsVision 4.1. Это будет дополнительная команда Навигатора, которая будет назначена на контекстное меню карточек документов. Т.е. пользовать сможет нажать правой кнопкой мыши на карточку в Навигаторе и назначить полный номер, не открывая карточку.

Скрипт:

Для получения номера используем объект TOHelperObject.NumeratorObject.

Sub DoEvent(UserSession, CardHost, FolderType, FolderID, SelectionIDs)

Dim sDetails, bFlag
bFlag = True
sDetails = "Номера присвоены следующим карточкам: "
' Создаем объект "Нумератор"
Set oNumerator = CreateObject("TOHelperObjects.NumeratorObject")
' Для каждой карточки из коллекции
For Each sID In SelectionIDs
' Получаем карточку
Set oCard = UserSession.CardManager.CardData(sID)
' Получаем основную секцию
Set oMainRow = oCard.Sections(oCard.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
If IsNull(oMainRow.Value("NumberRef")) Then
' Если номера нет
Set oNumerator.CardData = oCard
Set oNumerator.UserSession = UserSession
sNumID = ""
sFullNum = ""
If oNumerator.GetNewNumber(sNumID, sFullNum) Then
oMainRow.Value("FullNumber") = sFullNum
oMainRow.Value("NumberRef") = sNumID
sDetails = sDetails + oMainRow.Value("Name") + ","
Else
CardHost.ShowMessage "Комманда Навигатора", "Не найден нумератор для '" + oMainRow.Value("Name") + "'", , 3
End If
End If
Next
CardHost.ShowMessage "Комманда Навигатора", "Номера выделены успешно", sDetails, 4
Set oNumerator = Nothing
End Sub

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

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