trabajo flujo crear como aprobacion sharepoint workflow workflow-foundation sharepoint-designer workflow-activity

aprobacion - como crear un flujo de trabajo en sharepoint 2016



En el editor de flujo de trabajo del diseñador de SharePoint, ¿cómo obtengo el nombre de usuario de los iniciadores del flujo de trabajo? (4)

En el editor de flujo de trabajo del diseñador de Sharepoint deseo recuperar el nombre de usuario / nombre del iniciador del flujo de trabajo (es decir, quién lo inició o activó el flujo de trabajo); esto es relativamente fácil de usar utilizando productos de terceros como Nintex Workflow 2007 (donde usaría algo así como {Common: Initiator}), pero parece que no puedo encontrar ninguna forma de salir de la caja para hacer esto usando el diseñador de puntos compartidos y MOSS 2007.

Actualizar

No parece que esta característica bastante obvia sea compatible con OOTB, así que terminé escribiendo una actividad personalizada (como lo sugiere una de las respuestas). He enumerado el código de actividades aquí para referencia aunque sospecho que hay probablemente algunas instancias de esto flotando en blogs porque es una solución bastante trivial:

public partial class LookupInitiatorInfo : Activity { public static DependencyProperty __ActivationPropertiesProperty = DependencyProperty.Register("__ActivationProperties", typeof(Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties), typeof(LookupInitiatorInfo)); public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof (WorkflowContext), typeof (LookupInitiatorInfo)); public static DependencyProperty PropertyValueVariableProperty = DependencyProperty.Register("PropertyValueVariable", typeof (string), typeof(LookupInitiatorInfo)); public static DependencyProperty UserPropertyProperty = DependencyProperty.Register("UserProperty", typeof (string), typeof (LookupInitiatorInfo)); public LookupInitiatorInfo() { InitializeComponent(); } [Description("ActivationProperties")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties __ActivationProperties { get { return ((Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties)(base.GetValue(__ActivationPropertiesProperty))); } set { base.SetValue(__ActivationPropertiesProperty, value); } } [Description("Context")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public WorkflowContext __Context { get { return ((WorkflowContext)(base.GetValue(__ContextProperty))); } set { base.SetValue(__ContextProperty, value); } } [Description("UserProperty")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string UserProperty { get { return ((string) (base.GetValue(UserPropertyProperty))); } set { base.SetValue(UserPropertyProperty, value); } } [Description("PropertyValueVariable")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string PropertyValueVariable { get { return ((string) (base.GetValue(PropertyValueVariableProperty))); } set { base.SetValue(PropertyValueVariableProperty, value); } } protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { // value values for the UserProperty (in most cases you // would use LoginName or Name) //Sid //ID //LoginName //Name //IsDomainGroup //Email //RawSid //Notes try { string err = string.Empty; if (__ActivationProperties == null) { err = "__ActivationProperties was null"; } else { SPUser user = __ActivationProperties.OriginatorUser; if (user != null && UserProperty != null) { PropertyInfo property = typeof (SPUser).GetProperty(UserProperty); if (property != null) { object value = property.GetValue(user, null); PropertyValueVariable = (value != null) ? value.ToString() : ""; } else { err = string.Format("no property found with the name /"{0}/"", UserProperty); } } else { err = "__ActivationProperties.OriginatorUser was null"; } } if (!string.IsNullOrEmpty(err)) Common.LogExceptionToWorkflowHistory(new ArgumentOutOfRangeException(err), executionContext, WorkflowInstanceId); } catch (Exception e) { Common.LogExceptionToWorkflowHistory(e, executionContext, WorkflowInstanceId); } return ActivityExecutionStatus.Closed; } }

Y luego conéctelo con el siguiente archivo .action xml:

<?xml version="1.0" encoding="utf-8"?> <WorkflowInfo Language="en-us"> <Actions> <Action Name="Lookup initiator user property" ClassName="XXX.ActivityLibrary.LookupInitiatorInfo" Assembly="XXX.ActivityLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=XXX" AppliesTo="all" Category="WormaldWorkflow Custom Actions"> <RuleDesigner Sentence="Lookup initating users property named %1 and store in %2"> <FieldBind Field="UserProperty" DesignerType="TextArea" Id="1" Text="LoginName" /> <FieldBind Field="PropertyValueVariable" DesignerType="ParameterNames" Text="variable" Id="2"/> </RuleDesigner> <Parameters> <Parameter Name="__Context" Type="Microsoft.Sharepoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In"/> <Parameter Name="__ActivationProperties" Type="Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties, Microsoft.SharePoint" Direction="In"/> <Parameter Name="UserProperty" Type="System.String, mscorlib" Direction="In" /> <Parameter Name="PropertyValueVariable" Type="System.String, mscorlib" Direction="Out" /> </Parameters> </Action> </Actions> </WorkflowInfo>


La solución de actividad personalizada solo funciona si trabaja con musgo, si solo tiene wss 3.0 puede poner un paso más en su flujo de trabajo y establecer un campo de comentario personalizado con cualquier información, esto hace que la última persona modificada cambie y se convierta en la misma como el iniciador del flujo de trabajo, puede usar el campo ModifiedBy para tomar cualquier decisión que necesite.


No creo que esto sea posible en SharePoint Designer de fábrica. Probablemente pueda escribir una acción personalizada para obtener el originador, pero no creo que esté expuesto a través de la interfaz de flujo de trabajo SPD.

Lo mejor que probablemente podría hacer es obtener el usuario que creó o modificó el elemento en la lista, pero esto no manejaría los casos donde el flujo de trabajo se ejecutó manualmente.


Para aquellos que buscan en este artículo y ahora están usando SharePoint 2010, la variable del iniciador del flujo de trabajo ahora es compatible con OOTB en SharePoint Designer.

La fuente de datos sería "Contexto de flujo de trabajo" y el campo es, por supuesto, "Iniciador" y puede elegir devolverlo como "Nombre para mostrar", "Correo electrónico", "Nombre de inicio de sesión" o "Número de identificación de usuario".


Puedo pensar en una solución simple pero no muy sofisticada para esta usando solo SPD. Solo en los pasos del flujo de trabajo crea un elemento de prueba en una lista secundaria (probablemente una lista de tareas que almacena las propiedades workflowId y itemId para la refrencia) y luego realiza una búsqueda en tu flujo de trabajo en esa lista para ver quién es el creador de ese elemento, ese valor sería el iniciador de flujo de trabajo actual.