Acción de Workflow para proyectos Sandbox

He tenido que crear un workflow para Sharepoint Online que permitiese recopilar datos de dos listas para crear un correo electrónico. Los Workflows que podemos crear con Sharepoint Designer tienen unas acciones – muy limitados – que permiten trabajar en listas básicamente y en algunas otras utilidades. Existe la acción de enviar por correo pero no existe ninguna acción que permita consultar de una lista o dos listas con filtros, ordenaciones y joins. Para eso podemos crear en Visual Studio 2010 un Workflow ya que des de aquí disponemos de muchas más acciones – entre ellas una que te ejecuta el código que tú quieras – pero este tipo de proyecto no se puede desarrollar en Sandbox y Sharepoint Online solo podemos desarrollar en Sandbox.

Así que buscando y pensando llegué a la conclusión de que sólo podía crear una acción en Sandbox para que pudiese ser usado en Sharepoint Designer para crear el workflow. Microsoft en su página explica perfectamente como crear esta acción y como publicarla en Sharepoint Online y también puedes encontrar otras webs que hablan de ello. Pero nadie habla de lo que a mi me ha pasado al programarlo. Es por eso que necesito contarlo.

Primero déjame que te haga un resumen de lo que puedes encontrar en los siguientes links:

http://msdn.microsoft.com/en-us/library/ff798355.aspx

http://msdn.microsoft.com/en-us/library/ff798499.aspx

Lo primero que debes hacer después de crear un proyecto vació de Sharepoint es añadir una clase que tenga un método que devuelva un Hashtable y que su primer parámetro sea del tipo SPUserCodeWorkflowContext.

namespace MySharePointProject.ExecuteMyCode
{        
   public class ExecuteMyCodeClass    
  {
    public Hashtable EnviarLista(SPUserCodeWorkflowContext context, string nombrelista)        
    {
    }
  }
}

nombrelista es un parámetro que necesito pero que no es necesario.

Después debes añadir un elemento vació que te servirá para definir la acción – con sus parámetros de entrada y salida -.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <WorkflowActions>
 
    <Action Name="Exeute code Ideon" 
            SandboxedFunction="true"
            Assembly="$SharePoint.Project.AssemblyFullName$" 
            ClassName="MySharePointProject.ExecuteMyCode.ExecuteMyCodeClass" 
            FunctionName="EnviarLista" 
            AppliesTo="all"  UsesCurrentItem="true"
            Category="Custom">
      <RuleDesigner Sentence="Des de la lista %1 y poner la salida en %2 .">
        <FieldBind Field="nombrelista" 
                   Text="Nombre de la lista" 
                   Id="1" 
                   DesignerType="TextBox"></FieldBind>
        <FieldBind Field="listagenerada" 
                   Text="Lista generada" 
                   Id="2" 
                   DesignerType="ParameterNames"></FieldBind>
      </RuleDesigner>
      <Parameters>
        <Parameter Name="__Context" 
                   Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" 
                   Direction="In" 
                   DesignerType="Hide"/>
        <Parameter Name="nombrelista" 
                   Type="System.String, mscorlib" 
                   Direction="In" 
                   DesignerType="TextBox"
                   Description="Nombre de la lista"/>
 
        <Parameter Name="listagenerada" 
                   Type="System.String, mscorlib" 
                   Direction="Out" 
                   DesignerType="ParameterNames" 
                   Description="Lista generada"/>
      </Parameters>
 
    </Action>
  </WorkflowActions>
</Elements>

En negrita te he puesto lo que debes indicar.

Si defines bien los parámetros y el modo que se deben enlazar solo te queda escribir el código para devolver el resultado

Hashtable results = new Hashtable();            
string lista = string.Empty;            
//Tu codigo aquí
results["listagenerada"] = lista;
results["status"] = "Success";            
results["success"] = true;            
return results;

Empaquetas y subes el .wsp a la galería Soluciones de Sharepoint Online. Creas en Workflow con Designer y encontrarás tu acción en la lista de los disponibles. Maravilloso verdad? pues no. Eso es lo que se explica en la web oficial de Microsoft más muchas webs que explican lo mismo con otros ejemplos – igual que yo hasta ahora -. A mi esto no me funciona ni en Sharepoint Online ni Foundation. En un Server Standard o Enterprise no lo he probado. Sharepoint Online no permite ver los detalles del error y eso es un problema cuando ves que el Workflow no funciona. No sabes el porqué. Así que empecé a probar y a probar, desmontando y volviendo a montar y nada de nada. Supongo que hay más pero yo he encontrado aquí la solución

http://adventuresindotnet.blogspot.com/2011/05/sharepoint-2010-custom-workflow.html

pero sin que él me lo haya dicho. Fíjate en el Element.xml que él propone:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <WorkflowActions>
    <Action
      Name="Do My Custom Activity"
      Category="Custom"
      Assembly="MyActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=263abdd79d4ec6f8"
      ClassName="MyActivity.Activities"
      FunctionName="DoSomething"
      AppliesTo="all"
      UsesCurrentItem="true"
      SandboxedFunction="true">
      <RuleDesigner Sentence="Find Field %1 and do something with it related to %2">
        <FieldBind DesignerType="FieldNames" Id="1" Text="Field with File List" Field="FieldName" />
        <FieldBind DesignerType="StringBuilder" Id="2" Text="Extra String" Field="ExtraString" />
      </RuleDesigner>
      <Parameters>
        <Parameter Name="FieldName" Type="System.String, mscorlib" Direction="In" DesignerType="FieldNames" Description="The field with our data in it" />
        <Parameter Name="ExtraString" Type="System.String, mscorlib" Direction="In" DesignerType="StringBuilder" Description="A string that has some more data" />
        <Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In" DesignerType="Hide" />
      </Parameters>
    </Action>
  </WorkflowActions>
</Elements>

Salvando lo evidente es igual al que yo ye creado al inicio pero con una diferencia.

Assembly="MyActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=263abdd79d4ec6f8"

en lugar de

Assembly="$SharePoint.Project.AssemblyFullName$"

Ya puedes buscar y buscar que encontrarás $SharePoint.Project.AssemblyFullName$ será sustituido por el nombre del ensamblado. Pues no.

Debes indicar tu mismo el nombre del ensamblado completo y ya está. Así que mi solución ahora es así

<?xml version="1.0" encoding="utf-8"?> 
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">   
 <WorkflowActions>       
 <Action Name="Exeute code Ideon"             
        SandboxedFunction="true"             
        Assembly="MySharePointProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a45e4efa36e81a5d"             
        ClassName="MySharePointProject.ExecuteMyCode.ExecuteMyCodeClass"             
        FunctionName="EnviarLista"             
        AppliesTo="all"  
        UsesCurrentItem="true"             
        Category="Custom">       
Todo el resto igual
</Action>   
</WorkflowActions> 
</Elements>

Y si aún no te funciona yo hice otro cambio pero que no sé si es importante pero al ver que funcionaba después de hacer el cambio que ya te he comentado, la verdad no quise tocar nada más.

Entra en Package.package y añade al que ya tienes lo siguiente

<SafeControl Assembly="MySharePointProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a45e4efa36e81a5d"
               Namespace="MySharePointProject.ExecuteMyCode"
               TypeName="*" />
</SafeControl>

Espero que te funcione.

Anuncis

Un pensament sobre “Acción de Workflow para proyectos Sandbox

  1. Retroenllaç: SharePoint 2010: Depuración de custom sandbox activities! - Blog del CIIN

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s