Feld-Mapping SharePoint + Outlook Aufgabe

Gerade im Projekt-bereich kommt immer wieder die Anfrage, ob die Felder „Gesamtaufwand“ und „Ist-Aufwand“ aus der SharePoint Aufgabenliste mit der Outlook-Aufgabenliste gemapped werden können.

Dabei ist dies bereits automatisch hinterlegt. Im SharePoint muss dazu das Feld „Gesamtaufwand“ (Intern: TotalWork) und „Ist-Arbeit“ (Intern: ActualWork) in die Aufgabenliste übernommen werden.

tasksk1 tasksk2

Ich konnte bisher noch nicht herausfinden, wie weitere spezielle Felder ohne Anpassungen oder Programmierung (direkter Eingriff) verbunden werden können.

Werbeanzeigen

Map Fields in SharePoint with MS Project automatically

In a SharePoint List „Tasks“ you have the point to open this List in MS Project.

If there are some custom / special fields / columns you would like to implement or map, you need to do this manually in MS Project. But what, if you would like do that automatically?

In SharePoint Object model there is a Property in the Task List in SharePoint „WSSSyncFieldMap“, which will be only created, if you open once the Task list in MS Project. So here a little script for you 🙂

$web = Get-SPWeb htttp://server
$list = $web.Lists["Tasks"]
$list.RootFolder.Properties["WSSSyncFieldMap"] = "<Fields><Field SPStaticName='PlannedEffort' ProjField='Number1'/></Fields>"
$list.Update()

So in this case, the Field „PlannedEffort“ (of cource internal Field name in the Task List, maybe you created another field) in SharePoint is mapped to MS Project Column „Number 1“.

The only and really important thing is, that you can only map fields of the same Typ! And there is no error message, if you make something wrong. So please try it out once, before roll out somewhere 🙂

PS: If you running this Script via XML, don’t forget to change < and > into &lt; and &gt;

Set Permissions in multiple Language

Hello,

i have a Problem with a PowerShell Script running at a Customer for SharePoint.

We are going to set Permissions to a List. This is the typically Line:

$role = $targetWeb.RoleDefinitions["Read"]

Now interesting, that this was not working at all, because the Language of the Server – customer side – was german. ^^ So the Role Definition is „Lesend„.

2016-03-07T15:15:59:321 | SGSVR096 | 4112 | w3wp | 76 | 127.0.0.180 |  | 0 | Error | ***** ECSpand.SharePoint.Helpers.PowerShell.PowerShellOperations -> Execute(string scriptText, bool forwardException) | Exception occured while executing script. Exception is: System.Management.Automation.MethodInvocationException: Exception calling "Add" with "1" argument(s): "Object reference not set to an instance of an object." ---> System.NullReferenceException: Object reference not set to an instance of an object.   at Microsoft.SharePoint.SPRoleDefinitionBindingCollection.Add(SPRoleDefinition roleDefinition)
   at CallSite.Target(Closure , CallSite , Object , Object )
   --- End of inner exception stack trace ---
   at System.Management.Automation.Runspaces.PipelineBase.Invoke(IEnumerable input)
   at ECSpand.SharePoint.Helpers.PowerShell.PowerShellOperations.Execute(String scriptText, Boolean forwardException)

But in one sitecollection, it was created in english, so I could not create one script for two different language packs. What to do? Ask for the Language / all Languages? Wow no it is too long. So see, what the RoleDefinitions can give us, and see here:

### Check for all Languages
$roleForFull = $targetWeb.RoleDefinitions | where type -eq "Administrator"
$roleForContribute = $targetWeb.RoleDefinitions | where type -eq "Contributor"
$roleForRead = $targetWeb.RoleDefinitions | where type -eq "Reader"

Best greets!

Daniel

SharePoint Workflow History Export with Nintex and dox42

Heute zeige ich euch, wie die Zusammenarbeit von SharePoint, Nintex und dox42 zu einer Workflow-History das Leben erleichtert 🙂

Ausgangssituation:

Die Workflow History (Aufgaben und Meldungen) sollen automatisiert in ein PDF Dokument eingefügt und am SharePoint abgelegt werden.

Beschreibung:

Know-How: SharePoint Basis, Nintex Workflow Designer, dox42 (http://www.dox42.com)

Zuerst fangen wir mit der Workflow Aktion an, welche wir von dox42 erhalten haben und über den Nintex Workflow Designer einbauen:

WflHistory1

Diese wird wie folgt konfiguriert:

DocTemplate http://SERVER/FormServerTemplates/Dok1.docx
FileName test_{ID}.pdf
Library LIBRARY_NAME
Parameter1_Name Wert – WorkflowID
Parameter1_Value {Workflowinstanz-ID} (Zeichenkette mit { und } zusammenbauen)
Parameter2_Name Wert – RequestID
Parameter2_Value ID vom aktuellen Element
Server URL http://SERVER:4100/dox42service.asmx
Your_Site http://SERVER/SITE
Dox42Result Workflow-Variable: Dox42_Result

Anschließend muss eine Word Vorlage erstellt werden. Mithilfe des dox42 Plugins können so Steuerelemente eingebaut werden:

WflHistory2

Das Datamap wird wie folgt erstellt:

WflHistory3

Das Ergebnis kann sich sehen lassen:

WflHistory4

Dieser Blog-Eintrag ist anonymisiert und von allen Vertragspartnern akzeptiert worden.

Für nähere Informationen kontaktiert mich einfach, ich knüpfe hier auch gerne die Kontakte dazu.

Standardspaltenwerte ändern – Column Default value settings

Vor kurzem ein neues interessantes Problem. In den Bibliotheks-Einstellungen gibt es eine Option für die „Einstellungen für Standardspaltenwerte“. Das Feature selbst ist recht interessant, wenn man fest vordefinierte Ordnerstrukturen verwendet. Denn so kann für jeden Ordner auch eine Eigenschaft mitgegeben werden, nach welcher im ECM Kontext sortiert, gruppiert und gesucht werden kann. Selbst wenn der User die Dokumente nur über den Windows Explorer in den SharePoint hochlädt oder im SharePoint ohne zusätzliche Angabe von Metadaten, so wird trotzdem diese eine (oder mehrere) Eigenschaft gespeichert.

Einstellungen für Standardspaltenwerte

Standardspaltenwerte ändern

Eigentlich ein cooles Feature. Wenn man jedoch gerade in Projekt-Kontext dabei ist, Templates zu erstellen, und beim Erstellen einer Webseite auf Basis des Templates, so wird gerade solch eine Einstellung nicht mitgenommen. Grund hierfür kann z.B. sein, dass der Forms-Ordner, welcher sich in der Bibliothek versteckt, nicht vollständig kopiert wird.

Folgendes Script könnte hierbei als Workaround unterstützen:

asnp microsoft.sharepoint.powershell

## Nach Initialisierung des Snapin erst das Template laden
$sourceWeb = Get-SPWeb "http://URL_DES_TEMPLATES"
$sourceList = $sourceWeb.Lists["NAME_DER_BIBLIOTHEK"]
$sourceFolder = $sourceList.RootFolder.SubFolders["Forms"]
$sourceConfigFile = $sourceFolder.Files["client_LocationBasedDefaults.html"] # In dieser Datei sind die Informationen gespeichert

## Jetzt die neue Website laden und dorthin die Datei kopieren
$targetWeb = Get-SPWeb "http://URL_DER_NEUEN_SEITE"
$targetList = $targetWeb.Lists["NAME_DER_BIBLIOTHEK"]
$targetFolder = $targetList.RootFolder.SubFolders["Forms"]

## Vor dem eigentlichen Kopiervorgang muss der Inhalt noch an die neue Bibliothek angepasst werden
$tmpString = [System.Text.Encoding]::ASCII.GetString($sourceConfigFile.OpenBinary()).Replace([uri]::EscapeUriString($sourceList.RootFolder.ServerRelativeUrl), [uri]::EscapeUriString($targetList.RootFolder.ServerRelativeUrl))

## Jetzt kommt der 'Kopiervorgang' (Kopieren ist mit CopyTo nicht möglich, daher muss die Datei neu erstellt werden - Achtung: UTF-8
$targetConfigFile = $targetFolder.Files.Add("client_LocationBasedDefaults.html", [System.Text.Encoding]::UTF8.GetBytes($tmpString))
## Fertig!

Viele Grüße!

Resource Throttling

Hallo zusammen,

mein aktuelles Problem besteht darin, eine Best-Practise Methode für den Umgang mit Massendaten herauszufinden.

Grundsätzlich:
Microsoft hat als Richtlinie definiert, dass nur eine bestimmte Anzahl von Dokumenten in einer Bibliothek vorhanden sein sollten, um die Performance nicht zu beeinträchtigen. Es können jedoch Ordner innerhalb der Bibliothek verwendet werden, um Dokumente besser zu verteilen.
Die Einschränkung gilt allerdings auch für die Anzeige von Dokumenten aus einer oder mehreren Bibliotheken. Diese Einschränkungen kennen viele unter dem Begriff „Resource Throttling“.

Beispiel:
In einer Bibliothek sind 250 Ordner, in welchen jeweils 500 Dokumente abgelegt sind. Somit sind insgesamt 125.000 Dokumente in der Bibliothek, allerdings in Ordner verteilt, um damit die Microsoft Richtlinien einzuhalten. Ein Zugriff auf die Bibliothek funktioniert, da immer weniger Dokumente / Ordner angezeigt werden, als das Resource Throttling eingestellt hatte.

Problem:
Über eine eigene WebPart-Seite sollen alle Dokumente angezeigt werden, die ein bestimmtes Attribut beinhalten. Die Suche erfolgt mittels SPQuery im C# Code.

Im Beispiel-Code wird eine Webseite http://Server/demo/test_resource/SitePages/Homeapge.aspx aufgerufen, welche dieses WebPart beinhaltet.

Es geht also um den C# Code und dem SPQuery auf eine Bibliothek (SPList).

SPList list = SPContext.Current.Web.Lists["Dokumente"];
SPListItemCollection items;
SPQuery query = new SPQuery();
//query.ViewFields = "<FieldRef Name='FileLeafRef'/><FieldRef Name='Title'/><FieldRef Name='ContentType'/>";
    // --> Die angegebenen Informationen führten zu keinerlei verbesserung, daher auskommentiert
//query.ViewFieldsOnly = true;
    // --> Wie oben
//query.ViewAttributes = "Scope=\"Recursive\"";
    // --> Das bedeutet, dass die Suche über alle Ordner hinweg durchgeführt wird. Hier stürzt sich der "Resource Throttling" drauf
query.Query = "<Where><Eq><FieldRef Name='ecsPersNr' /><Value Type='Text'>" + g_url_PersNr + "</Value></Eq></Where>";
    // --> Die Mitgabe einer Query ist natürlich notwendig, hier in diesem Beispiel eine bestimmte Nummer
//query.QueryThrottleMode = SPQueryThrottleOption.Override;
    // --> Hier habe ich versucht, das Resource Throttling zu überschreiben, was allerdings zu keinem Ergebnis geführt hat
SPFolder listFolder = list.RootFolder.SubFolders["0" + a.ToString().Trim()];
    // --> Mit der Übergabe eines gezielten Ordners konnte ich schließlich innerhalb der Resource Throttling bleiben
query.Folder = listFolder;
    // http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.folder(v=office.15).aspx
items = list.GetItems(query);

Es gab mehrere Lösungsansätze, allerdings hat keines zu einem Sauberen Ergebnis gebracht.

Außerdem habe ich noch zusätzlich ein weiteres Problem in dem oben genannten Code. Die Definition des Ordners mittels dem SPFolder.
Der Vorteil daraus ist natürlich, dass die SPQuery Suche nur noch in dem Ordner durchgeführt wird.
Der Nachteil ist allerdings, dass der Aufruf mittels SPFolder länger dauert, da dieser erst den Ordner „finden“ muss. Dadurch dauert der Vorgang einige Sekunden länger.

Problem 2:
Wenn im Code „Rekursiv“ hinterlegt ist, so sucht ja der Query über alle Ordner hinweg… gibt man aber ein SPFolder mit, so muss erst einmal Zeit für das laden des SPFolder geopfert werden, damit einem dann aber das Resource Throttling vom SharePoint nicht in die Knie zwingt.
Sind also alleine für den „Suchvorgang“ bereits mehr als 5.000 Elemente zur Verfügung gestellt, in denen gesucht wird, so klappt das nicht. -> Einschränkung wäre dann eben mittles Bibliotheken arbeiten. Nur ist die Frage, wie man schneller auf das gewünschte SPFolder kommt.

Soviel dazu. Falls jemand noch weitere Idee hat probiere ich diese gerne aus!

Viele Grüße!

SharePoint Falle – Liste Aufgaben

Schönen guten Morgen zusammen!

SharePoint hat im Standard einen Inhaltstypen „Aufgaben“ und mehrere Listenvorlagen. In vielen Projekten sind diese Listen und Bibliotheken immer wieder hilfreich, da diese bereits viele tolle Zusatzfunktionen bieten (Kalender, Zeitachse, etc.).

Ein weiterer Vorteil davon ist, wenn eine Liste mehrfach verwendet wird (auch in Unterseiten), könnte so eine Suche per Inhaltstyp alle Einträge anzeigen. Tolle Sache!

Doch als ich dies mit den „Aufgaben“ getestet habe, ist mir folgendes aufgefallen:

Die Vorlagenliste „Aufgaben“ enthält den Inhaltstyp „Aufgaben“, welcher auch auf der Root-Ebene zu finden ist. Für Endkunden sollen solche WebParts konfigurierbar sein, daher gehe ich bewusst auf die internen Feldnamen, da diese nicht mehr vom User verändert werden können und der Administrator bei der Konfiguration keine GUIDs auslesen muss. Wenn ich allerdings über den Root-Inhaltstyp eine Suche starte, habe ich keine Möglichkeit nach dem Feld „Enddatum / Fristende“ zu suchen, da plötzlich keine Aufgaben mehr angezeigt werden. Suchtreffer ist leer.

Eine genauere Analyse des XML zeigt mir ein schockierendes Erlebnis. Die XMLs habe ich aus folgendem Pfad:

Hier ein Ausschnitt aus dem XML der Standard SharePoint Felder (C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\FEATURES\fields\fieldswss.xml):

<Field ID="{cd21b4c2-6841-4f9e-a23a-738a65f99889}"
    Name="TaskDueDate"
    Group="$Resources:Issue_Task_Columns"
    Type="DateTime"
    DisplayName="$Resources:core,Due_Date;"
    SourceID="http://schemas.microsoft.com/sharepoint/v3/fields"
    StaticName="TaskDueDate"
    Format="DateOnly">
 </Field>

In der entsprechenden schema.xml Datei der Aufgabenliste-Vorlage (C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATES\FEATURES\TaskList) ist folgender Eintrag zu finden:

<Field Type="DateTime"
    ID="{cd21b4c2-6841-4f9e-a23a-738a65f99889}"
    Name="DueDate"
    DisplayName="$Resources:core,Due_Date;"
    Format="DateOnly"
    SourceID="http://schemas.microsoft.com/sharepoint/v3"
    StaticName="DueDate"
>

Dabei ist sichtbar, dass der interne Feldname geändert wird.

Vorsicht also bei der Verwendung von internen Feldnamen, es kann durchaus passieren, dass diese in anderen Listen und Bibliotheken plötzlich anders heißen!

Viele Grüße

Query für Datum Von Bis

Sollte eine Query Abfrage auf Objekte benötigt werden, welches bei Datum eingeschränkt wird (zB Alle Dokumente mit Bearbeitungsdatum von heute bis vor 30 Tage), wäre folgendes Beispiel:

<Where><And><Gt><FieldRef Name="Datumsfeld" /><Value Type="DateTime"><Today /></Value></Gt><Lt><FieldRef Name="Datumsfeld" /><Value Type="DateTime"><Today OffsetDays="30" /></Value></Lt></And></Where>

Installation SharePoint 2010 SP1 auf Windows Server 2012 Std. mit SQL Server 2008 R2

Heute möchte ich euch meine Erfahrung teilen, wie man einen SharePoint 2010 auf einem neuen Windows Server 2012 installiert. Es gibt bereits einige Beiträge im Internet, welche dies in Englisch ausführlich und mit einigen Verweisen erhoben haben. Ich habe dies heute auf einem Produktivsystem installiert, es läuft einwandfrei. 🙂

Vorbereitung für die Pre-Requisits

Erst müssen einige Server-Rollen (2x) und Features (1x) hinzugefügt werden.

Webserver (IIS):

webserver_1 webserver_2 webserver_3 webserver_4

Anwendungsserver:

anwendungsserver

Feautures:

Windows Identity Foundation 3.5

Nach der Installation der Rollen und Features muss eine „ServerManagerCmd.exe“ unter „C:\Windows\System32“ abgelegt werden. Laut Blog-Einträgen im Internet macht diese Datei nichts anderes wie:

System.Environment.ExitCode = 1003;

Anschließend kann die Installation der „Pre-Requesits“ sowie die Haupt-Installation von SharePoint ausgeführt werden.

Im IIS sollte noch folgende Einstellung getätigt werden (unter Standard Applikation Pool Einstellung):

anwendungspoolstandardwerte

Fertig!

Anbei meine Quellen aus den Recherchen:

PowerShell Iterieren von Items

Hallo zusammen!

Ich habe heute zwei ganz kleine Aufgaben erhalten, hier die kürzeste Lösung jeweils:

1.) In jedem Element in einer Bibliothek oder Liste die Vererbung der Berechtigung wiederhergestellt, so dass bei allen Elementen die Berechtigung von der Liste oder Bibliothek gezogen wird:

$web = Get-SPWeb http://server/web
$list = $web.Lists["LISTENNAME"]
foreach ($item in $list.Items) { $item.ResetRoleInheritance(); $count++; write-host $count($item.ID) von $list.ItemCount }

Ist ein Drei-Zeiler… richtig.

Was dabei aber unbedingt zu beachten ist:

$list.ItemCount geht noch, hier wird die Gesamtsumme der vorhandenen Elemente angezeigt. Jedoch das iterieren von Elementen mittels foreach ($item in $list.Items) erzeugt dabei einen großen Cache, hier wird jedes Element geladen! Achtet daher vor allem bei großen Bibliotheken darauf, dass hier sehr viel Cache geladen wird.

2.) Für jedes Element die letzte Version wiederherstellen. Dafür einfach in der Schleife statt $item.ResetRoleInheritance() einfach folgendes:

$item.Versions.Restore(0)

Viele Grüße!

Daniel