пятница, 4 октября 2013 г.

DV 5.1.2344 Добавление ссылки на карточку в другую карточку

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

using System;
using DocsVision.BackOffice.CardLib.CardDefs;
using DocsVision.Platform.ObjectModel;
using DocsVision.BackOffice.ObjectModel;
using DocsVision.BackOffice.ObjectModel.Services;
using Docsvision.DocumentsManagement;
using DocsVision.Platform.ObjectModel.Search;


        /// <summary>
        /// В список ссылок документа добавляет связанный документ
        /// </summary>
        /// <param name="document">карточка документа в который добавляется ссылка на другую карточку</param>
        /// <param name="addeddocument">карточка добавляемого документа в качестве ссылки в карточку другого документа</param>
        /// <param name="LinkName">Имя связи из справочника ссылок</param>
        private void CreateRefInCard(Document document, Document addeddocument, string LinkName)
        {
            IReferenceListService referenceService = CardControl.ObjectContext.GetService<IReferenceListService>();
           

            ReferenceList referenceList;
            if (document.MainInfo.ReferenceList == null)
            {
                referenceList = referenceService.CreateReferenceList();
                CardControl.ObjectContext.SaveObject(referenceList);
           
                document.MainInfo.ReferenceList = referenceList;
            }
            else
            {
                referenceList = document.MainInfo.ReferenceList;
            }
       
            LinksLinkType linkType = CardControl.ObjectContext.FindObject<LinksLinkType>(new QueryObject("LinkName", LinkName));
           
            Guid CardTypeID = CardControl.Session.CardManager.GetCardData(CardControl.ObjectContext.GetObjectRef(addeddocument).Id).Type.Id;
           
            referenceService.CreateReference(referenceList, linkType, CardControl.ObjectContext.GetObjectRef(addeddocument).Id, CardTypeID, false);
            CardControl.ObjectContext.AcceptChanges();
        }

воскресенье, 5 мая 2013 г.

Добавление нового свойства в карточку доп командой навигатора

for each SelectCard in SelectionIDs
   Set CardData = UserSession.CardManager.CardData(SelectCard)
   Set oProp = CardData.Sections(CardData.Type.Sections.GetByAlias("Properties").ID)
   Set oContrProp = oProp.FindRow("@Name = 'Контрагент'")
   if oContrProp is nothing then
      Set oContrProp = oProp.Rows.AddNew()
      oContrProp.Value("Name") = "Контрагент"
      oContrProp.Value("ParamType") = 11
' ... и т.д. - остальные поля
   end if
next
'Взято с форума forum.idoc.ru

воскресенье, 8 апреля 2012 г.

Об ошибке: 80040543: указанная строка данных не существует

Недавно при написании скрипта на событие сохранения столкнулся со следующей ошибкой:

Ошибка при работе с внутренним документом


Не удалось сохранить изменения
80040543: указанная строка данных не существует


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


CardData.Sections("7A9F0D60-444E-41AF-845E-4F4E94F43A52").FindRows _
("<ConditionGroup><Condition><Field>ApproverRowID</Field><Value>'" & miniRow.value("RowID")& "'</Value></Condition></ConditionGroup>")


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


P.S. Так и осталось загадкой почему так происходило.

четверг, 29 марта 2012 г.

О подключении и работе с DocsVision из VBA приложений

Данный код позволяет подключиться к серверу DocsVision и работать с ним из VBA приложений (Outlook, Word, Excel и т.п.). Чтобы код работал необходимо в редакторе Visual Basic через меню Tools->References подключить следующие библиотеки:
DocsVision 4.5 Card Host
DocsVision 4.5 Navigator
DocsVision 4.5 Object Manager

'Строка подключения к серверу DocsVision. Ее берем из консоли настройки. Лучше, если подключаться будем по named pipe. Тогда в домене нам не потребуется вводить  аутентификационные данные.
Const ConnectString = "\\ServerName\Pipe\DocsVision45\StorageServer"

Dim oSession As UserSession
Dim Manager As New SessionManager
Dim oCard As CardData
Dim Navigator As INavigatorHost2
Dim host As ICardHost


'Подключаемся к серверу
Manager.Connect ConnectString
' Создаем сессию
Set oSession = Manager.CreateSession
' Получаем объект навигатор
Set Navigator = CreateObject("DVNavigator.NavigatorControl")
' Получаем объект CardHost

Set host = Navigator.CreateHost(oSession)


Так как получены основные объекты DocsVision теперь можно с ним работать. Единственное, что недоступно, так это свойства созданной (полученной) карточки документа. То есть нельзя получить и соответственно изменить свойства карточки документа.

понедельник, 26 марта 2012 г.

Получение типа карточки по ИД ее вида

' Функция возвращает тип карточки по ИД вида.
' UserSession - сессия пользователя
' DocsViewID - ИД вида документа
Function GetDocTypeByDocView(UserSession, DocsViewID)
Const ID_TYPESCARD = "{BE14D55D-92B7-4345-AD10-32588981F83D}"
  GetDocTypeByDocView = -1 'Вид документа по-умолчанию. Для возвращаемого значения, если не будет найден вид документа с ИД  DocsViewID
' Получение карточки справочник типов
Set oTypesCard = UserSession.CardManager.DictionaryData(ID_TYPESCARD)
' Получение секции Типы документов справочника типов
Set oSectDocType = oTypesCard.Sections(oTypesCard.Type.AllSections.GetByAlias("DocumentTypes").ID)
' Перебор всех видов документов для поиска необходимого. Можно, наверное, для этого воспользоваться поиском, то есть функцией FindRow.
For Each Row In oSectDocType.AllRows
   If Row.Value("RowID") = DocsViewID Then
      GetDocTypeByDocView = Row.Value("DocumentType")
      Exit Function
   End If
Next
End Function

Добавление в секцию файлы карточки 'Список файлов' файла

'Данная процедура добавляет в секцию файлы карточки 'Список файлов' файл.
'Параметры процедуры:
' UserSession - сессия пользователя
' FileName - полное имя файла.
' ShortFileName - краткое имя файла
'  SectionFilesOfCardFilesList - секция файлы карточки Список файлов
Sub AddFileInSectionFiles(UserSession, FileName, ShortFileName, SectionFilesOfCardFilesList)
On Error Resume Next
Const ID_FILESLISTCARD = "{BFC9D190-BCD6-411A-B9F9-3160D3F68819}" ' ИД схемы карточки список файлов
Const ID_FILECARD = "{2BBD0A41-265E-4FF8-82D6-C6342F34B1AF}" ' ИД схемы карточки файла
Const ID_VFILECARD = "{6E39AD2B-E930-4D20-AAFA-C2ECF812C2B3}" ' ИД схемы карточки файла с версиями

'Загружаем файл
Set File = UserSession.FileManager.CreateFile(ShortFileName)
File.Upload FileName

' Создаем карточку файла
Set oCardFile = UserSession.CardManager.CreateCardData(ID_FILECARD)
' Создаем карточку файла с версиями
Set oCardFileVers = UserSession.CardManager.CreateCardData(ID_VFILECARD)
' Получаем строку основной секции карточки файла
Set RowCardFile = oCardFile.Sections(oCardFile.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
' Получаем строку основной секции карточки файла с версиями
Set RowCardFileVers = oCardFileVers.Sections(oCardFileVers.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
' Получаем секцию Versions карточки файла с версиями
Set SectVersCardFileVers = oCardFileVers.Sections(oCardFileVers.Type.Sections.GetByAlias("Versions").ID)
' Добавляем новую строку в секцию Versions карточки файла с версиями
Set NewRowFileVers = SectVersCardFileVers.Rows.AddNew
' Заполняем поля новой строки cекции Versions значениями
NewRowFileVers.Value("FileID") = File.ID
NewRowFileVers.Value("Version") = 0
NewRowFileVers.Value("VersionNumber") = 1
curuser = GetCurrentUser(UserSession)
If curuser="" Then Exit sub
NewRowFileVers.Value("AuthorID") = curuser

' Заполняем поля строки основной секции карточки файла с версиями значениями
RowCardFileVers.Value("CurrentID") = NewRowFileVers.ID
RowCardFileVers.Value("Name") = ShortFileName
RowCardFileVers.Value("NextVersion") = 1
' Заполняем поле FileID строки основной секции карточки файла ИД карточки файла с версиями
RowCardFile.Value("FileID") = oCardFileVers.ID

' Добавляем новую строку в секцию Ссылки на файлы карточки список файлов
Set NewRow = SectionFilesOfCardFilesList.Rows.AddNew
' Заполняем поле CardFileID новой строки ИД карточки файла
NewRow.Value("CardFileID") = oCardFile.ID
End Sub

'Функция получает текущего пользователя по аккаунту
Function GetCurrentUser(UserSession)  
' ИД схемы справочника сотрудников
   Const DIC_STAFF = "{6710B92A-E148-4363-8A6F-1AA0EB18936C}"
   Dim Groups, oRows, FindUserID
   GetCurrentUser=""

   Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF)
   If RefStaff Is Nothing Then
      msgbox "Ошибка получения справочника сотрудников. За помощью обратитесь к администратору."
      Exit Function
   End If

   Set SectionEmployeesRefStaff = RefStaff.Sections(RefStaff.Type.AllSections.GetByAlias("Employees").ID)
   Set oRows = SectionEmployeesRefStaff.FindRows("<ConditionGroup><Condition><Field>AccountName</Field><Op>STREQ</Op><Value>'" & UserSession.Properties("AccountName") & "'</Value></Condition></ConditionGroup>")

    Set oUser=oRows.Item(0)

    GetCurrentUser = oUser.ID
End Function

О копировании значений полей (свойств) из одной карточки в свойства другой при создании ее из первой

   Нередко встает необходимость создать одну карточку из другой по кнопке и передать значения полей (свойств) из первой в свойства второй карточки  при ее создании. При этом в коде  первой карточки при создании второй не получается получить свойства карточки, которая создается. Если взять коллекцию строк из секции Properties этой карточки и получить количество строк, то увидим 0. Чтобы все-таки сделать так как  нам необходимо, надо в поле ParentCardID второй карточки при ее создании(из первой) прописать ИД первой карточки. А в событии открытия второй карточки получить данные (значения полей и свойств) первой (по ParentCardID) и скопировать их в необходимые нам свойства.