2011-01-27 18 views
6

Ho creato un flusso di lavoro SharePoint Designer e l'ho associato a un elenco. Il flusso di lavoro crea un processo di approvazione, quindi SharePoint crea un'attività nell'elenco delle attività in modo che l'utente possa approvare o rifiutare.Approvare un'attività del flusso di lavoro SharePoint utilizzando SharePoint Web Services/Object Model

Quello che devo fare è approvare o rifiutare l'attività senza aprire l'attività nell'elenco delle attività. Dopo alcune ricerche ho capito che posso utilizzare SharePoint Web Services. Tuttavia mi sento perso perché non so quale servizio, ad es. Lists.asmx e quale metodo, ad es. UpdateListItems, per chiamare.

Qualcuno può guidarmi attraverso quanto segue:
1- È possibile approvare un'attività di flusso di lavoro Servizi Web di SharePoint?
2- Puoi mostrarmi un esempio di come approvare un'attività, ad es. quale servizio e metodo chiamare e quali dovrebbero essere i parametri?

Aggiornamento
Sono stato con il seguente codice XML per impostare il flusso di lavoro per completare:

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>"; 

L'operazione elemento elenco viene aggiornato ma il WorkflowOutcome rimane vuoto e il flusso di lavoro non si muove al passo successivo.
Cos'altro mi manca?

Aggiornamento # 2
sto sospettando le ExtendedProperties della voce elenco delle attività. Per un elemento che è stato completato utilizzando l'interfaccia utente, ExtendedProperties mostra ws_TaskStatus = 'Approvato'. Tuttavia, per un articolo che è stato approvato utilizzando il codice ws_TaskStatus non esiste.

Update # 3
Da un posto di MSDN, mi è stato detto di utilizzare la Workflow.asmx al posto del Lists.asmx.
Ho usato il seguente codice:

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); 
} 

L'XML che sto usando per approvare il compito è

<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> 

Ma ancora una volta il compito è stato aggiornato, ma il flusso di lavoro non si mosse in avanti.

Aggiornamento # 4
Ho fatto un ultimo studio con il modello oggetto server SharePoint tuttavia, ancora una volta, il compito è aggiornato, ma il flusso di lavoro non è in movimento in avanti.
Ecco il mio codice:

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); }

risposta

4

Dopo un sacco di prove e indagini Ho appena avuto il seguente codice di lavoro per approvare il compito

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); 
} 

Ho il sospetto che ht["TaskStatus"] = "Approved"; è che attributo che risolto. Ad ogni modo cercherò di restringere il set di proprietà che devono essere cambiate.

3

È possibile utilizzare il seguente codice che utilizza il servizio web gli elenchi e il metodo UpdateListItems.La chiave è quella di utilizzare il Cmd = 'Moderato'

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

Non sono sicuro se la soluzione di Madhur lavora sulla voce associata o sul compito, ma per aggiornare il compito prova:

<?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> 

Informazioni sul servizio:

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

Informazioni sul campo approvato:

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 per i collegamenti utili –

Problemi correlati