none
Извлечение элементов списка: Бага или Фича? RRS feed

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

  • Кто-нибудь может объяснить почему для библиотеки документов извлечение реализовано, а для списка нет?
    Это довольно интересный вопрос так как Sharepoint позиционируется как портал для совместной работы, а именно этот функционал и исключен в случае списка.
    Какие есть соображения на этот счет?

    Извлечение для записи нужно если:
    1. С записью могут работать пользователи и код.
    2. Запись одновременно могут изменять несколько пользователей.
    3. Запись одновременно может быть изменена несколькими приложениями (кодом).
    Построить мало мальски нормального извлечения не получается Sad к сожалению.
    Хотя удалось снизить количество конфликтов сохранения примерно в десять раз.
    Непонятно почему имея готовый механизм для библиотеки документов он отсутствует для записи, хочется понять идеологию продукта, тем более что он позиционируется для совместной работы.
    30 ноября 2007 г. 9:20

Все ответы

  • попробовал, сходу получил сообщение:

    ===

    Конфликт сохранения 
             Внесенные изменения противоречат изменениям, сделанным другим пользователем в это же время. Чтобы применить свои изменения, в веб-обозревателе нажмите кнопку "Назад", обновите страницу и отправьте их еще раз.

    ===

    тоже, конечно, еще тот цирк...

     

    30 ноября 2007 г. 9:53
  • Вопрос что делать когда изменения делает РП и получает такое исключение?
    Если человек может его обработать, то про код ничего такого сказать не могу. Что делать? Кто виноват? Smile))
    30 ноября 2007 г. 10:41
  • 1. Частично проблему возникновения конфликтов можно, наверное, решить используя версионность и обязательное утверждение новых/измененных элементов списка.

     

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

     

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

     

    С документами все понятно. Как правило они содержат значительный объем иноформации, который может реально потребоваться на редактирование нескольким пользователям. Зачем нескольким пользователям может понадобиться отредактировать одновременно информационную единицу состоящую из нескольких единиц полей - я придумать не смог. (Естественно, с учетом вышесказанного WSS - это не СУБД)

     

    Если описанная конфликтная ситуация в действительности возможна, значит, наверное, подобную информацию все-таки следует первично хранить не в SharePoint, в БД. А доступ к ней предоставлять через, к примеру, формы InfoPath с подключением к данным и отображением значимых полей на поля списка SharePoint.

    =============================================================

     

    (ИМХО) Опять же технология обработки списков и библиотек, несмотря на кажущееся подобие, все же отличается. Если вы переведете библиотеку в табличный режим, вы не сможете создать новую запись, не создав новый документ. А на создание нового документа уходит время. То есть, технология работы с библиотекой предполагает определенные временные затраты, обоснованные именно тем что вы работате с ДОКУМЕНТОМ, а не просто с ЗАПИСЬЮ ! Технология работы со списком изначально предполагает мобильность, особенно, если учесть что работа в табличном режиме практичсеки не отличается от работы в Excel. Добавление принудительного извлечения каждый раз, когда вы хотите гарантировать 100% целостность, этой мобильности СПИСКИ лишит.
    30 ноября 2007 г. 14:40
  • В библиотеке документов эта функция отключается.
    2. к сожалению это решение позволяет исключить только часть конфликтов. Так как основная проблема возникает при использовании eventHandler'ов. Они стартую почти одновременно, но не в момент события а чуть погодя, в результате имеем процесс 1 что-то записал в список, через короткий промежуток процесс 2 записал в этот же элемент. После первой записи стартует eventHandler-1 после второй eventHandler-2, но если между записями было(для примера) 10 ед. времени то между стартом eventHandler'ов 1 ед. на запись что item извлечен нужно 2 ед. времени получили проблему, причем неприятность в том, что отвалится 2 запись - более поздняя. Я сделал очередь, и флажок в результате уменьшил количество конфликтов в 10 раз. Но они все же есть. Я понимаю конечно идею статичной информации, но  список легкий и в нем удобно отображать состояния и переходы состояний других объектов (документов, списков, узлов и т.п.) в этом и заключается проблема отсутствия блокировки записи. Идеологически мне кажется это не правильным. Тем более что на базе sharepoint можно поднять и интернет портал. Банально при нагрузке на список в день 10000 пользователей мы легко получаем конфликты сохранений.
    30 ноября 2007 г. 15:23
  • Поскольку акценты смещаются в сторону программирования и "ед. времени" ...

     

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

     

    public int x1=0        // количество eventHandler, попавших в очередь, в не зависимости от длины стека

    public int a1()         // массив номеров eventHandler

     

    eventHandler()

    {

    [static int x1 = 0]

    [static int a1()]

    int x3                    // внутренний номер eventHandler в очереди

    x3 = ++x1

     

    // Добавляем в массив (стек) номер последнего eventHandler

    ii = len(a1)++

    a1(ii) = x3

     

    // По умолчанию обрабатывается первый в стеке eventHandler

     

    // Если очередь текущего номера eventHandler не наступила

    do

    {

        // цикл задержки (предусмотреть экстренный выход)

    } while (x3<>a1(1))

     

    // Если выход не экстренный

    if (x3 = a1(1))

    {

    // Рабочая функция

     

    ii=1

    }

    else

    {

    // Ищем позицию x3 в стеке

    ii=0

    ii = Find(x3, a1)

    }

     

    // Если позиция найдена, удаляем номер eventHandler из стека и уменьшаем стек

    if (ii>0)

    {

    Delete(a1, ii)

    }

     

    // Если удален последний элемент, значит ВСЕ eventHandler обработаны. Обнуляем x1

    if (len(a1) = 0)

    {

    x1 = 0

    }

    }

    1 декабря 2007 г. 20:07