close

Development, Coding

AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioHybridOn-PremisesScripting, PowerShellSharePoint 2013SharePoint Online

SharePoint 2013 Social Tag Manager

In SharePoint 2013 gibt es die Möglichkeit, echte Hashtags zu nutzen, in der Form #tag. Als SharePoint Entwickler ist man natürlich daran interessiert, Hashtags programmatisch zu nutzen. Dafür gibt es natürlich auch eine API. Eine umfassende Dokumentation dazu gibt es in der MSDN (https://msdn.microsoft.com/EN-US/library/office/jj163864.aspx). Es werden selbstverständlich sämtliche APIs vom .NET client object model, Server object model bis hin zum JavaScript object model sowie REST services unterstützt. In diesem Beitrag wird das „Server object model“ als „Starting-Point“ gezeigt.

Will man also ein Hashtag programmatisch hinzufügen, ist die Klasse SocialTagManager notwendig. Sie befindet sich im Assembly Microsoft.Office.Server.UserProfiles (Namespace, Microsoft.Office.Server.SocialData). Dies ist noch keine wesentliche Neuerung, da diese bereits in SharePoint 2010 zur Verfügung stand. Der Unterschied ist jedoch erkennbar, wenn man das Term Store Management Tool aufruft. Dort werden Hashtags im System-Zweig des Taxonomy Term Stores abgelegt.

(mehr …)

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridKonfiguration, DeploymentOn-PremisesSharePoint 2013SharePoint Online

Lösung: SharePoint 2013 – Workflow startet nach Veröffentlichung nicht mehr

Wenn ein Workflow nach dem Veröffentlichen nicht mehr starten will kann es am SharePoint Designer Cache liegen. Die Workflow Status Spalte gibt dann nur folgendes aus „Failed on start“. Ob es am Cache des SP Designers liegt lässt sich überprüfen in dem man den Workflow von einem anderen Rechner aus veröffentlich. Startet der Workflow dann wieder wie gewollt war es wohl der Cache.

Um den Cache zu leeren muss man wie folg vorgehen:

  1. SP Designer schließen
  2. Mit Windows+R „Run“ aufrufen und
    %USERPROFILE%AppDataLocalMicrosoftWebsiteCache
    einfügen und ENTER drücken.
  3. Den Inhalt des Ordners der nun offen ist komplett löschen
  4. Wieder mit Windows+R „Run“ aufrufen und
    %APPDATA%MicrosoftWeb Server ExtensionsCache
    einfügen und ENTER drücken
  5. Wieder den gesamten Inhalt löschen
  6. Zusätzlich kann man in den SharePoint Designer Optionen Zwischenspeichern der Seiten Daten verhindern. Dazu im SP Designer (2010 und 2013): File -> Options -> Application Options

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioKonfiguration, DeploymentOn-PremisesScripting, PowerShellSharePoint 2013

SharePoint 2013: Client Side Managed Meta Data Service

Wer schon mal versucht hat, die seit SharePoint 2013 neue Assembly Microsoft.SharePoint.Client.Taxonomy zu verwenden um mittels CSOM auf das Managed Meta Data Service zuzugreifen, hat vielleicht schon mal folgende Fehlermeldung gesehen.

Cannot invoke method or retrieve property from null object.
Object returned by the following call stack is null.
„GetDefaultSiteCollectionTermStore
Microsoft.SharePoint.Taxonomy.TaxonomySession.GetTaxonomySession“

Das Code-Fragment, das diese Fehlermeldung verursacht sieht beispielsweise so aus.

Anmerkung: Dieses Beispiel legt einen Termset “Intrigen der Macht, mit den Titeln von drei Büchern an, in der Gruppe “Books”.

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioKonfiguration, DeploymentScripting, PowerShellSharePoint 2013SharePoint 2016

SharePoint 2013 und Unit Tests mit Visual Studio 2013

In der Vergangenheit war es nicht immer einfach die von Visual Studio mitgebrachte Möglichkeit für Unit Tests in Verbindung mit SharePoint zu nutzen. In den aktuellen Versionen (SharePoint 2013 und Visual Studio 2013) ist dies einfacher geworden und sollte auch anregen daran zu denken, wenn man SharePoint Apps entwickelt. Gerade wenn man an Auto-hosted Apps denkt, bei denen die Businesslogik außerhalb des SharePoints, in beispielsweise einem Azure Service gehostet wird, sollte man Unit Tests unbedingt nutzen.

Aber nicht nur für SharePoint Apps sind sie eine wichtige Möglichkeit Qualität in eine Lösung zu bringen, sondern auch für die traditionellen (Full-trusted) Lösungen, wie man sie hinlänglich kennt. Unit Tests im Zusammenspiel mit Full-trusted Solutions waren eben mitunter recht schwierig umzusetzen.

Beispielsweise kann man damit einen Unit Test schreiben, um Eventreceiver einer Liste zu testen. Legt man ein SharePoint Projekt an, dann ist es relativ leicht auch ein Unit Test Projekt zu erstellen, um das Ausführen von Eventreceivern zu testen. Geht man von einem Eventreceiver aus, der z.B. ein Datumsfeld setzt, wenn ein neues Item angelegt wird, so braucht man anschließend nur einen Unit Test, der genau diesen Fall überprüft, erstellen.

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: AngularJS

AngularJS ist die Werkzeugkiste schlecht hin. Mit dem Open-Source-Framework von Google lassen sich ganz leicht Single Page Applications (SPA) erstellen. AngularJS fügt HTML ein neues Konstrukt hinzu. Die Implementierung der AnuglarJS Library in ein SharePoint 2013 App Projekt ist auch nicht kompliziert, da zunächst die Library selbst von dem AngularJS Server heruntergeladen werden sollte. Anschließend wird im Projekt auf diese JavaScript-Datei verweisen mittels folgendem Tag
<script type=“text/javascript“ src=“Pfad/angular.js“></script>
wobei “Pfad” durch den richtigen Dateipfad zu ersetzten ist. Alternativ kann auch die Url des CDN verwendet werden:
https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js

Da die Library nun eingebunden und einsatzbereit ist, kann die Zwei-Wege-Datenbindung von AngularJS verwendet werden. Änderungen in der Ansicht (View) wirken sich so automatisch im Datenmodell (Model) aus und werden in den entsprechenden Elementen der Ansicht (View) direkt angezeigt.

Hier ein kleines Beispiel:

(mehr …)

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridMicrosoft 365On-PremisesScripting, PowerShellSharePoint 2013SharePoint 2016SharePoint Online

SharePoint 2013 DEV: Javascript – ein Must-Have!

Bekannt ist, dass Javascript eine Scriptsprache und keine Programmiersprache ist. Zumindest für Entwickler. Trotzdem stehen genau diese oft vor der Anforderung, dass genausoviel von Solutions in Javascript wie von Solutions in anderen vollständigen Programmiersprachen gefordert wird. Nur wie soll eine prozedurale Scriptsprache dabei mithalten können?

In vielen Punkten gibt es keine Möglichkeit dafür, an anderer Stelle mittlerweile sehr wohl. In letzter Zeit sind sehr viele Libraries entstanden, die mit vielen Schwierigkeiten, die sich in Javascript stellen, leicht umgehen können. Im Falle von Databinding sind Knockout oder AngularJS wahre Problemlöser. Bei 2D-Geometry hilft Svg, bei 3D ThreeJS.

Trotz aller Neuerungen kämpft man aber leider immer noch mit Unterschieden unter den verschiedenen Browsern. Eine einheitliche Standardisierung könnte hier vieles vereinfachen, allerdings ist so etwas noch ferne Zukunftsmusik, falls es überhaupt eintritt. Deshalb ist es unter Umständen vernünftiger auf Technologie zu setzen, die auf Basis von Plugins arbeitet.

In diesem Fall muss sich der Hersteller des Plugins um die Unterschiede in den Browsern kümmern, während sich der Entwickler auf die Umsetzung seiner Solution konzentrieren kann. Eines der bekanntesten Beispiele dafür ist Unity. Diese Engine läuft sowohl in allen größeren Browsern als auch auf Applikationsebene und allen mobilen Devices. Eine durchaus abzuwägende Alternative, besonders weil Unity auch C# unterstützt.

Happy Coding!

Published: 08.09.2014 08:42

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Apps, Apps, Apps

Sharepoint Apps sind die Zukunft. Nur leider ist die Zukunft in diesem Fall schlecht und oft auch fehlerhaft dokumentiert. Die einfachsten Implementierungen können so schnell viel Zeit kosten, weil Fehler an der falschen Stelle gesucht werden, geht man doch nicht davon aus, dass die Dokumentation in diversen Büchern und auf guten Developerseiten einfach falsch ist.

Ein gutes Beispiel dafür sind Rest-Services, die schnell und damit hervorragend zur App-Entwicklung eingesetzt werden können. Zu Beachten dabei ist, dass die Verwendung von “ajax” zum Aufruf selbiger nicht funktioniert. Warum? Weil jede App in ihrer eigenen Domäne läuft und deshalb jeder Zugriff Cross-Domain ist. Damit bleibt der “/_layouts/15/SP.RequestExecutor.js” als einzige Möglichkeit übrig, diesen Zugriff durchzuführen.

Die notwendige Url dafür gestaltet sich noch einmal so schwierig, denn bei vielen Anleitungen wird das notwendig setzen des “Targets” gar nicht erwähnt. Eine mögliche Url wäre:

appweburl + „/_api/SP.AppContextSite(@target)/web/getfolderbyserverrelativeurl(‚“ + listname + „‚)/files?@target='“ + hostweburl + „‚&$top=“ + 10+ „&$skip=“ + 10;

Und aufpassen, nicht vertippen, denn Compiler-Checks für einen String gibt es natürlich nicht.

Für viele andere Cross-Domain Aufrufe findet sich leider nicht so leicht ein möglicher Weg. Somit ist wieder einmal die Kreativität des Entwicklers gefragt, um solche Dinge zu umschiffen.

Happy Coding!

Published: 01.08.2014 08:51

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: List Url Filter, Migrations Highlights

In SharePoint 2010 kann eine Liste bequem per Url-Parameter gefiltert werden. Ob mit

FieldField1=MusterFieldName&FieldValue1=MusterValue
FieldName=MusterFieldName&FieldMultiValue=MusterValue1;MusterValue2

können schnell Filterergebnisse erzielt werden. Zusätzlich kann mit “FilterOp1” ein Operator gesetzt werden, um nicht nur Equal sondern auch “StartsWith”, “Contains” oder andere Filteroptionen umzusetzen.

In SharePoint 2013 funktioniert diese Filterung noch immer, allerdings nur solange bis man mehr Items in der Liste hat, als auf eine Seite passen. Dann nämlich kann geblättert werden und “FilterOp1” funktioniert nicht mehr.

Versuche, diese Option mit anderen Url-Filtern umzusetzen, scheitern. Also greift man auf Tricks wie das Anlegen von “Calculated Fields” zurück, um auf diese mit “Equal” zu filtern. Allerdings scheitert Url-Filterung bei “Calculated Fields” komplett.

Eine mögliche Lösung ist ein “List Event Receiver”. Dieser wird an die Liste gehängt und befüllt ein “Hidden Field” mit Werten, mit Hilfe derer auf “Equal” gefiltert werden kann. Ob das allerdings noch bequem ist, sei dahingestellt.

Published: 16.07.2014 10:57

Source: New feed

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridMicrosoft 365SharePoint OnlineTool, Bot, App, Add-In

Eine SharePoint 2013 App mit NAPA

In einem meiner letzten Blog Beiträge hatte ich angekündigt eine App mit NAPA zu erstellen.

NAPA ist bereits eine App, die es ermöglicht einfache SharePoint 2013 Apps oder Office 2013 Apps zu erstellen. Wenn man NAPA nutzen möchte, muss man dies in einer Developer Site Collection tun. Außerdem sollte man die NAPA App anschließend im SharePoint Store suchen und in der Site Collection hinzufügen.

SharePoint 2013 Bloglog, SharePoint Store NAPA App

Nachdem man NAPA hinzugefügt hat (Add und Trust), kann man diese auch aufrufen. NAPA zeigt anschließend folgenden Dialog.

Hinweis: Sollte der Benutzer mit dem die NAPA App geöffnet wird, ein Sonderzeichen wie z.B. ein | oder Klammern-Symbol im Displaynamen haben, dann liefert Office365 einen HTTP 500 Internal Server Error zurück. Es soll ja Benutzer geben, deren Organisationskonto einen Aufbau wie “Benutzernamen | Abteilungsnamen” haben. Wenn das der Fall ist, dann sollte man sich ein Benutzerkonto anlegen, das ohne diese Zeichen auskommt.

SharePoint 2013 Bloglog, NAPA Add New Project

Klickt man anschließend auf “Add New Project” kann man sich entscheiden, wofür man eine App entwickeln möchte. In unserem Fall wird es eine App für SharePoint sein.

SharePoint 2013 Bloglog, NAPA App for SharePoint

Hier kann man noch den Projekt Namen vergeben, in meinem Fall möchte ich eine App für eine einfache Zeiterfassung erstellen. Anschließend wird der Quellcode der Default.aspx Page angezeigt.

SharePoint 2013 Bloglog, SharePoint NAPA Default_aspx App

Klickt man in der Tool-Leiste (links im Bild) auf den “Play” Button, dann wird diese App innerhalb der SiteCollection auch deployed und kann verwendet werden.

SharePoint 2013 Bloglog, App Page Title

Natürlich ist diese App völlig unbrauchbar, allerdings hat sie bereits sämtlich Bestandteile, die auch bei komplexen Apps vorhanden sein müssen, damit sie auf SharePoint 2013/Office 365 deployed werden kann. Die App selbst läuft als SharePoint-hosted App und kann somit nur Logik abbilden, die in JavaScript programmiert werden kann. Dazu gehören natürlich auch Web-Service Aufrufe, die mittels JavaScript implementiert werden. Zusätzlich zur Startseite Default.aspx der App wird seitens NAPA noch ein wichtiger Bestandteil angelegt um ein App Part zu realisieren. Der Solution Tree im Folder “Pages” beinhaltet auch die Seite ClientWebPart.aspx.

SharePoint 2013 Bloglog, SharePoint NAPA ClientWebPart_aspx

Ein Client Webpart ist eigentlich ein App Part, das auf Seiten wie ein gewöhnliches Webpart positioniert werden kann. Der Unterschied zu einem Standard Webpart liegt darin, dass die gesamte Logik clientseitig abläuft, somit ist es ein Client Webpart (=App Part).

Wichtig ist dabei, der Code in der 1. Zeile:

<WebPartPages:AllowFraming runat=“server“ />

Damit ist sichergestellt, dass diese Page in einem iFrame verwendet werden kann, was absolut notwendig ist, um ein App Part auf einer Seite hinzufügen zu können. Das automatisch generierte App Part sieht dann auf einer Testpage in der Site Collection wie folgt aus.

SharePoint 2013 Bloglog, SharePoint NAPA Default AppPart

Die Entwicklungsumgebung selbst hilft beim Entwickeln mit Syntax-Highlighting und IntelliSense, aber ein Ersatz für Visual Studio ist es nicht. Daher gibt es einen Button in der Tools Leiste, mit dem das gesamte Projekt, das ursprünglich in der Developer Site Collection angelegt wurde, lokal in Visual Studio geöffnet werden kann.

Online in der NAPA App können lediglich CSS, ASPX und JS Dateien angelegt und bearbeitet werden. Des Weiteren können Bilder, die für die App relevant sind hochgeladen werden. Leider ist es aber nicht möglich z.B. Listdefinitionen oder Listinstanzen hinzuzufügen. Daher ist es unumgänglich den Weg Richtung Visual Studio zu gehen. Im nächsten Blogbeitrag zeig ich dann wie wir diese App erweitern.

Published: 14.07.2014 15:01

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

Kleine feine API: SPQuery mit Camlex.Net

Ein Assembly, das es schon seit einigen Jahren gibt und das mir bei einem meiner letzten Projekte sehr geholfen hat, ist Camlex.Net.

Dabei handelt es sich, um die Möglichkeit SPQuery Abfragen auf Basis von “Expression Trees” zu erstellen. Somit ist es nicht notwendig CAML Abfragen manuell zu erstellen. Wie fehleranfällig bzw. wie unflexibel die dynamische Erweiterung von solchen Abfragen ist, weiß jeder, der es einmal versucht hat. Die Fehlermeldungen, die man im Fehlerfall erhält, wenn Abfragen falsch sind, geben auch selten Informationen über das tatsächliche Problem.

Um Camlex.Net verwenden zu können, braucht man lediglich die Camlex.Net.dll (oder für den Client-Zugriff die Camlex.Client.dll). Diese kann man auf Codeplex (http://camlex.codeplex.com/) herunterladen oder per Install-Package installieren. Wichtig dabei ist, wenn man es in einer SharePoint Lösung verwendet, muss diese DLL im Package inkludiert werden, falls sie nicht am Ziel SharePoint vorhanden ist. Zusätzlich muss man noch ein using System.Linq im Source Code hinzufügen und schon kann man mit Hilfe von LINQ komfortable Abfragen erstellen.

Eine einfache Abfrage

Stellen wir uns vor, wir suchen in einer Liste, die Büchertitel speichert, ein bestimmtes Buch mit dem Titel “Intrigen der Macht”. Diese Abfrage sieht mit Camlex.Net wie folgt aus.

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == „Intrigen der Macht“);

Man erhält dadurch eine Instanz vom Type IQuery zurück, die eine Methode implementiert, um daraus ein SPQuery Objekt zu erzeugen.

camlQuery.ToSPQuery() liefert ein SPQuery Objekt zurück, das anschließend an die Methode SPLiist.GetItems(SPQuery) wie gewohnt übergeben werden kann.

Dieses einfache Beispiel zeigt, die Abfrage für konstante Werte.

Eine Abfrage mit dynamischen Werten

Nehmen wir aber an, man will einen dynamischen nicht konstanten Ausdruck, der über ein entsprechendes Interface übergeben wurde, abfragen. Das nachfolgende Beispiel ist die Umsetzung einer TextBox (TitleTextBox) in einer ApplicationPage und einem entsprechenden Code-Behind File.

Func<object> booktitle = () => TitleTextBox.Text;

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == booktitle());

Dieses Beispiel entspricht nun schon eher einem echten Anwendungsfall, gehen wir aber noch einen Schritt weiter.

Eine dynamische Abfrage

Wenn man z.B. ein Suchformular hat, das es ermöglicht nach dem Titel und nach dem Autor zu suchen, wobei der Autor als optionaler Suchparameter mitgegeben werden kann, so muss man eine dynamische Abfrage erstellen. Dies würde dann mit Hilfe von Camlex.Net wie folgt umgesetzt werden:

Func<object> booktitle = () => TitleTextBox.Text;

Func<object> bookautor = () => AuthorTextBox.Text;

var expressions = new List<Expression<Func<SPListItem, bool>>>();

expressions.Add(item => (string)item[„Title“] == booktitle());

if (!string.IsNullOrEmpty(AuthorTextBox.Text))

expressions.Add(x => (string)item[„Author“] == bookauthor());

var camlQuery = Camlex.Query()

.WhereAll(expressions);

(Die Methode für OR wäre im obigen Beispiel .WhereAny(expressions).)

Somit hat man eine dynamische SPQuery, die nur den Autor in der Filterbedingung berücksichtigt, wenn dieser tatsächlich auch über das Suchformular eingegeben wird.

An dieser Stelle sei auch erwähnt, dass die Abfrage von verschiedenen Typen (Lookup, Int, DateTime, usw.), die Kombination von And und Or Operatoren, die Sortierung und die Gruppierung möglich sind.

Dem interessierten Leser empfehle ich folgende Links:

http://camlex.codeplex.com/ hier im Speziellen die Dokumentation und das Diskussionsforum.

http://camlex-online.org.

Published: 04.07.2014 15:16

Source: New feed

mehr lesen
1 2 3 4
Page 3 of 4