by Andreas

Sharepoint 2010 – programmatically set workflow initiation parameters

If you trigger workflows from the code behind of a custom webpart you might want to set some of the workflow initiation parameters to runtime values. I’ve seen some pretty ugly attempts to do this by alternating the SPWorkflowAssociation.AssociationData object using string.Replace for instance.. To save others the time and effort figuring out this I thought I’d share a method I wrote where this is done in a more proper and reliable way.

For simplicity the namespace is hardcoded, but you should be able to figure that part out for yourself. This is the default namespace, and will work unless you’ve tampered with it.

It pretty much just accepts the original association data (XML based) and the name of the initiation parameter plus the new value (this is only for string based variables, but you could easily add support for other types as well).

private static string AddVariableToWorkflowAssociationData(string originalAssociationData, string variableName, string variableValue)
{
    XNamespace dfs = "http://schemas.microsoft.com/office/infopath/2003/dataFormSolution";
    XNamespace d = "http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields";

    var associationDataXml = XElement.Parse(originalAssociationData);

    if (associationDataXml == null ||
        associationDataXml.Element(dfs + "dataFields") == null ||
        associationDataXml.Element(dfs + "dataFields").Element(d + "SharePointListItem_RW") == null ||
        associationDataXml.Element(dfs + "dataFields").Element(d + "SharePointListItem_RW").Element(d + variableName) == null)
    {
        _log.Warn("AddVariableToWorkflowAssociationData() unable to find node '" + variableName + "' in association data");
        return originalAssociationData;
    }

    _log.Info("Setting workflow parameter '" + variableName + "' to '" + variableValue + "'");
    var nodeToChange = associationDataXml.Element(dfs + "dataFields").Element(d + "SharePointListItem_RW").Element(d + variableName);
    nodeToChange.SetValue(variableValue);

    return associationDataXml.ToString();
}

Invoke this method by getting a reference to the workflow you want to trigger (SPWorkflowAssociation), call my method with the original association data, and use the return value when starting the workflow:

string enhancedAssociationData = AddVariableToWorkflowAssociationData(wrkFl.AssociationData, "MyVeryOwnAssociationParameter", "SomeCrazyValue!!");
enhancedAssociationData = AddVariableToWorkflowAssociationData(enhancedAssociationData, "AnotherAssociationParameter", "AndYetAnotherCrazyValue");
siteColl.WorkflowManager.StartWorkflow(record, wrkFl, enhancedAssociationData, true);

Some of this code was altered on the fly for this blog post so compilation is not guaranteed. However, if you’re this deep into it to start with you should be capable of resolving that anyway!

by Degree Admin

Hva er nytt i Sharepoint 2010?

  • Stor oppdaterting av grensesnittet. Sharepoint benytter nå “Ribbons”. Hensikten er at Sharepoint skal bli så likt som andre Office applikasjoner som mulig.
  • Utvidede muligheter på “mysite”. Funksjoner som: Du kan se hva brukeren driver med, chatte, skrive meldinger og få oversikt over hvor brukeren plasserer seg i organisasjonen og blant de andre brukerne.
  • Bedre støtte for andre nettlesere. Microsoft har bygget opp denne funksjonaliteten med Ajax og ikke ActiveX.
  • Metadata er enklere å navigere i enn før. Du kan legge til nøkkelord, og navigere i disse via et hiarki som likner mapper. Dette, sammen med en unik id som følger dokumentet gjennom hele systemet, skal gjøre dem lettere å finne.
  • Bedre søk. Boolske parametre, fonetisk søk og rangering av søkeresultater er nå inkludert.
  • Fast Search for Sharepoint. Søkeserver i systemet gir Sharepoint smartere søk, med blant annet forhåndsvisninger, nøkkelord-forslag og forståelse for lingvistikk.
  • Enklere å lage sine egne “dashboards”; en slags hovedside for Sharepoint-brukerne. Før krevde dette koding. Nå er det mulig ved å dra og slippe elementer i en “dashboard-designer”.
  • Sharepoint 2010 inneholder også noe som heter Composites. Du kan via Sharepoint åpne for eksempel sql-databaser fra andre systemer. Du kan dermed endre og lagre dem i Sharepoint, og databasene oppdaterer seg. Sharepoint fungerer med andre ord som en redigerer for filer som kanskje kjører på andre eldre og mer kompliserte systemer.
  • “Embed” Excel dynamiske grafer. Grafer fra Excel vil holde seg oppdatert på siden.
  • Bedre lister. Mulighet for millioner av elementer i lister.
  • Business Connectivity Services. Interaksjon  med eksterne data på samme måte som SharePoint data.
  • Mickroblogging. Man kan lage egen blogg på egne områder eller for bedriften.
  • Støtte for content types på tvers av Site Collection, Web Applications, Farms og Multiple Farms.
  • Enterprise Content Management (ECM). Forbedring av dokumenthåndteringsystem. Mange nye funksjoner og større muligheter, både for brukere, administratorer, og utviklere. Unike dokument-ID`er, Document sets, taksonomi, metadata services og enda bedre Office integrasjon.
  • Arbeidsflyt har fått mange nye funksjoner. Designer arbeidsflyt kan bli pakket som en  .wsp fil for utrulling på andre sider. Både arbeidsflyt på sites og lister. Kan opprette arbeidsflyt i Visio. Kan også eksportere det ut i Sharepoint Designer for deretter å importere det inn til Visio igjen.
  • Visio services in SharePoint 2010. Visio 2010 har fått bedret funksjonalitet for å koble visio-diagrammer og figurer mot en eller flere datakilder. Visio services er en måte å dele disse diagrammene vha en browser – brukerne trenger ikke Visio-klienten.