1

Je crée une tâche de workflow le listItem en sharepoint 2013. Le flux de travail fonctionne très bien quand je suis en ajoutant l'élément de liste la tâche est créée et il n'y a pas d'erreur. Cependant, quand je mets à jour l'élément le code de workflow me donne cette erreur:<nativehr> 0x8102009b</nativehr><nativestack></ nativestack> Flux de travail Sharepoint 2013

<nativehr>0x8102009b</nativehr><nativestack></nativestack> 

StackTrace

at HBLEventReceiverWP.ApprovalWFRecevier.ApprovalWFRecevier.LookupAndStartWorkflow(SPListItem listItem, SPWorkflowManager manager, SPWorkflowAssociationCollection associationCollection, String workflowId) 
    at HBLEventReceiverWP.ApprovalWFRecevier.ApprovalWFRecevier.ItemUpdated(SPItemEventProperties properties) 
    at Microsoft.SharePoint.SPEventManager.RunItemEventReceiver(SPItemEventReceiver receiver, SPUserCodeInfo userCodeInfo, SPItemEventProperties properties, SPEventContext context, String receiverData) 
    at Microsoft.SharePoint.SPEventManager.RunItemEventReceiverHelper(Object receiver, SPUserCodeInfo userCodeInfo, Object properties, SPEventContext context, String receiverData) 
    at Microsoft.SharePoint.SPEventManager.<>c__DisplayClassa`1.<InvokeEventReceiver>b__7() 
    at Microsoft.SharePoint.SPSecurity.RunAsUser(SPUserToken userToken, Boolean bResetContext, WaitCallback code, Object param) 

Ceci est mon code sur itemupdated événement.

public class ApprovalWFRecevier : SPItemEventReceiver 
    { 
     /// <summary> 
     /// An item was updated. 
     /// </summary> 
     public override void ItemUpdated(SPItemEventProperties properties) 
     { 
      base.ItemUpdated(properties); 
       // get site collection web 
      using (SPWeb spWeb = properties.OpenWeb()) 
      { 
       // get current site 
       SPSite spSite = spWeb.Site; 
       // 
       spWeb.AllowUnsafeUpdates = true; 
       // check if it is a component list 
       bool isCompLst = CheckIsComponentList(properties.List.ToString()); 
       if (isCompLst == true) 
       { 
        // set the list item 
        SPListItem listItem = properties.ListItem; 

        // check if item is in preview mode 
        if (properties.List.ToString() == "SitePages") 
        { 
         if (Convert.ToBoolean(listItem["Preview"]) == false) 
         { 
          SPWorkflowManager manager = spSite.WorkflowManager; 
          //get item's parent list 
          SPList parentList = listItem.ParentList; 
          //get all workflows that are associated with the list 
          SPWorkflowAssociationCollection associationCollection = parentList.WorkflowAssociations; 
          //lookup and start the worflow 
          LookupAndStartWorkflow(listItem, manager, associationCollection, "Approval"); 
         } 

        } 
        else if (CheckPreviewCol(listItem, properties) == false) 
        { 
         //obtain an instance of SPWorkflowManager 
         //which will be later used to start the workflow 
         SPWorkflowManager manager = spSite.WorkflowManager; 
         //get item's parent list 
         SPList parentList = listItem.ParentList; 
         //get all workflows that are associated with the list 
         SPWorkflowAssociationCollection associationCollection = parentList.WorkflowAssociations; 
         //lookup and start the worflow 
         LookupAndStartWorkflow(listItem, manager, associationCollection, "Approval"); 

        } 
       } 
      } 



     } 

     #region Methods 

     public bool CheckIsComponentList(string listName) 
     { 
      try 
      { 
       bool IsCompLst = false; 

       switch (listName) 
       { 
        case "HeadingComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "ParagraphComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "FAQComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "FAQComponentDetail": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "BulletComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "BulletComponentDetail": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "ButtonsComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "TwoImageComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "ImageGridComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "ImageWithDescriptionComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "GreenTextComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "TableComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "TableComponentRows": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "CenterComponent": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        case "CenterComponentDetail": 
         // set component list to true 
         IsCompLst = true; 
         break; 
        case "SitePages": 
         // set component list to true 
         IsCompLst = true; 
         break; 

        default: 
         // set component list to true 
         IsCompLst = false; 
         break; 
       } 
       return IsCompLst; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 
     public bool CheckPreviewCol(SPListItem listItem, SPItemEventProperties properties) 
     { 
      try 
      { 
       bool isPreview = true; 

       bool oldValue = listItem["Preview"] != null ? Convert.ToBoolean(listItem["Preview"]) : true; 
       if (oldValue == true) 
       { 
        bool newValue = properties.AfterProperties["Preview"] != null ? Convert.ToBoolean(properties.AfterProperties["Preview"]) : true; 

        if (oldValue != newValue) 
         isPreview = false; 
       } 
       else 
        isPreview = false; 

       return isPreview; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

     private static void LookupAndStartWorkflow(SPListItem listItem, SPWorkflowManager manager, SPWorkflowAssociationCollection associationCollection, string workflowId) 
     { 
      try 
      { 

       //iterate workflow associations and lookup the workflow to be started 
       foreach (SPWorkflowAssociation association in associationCollection) 
       { 
        //if the workflow association matches the workflow we are looking for, 
        //get its association data and start the workflow 
        if (association.Name.ToLower().Equals(workflowId.ToLower())) 
        { 
         //get workflow association data 
         string data = association.AssociationData; 

         //start workflow with privileges 
         SPSecurity.RunWithElevatedPrivileges(delegate() 
         { 
         SPWorkflow wf = manager.StartWorkflow(listItem, association, data, true); 
         }); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

     #endregion 

    } 

Répondre

0

Cette erreur peut signifier qu'il existe déjà un flux de travail actif pour cet élément spécifique. la solution dans votre cas serait de vérifier si le flux de travail est terminé. Ce serait quelque chose comme:

if(workflow.IsCompleted) 
{ 
    //you can start it 
    //this is pseudocode do not rely on it 
} 

Pour plus d'informations, consultez this source.