2011-10-06 201 views
3

我有2个SharePoint列表,我必须将所有项目从List1复制到List2。SharePoint 2010“foreach”

在List1上有一个布尔型字段(默认为'no'),一个文本字段和一个关联的WorkFlow,它们在修改时触发。

的UML的工作流简化:

  1. 复制当前项目列表2
  2. 设置我boolen场为“是”
  3. 搜索与boolen领域的项目“不”,设置它的文本字段“复制'

我通过修改List1中的一个项目开始该过程,然后它将自己复制到List2,修改另一个项目,等等......直到有任何项目的boolen字段设置为'没有'。

这适用于10个项目,但然后失败。项目10将项目11的文本字段修改为“复制”,但项目11的WorkFlow未启动。我已经试过了它的仆役时间,并且在10份之后总是停下来。

我已经谷歌和MSDN'd。我发现的最佳解决方案是在WorkFlow中暂停1分钟。但我有成千上万的物品...

有没有人有任何建议?我什至无法找到任何限制在SharePoint 2010服务器,默认为10.

谢谢!

+0

非常怪异确实 - 我不知道的10左右任何限制无论是。与分页有关吗?但工作流通常不关心分页。 –

+2

我认为有一个并发工作流限制,默认情况下是8或15。我现在没有SP2010,但我认为这是在中央管理> Web应用程序管理>选择您的Web应用程序>资源/限制/限制/无论它叫什么。看到这个额外的信息:http://stackoverflow.com/questions/6332070/active-vs-running-workflow-不是100%确定它适用,但不知何故,我认为节流击中你。还请检查ULS日志文件(14 \ LOGS)以获取有关工作流程限制的信息。 –

+0

当您需要简单地将项目从一个列表复制到另一个列表时,忘记工作流程。你正在滥用一种不应该取代“简单的旧的循环”的机制。不管错误的来源是什么。 –

回答

0

由于工作流程的速度,您正在触发SharePoint 2010中的硬编码资源限制。这是为了防止系统在工作流程操作期间变得无响应。应用程序页面或计时器作业中的代码将绕过此限制,但不建议执行贪婪操作,导致系统无法响应用户。

0

你可以做CAML批处理方法。

somethig这样的:

void UpdateList() 
    { 
     StringBuilder methodBuilder = new StringBuilder(); 
     string batch = string.Empty; 
     string newValue="mmmm"; 
     string updateColumn = "SampleColumn"; 


     try 
     { 
      string batchFormat = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
            "<ows:Batch OnError=\"Continue\">{0}</ows:Batch>"; 
      string methodFormat = "<Method ID='{0}' >" + 
            "<SetList>{1}</SetList>" + 
            "<SetVar Name='Cmd'>Save</SetVar>" + 
            "<SetVar Name='ID'>{2}</SetVar>" + 
            "<SetVar Name='urn:schemas-microsoft-com:office:office#{3}'>{4}</SetVar>" + 
            "</Method>"; 

      using (SPSite siteCol = new SPSite("SampleSite")) 
      { 
       using (SPWeb web = siteCol.OpenWeb()) 
       { 

        // Get the list containing the items to update 
        SPList list = web.Lists["SampleList"]; 
        string listGuid = list.ID.ToString(); 
        SPListItemCollection allItems = list.GetItems(); 

        // Build the CAML update commands. 
        for (int i = 0; i < allItems.Count; i++) 
        { 
         int itemID = allItems[i].ID; 
         methodBuilder.AppendFormat(methodFormat, itemID, listGuid, itemID, updatedColumn, newValue); 
        } 
        web.AllowUnsafeUpdates = true; 

        // Generate the CAML 
        batch = string.Format(batchFormat, methodBuilder.ToString()); 

        // Process the batch 
        string batchReturn = web.ProcessBatchData(batch); 

       } 
       //done 
      } 

     } 
     catch (Exception ex) 
     { 
    //show the error 
     } 

    } 

您可以创建创建批处理方法,在列表和文档库删除和更新项目。

参考文献:

http://msdn.microsoft.com/en-us/library/office/ms437562%28v=office.15%29.aspx

http://msdn.microsoft.com/en-us/library/office/ms459050(v=office.15).aspx

0
如果你想改变工作流程并行执行限制

....

对于检查范围:

Get-SPFarmConfig | Select WorkflowPostponeThreshold 

对于变化

Set-SPFarmConfig -WorkflowPostponeThreshold 50 

定时服务流程项目(工作流延续)上批量

Get-SPFarmConfig | Select WorkflowBatchSize 

Set-SPFarmConfig -WorkflowBatchSize 150