This task is currently locked by a running workflow

by Robin Persson 4. February 2010 11:20

Detta problem brottades jag med en hel del nyligen.

"Workflowet" jag skapade fungerade så att den skapade en "approve/reject task" och beroende på svar från "approvern" så skapades ytterligare en "task". När denna andra "task" skulle godkännas så exkverades inte koden som den skulle. Den körde aldrig metoder som t.ex. OnTask_Changed och inga ändringar registrerades. När man sen öppnade samma "task" igen så inträffade följande: "This task is currently locked by a running workflow". Efter en hel del klurande, googlande och "trial & error" löste jag det genom att sätta ett nytt "task ID" på varje "task" som skapades via "workflowet".

task.TaskId = Guid.newGuid()

Vissa personer har löst detta problem på andra sätt genom att ta bort låset som "workflowet" sätter. Men jag är rädd för att det inte är en långsiktig lösning. 

Så kom ihåg: Alla "tasks" som skapas i ett workflow ska i kod få ett unikt id!

Skrivskydda ett postat InfoPath formulär

by Robin Persson 28. January 2010 15:14

Det finns ett väldigt enkelt sätt att skrivskydda ett InfoPath formulär som en gång har sparats i en Sharepoint lista.

När jag först fick den här uppgiften var jag inne på att dölja spara/skicka knappen i formuläret. Men det hittade jag ingen bra lösning på, dessutom ville jag i detta fall hålla mig borta från en code behind.

Istället skapade jag en ny vy i formuläret som jag gjorde skrivskyddad.

 

 

Jag kopierade allt från huvudvyn och klistrade in i min skrivskyddade vy. (Det går inte se skillnad på de båda vyerna).

Sen skapade jag en regel som körs när vyn öppnas. Tools -> Form Options... -> Open and Save -> Rules.

Välj att skapa en ny regel och klicka sen på Set Condition.

 

 

Välj ett fält som du vet måste innehålla data när formuläret postas. (Alltså ett obligatoriskt fält). Välj sen "is not blank" alternativet. Detta fält kommer alltså alltid innehålla data när ett sparat fält öppnas, men inte när ett nytt formulär öppnas. (Du kan även göra detta på andra sätt, om du inte har obligatoriska fält i ditt formulär, som t.ex. sätta ett fälts värde när formuläret postas och matcha i mot det)

Gå vidare genom att klicka "OK" och sen på "Add Action". I Action fältet väljer du "Switch views" och sen väljer du helt enkelt den skrivskyddade vyn du just skapade.

 

 

Se sen till att användaren inte kan välja några andra vyer. Tools -> Form Options -> Browser -> kryssa ur "Views".

 

Färdigt! När man nu öppnar ett formulär i ett formulärbibliotek så kommer allt vara skrivskyddat.

Top 5 saker jag ser fram emot i Sharepoint 2010

by Robert Skyttberg 26. January 2010 21:03

1. BCS - Business Connectivity Services

Integration med andra system är något som är mycket viktigt när det gäller Sharepoint och med Sharepoint 2010 är BCS bara ett av de verktyg vi utvecklare får till vårt förfogande när det gäller integration.

BCS är den nya BDC ifrån Moss 2007 med stora skillnader. Det kommer nu enkelt gå via antingen Sharepoint Designer eller Visual Studio gå att sätta upp kopplingar och bygga snabbt CRUD-applikationer(sharepoint listor) mot extern data, såsom databaser och web services m.m. Tidigare gick det endast att läsa ifrån andra källor med BDC.

 

2. Relationer

Äntligen! Eller? Jag hoppas och tror det kommer tillföra en hel del nytta. Både genom att det blir möjligt att skapa beroenden mellan listor och items samt att det kommer att gå att hämta ut och visa data i en gemensam vy byggda på relationer.

 

3. Client Object Model

Client OM tycker jag verkar grymt intressant då detta kommer öppna upp det en hel del för utvecklare att enkelt bygga "stand alone" program som integrerar med Sharepoint 2010.

 

4. No more CAML? -> LINQ

Alla som jobbat som utvecklare mot WSS/MOSS listor vet hur drygt det kan vara ibland med att skriva CAML frågor och hur konstigt uppbyggda dessa är. I Sharepoint 2010 går det att undvika dessa och använda LINQ to Sharepoint istället vilket kommer blir härligt för alla vana .net utvecklare.

 

5. Taxonomi

Detta är en viktig del som kommer bli ruggigt användbart ifall man förstår sig på hur det är tänkt att man skall kunna använda det. Grejen är att man kommer kunna tagga upp i princip allt möjligt dels personligen men även administrationsmässigt genom att bygga listor m.m. kommer det bli möjligt att göra "förslag på andra saker" du kan vara intresserad av etc. Dock tror jag det kommer ta ett bra tag innan man förstått sig på och hur man skall bygga sina siter för att ta nytta av detta på bästa sätt.

 

Detta var några saker som jag tycker verkar väldigt intressant med nya Sharepoint 2010. Vad är det som lockar hos er i den nya versionen?

Scripta anpassade dokumentbibliotek och listor Del 1

by Robert Skyttberg 24. January 2010 22:26

Det finns två sätt att koda egna listor i sharepoint 2007, antingen väljer man API spåret eller XML/CAML spåret. Som med allt annat så finns det för- och nackdelar med båda dessa sättet. Stora grejer som jag ser det är i XML så kan du återanvända GUID till innehållstyper, fält m.m. vilket är något jag ofta gör/behov av.

I det här inlägget kommer jag gå igenom hur du bygger en egen dokument lista med innehållstyper och egna fält i en feature som vi sedan kommer använda för att generera egna listor som vi behöver. Vi börjar med att skapa ett nytt projekt och en ny Blank Feature med hjälp av tex WSPBuilder(riktigt bra verktyg för utvecklare). När detta är gjort öppnar du upp feature.xml. Ändra din fil så att den ser ungefär enligt följande, tänk på att generera egna guidar.

 

<?xml version="1.0" encoding="utf-8"?>

<Feature  xmlns="http://schemas.microsoft.com/sharepoint/"

          Id="876551fb-e627-4e7a-8207-a7682b431b98"

          SolutionId="4EAA49EB-2965-44ea-8D47-BE360AA7813E"

          Title="MyDocumentListTemplate"

          Description="Description for MyDocumentListTemplate"

          Version="1.0.0.0"

          Hidden="FALSE"

          Scope="Site"

          ActivateOnDefault="TRUE"

          DefaultResourceFile="core">

  <ElementManifests>

    <ElementManifest Location="SP2010.ListTemplates\SSH.ListTemplates.xml" />

    <ElementFile Location="SP2010.DocumentLibraryTemplate\schema.xml"/>

    <ElementFile Location="SP2010.DocumentLibraryTemplate\EditDlg.htm"/>

    <ElementFile Location="SP2010.DocumentLibraryTemplate\FileDlg.htm"/>

    <ElementFile Location="SP2010.DocumentLibraryTemplate\Repair.aspx"/>

    <ElementFile Location="SP2010.DocumentLibraryTemplate\Upload.aspx"/>

  </ElementManifests>

</Feature>

 

Det viktiga i denna filen är innehållet i <ElementManifests /> som vi kan sno ifrån den ursprungliga DocumentLibrary som finns under 12 högen och sedan: \12\TEMPLATE\FEATURES\DocumentLibrary.

Viktigt är också vad som står framför vår pekning av filerna, i mitt fall SP2010.ListTemplates samt 2010.DocumentLibraryTemplate vilket gör att vi måste skapa kataloger i vårt projekt och lägga filerna där. Nu borde vi ha en struktur som ser ut såhär i vårat projekt.

 

 Spara om filerna enligt din elementmanifest spec. Öppna nu filen ListTemplates.xml och uppdatera den enligt följande. Viktigt är att sätta Type med värde över 10000 så att den inte krockar med någon annat i Sharepoint.

 

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

    <ListTemplate

        Name="SP2010.DocumentLibraryTemplate"

        Type="10070"

        BaseType="1"

        OnQuickLaunch="TRUE"

        SecurityBits="11"

        DisplayName="MyDocumentListLibrary"

        Description="My description of MyDocumentListLibrary"

        Image="/_layouts/images/itdl.gif"

        DisallowContentTypes="False"

        />

</Elements>


Nästa steg är att lägga till våra innehållstyper till vår schema.xml men innan vi öppnar schema.xml så måste vi skapa våra innehållstyper och sidkolumner. Skapa en blank feature i samma projekt och döp det till DocumentContentTypesAndSitecolumns ta bort elements-filen och skapa sedan de innehållstyper du vill ha med samt kolumner. Vår struktur ser nu enligt följande och exempel på hur våra innehållstyper och sidkolumner kan se ut enligt följande.

 

 

Sitecolumns.xml

<?xml version="1.0" encoding="utf-8" ?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <Field ID="{DIN GUID}" Type="Text" Group="SP2010 Kolumner"

         Name="SP2010_Epost" DisplayName="E-post" SourceID="http://schemas.microsoft.com/sharepoint/v3/fields"

         StaticName="SP2010_Epost" Description="E-post" Required="TRUE"  />

 …

</Elements>


firstCT.xml

 

<?xml version="1.0" encoding="utf-8" ?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <ContentType ID="0x0101001A7F23FCA140433eAF3E8D034000E351" Name="First CT" Group="SP2010-innehållstyper" Description="Innehållstyp för First" Version="0">

    <FieldRefs>

      <FieldRef ID="{Samma guid som i sitecolumns.xml}" Name="SP2010_Epost" />

       …

    </FieldRefs>

  </ContentType

</Elements>

 

Viktigt är i ID är en kombination av värden som indikerar vilken innehållstype den ärver ifrån. I vårat fall är det 0x0101 som säger åt sharepoint att den här innehållstypen ärver ifrån Document. Man behöver även lägga till två nollor innan vi kastar in vår GUID. Så med andra ord blir det 0x010100VÅRGUID.

Bibliotek innehållstyper

-          0x0101   -   Dokument

-          0x010101 - Formulär

-          0x010102 - Bilder

-          0x010108 – WikiDokument

-          0x010109 - BasPage

-          0x01010901 - WebPartSida

Så nu är vi klara med våra innehållstyper och kolumner så nu kan vi gå over till schema.xml. Bli inte rädda för den filen då den är ohyggligt stor när man först öppnar och läser den.

Börja med att byta ut följande:

 

<List xmlns:ows="Microsoft SharePoint"

      Title="$Resources:shareddocuments_Title;"

      Direction="$Resources:Direction;"

      Url="Shared Documents"

      BaseType="1">

Till:

<List xmlns:ows="Microsoft SharePoint"

      Title="$Resources:shareddocuments_Title;"

      Direction="$Resources:Direction;"

      Url="Shared Documents"

      Type="10070"

      BaseType="1"

      EnableContentTypes="True"

      EnableFolderCreation="FALSE"

      EnableVersioning="majorminor">

 

Du kan nu ta bort följande del då vi kommer koppla våra innehållstyper mha av powershell.

 

<ContentTypes>

  <ContentTypeRef ID="0x0101">

    <Folder TargetName="Forms/Document" />

  </ContentTypeRef>

  <ContentTypeRef ID="0x0120" />

</ContentTypes>

 

Nu är grunderna lagda och det går bra att bygga vårt WSP projekt samt köra deploy till vår server. Om du nu går in på sidan och webbplatsinställningar/webbplatsamlingens funktioner hittar du våra två nyinstallerade features.

 

 

Nu går det att för hand klicka sig fram till att få vårat eget bibliotek med egna innehållstyper skapade vi gränssnittet. Du hittar vår nya typ av bibliotek under webbplatsbibliotek och listor. Men jag ska visa ett annat sätt som gör det enkelt och smidigt att bygga upp miljöer genom powershellscriptning. Anledning till att man vill använda den scriptade vägen är att du minimerar chanserna att göra fel genom att i andra fall klicka dig fram till hur miljön skall vara och det går fort att flytta eller sätta upp nya miljöer(ex testserver, prodserver eller nya kollegors utv.miljö).

Detta kommer jag beskriva och visa hur vi bygger i del två.

 

 

InfoPath 2010

by Robin Persson 20. January 2010 00:35

InfoPath är både älskad och hatad! Själv förespråkar jag InfoPath starkt, och trivs bra att arbeta med produkten.

Nu kommer snart Infopath 2010 att släppas och den innehåller en hel del förbättringar och nyheter.

Här kommer några av dem:

 

  • Innehåller Office Fluent UI
  • Nya kontroller som bild knappar och grupp/person väljare
  • Publicera formulär med ett enda klick
  • Möjlighet att (i Sharepoint 2010) skapa skräddarsydda list formulär

 

Ska bli mycket intressant att sätta tänderna i denna produkt.

Läs gärna mer här: http://blogs.msdn.com/infopath/archive/2009/07/15/what-s-new-in-infopath-2010.aspx

Bamboo Solutions video

by Robin Persson 15. January 2010 19:36

Många har säkert kommit i kontakt med Bamboo Solutions. Det är ett företag som gör Webparts för Sharepoint. Jag hittade en video på Youtube.

Jag gillade speciellt en av kommentarerna på videon:

"No wonder their web parts don't work...the spend all their R&D money on bad music videos"

Se vem som ringer på Windows Mobile

by Robin Persson 14. January 2010 23:52

För ett tag sen skapade jag ett Windows Mobile program som automatiskt slår upp ett nummer mot Eniro.se eller Hitta.se.

Programmet innehåller inställningar so t.ex:

  • Slå bara upp nummer när du är WiFi ansluten.
  • Slå enbart upp nummer som du inte har som kontakt.
  • Slå upp nummer på sms
  • Möjlighet att använda Eniro.se eller Hitta.se
  • Spara hittad kontakt i mobilen.
  • Intern logg (historik)

 

Så om du har Windows Mobile rekommenderar jag starkt detta program. Det har har varit mycket användbart för mig och andra.

Download: OnCallSetup.CAB (117,89 kb)

Sätt rättigheter på SPListitem via Workflow

by Robin Persson 14. January 2010 22:40

En kund jag arbetade för hade som krav att dokument i en lista på en Sharepoint 2007 enbart skulle få ses av personer från ett visst land och personer från en viss region.

Problemet var att de inte hade denna information på användarnas konton i deras AD.

Landskod samt regionskod sparades som metadata på dokumentet. Till en början var jag inne på att ange landskod och regionskod i fält på användarnas User Profiles i Sharepoint, samt att senare filtrera listan med hjälp av en "Current User Webpart".

Problemet som uppstod då var att man inte kunde filtrera en lista med multipla värden (en användare kunde tillhöra flera länder), samt att man heller inte kunde filtrera på landskod och regionskod samtidigt.

En nackdel med denna lösning var att du inte heller fick full säkerhet då du enbart filtrerade listan (du angav aldrig några rättigheter på dokumenten).

 

Istället skapade jag upp grupper i Sharepoint för varje land och region. Lade in rätt användare i tillhörande grupp (gjorde detta snabbt via en Console app, skulle också kunna ha använt Power Shell vilket kanske är att rekommendera).

Tanken var att jag skulle skapa en event receiver att lägga på dokumentbiblioteket men tidigare hade jag skapat ett skräddarsytt approval workflow som till samma bibliotek.

Så istället för att skapa en ny feature så lade jag in funktionaliteten i workflowet, så att när workflowet initierades tog den bort rättigheterna för de länder och regioner (grupperna jag skapade) som inte fanns med som metadata på dokumentet i fråga.

Alla länder och regioner fanns i en lista på siten så jag gick igenom listan och och matchade lanskod samt regionskod mot grupperna i Sharepoint och tog bort rättigheter för gruppen på dokumentet, men inte för det land och region som angetts som metadata på dokumentet.

private void SetListItemPermission()
{
        string currentCountry = workflowProperties.Item["Country"].ToString();
        string currentRegion = workflowProperties.Item["Region"].ToString();

        SPList countryList = workflowProperties.Web.Lists["TheCountryAndRegionList"];
        workflowProperties.Item.BreakRoleInheritance(true);
        string newRegion = string.Empty;
        foreach (SPListItem item in countryList.Items)
        {
            string country = item["Country"].ToString();
            string region = item["Region"].ToString();
            if (country != currentCountry)
            {
                    if (workflowProperties.Web.SiteGroups.GetCollection(new String[] { country }).Count > 0)
                    {
                        SPPrincipal spp = (SPPrincipal)workflowProperties.Web.Groups[country];
                        workflowProperties.Item.RoleAssignments.Remove(spp);
                    }

                    if (newRegion != region && region != currentRegion)
                    {
                        newRegion = region;
                        if (workflowProperties.Web.SiteGroups.GetCollection(new String[] { "Region" + region }).Count > 0)
                        {
                            SPPrincipal spp = (SPPrincipal)workflowProperties.Web.Groups["Region" + region];
                            workflowProperties.Item.RoleAssignments.Remove(spp);
                        }
                    }
            }
}

Glöm ej ange BreakRoleInheritance(true) på dokumentet så det ej ärver rättigheter från listan det existerar i.

Vad är detta?

Detta är en blogg av Robin & Robert om främst allt inom och runt omkring Sharepoint 2010 & Sharepoint 2007, men även en hel del annat när det kommer till utveckling och IT.

Senaste Kommentarerna

Comment RSS