Sprungmarken mit Text einer Wiki-Page einrichten

Um im beliebigen Text einer Websiteseite eine Sprungmarke als Ziel zu platzieren, gilt es wie folgt vorzugehen. Schritt 1: SP - > Einstellungen -> Seite hinzufügen Schritt 2: Den Text mit beliebigen Inhalten versehen Schritt 3: An gewünschten Positionen Sprungmarken einbauen Im Bearbeitungsmodus der Seite, werden über das Menüband Einfügen -> Code einbetten so viele Marken gesetzt wie erforderlich. Diese Stellen bekommen folgenden Code eingefügt Der Text, wie im vorliegenden Beispiel „MeinLink“ navigiert uns zu der gewünschten Stelle. Schritt 4: Die Auslöser für die Links müssen sich noch im Text befinden, um springen zu können. In meinem Beispiel sind es die quadratischen Kacheln. Den Code dazu gibt es noch anbei, abschließend nach der Beschreibung. Der HTML Code wird dabei in ein Skript-Editor Webpart eingefügt, Einfügen -> Webpart -> Medien und Inhalt -> Skript-Editor In Abhängigkeit davon, über welche Kachel welcher Link als Sprungmarke angezeigt werden soll, müssen diese Links mit den kacheln verknüpft werden. Entscheidend sind die im nachfolgenden gekennzeichneten Stellen zu den Links Schritt 5: Seite inkl. Aller Webparts speichern. HTML Code für die Kacheln <html> <head> <title>Test</title> <style type="text/css"> #body { font-family: Arial; } .li { display: inline; } .a { display: inline-block; width: 160px; height: 160px; background-color: gray; position: relative; /*background-image: url('http://srv1/_layouts/15/images/gettingstarted.png');*/ background-position: top left; text-decoration: none; color: #ffffff; text-align: center; } .a > span { /*height: 10%;*/ position: absolute; bottom: 0; display: block; width: 100%; background-color: rgba(64, 64, 64, 0.5); transition: all ease-in 0.3s; text-align: center; height: 2.5em; ine-height: 2.5em; } .a:hover > span { height: 100%; } #a1{ background-image: url('http://srv1/_layouts/15/images/gettingstarted.png'); background-color: red; } #a2{ background-image: url('http://srv1/_layouts/15/images/gettingstarted.png'); background-color: blue; } #a3{ background-image: url('http://srv1/_layouts/15/images/gettingstarted.png'); background-color: green; } #a4{ background-image: url('http://srv1/_layouts/15/images/gettingstarted.png'); background-color: orange; } </style> </head> <body> <div> <ul> <li class="li"><a href="http://www.google.de"><span id="a1" class="a"><span>Google</span></span></a></li> <li class="li"><a href="#MeinLink"><span id="a2" class="a"><span>Lorem ipsum dolor</span></span></a></li> <li class="li"><a href="#MeinLink2"><span id="a3" class="a"><span>Lorem ipsum dolor</span></span></a></li> <li class="li"><a href="#"><span id="a4" class="a"><span>Lorem ipsum dolor</span></span></a></li> </ul> </div> </body> </html> Fertig

Sharepoint 2016 Listenelement drucken

Da im Sharepoint das Drucken eines Listenelements auf direktem Wege nicht möglich ist, behelfen sich [Mehr]

SharePoint Designer 2013 – Einbinden SQL Datenquelle mit Abfrage

Mit dem SharePoint Designer lassen sich verschiedene Datenquellen einbinden, um diese in SharePoint z.B. in Form eines Webparts auf einer beliebigen Seite darzustellen. Mit diesem Blog zeige ich, wie sich eine SQL Tabelle verknüpfen und mit einem Textfeld eine Abfrage mittels Filterfunktion einrichten lässt. Der erste Schritt ist die Herstellung einer Verbindung zu der SQL Tabelle als Datenquelle. Wie im Bild zu sehen, wird das Objekt Datenquellen über die Navigation gefolgt von Datenbankverbindung, gewählt. Im Dialogfenster Datenquelleneigenschaften ist nun die Schaltfläche -> Datenbankverbindung einrichten auszuwählen. Nun folgen weitere Angaben für die Verbindung. Servername, Benutzername und Kennwort für die Verbindung mit SQL sind einzutragen. Im nächsten Schritt wird die Datenbank und Tabelle gewählt. Gegebenenfalls können auf der Registerkarte Quelle weitere Einstellungen vorgenommen werden, wie z.B. die Auswahl der Felder, ein Filter oder eine Sortierung. Darauf wird hier verzichtet. Auf der Registerkarte Allgemein wird ein sprechender Name vergeben: „Northwind Customers“ Im nächsten Schritt wird für diese Übung eine leere Webseite erstellt. Es gilt über das Objekt Websiteseiten -> Seite -> ASPX auszuwählen. Im nächsten Schritt erscheint eine zunächst leere ASPX Seite. Tag: form, wird gelöscht, damit die Seite später mit der Masterpage verknüpft werden kann. Der Cursor soll anschließend innerhalb des Tag Body stehen, z.B. Zeile 15. Jetzt wird die Datenquelle eingefügt. Über das Menüband Einfügen -> Datenansicht -> Northwind Customers in diesem Beispiel. Gleich nach dem Einfügen wähle ich in der oberen Schnellstartleiste das kleine Symbol Browservorschau aus, die letzte Schaltfläche, direkt oberhalb der Registerkarte Einfügen. Momentan sieht die Seite nach dem Veröffentlichen so aus: Damit der Rumpf von SharePoint 2013 erscheint, wird diese nun mit der verwendeten Masterpage verknüpft. Dazu wird die Registerkarte Formatvorlage ausgewählt. Für den SharePoint Style, wird diese mit dem seattle.master verknüpft über Registerkarte Formatvorlage -> Anfügen -> seattle.master. Im nächsten Dialogfenster wird der Inhaltsbereich lediglich mit OK bestätigt. Als nächstes werden zwei Steuerelemente eingefügt: Registerkarte Einfügen -> ASP.NET -> TextBox und Button, wie auf den beiden nachfolgenden Screenshots abgebildet. Die Position ist die Zeile direkt unterhalb der Zeile 4 der PlaceHolderMain. In diesem Beispiel stehen beide Steuerelemente in der Zeile 7 und 8. Darunter <br></br> für eine Zeile Abstand zur Liste. Damit nach der Eingabe eines gesuchten Wertes und nach einem Klick auf den Button die Filterung stattfinden kann, muss eine Filterung eingerichtet werden. Hierfür ist es erforderlich den Cursor in die Zeile der SQL Datenquelle zu setzen, damit die entsprechenden kontextbezogenen Registerkarten eingeblendet werden (Tools für die Datenanzeige). Diese erscheinen in der Farbe grün rechts hinten. Vor der Filterung muss ein Parameter gesetzt werden. Auf der Registerkarte Optionen -> betätigen Sie die Schaltfläche Parameter. Schaltfläche Neuer Parameter -> Parameterquelle -> Steuerelement. Nachfolgend wird Steuerelement-ID: TextBox1 ausgewählt. Jetzt kann die Filterung erfolgen. Auf der Registerkarte Optionen betätigen Sie die Schaltfläche Filtern. Im geöffneten Dialogfenster wird XSLT-Filterung hinzufügen aktiviert und die Schaltfläche Bearbeiten angeklickt. Im Dialogfenster Erweiterte Bedingung wird nun der XPAth-Ausdruck gebildet. Es gilt aus der Funktionskategorie contains auszuwählen, gefolgt von der Spalte, nach der die Filterung erfolgen soll, z.B. @CustomerID. Hinter der ausgewählten Spalte wird ein Komma eingegeben und dahinter der Parameter der zuvor erstellt wurde $Param1 aus der Liste ausgewählt. Zuvor sah die Datenquelle so aus. Ab sofort kann gefiltert werden, indem in das Eingabefeld eine CustomerID oder ein Teil von den Anfangsbuchstaben eingegeben und hinterher der Button betätigt wird. Die Filterung erfolgt, wie angezeigt. Es ist fertig. Hinweis: Das setzen des Filters kann u.U. zu Problemen führen, wenn dort ein Fehler gemacht wird. Sofern die Filterung nicht funktioniert, müssen Sie den Filter nochmal von vorn erstellen.

Visual Studio User Group Wien– Unterlagen

Danke für die Teilnahme am Usergroup Meeting in Wien gestern Abend (23.4.2015) Wie versprochen die Linksammlung: Präsentation: http://1drv.ms/1JjpvV3 ChromeControl: http://blog.ppedv.de/post/2013/06/21/ChromeControl-in-Provider-Hosted-App-einbinden.aspx Cross Domain Lib: http://blog.ppedv.de/post/2013/08/29/SharePoint-2013-App-Zugriff-auf-das-HostWeb-mittels-Javascript.aspx Konfiguration für Apps: http://blog.ppedv.de/post/2013/10/29/sharepoint-2013-server-fur-app-development-vorbereiten.aspx

Call4Papers – SharePoint konferenz Wien

Auch dieses Jahr findet wieder die SharePoint konferenz in Wien statt. Heuer wird sie vom 17.-18. Juni 2015 in der Pyramide Vösendorf über die Bühne gehen. In unserer mobilen Welt ändert sich auch die Arbeitsweise in Unternehmen. Tools wir SharePoint, Lync, Exchange, Office 365 unterstützen Firmen dabei ihren Mitarbeitern neue Arbeitsmethoden zu ermöglichen. Daher ist das heurige Motto: New Way Of Work   Die Konferenz wird in die Bereiche Business, IT Pro und Development untergliedert. Ich freue mich über Sessionvorschläge die zum Motto der Konferenz und in einen der drei Bereiche passen.  Tools wie Lync, Exchange, O365 aber auch Hyper-V sind heuer gerne gesehen. Bitte die Vorschläge mit Titel, Abstract, Level (100-400) und Angabe des Bereichs an marting@ppedv.de schicken. Der Abgabetermin ist der 20.4.

Newsfeed Posting per Code

Newsfeed Postings können in SharePoint auch mittels Client Object Model durchgeführt werden. Dafür muss die dll “Microsoft.SharePoint.Client.UserProfiles” aus dem ISAPI Verzeichnis referenziert werden. Das Posting selbst muss mit einem ClientContext für den SP User durchgeführt werden. Ein Versuch mit einem App ClientContext schlägt fehl. Da in meinem BSP mit Office365 gearbeitet wird, müssen Credentials für SharePoint Online verwendet werden. (zeile 8 bis 11) Ein Post wird mit der Methode CreatePost (Zeile 19) einer Instanz des SocialFeedManagers (Zeile 13) erstellt. Der erste Parameter ist die URL des Newsfeeds oder kann auch NULL sein. Im Falle von NULL wird das Posting im Newsfeed des User in seiner MySite erstellt. Der gesamte Code: 1: var spContext = SharePointContextProvider.Current.GetSharePointContext(Context); 2:   3: using (var clientContext = new ClientContext(spContext.SPHostUrl)) 4: { 5: string pwd = PASSWORD; 6: string userEmail = USERLOGIN; 7:   8: SecureString str = new SecureString(); 9: pwd.ToList().ForEach(c => str.AppendChar(c)); 10:   11: clientContext.Credentials = new SharePointOnlineCredentials(userEmail, str); 12:   13: SocialFeedManager socMan = new SocialFeedManager(clientContext); 14: SocialPostCreationData dat = new SocialPostCreationData 15: { 16: ContentText = TextBox1.Text + " " + DateTime.Now.ToShortTimeString() 17: }; 18:   19: socMan.CreatePost(spContext.SPHostUrl.ToString(), dat); 20: clientContext.ExecuteQuery(); 21:   22: TextBox1.Text = ""; 23: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

App Part - Parameter

Serverseitige Webparts in SharePoint können konfiguriert werden. Gleiches möchte man euch bei App Parts erreichen. Jedoch werden SharePoint App Parts IFRAME in die Webseite eingebettet. Server Seitigen Code gibt es hier nicht. Allerdings können in der Elements-Datei des App Parts Properties definiert werden. Im ClientWebPart Knoten der XML Datei ist folgender Eintrag möglich: <Properties>       <Property Name="Konfiguration1"                 Type="string"                 WebBrowsable="true"                 WebDescription="Test Konfiguration"                 WebDisplayName ="Konfig1"                 RequiresDesignerPermission="true"                 DefaultValue="">       </Property>     </Properties>   Dieser Eintrag ermöglicht das Konfigurieren. Allerdings muss der Konfigurationswert auch an der App part übergeben werden. Und dies wird in den Aufruf-Parameter der URL erledigt, jedoch muss dies ebenfalls konfiguriert werden. Für jedes Property wird ein Platzhalter mit _ vor und nach dem Namen angelegt und dieser kann in der URL verwendet werden. Die URL ist ebenfalls in der Elements Datei beim Content Type anzugeben: <Content Type="html" Src="~remoteAppUrl/Pages/DemoAppPart.aspx?{StandardTokens}&amp;Konfiguration1=_konfiguration1_&amp;EditMode=_editMode_" />

Was ist schneller? CAML oder KQL

Unlängst beschäftigte ich mich mit der Frage, welcher Weg der schnellste ist, um auf die Daten zu zugreifen: der Zugriff über eine CAML Abfrage oder der Zugriff über den Search Index. Daher habe ich eine SharePoint Kontakt-Liste mit ca. 18.000 Datensätzen gefüllt und dann eine simple Abfrage programmiert. Die Aufgabenstellung war die Suche im “CompanyName” mit dem BeginsWith Operator. Die CAML Variante: lbAusgabe.Items.Clear(); SPList firmen = SPContext.Current.Web.Lists["Firmen"]; DateTime start = DateTime.Now; int anz = 0; string caml = @"<Where><BeginsWith> <FieldRef Name='Company'/> <Value Type='Text'>{0}</Value> </BeginsWith></Where>"; SPQuery q = new SPQuery(); q.Query = string.Format(caml, txtSuche.Text); q.QueryThrottleMode = SPQueryThrottleOption.Override; q.RowLimit = 100; foreach (SPListItem it in firmen.GetItems(q)) { lbAusgabe.Items.Add(it["Company"].ToString() ?? ""); anz++; } DateTime ende = DateTime.Now; double Dauer = (ende - start).TotalMilliseconds; lblDauer.Text = "Dauer:" + Dauer.ToString("#,###"); lblAnzahl.Text = "Anzahl: " + anz.ToString(); Diese Abfrage liefert nur die ersten 100 Datensätze. Da die Abfrage aber über alle Datensätze läuft, ist es notwendig das List Throttling zu deaktivieren. Daher wird der QueryThrottleMode auf “Override” gestellt. Die zweite Variante verwendet die Keyword Query Language (KQL) und greift somit auf den Search-Index zu: int anz = 0; lbAusgabe.Items.Clear(); SPList firmen = SPContext.Current.Web.Lists["Firmen"]; DateTime start = DateTime.Now; KeywordQuery q = new KeywordQuery(); q.QueryText = "CompanyOWSTEXT:" + txtSuche.Text + "*"; q.QueryText += " AND Path:" + firmen.ParentWeb.Site.Url + firmen.ParentWebUrl + firmen.RootFolder + "*"; q.SelectProperties.Add("Company"); q.RowLimit = 100; SearchExecutor se = new SearchExecutor(); ResultTableCollection rtc = se.ExecuteQuery(q); var resultTables = rtc.Filter("TableType", KnownTableTypes.RelevantResults); var resultTable = resultTables.FirstOrDefault(); foreach(DataRow dr in resultTable.Table.Rows) { lbAusgabe.Items.Add(dr["Company"].ToString() ?? ""); anz++; } DateTime ende = DateTime.Now; double Dauer = (ende - start).TotalMilliseconds; lblDauer.Text = "Dauer:" + Dauer.ToString("#,###"); lblAnzahl.Text = "Anzahl: " + anz.ToString();   Spannend war die Messung der Abfragezeiten. Um valide Ergebnisse zu bekommen, habe ich jede Abfrage mehrmals ausgeführt. Hier die Ergebnisse in Millisekunden:   CAML Search Abfrage 1 413 138 Abfrage 2 423 201 Abfrage 3 449 109 Abfrage 4 425 113 Abfrage 5 472 105 Abfrage 6 459 112 Mittelwert 440,2 129,7   Hier ist eindeutig zu erkennen, dass der Zugriff über die Search deutlich schneller ist. Allerdings wurde in der Liste kein Index gesetzt. Sobald in der Kontakt-Liste auf das Feld “CompanyName” ein Index gesetzt wird, sieht das Ergebnis anders aus:   CAML Search CAML Mit index Abfrage 1 413 138 34 Abfrage 2 423 201 23 Abfrage 3 449 109 27 Abfrage 4 425 113 26 Abfrage 5 472 105 27 Abfrage 6 459 112 30 Mittelwert 440,2 129,7 27,8   Und hier sieht man ganz klar, warum es empfehlenswert ist einen Index zu verwenden. Durch diese simple Konfiguration kann die Abfragezeit deutlich reduziert werden! SharePoint ist keine Datenbank! Wenn die SharePoint-Listen aber dennoch als Datenbank verwendet werden, dann sollte man wie in jeder richtigen Datenbank auch Indizes verwenden! Diese und weitere Varianten im Umgang mit SharePoint-Listen per Programmcode werden auch in unserer Schulung “SharePoint 2013 - Lösungen entwickeln und anpassen" behandelt.

Sharepoint Autoinstaller


Andreas Rauch

Warum kompliziert und mit viel Handarbeit, wenn’s auch anders geht.  Ob man nun Sharepoint einmal installiert oder des Öfteren, sollte – falls noch nicht bekannt - man sich mit mal den Sharepoint AutoSPinstaller genauer ansehen. Der AutoSPInstaller installiert, wie der Name schon prophezeit, von den Prerequesits an bis hin zum “Portal” inklusive aller Dienste alles, was das Sharepoint-Herz höher schlagen lässt. Die Vorteile sind unter anderem “schöne” Datenbanknamen, das Deaktivieren nicht notwendiger Dienste, das Ausschalten des LoopbackChecks und der verstärkten Sicherheitskonfiguration des IE. Gefühlt, aber nicht gemessen steht der Sharepoint Server in kürzerer Zeit. Zumindest hatte ich währenddessen Zeit für ein paar Tassen Cappuccino und einen Plausch mit meinen Kollegen. Der Autoinstaller benötigt eine XML-Konfigurationsdatei, in der sämtliche Angaben enthalten sein müssen. Nun ist es nicht jedermanns Sache sich ein XML-File zusammenzubasteln, aber auch das kann man sich mittels passendem Tool, dem AutoinstallerGUI zusammenbasteln. Beide Tools sind auf Codeplex zu finden: Sharepoint AutoSPInstaller und Sharepoint AutoSPInstallerGUI Sehen wir uns mal eine typische Installation an. Typische Singleserver Installation   Damit der AutoSPInstaller funktionieren kann, muss eine bestimmte Verzeichnisstruktur her. So sollten, wenn gewünscht, Language-Packs in ein bestimmtes Verzeichnis entpackt werden, dessen Name das Länderkürzel aufweist. Hier bspw. englisch und niederländisch. Der Installer kann durchaus mit SP 2010 und SP 2013 umgehen. In das jeweilige Verzeichnis muss lediglich der Inhalt der DVD kopiert werden.   Unter anderem können auch Updates in die Ordner integriert werden… Nun kann man mit dem AutoSPInstaller loslegen. Nachdem man Key, Version, Verschiedene Settings wie Loopback disablen lässt… ..legt man ServiceAccounts, Logfile-Pfade und Settings für die Zentraladministration fest. Als nächstes lässt sich eine Webapplication und Websitesammlung festlegen. Interessant dürfte auch sein, hier die SQL Aliase anzulegen. Ein schöner Hinweis auf eine gängige Praxis, um unabhängig vom tatsächichen Ort des SQL Servers zu sein. Anschliessend konfigurieren wir die ServiceApplications, wie Search, AppManagement usw. und zuletzt die Enterprise ServiceApplications. Das Ergebnis unserer Konfiguration speichern wir als AutoSPInstallerInput.xml im Autoinstallerverzeichnis. Und schon kann es losgehen: AutoSPInstallerLaunch.bat Im Powershellfenster können wir beobachten, was gerade passiert… Cool, oder? Übrigens: Lässt man den Installer mehrfach laufen, kann im Prinzip nichts schiefgehen. Das Setup kontrolliert, ob Dinge schon existieren und überspringt dann einfach den einen Schritt. So lässt sich bspw. eine Grundinstallation, in der nur Sharepoint inkl. Prerequesits installiert wurde, durchaus mit dem AutoSPInstaller zu Ende konfigurieren. Leider lief bei mir lediglich die englische Version des SP einwandfrei durch. Bei der deutschen Version hakelte es hier und dort. PS: Mittlerweile steht bereits eine neuere Version zur Verfügung mit der auch Sharepoint inklusive SP1 installiert werden kann.

Office Web Apps – Leider ging etwas falsch. Technische Details


Andreas Rauch

Machen Sie so etwas nie! Wenn Sie diese Meldung in Sharepoint 2013 bei den Office Web Apps bekommen oder etwa Access Services 2013 Lösungen nicht veröffentlichen können, dann steht vermutlich oben im Eck der Sharepoint-Seite: SYSTEMKONTO Der Fehler tritt auf, da die Office Web Apps beim SharePoint-Server einen Benutzertoken bei jeder Anforderung übergeben müssen. Jedoch erstellt SharePoint Server 2013 kein Benutzertoken für ein Systemkonto. Also auch kein Konto bzw. Token für die Office Web Apps. Verwenden Sie ein anderes Konto und schon wird wieder alles funktionieren Also liebe Installateure, die das DOM\Administrator-Konto für die Testfarm verwenden. Das steht auf den 10 Geboten für den Sharepoint Server ganz oben. Nachzulesen unter: http://support.microsoft.com/kb/2761265/de