close

Juli 2014

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
AllgemeinCloudCollaboration, ProduktivitätHybridYammer

Yammer Zertifizierungen

Wir bereits geschrieben arbeiten wir seit einiger Zeit mit Yammer im produktiven Einsatz. Einige Gruppen haben sich schon gebildet, regelmäßig entstehen neue Konversationen – sehr praktisch um am Laufenden zu bleiben!

So wie bei allen Werkzeugen braucht es eine Zeit, bis alle flüssig damit arbeiten können – prinzipiell ist Yammer aber einfach gehalten und einfach zu lernen. Trotzdem zahlt es sich aus – vor allem weil ich das Produkt wirklich kennen lernen will – sich ein bisschen mehr damit zu beschäftigen und vielleicht sogar Zertifizierungen zu überlegen.

image

Es gibt mehrere Abstufungen bzw. Bereiche für die offizielle Zertifikate angeboten werden:

  • Yammer Power User Certification
  • Yammer Administrator Certification
  • Yammer Community Manager Certification
  • Yammer Trainer Certification
  • Yammer Developer Certification (mehr …)
mehr lesen