Автоинкрементные столбцы в Sharepoint Foundation 2010.

Автоинкрементные столбцы в Sharepoint Foundation 2010.

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

Обзор задачи

Можно создать небольшую схему, работающую через рабочие процессы, для этого понадобятся:

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

Сразу же усложним себе задачу, дабы было интересно: требуется, чтобы к каждому элементу присваивался уникальный номер, присваиваемый по шаблону PPPYYTTT-XXXX (где PPP — префикс организации, которой принадлежит документ или элемент списка, YY — две последние цифры года, TTT — от 2х до 3х символов, условный тип контента (приказ, протокол и т.п.), XXXX — порядковый номер документа, обязательно четырехзначный, дополняемый нулями), например РЖД13ИСХ-0045. Таким образом можно раздавать уникальные номера документам на крупном предприятии с несколькими юр. лицами. Нумероваться будут элементы списков, содержащих единственный тип контента, поэтому в одном списке тип контента в номере будет всегда один. Можно реализовать и систему по-хитрее, когда в одном списке хранятся элементы нескольких типов, например,  корреспонденция, где регистрируют исходящую(ИСХ) и входящую(ВХ) корреспонденцию и справки(СПР). Для этого в РП нужно будет добавить небольшое условие, но об этом позже.

 Системный список

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

Столбцы списка-счетчика

Столбцы списка-счетчика

Код Предприятия — это переименованный столбец «Название»,  Код Контента — поле выбора с типами контента, это те, что вставляются в середину номера. Последний номер — простое число, изначально равное 0, и Новый номер — Вычисляемый столбец с простой формулой Последний номер + 1. Код Строки — конкатенация строк Код Предприятия и Код Контента. Вычисленный номер — сформированный номер по шаблону, упомянутому ранее, формула столбца следующая:

 =[Код Предприятия]&(ГОД(Создан)-2000)&[Код Контента]&ЕСЛИ([Новый номер]<10;»000″;ЕСЛИ([Новый номер]<100;»00″;ЕСЛИ([Новый номер]<1000;»0″;)))&[Новый номер]

Пока что оставляем список-счетчик без внимания, переходим к созданию РП. Открываем Sharepoint Designer, ищем и открываем список, в котором нужно добавить столбец с нумерацией элементов. Создаем рабочий процесс:

Вводим имя РП

Вводим имя РП

В параметрах РП ставим галку Автоматически запускать рабочий процесс при создании элемента и снимаем с Разрешить запуск этого рабочего процесса вручную.

Создание рабочего процесса

Создание рабочего процесса автонумерации

Переходим в режим редактирования рабочего процесса — жмем на кнопку Открыть рабочий процесс. Начинаем с объявления переменных:

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

Переменные Рабочего Процесса

Шаги РП

Вот так выглядит готовый рабочий процесс

Мы же начинаем с пустого РП:

Девственно чистый Рабочий Процесс

Новый Рабочий Процесс

  1. Идем в Действие и выбираем в группе Основные действия Задать переменную рабочего процесса. Нажимаем на переменная и в выпадающем списке выбираем нужную переменную.Затем, нажимаем на значение появится поле и кнопочка функции (крайняя справа) и в появившемся окне поле Источник данных, по-умолчанию принимает значение Текущий элемент, выбираем нужное поле, в нашем случае это Код Предприятия.
    Список доступных действий

    Список доступных действий

    Действие

    Новое действие

    Окно выбора поля

    Определение подстановки в рабочем процессе

    Первое действие

    Первое действие готово

  2. Второе действие создаем аналогично первому, за одним исключением — нажимаем не кнопку функции, а кнопку с многоточием — вызовем Построитель строк.
    Вызвать диалог вставки переменных или значений из столбцов можно, нажав на кнопку Добавить или изменить подстановку. Откроется уже знакомое окно Определение подстановки в рабочем процессе. Выберем источником данных Параметры и переменные рабочего процесса. А в Поле из источника укажем имя переменной КодПредприятия и нажмем ОК. Допишем тип контента (в нашем случае у списка код «ПЛ») — конкатенация строк в построителе осуществляется без каких-либо операндов. Так мы сформировали идентификатор, который точно укажет на строку в списке-счетчике — это нам пригодится на следующем шаге.

    Потроитель строк

    Окно построителя строк

  3. Повторяем действия первого шага, но уже для переменной новоеЧисло. В значении указываем следующие параметры:
    Источник данных: %имя списка-счётчика%
    Поле из источника: Новый номер
    В секции поиск элемента списка нужно указать столбец по которому будет производиться поиск нужного значения и источник значения:
    Поле: КодСтроки
    Значение: Выбрать ИдентификаторСчётчика

    Задаем значение нового номера

    Диалоговое окно подстановки

    Единственно новое здесь — Вернуть поле как — возвращаем как строку.

    Указать значение подстановки

    Указать значение подстановки

  4. Для переменной ГотовыйНомер проделываем те же действия, что и на предыдущем шаге, только Поле указываем ВычисленныйНомер.
  5. Добавляем Действие -> Действия со списками -> Изменить поле в текущем элементе. Для поля Номер задаём значение переменной ГотовыйНомер.
  6. Последний шаг — Сказать списку счетчику, что номер заняли и нужно бы увеличить следующий номер на 1, для этого обновим элемент в списке Счётчики-Общие:
    Добавляем Действие -> Действия со списками -> Обновить элемент в списке. Жмем кнопку Добавить и с помощью уже знакомых диалогов выбираем нужные поля, а конкретно — Последний номер и присваиваем ему значение переменной новоеЧисло.

    Диалог обновления элемента

    Диалог обновления элемента

    Добавление значения в диалоге обновления.

    Добавление значения в диалоге обновления.

Сохраняем рабочий процесс. Теперь при создании нового элемента в списке автоматически будет проставляться номер элемента или документа. Чтобы решить задачу с несколькими кодами контента в одном списке можно перед шагом 2 вставить блок условий, где в зависимости от типа контента(имею ввиду тип контента sharepoint) будет присваиваться значение переменной, допустим, ТипКонтента. А затем на шаге 3 мы будем объединять в одно строку две переменные КодПредприятия и ТипКонтента.
Если же элементы имеют общий тип контента, то можно добавить специальный столбец или пытаться вычислить код контента по уникальному содержимому существующих столбцов.

 

комментариев 9

  1. Сергей:

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

    • bormoshka:

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

  2. Сергей:

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

  3. Сергей:

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

    • bormoshka:

      Рабочим процессом точно не обойтись. Но можно попробовать в настройках списка задать значения полей по-умолчанию. С датой точно можно про остальные не скажу.Там можно простенькие формулы писать.

  4. Евгений:

    Добавляем Действие -> Действия со списками -> Изменить поле в текущем элементе. Для поля Номер задаём значение переменной ГотовыйНомер.

    Объясните, пожалуйста, откуда взялось поле Номер?

    • bormoshka:

      Ух, вспомнить бы ещё.
      Поле номер — это поле, в целевом списке, где мы и хотим видеть наш сгенерированный номер.

  5. Максим:

    У меня вопрос. Как сделать так что бы в «Поле из источника» появилось «Код Предприятия».

  6. Алексей:

    Спасибо автору за внятно изложенную полезную информацию.

Добавить комментарий