none
Заполнение столбца подстановки. RRS feed

  • Вопрос

  • Здравствуйте,

    Прошу простить новичка за простейший наверное вопрос.

    Стоит задача подстановки столбца из одного списка, в другой результирующий. Главное, чтобы подставлялся как есть, по мере забивки данных в него(т.е. ячейки автоматом заполняются в результирующей таблице). И тут появилась проблема, автоматом значения не появляются, в столбце подстановки приходится их выбирать!

    Подскажите плз. как решить, или куда копать? Вроде как простейшая вещь, а работать не хочет :-(

    10 сентября 2015 г. 22:43

Ответы

  • Добрый день,

    все верно, значения автоматом не подставляются, т.к. есть понятия поля выбора и его значение.

    Я как понял у вас поле с выбором множественных значений?

    В вашем случае необходимо создать Event Reciever на изменение элементов списка подстановки, который будет обновлять значения всех элементов второго списка. Рабочий процесс не подойдет, т.к. выборка из второго списка вернет только первое значение из множества.

    Если надо сделать быстро, то устанавливаем iLove SharePoint

    Устанавливать через PS(если у вас SP2013, т.к. данный пакет для SP2010):

    Install-SPSolution iLoveSharePoint.Workflow.Activities.wsp -GACDeployment -CompatibilityLevel {14, 15}

    Добавляем РП в списке подстановки на изменение и в активити Execute PowerShell Script пробегаемся по всем элементам второго списка и обновляем поле подстановки(на примере обновления одного элемента):

    $web = $site.OpenWeb("targetweb")
    $list = $web.Lists.GetByTitle("targetlist")
    $item = $list.GetItemById(1)
    $ctx.Load($web)
    $ctx.Load($list)
    $ctx.Load($item)
    $ctx.ExecuteQuery()
    
    $mvLookup = $item["MultiValueLookupColumnName"]
    $mvLookup |% { "Lookup Value: $($_.LookupId):$($_.LookupValue)" }
    
    # create an Object[] and add FieldLookupValue instances
    $lookupValueCollection = @()
    $lookupValue = New-Object Microsoft.SharePoint.Client.FieldLookupValue
    $lookupValue.LookupId = 4
    $lookupValueCollection += $lookupValue
    
    $lookupValue = New-Object Microsoft.SharePoint.Client.FieldLookupValue
    $lookupValue.LookupId = 5
    $lookupValueCollection += $lookupValue
    
    # convert the Object[] to a FieldLookupValue[]
    $mvLookup = [Microsoft.SharePoint.Client.FieldLookupValue[]]$lookupValueCollection 
    
    # set multi-value lookup field value
    $item["MultiValueLookupColumnName"] = $mvLookup
    $item.Update()
    $ctx.ExecuteQuery()

    • Предложено в качестве ответа Kaplin VladimirModerator 11 сентября 2015 г. 7:45
    • Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 11 сентября 2015 г. 8:37
    • Снята пометка об ответе Sarge_Alex 14 сентября 2015 г. 11:38
    • Помечено в качестве ответа Sarge_Alex 14 сентября 2015 г. 12:36
    • Снята пометка об ответе Sarge_Alex 14 сентября 2015 г. 13:08
    • Помечено в качестве ответа Sarge_Alex 14 сентября 2015 г. 13:10
    11 сентября 2015 г. 2:42

Все ответы

  • Добрый день,

    все верно, значения автоматом не подставляются, т.к. есть понятия поля выбора и его значение.

    Я как понял у вас поле с выбором множественных значений?

    В вашем случае необходимо создать Event Reciever на изменение элементов списка подстановки, который будет обновлять значения всех элементов второго списка. Рабочий процесс не подойдет, т.к. выборка из второго списка вернет только первое значение из множества.

    Если надо сделать быстро, то устанавливаем iLove SharePoint

    Устанавливать через PS(если у вас SP2013, т.к. данный пакет для SP2010):

    Install-SPSolution iLoveSharePoint.Workflow.Activities.wsp -GACDeployment -CompatibilityLevel {14, 15}

    Добавляем РП в списке подстановки на изменение и в активити Execute PowerShell Script пробегаемся по всем элементам второго списка и обновляем поле подстановки(на примере обновления одного элемента):

    $web = $site.OpenWeb("targetweb")
    $list = $web.Lists.GetByTitle("targetlist")
    $item = $list.GetItemById(1)
    $ctx.Load($web)
    $ctx.Load($list)
    $ctx.Load($item)
    $ctx.ExecuteQuery()
    
    $mvLookup = $item["MultiValueLookupColumnName"]
    $mvLookup |% { "Lookup Value: $($_.LookupId):$($_.LookupValue)" }
    
    # create an Object[] and add FieldLookupValue instances
    $lookupValueCollection = @()
    $lookupValue = New-Object Microsoft.SharePoint.Client.FieldLookupValue
    $lookupValue.LookupId = 4
    $lookupValueCollection += $lookupValue
    
    $lookupValue = New-Object Microsoft.SharePoint.Client.FieldLookupValue
    $lookupValue.LookupId = 5
    $lookupValueCollection += $lookupValue
    
    # convert the Object[] to a FieldLookupValue[]
    $mvLookup = [Microsoft.SharePoint.Client.FieldLookupValue[]]$lookupValueCollection 
    
    # set multi-value lookup field value
    $item["MultiValueLookupColumnName"] = $mvLookup
    $item.Update()
    $ctx.ExecuteQuery()

    • Предложено в качестве ответа Kaplin VladimirModerator 11 сентября 2015 г. 7:45
    • Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 11 сентября 2015 г. 8:37
    • Снята пометка об ответе Sarge_Alex 14 сентября 2015 г. 11:38
    • Помечено в качестве ответа Sarge_Alex 14 сентября 2015 г. 12:36
    • Снята пометка об ответе Sarge_Alex 14 сентября 2015 г. 13:08
    • Помечено в качестве ответа Sarge_Alex 14 сентября 2015 г. 13:10
    11 сентября 2015 г. 2:42
  • Если у вас обычное поле подстановки, то действуем аналогичным образом, только код будет намного проще.
    11 сентября 2015 г. 2:44
  • Огромное спасибо за ответ!

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

    И при выполнении, вышеописанный РП(я поставил ilovesharepoint) дает ошибку: Error while executing PowerShell Script: Method invocation failed because [Microsoft.SharePoint.WorkflowActions.WorkflowContext] doesn't contain a method named 'Load'.

    Это можно исправить(у меня SP 2013 Foundation)?




    • Изменено Sarge_Alex 13 сентября 2015 г. 21:08
    13 сентября 2015 г. 1:06
  • Приведенный ниже скрипт не работает :-(

    Примеров решения задачи подстановки значений столбцов из одного списка в другой не нашел.

    Похоже надо разбираться с Visual Studio, чтобы создать Event Receiver.


    • Изменено Sarge_Alex 14 сентября 2015 г. 12:36
    14 сентября 2015 г. 12:35
  • Добрый день,

    ну конечно он не будет работать для простого столбца, т.к. FieldLookupValue[] не равно FieldLookupValue.

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

    14 сентября 2015 г. 12:58
  • Это понятно, так и делаю.

    Однако там на стадии объявления переменных застряло.

    Т.е. после строки $ctx.Load($web) идет ошибка вида: 

    Error while executing PowerShell Script: Method invocation failed because [Microsoft.SharePoint.WorkflowActions.WorkflowContext] doesn't contain a method named 'Load'.

    Из чего и сделан вывод о нерабочем коде.

    14 сентября 2015 г. 13:19
  • Упс, не хватает пару строк, замените начало скрипта ($web = $site.OpenWeb("targetweb") ) на :

    $ctx= Connect-SPOSite https://SiteUrl
    $web = $context.Web

    14 сентября 2015 г. 14:05
  • При обработке строки: 

    $list = $web.Lists.GetByTitle("test1")


    Возникает ошибка:

    PS E:\> .\testmove.ps1
    Cannot index into a null array.
    At E:\testmove.ps1:6 char:1
    + $list = $web.Lists.GetByTitle["test1"]
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    Список есть, данные в нем тоже, что ему не хватает - непонятно! 

    15 сентября 2015 г. 14:14
  • Добрый день,

    Вы пытаетесь запустить скрипт из консоли? Тогда нужен будет другой скрипт.

    Скрипт запускаемый из Execute PowerShell Script Action уже имеет предопределенные переменные:

    • $site = the current Microft.SharePoint.SPSite
    • $web = the current Microft.SharePoint.SPWeb
    • $list = the current Microft.SharePoint.SPList (null in site workflows)
    • $item= the current Microft.SharePoint.SPListItem (null in site workflows)
    • $ctx = the current workflow context Microsoft.SharePoint.WorkflowActions.WorkflowContext
    • $sharePointService = the current Microsoft.SharePoint.Workflow.ISharePointService service
    • $listItemService = the curent Microsoft.SharePoint.Workflow.IListItemService service

    И кстати он работает через ServerOM.

    16 сентября 2015 г. 5:29
  • Если требуется явно открыть какой-то сайт (не контекстный для РП), то в PS:

    $web = Get-SPWeb "http://portal/sitename" #открываем сайт
    $list = $web.Lists["ListName"] #открываем список
    $items = $list.Items #получаем все элементы списка
    16 сентября 2015 г. 6:22
  • Посмотрите простое описание работы с объектами SharePoint на PS: Using PowerShell to play with SharePoint Items
    16 сентября 2015 г. 6:23
  • Решение проблемы:

    Нашел наконец решение, как можно синхронизовать списки с помощью скрипта. Собственно само решение взято отсюда: http://adicodes.com/copy-or-replace-list-items-in-powershell/

    Немного подредактировав скрипт(убрав слеши "/" перед lists) можно заставить его работать на сервере с SP2013.

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

    $sourceListUrl = $sourceListWeb.ServerRelativeUrl + "lists/" + $SourceListName;

    $destinationListUrl = $dstListWeb.ServerRelativeUrl + "lists/" + $DestinationListName;


    Скрипт копирует все столбцы одного списка в другой, проверяя наличие ранее скопированных строк по текстовому столбцу "Title". Ничто не мешает, в результирующем списке сделать меньше полей(если вам не нужно копировать все). Тоже будет работать. Также можно проверять по другому столбцу, предварительно изменив его тип.

    Цель как бы достигнута, можно поставить скрипт выполняться в планировщик раз в 5-10 минут(на практике этого достаточно). Однако это не совсем правильно. Правильно будет заставить его выполняться в рабочем процессе, при изменении целевого списка, с помощью РП созданного в ilovesharepoint.

    Вот здесь небольшая засада, сначала скрипт отказывается выполняться из-за ошибки write-host, правим его вставляя эти строки в начало:

    $ps.addscript("function write-host {}").invoke()
    $ps.commands.clear()

    Однако далее, при выполнении РП, выдается ошибка: 

    Error while executing PowerShell Script: You cannot call a method on a null-valued expression.

     И вот тут уже непонятно, какая переменная там в нулевом значении?

    Если кто-нибудь сталкивался с этим, подскажите плз. на какие переменные в скрипте подставляет ilovesharepoint? Те, что обозначены выше, я в скрипте не увидел, или может я не туда смотрю?


    • Изменено Sarge_Alex 20 сентября 2015 г. 22:04
    20 сентября 2015 г. 22:02