2011-10-06 48 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