close

Sonstiges

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
AllgemeinCloudCollaboration, ProduktivitätEnterprise SearchHow-To, Tutorial, SzenarioSocial Networking, CommunityYammer

Yammer?! Yammer! Was ist Yammer überhaupt?

Wir bei HATAHET haben Yammer seit einiger Zeit intern im Einsatz und wollen euch davon natürlich auch berichten! Was könnt ihr erwarten?

Was ist Yammer?
Die erste Frage ist immer: „Was ist Yammer überhaupt?“
Eine kurze Antwort darauf kann sein: Yammer ist ein sogenanntes „Enterprise Social Network“, dass die Zusammenarbeit über Konversationen massiv erleichtert und den dadurch generierten Inhalt durchsuchbar zur Verfügung stellt.

Hier eine andere, ebenfalls kurze Antwort in Form eines Videos:

Rijkswaterstaat: Yammer introduction from Tribewise on Vimeo.

Wofür kann ich Yammer in meinem Unternehmen einsetzen?
Die nächste Frage: “Und was können wir damit machen?”
Yammer kann vielfältig eingesetzt werden und die Produktivität im Unternehmen steigern. Ein paar Szenarien werde ich an dieser Stelle vorstellen. (mehr …)

mehr lesen
AllgemeinAutomation, Workflow, Self ServiceHow-To, Tutorial, SzenarioKonfiguration, DeploymentOn-PremisesSharePoint 2013

Lösung: Fehlerhaftes Check Out Verhalten in SharePoint 2013

Letztens ist uns nach einer SharePoint 2013 Implementierung ein sehr “eigenartiges” Verhalten beim Check In/Out in Document Libraries aufgefallen. Und zwar wenn das Check Out erforderlich ist um ein Dokument zu bearbeiten.

image

Wählt man ein Dokument zum Bearbeiten aus und klickt im Ribbon dann auf “Edit Properties” so erhält man, wie gewohnt, den Hinweis dass man das Dokument zuerst mal auschecken muss um es zu editieren. Soweit ja alles gewohnt und OK!

image

image (mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioMigration, UpgradeOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Solution Migration, Migrations Highlights

Eine Solution von SharePoint 2010 auf SharePoint 2013 zu migrieren ist bis auf die Details eine feine Sache. Man folgt einfach den folgend angeführten Punkten und muss sich dann nur mehr um die eben erwähnten Details kümmern. Diese können in der Schwierigkeit von sehr einfach bis unmöglich variieren, je nachdem wie umfassend sich der anprogrammierte Bereich in den Versionen verändert hat.

Solution Migration 2010 – 2013

1. Unload des Csproj-Files und öffnen mit Editor

2. XML Element TargetFrameworkVersion auf v4.5 ändern:

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>

3. TargetOfficeVersion direkt unter <Project><PropertyGroup>…<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>:

<TargetOfficeVersion>15.0</TargetOfficeVersion> (mehr …)

mehr lesen
AllgemeinDevelopment, CodingOn-PremisesSharePoint 2013Tool, Bot, App, Add-In

SharePoint 2013 App Modell – Hosting Möglichkeiten

In meinem letzten Blogbeitrag hab ich bereits angedeutet, dass es verschieden Möglichkeiten gibt SharePoint 2013 Apps zu hosten. Diesmal möchte ich eine kurze Zusammenfassung der Hosting Möglichkeiten geben. Das SharePoint App Model bietet drei Optionen, die man beim Entwickeln einer neuen SharePoint App bereits wissen sollte, da man sich in Visual Studio bei der Erstellung eines neuen Projekts dafür entscheiden muss.

SharePoint 2013 Bloglog, Visual Studio New project (HATAHET)

Die drei Möglichkeiten sind:

  1. Provider-hosted Apps
  2. Autohosted Apps
  3. SharePoint-hosted Apps

Remote Web

Um das besser zu verstehen, muss ich an dieser Stelle den Begriff Remote Web kurz erklären.

Das Remote Web bezeichnet einen Webserver, der außerhalb der SharePoint 2013 Farm Funktionalitäten für die App zur Verfügung stellt. Es kann nicht nur eigene komplexe Funktionalitäten zur Verfügung stellen, um in einer App verwendet zu werden, sondern es kann selbst auch über das Client Side Object Modell (CSOM) den SharePoint 2013 “anprogrammieren”. Die App, d.h. die Sub-Site, die im SharePoint die App repräsentiert, verwendet in so einem Fall Webseiten des Remote Webs als Startseite. Dies wird im App-Manifest als RemoteAppUrl hinterlegt. “~remoteAppUrl” ist ein dynamischer Token, der beim Entwickeln eine Erleichterung darstellt, da man nicht ständig die URL des Remote-Webservers eingeben muss. (mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioMigration, UpgradeOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Workflow Manager 1.0, Migrations Highlights

Body:

Eines der neuen Features in SharePoint 2013 ist der eigenständig arbeitende Workflow-Manager. Erst einmal installiert, was durchaus aufgrund von Permission-Aspekten trickreich sein kann, eröffnet der Workflow-Manager neue Möglichkeiten um hilfreiche Workflows in einer SharePoint-Umgebung anzulegen.

image

Möchte man nun eine Custom-Workflow-Action von SharePoint2010 auf SharePoint2013 migrieren, kann man das tun, indem man die Abwärtskompatibilität nutzt. Diese funktioniert Out-of-the-Box und schafft keine neuen Herausforderungen. Ganz im Gegenteil zu einer vollständigen Migration auf SharePoint2013.

SharePoint Designer und der neue Workflow-Manager sind aktuell scheinbar nicht auf Entwicklungen in diesem Bereich ausgelegt. Gründe dafür sind, dass Dlls der entwickelten Assembly und eine AllowedTypes.xml händisch in zwei Ordner des Workflow-Managers kopiert werden müssen. Ein Deployment integiert in das Hinzufügen einer Solution in eine SharePoint-Umgebung gibt es derzeit nicht.

Zudem gestaltet sich das Entwickeln sehr mühsam. Bei jedem Entwicklungslauf muss der Cache des SharePoint-Designers geleert werden, der über drei Position im File-System verteilt ist. Die Custom-Workflow-Action muss komplett neu im VS-Projekt angelegt werden und manchmal muss sogar das entsprechende Feature neu erstellt werden. Erschwerend hinzukommt, dass Fehlermeldungen rar aufscheinen.

Fazit für das Migrieren und Entwickeln von Custom-Workflow-Actions ist das Umsatteln auf Web-Services. Der neue Workflow-Manager bietet nämlich die Möglichkeit, genau diese aufzurufen. Deshalb heißt es für uns Abschiednehmen von Custom-Workflow-Actions und die neue Möglichkeit der Web-Services im Workflow-Bereich Willkommen zu heißen.

lg Georg

Published: 05.03.2014 07:18

Source: New feed

mehr lesen
AllgemeinHow-To, Tutorial, SzenarioKonfiguration, DeploymentOn-PremisesSharePoint 2013

Lösung: User erscheint nicht in Audience auf

Einer unserer Kunden sagte mit diese Woche dass ein Mitarbeiter das Problem hat dass ihm WebParts nicht angezeigt werden, auf die Audiences gesetzt wurden. In diesem Fall wurde nicht mit zentralen Audiences gearbeitet die über die User Profile Service Application erstellt wurden, sondern es wurde direkt eine Active Directory Gruppe beim WebPart als Audience zugewiesen.

Im ersten Moment natürlich gleich ein klarer Fall dass der User nicht in dieser AD-Gruppe ist, oder? Also nichts wie ab ins Active Directory zu dieser AD-Gruppe….und Überraschung, der User ist zugewiesen. Also doch nicht so klar! (mehr …)

mehr lesen
1 11 12 13 14 15 17
Page 13 of 17