Nell'editor del flusso di lavoro di sharepoint designer come posso ottenere il nome utente degli iniziatori del flusso di lavoro?

StackOverflow https://stackoverflow.com/questions/131238

Domanda

Nell'editor del flusso di lavoro del progettista di Sharepoint desidero recuperare il nome utente / il nome dell'iniziatore del flusso di lavoro (ovvero chi lo ha avviato o attivato il flusso di lavoro) - questo è relativamente facile da fare utilizzando prodotti di terze parti come Nintex Workflow 2007 (dove Vorrei usare qualcosa come {Common: Initiator}) - ma non riesco a trovare una via d'uscita per farlo usando Share Point Designer e MOSS 2007.

Aggiorna

Non sembra che questa funzionalità piuttosto ovvia sia supportata da OOTB, quindi ho finito per scrivere un'attività personalizzata (come suggerito da una delle risposte). Ho elencato il codice delle attività qui come riferimento, anche se sospetto che probabilmente ci siano alcune istanze di questo che fluttuano là fuori sui blog in quanto è una soluzione piuttosto banale:

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

E poi collegalo con il seguente file .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>
È stato utile?

Soluzione

Non credo sia possibile farlo immediatamente in SharePoint Designer. Probabilmente potresti scrivere un'azione personalizzata per ottenere l'originatore, ma non credo che sia esposto attraverso l'interfaccia del flusso di lavoro SPD.

Il meglio che probabilmente potresti fare è ottenere l'utente che ha creato o modificato l'elemento nell'elenco, ma questo non gestirà i casi in cui il flusso di lavoro è stato eseguito manualmente.

Altri suggerimenti

Per coloro che utilizzano Google in questo articolo e ora utilizzano SharePoint 2010, la variabile di iniziatore del flusso di lavoro è ora supportata OOTB in SharePoint Designer.

L'origine dati sarebbe " Contesto del flusso di lavoro " e il campo è, ovviamente, "Iniziatore" e puoi scegliere di restituirlo come " Nome visualizzato " ;, " Email " ;, " Nome di accesso " o il " Numero ID utente "

Posso pensare a una soluzione semplice ma non molto sofisticata per questo usando solo SPD. Solo nei passaggi del flusso di lavoro creare un elemento di prova in un elenco secondario (probabilmente un elenco di attività che memorizza le proprietà del flusso di lavoro e dell'elementoId per il riferimento) e quindi effettuare una ricerca nel flusso di lavoro su quell'elenco per vedere chi è il creatore di quell'elemento, che valore sarebbe l'iniziatore del flusso di lavoro corrente.

La soluzione di attività personalizzata funziona solo se lavori con moss, se hai solo wss 3.0 puoi aggiungere un ulteriore passo nel tuo flusso di lavoro e impostare un campo di commento personalizzato con qualsiasi informazione, in questo modo l'ultima persona modificata da cambiare e diventa lo stesso dell'iniziatore del flusso di lavoro, quindi puoi utilizzare il campo ModifiedBy per prendere qualsiasi decisione di cui hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top