2011-01-27 88 views
6

我已經創建了一個工作流,即SharePoint Designer並將其與列表關聯。該工作流程會創建審批流程,因此SharePoint會在「任務」列表中創建一項任務,以便用戶批准或拒絕。使用SharePoint Web服務/對象模型批准SharePoint工作流任務

我需要做的是在不打開任務列表中的任務的情況下批准或拒絕任務。經過一番研究,我發現我可以使用SharePoint Web Services。然而,我不知道哪一種服務,例如Lists.asmx,以及哪種方法,例如UpdateListItems,來調用。

有人可以通過以下方式指導我:
1-批准工作流任務SharePoint Web Services是否可行?
2-您能否告訴我一個如何批准任務的例子,例如需要調用哪種服務和方法以及參數應該是什麼?

更新
我一直在使用下面的XML設置工作流程來完成:

batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" // Also used Moderate 
       + "<Field Name='ID'>115</Field>" 
       + "<Field Name='Status'>Completed</Field>" 
       + "<Field Name='FormData'>Completed</Field>" // Also used Approved 
       + "<Field Name='WorkflowOutcome'>Approved</Field>" 
       + "<Field Name='Completed'>True</Field>" 
       + "<Field Name='PercentComplete'>1</Field>" 
       + "<Field Name='_ModerationStatus'>0</Field>" 
       + "</Method>"; 

任務列表項更新,但仍然WorkflowOutcome空,工作流不動的下一步。
我還缺少什麼?

更新#2
我懷疑任務列表項的ExtendedProperties。對於使用UI完成的項目,ExtendedProperties顯示ws_TaskStatus ='Approved'。但是,對於使用代碼ws_TaskStatus批准的項目不存在。

更新#3
從MSDN後,我被告知使用Workflow.asmx而不是Lists.asmx的。
我用下面的代碼:

WorkflowService.Workflow listProxy = new WorkflowService.Workflow(); 
listProxy.Url = "http://<server_name>/_vti_bin/workflow.asmx"; 
listProxy.UseDefaultCredentials = true; 

int todoID = 118; 
Guid tasklistID = new Guid("{79ABFDE7-0398-4AD7-918A-0D40204E7726}"); 
string itemURL = "http://<server_name>/TestLibrary/volshext.log"; 
XmlDocument taskData = new XmlDocument(); 
taskData.Load(@"..\..\TaskData.xml"); 

try 
{ 
    XmlNode response = listProxy.AlterToDo(itemURL, todoID, tasklistID, taskData.DocumentElement); 
    Console.WriteLine(response.InnerText); 
} 

我使用批准該任務的XML是

<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD" > 
<my:TaskStatus>#</my:TaskStatus> 
<my:Comments /> 
<my:DelegateTo /> 
<my:NewDescription>Please approve Workflow Demo</my:NewDescription> 
<my:NewDueDate /> 
<my:RequestTo /> 
<my:Decline>0</my:Decline> 
<my:dcr>0</my:dcr> 
<my:Status>Completed</my:Status> 
</my:myFields> 

但同樣的任務更新,但工作流程並沒有向前推進。

更新#4
我已經然而,再次提出與SharePoint服務器對象模型中的一個庭審最後,任務更新,但工作流程不前進。
這裏是我的代碼:

SPSite site = new SPSite("http://sitenamehere/"); 
using (SPWeb web = site.OpenWeb()) 
{ 
    SPList list = web.Lists["Shared Documents"]; 
    //SPListItem item = list.GetItemById(18); 
    SPListItem item = list.GetItemByUniqueId(new Guid("5300d16e-94f8-4338-8206-4a57ab7c369b")); 
    SPWorkflow workflow = item.Workflows[0]; 
    SPWorkflowTask task = workflow.Tasks[0]; 
    Hashtable ht = new Hashtable();
ht[SPBuiltInFieldId.Completed] = "TRUE"; ht["Completed"] = "TRUE"; ht[SPBuiltInFieldId.PercentComplete] = 1.0f; ht["PercentComplete"] = 1.0f; ht["Status"] = "Completed"; ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]); //ht["TaskStatus"] = "#"; //ht["ows_TaskStatus"] = "Approved"; //ht["FormData"] = SPWorkflowStatus.Completed; //ht["Outcome"] = "Approved"; //task.ModerationInformation.Status = SPModerationStatusType.Approved;
web.AllowUnsafeUpdates = true; SPWorkflowTask.AlterTask((task as SPListItem), ht, true); }

回答

4

大量的試驗和調查後,我剛做了下面的代碼工作批准任務

SPSite site = new SPSite("http://servername/"); 
using (SPWeb web = site.OpenWeb()) 
{ 
    SPList list = web.Lists["TestList"]; 
    SPListItem item = list.GetItemById(22); 
    SPWorkflow workflow = item.Workflows[0]; 
    SPWorkflowTask task = workflow.Tasks[0]; 

    Hashtable ht = new Hashtable();    
    ht[SPBuiltInFieldId.Completed] = "TRUE"; 
    ht["Completed"] = "TRUE"; 
    ht[SPBuiltInFieldId.PercentComplete] = 1.0f; 
    ht["PercentComplete"] = 1.0f; 
    ht["Status"] = "Completed"; 
    ht[SPBuiltInFieldId.TaskStatus] = SPResource.GetString(new CultureInfo((int)task.Web.Language, false), Strings.WorkflowStatusCompleted, new object[0]); 
    ht[SPBuiltInFieldId.WorkflowOutcome] = "Approved"; 
    ht["TaskStatus"] = "Approved"; 
    ht["FormData"] = SPWorkflowStatus.Completed; 

    web.AllowUnsafeUpdates = true; 
    SPWorkflowTask.AlterTask((task as SPListItem), ht, true); 
} 

我懷疑ht["TaskStatus"] = "Approved";是解決它該屬性。無論如何,我會盡量縮小需要改變的一組屬性。

3

您可以使用使用列表Web服務和UpdateListItems方法下面的代碼。關鍵是要使用CMD =「適度」

public static XmlNode UpdateListItemApprove() 
{ 
      listservice.Lists listProxy = new listservice.Lists(); 


      string xml = "<Batch OnError='Continue'><Method ID='1' Cmd='Moderate'><Field Name='ID'/><Field Name='FileRef'>http://basesmcdev2/sites/tester1/approvals/KL022030.lic</Field><Field Name=\"_ModerationStatus\" >0</Field></Method></Batch>"; 

      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 

      XmlNode batchNode = doc.SelectSingleNode("//Batch"); 

      listProxy.Url = "http://basesmcdev2/sites/tester1/_vti_bin/lists.asmx"; 
      listProxy.UseDefaultCredentials = true; 

      XmlNode resultNode = listProxy.UpdateListItems("approvals", batchNode); 

      return resultNode; 


} 
3

我不知道,如果Madhur的解決方案適用於相關的項目或任務,但更新任務的嘗試:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<UpdateListItems 
xmlns="http://schemas.microsoft.com/sharepoint/soap/"> 
<listName>Tasks</listName> 
<updates> 
<Batch OnError="Continue" ListVersion="1"> 
<Method ID="1" Cmd="Update"> 
<Field Name="ID">199</Field> 
<Field Name="Outcome">Approved</Field> 
<Field Name="Status">Completed</Field> 
<Field Name="ows_TaskStatus">Approved</Field> 
</Method> 
</Batch> 
</updates> 
</UpdateListItems> 
</soap:Body> 
</soap:Envelope> 

在服務信息:

http://objectmix.com/sharepoint/800144-updatelistitems-web-service-does-not-update-field.html

信息經批准的領域:

http://social.msdn.microsoft.com/Forums/en/sharepointworkflow/thread/6712d379-2df6-4223-9a29-b2e60493f1b6

http://social.msdn.microsoft.com/Forums/en/sharepointworkflow/thread/3dc95190-cc61-4067-ac35-2d1a82fad499

+0

+1對於有用的鏈接 – 2011-02-01 12:51:22

相關問題