none
документооборот на sharepoint 2010 и word 2010 RRS feed

  • Общие обсуждения

  • Приветствую! Помогите, пожалуйста, разобраться с проблемой.
    Есть портал на Sharepoint 2010. В одной из библиотек реализовано хранилище описания иерархических сущностей:

    папка объекта 1
    -описание объекта 1
    -папка объекта 1.1
    --описание объекта 1.1
    --папка объекта 1.1.1
    ---описание объекта 1.1.1

    Количество объектов на каждом уровне произвольно. Описания вложенных объектов перетаскивают в описания вышестоящих руками (описание объекта 1 содержит уникальный текст + описание всех вложенных объектов).
    Придумал решение по оптимизации: создаем типы контента для каждого уровня и вешаем на них шаблоны. создаем списки для каждого типа контента. при создании нового объекта указываем его положение в иерархии (выбором вышестоящих объектов). после создания в библиотеке появляются соответствующие изменения иерархии. Документы связаны друг с другом посредством использования поля {link}. Это позволяет в каждом документе иметь только уникальный текст + подтянутое содержимое описаний вложенных объектов. Так вот основная проблема в автоматическом создании и обновлении этих полей, ведь иерархию мы меняем. Придумал для типов контента многострочное текстовое поле "Ссылка", куда складываю через разделитель ссылки на все вложенные документы. Плюс, создал скрипт на VBA и повесил его на шаблоны. Скрипт берет значение поля "Ссылка", парсит и генерит поля {link}. Вот он скрипт:

    Sub LinkCreator()
    '
    ' DocCreator Макрос
    '
    '
    Dim Property As MetaProperty
    Dim Properties As MetaProperties
    Dim rng As Range
    Dim fld As field
    Dim par As Paragraph
    Dim links() As String
    Dim linkfield As field

    ' парсим строку "ссылки" в массив
    Set Properties = ActiveDocument.ContentTypeProperties
    For Each Property In Properties
    If Property.Name = "Ссылка" Then
    links = Split(Property.Value, ";")
    End If
    Next Property

    'так как поля такого типа создаются только в макросе, то ищем созданные ранее поля и убиваем их, чтобы создать для новых значений
    For Each linkfield In ActiveDocument.Fields
    If (linkfield.Type = wdFieldLink) Then
    ActiveDocument.Fields(linkfield.Index).Select
    Selection.Start = Selection.End
    'удаляем параграф, чтобы при обновлении наши поля не ползли вниз
    Selection.Delete
    'удаляем "старое" поле
    linkfield.Delete
    End If
    Next linkfield

    'вставка новых полей
    For Each link In links
    Set rng = ActiveDocument.Range(Start:=ActiveDocument.Range.End - 1, End:=ActiveDocument.Range.End - 1)
    Set fld = ActiveDocument.Fields.Add(rng, wdFieldRefDoc, link, False)
    Set rng = ActiveDocument.Range(Start:=ActiveDocument.Range.End - 1, End:=ActiveDocument.Range.End - 1)
    'каждое поле с новой строки, поэтому пихаем параграф
    Set par = ActiveDocument.Paragraphs.Add(rng)
    Next link

    End Sub


    Проблема: формируемые поля имеют вид {link <ссылка>}, без приставки типа документа (word.document.12) и префикса отображения (я использую \h). если добавлять их строкой вместе с ссылкой, то локально на машине все работает (если все действия делаю с пустым шаблоном. как только заполняю его "'элементами управления содержимым", сыпятся ошибки доступа к данным), а вот когда выкладываю на портал, то либо возникает ошибка доступа к данным, на которые ссылаюсь, либо при повторном обновлении полей (старые удаляются) вылетает ошибка "операция не может быть выполнена". Буду рад услышать как коментарии по концепции, так и по коду конкретного решения. Спасибо!
    18 февраля 2012 г. 7:05

Все ответы

  • Это вопрос для форума по Sharepoint. Переношу.

    (Возможно вам быстрее ответят на форумах разработчиков MSDN или gotdotnet.ru)


    Сазонов Илья http://isazonov.wordpress.com/

    18 февраля 2012 г. 16:03
    Модератор