Kategorien
IT SharePoint

SharePoint: Inhaltsdatenbank-Version an SharePoint-Version angleichen

Wenn man in einer SharePoint-Installation ein neues Cumulatives Update installiert um Programm-Fehler zu beheben, so wird die gesamte SharePoint-Version hochgehoben, also die Assemblies/Dlls etc. aktualisiert und haben dadurch höhere Versionsnummern.

Die Inhaltsdatenbank (Content Database) wird grundsätzlich aber nicht automatisch aktualisiert und behält das alte Schema und auch die alte Versionsnummer bei.

In der Regel ist dies nicht weiter tragisch, aber unter Umständen kann es trotzdem nötig werden, dass man die Inhaltsdatenbank aktualisiert und damit ihre Version an diejenige des SharePoint-Serves angleicht, so zum Beispiel, wenn man ein Backup einer Site-Collection einspielen möchte (Restore-SPSite), welches von einer Site/Datenbank mit der höheren Versionsnummer, die des Servers, entstammt.

Um manuell die Inhaltsdatenbank zu aktualisieren, kann man sich der SharePoint Management Shell bedienen.

Zuerst sollte man die gewünschte Content Database in eine Variable laden (wobei man „SQLServerName\WSS_Content_Database_Name“ durch den entsprechenden Datenbank-Server und Namen der Inhaltsdatenbank ersetzen muss):

$contentdb = Get-SPContentDatabase | Where-Object {$_.Name -match "SQLServerName\WSS_Content_Database_Name"}

Ist unklar, wie die Inhaltsdatenbank heisst, so kann man zuerst einfach nur Get-SPContentDatabase eingeben um eine Auflistung aller Inhaltsdatenbanken zu erhalten. Sollte die gewünschte Datenbank nicht aufgeführt sein, sollte sicher gestellt werden, dass diese in der Central Administration im Status „Ready“ ist.

Danach kann man mit folgendem PowerShell-Befehl die Aktualisierung starten:

Upgrade-SPContentDatabase -Identity $contentdb

In der PowerShell wird der Fortschritt in Prozent angezeigt. Bei grösseren Datenbanken kann die Aktualsierung mehrere Minute bis hin zu Stunden dauern.

Weitere Informationen findet ihr in diesem Technet-Artikel: http://technet.microsoft.com/en-us/library/ff607813.aspx

Kategorien
IT SharePoint

SharePoint: Alerts für Volltext-Suchresultate aktivieren

SharePoint 2010 bietet ja die Möglichkeit auf Listen Alerts einzurichten. Wenn Elemente geändert oder hinzugefügt werden, kann man sich so über Email oder auch SMS benachrichtigen lassen. Sehr praktisch wenn man etwas beobachten möchte, aber nicht die ganze Zeit manuell sich durch Listen wühlen möchte.

Solche Alerts kann man praktischerweise aber auch in der SharePoint-Suche aktivieren. So kann man sich benachrichtigen lassen, wenn die Volltextsuche zu einem bestimmten Suchbegriff ein neues oder geändertes Element findet.

SharePoint Search Alerts anlegen
SharePoint Search Alerts anlegen

Die Möglichkeit solche Alerts in der Volltext-Suche zu verwenden ist jedoch in der Grundeinstellung deaktiviert. Der Link dazu ist zwar vorhanden, doch möchte man einen neuen Alert hinzufügen, erscheint folgende Fehlermeldung:

Search alerts have been turned off for this Search Application. For assistance, contact your server administrator.

Über die „Central Administration“ von SharePoint kann dies einfach aktiviert werden:

  • In der „SharePoint 2010 Central Administration“ auf „Manage service applications“ gehen (in der Sektion „Application Management“)
  • In der Liste die „Search Service Application“ finden und den Link zum Öffnen anklicken
  • In der obersten Rubrik „System Status“ befindet sich ziemlich zu unter der Eintrag „Search alert status“
  • Bei „Search alert status“ auf der rechten Seite auf „Enable“ klicken um Alerts zu aktivieren
Alerts für Suchresultate in der Search Service Administration aktivieren
Alerts für Suchresultate in der Search Service Administration aktivieren

Grosse Nachteile, bei aktivierter Einstellung, sind mir nicht bekannt, aber ich vermute dass bei einigen 10’000 Alerts die Performance etwas leiden könnte, vermutlich in den meisten Szenarien vernachlässigbar. Die MSDN zu Thema Alerts für die Suche erwähnt jedenfalls nichts dazu.

Kategorien
IT SharePoint

SharePoint: Elemente ohne Ordner in einem DataView-WebPart anzeigen

Wenn man im SharePoint-Designer eine ganz normale View, welche ein XslListView-WebPart enthält bearbeitet, so kann man via Ribbon einstellen wie mit Ordnern umgegangen werden soll. Entweder es wird nur der Inhalt eines spezifischen Ordners angezeigt, es werden alle Elemente aller Ordner angezeigt oder es werden alle Elemente und alle Ordner (mit Unterordner) angezeigt.

Verwendet man auf der View jedoch ein DataView-WebPart (zum Beispiel weil, man nach mehr als zwei Elementen gruppieren möchte), so sind diese Optionen zwar auch im Ribbon verfügbar, doch scheinen sie keine Auswirkungen mehr zu haben (Bug?).

Die gewünsche Einstellung lässt sich aber zum Glück auch ohne (zumindest fast ohne) Klicki-Bunti von Hand erledigen:

  1. Dazu öffnet man (im SharePoint Designer) am einfachsten die View in der Split-Ansicht oder Code ansicht, so dass man den Quellcode der Seite bearbeiten kann.
  2. Nun sucht man nach dem Tag „SharePoint:SPDataSource“ innerhalb des DataForm-/DataView-WebParts und klickt diesen an.
  3. Nun sollte das „Tag Properties“-Window erscheinen (falls nicht, muss dieses zuerst via Kontextmenü geöffnet werden)
  4. Unter „Tag Properties“ gibt es nun einen Eintrag „Scope“ und der Wert dafür kann man bequem mittels Dropdownmenü selektieren, z.B. „Recursive“ (alle Elemente) oder „RecursiveAll“ (alle Elemente und alle Ordner).
  5. Zum Schluss natürlich die Seite noch abspeichern und wenn nötig Publishen, damit die Änderung für einem selber und Benutzer sichtbar wird

Mehr details zu „Scope“ findet ihr in der MSDN zum SPViewScope-Eintrag.

Kategorien
IT SharePoint

SharePoint: „Ungültige Formel“-Fehler

Heute habe ich in einer Liste eine Formel zur Validierung eines Listenelementes einbauen wollen („List Settings“->“Validation Settings“).

Die Formel sollte sicherstellen, dass nur Elemente gespeichert werden können, bei denen das Anfgangsdatum kleiner ist als das Enddatum und dass beide Daten im selben Jahr liegen.

Folgende Formel hatte ich zuerst verwendet:

=AND([From Date]<=[To Date],YEAR([From Date])=YEAR([To Date]))

Beim abspeichern der Formel erhielt ich, für mich überraschend, folgende Fehlermeldung:

"The formula contains a syntax error or is not supported"
Fehlermeldung: „The formula contains a syntax error or is not supported“

Der Fehler war für mich nicht gleich ersichtlich, ich habe den Aufbau der Formel 1:1 von anderen Beispielen übernommen, wie z.B. von http://adicodes.com/column-validations-and-list-validations-in-sharepoint-2010/ oder von Microsoft selber (http://office.microsoft.com/en-us/sharepoint-server-help/examples-of-common-formulas-HA010105479.aspx).

Nach einigem analysieren und suche im Internet bin ich auf eine Seite gestossen, welche den Fehler beschreibt.

Scheinbar sind die Formeln abhängig von der Sprache des Betriebssystems (des Servers), sowie der gewählten Regionaleinstellungen. Auf dem Server war folgendes Listen-Trennzeichen eingestellt:

Listentrennzeichen-Einstellung in den Regionaloptionen in der Systemsteuerung
Listentrennzeichen-Einstellung in den Regionaloptionen in der Windows-Systemsteuerung

Das Trennzeichen für die verschiedenen Unterformeln musste also von „,“ auf „;“ gewechselt werden, was folgende Formel ergab:

=AND([From Date]<=[To Date];YEAR([From Date])=YEAR([To Date]))

Oder im SharePoint in den „Validation Settings“:

"SharePoint List Validation Settings"-Formel

Danach konnte die Formel gespeichert werden und validiert nun sinngemäss die Listen-Elemente.

 

Kategorien
personal

HTC One S

Bis vor ca. einem Monat hatte ich ein HTC Hero als Mobiltelefon. Dieses hatte ich für etwas mehr als zwei Jahre und mit der Zeit war ich immer weniger damit zufrieden. Hauptsächlich lag es am schlechten Akku, welcher von mir vielleicht mal hätte ausgewechselt werden sollen 🙂 … jedenfalls kam es häufig vor, dass das Telefon trotz aufgeladenen Akkus nach kurzer Zeit schon seinen Geist aufgab. Besonders hilfreich, wenn man gerade mit einem Kunden am telefonieren war. Auch die Rechenpower war nach zwei Jahren nicht mehr die beste und man merkte einfach, dass es mittlerweile ein Relikt aus einer vergangenen Zeit geworden war.

Ich habe lange nach einem neuen Telefon Ausschau gehalten. Wichtig war für mich, dass es Android 4.0 ICS (Ice Cream Sandwich) haben müsste, ein (zumindest für nich) ansprechendes Design, mindestens ein 4.3″ Display, eine hohe Performance und trotzdem lange Akku-Laufzeit.

Da Android 4.0 noch recht neu ist, gab es noch nicht so viele Kandidaten auf dem Markt, respektive es gab einiges auf dem Markt und einige Ankündigungen, welche in naher Zukunft erscheinen sollten. In die engere Auswahl kamen für mich das Samsung Galaxy S3 und das HTC One S.

HTC One S Press Shot

Da ich bisher mit meinem HTC-Gerät grundsätzlich zufrieden war, die Sense-Oberfläche mochte und auch nicht bis zum Release des Galaxy S3 warten wollte (nimmt sich vermutlich nicht viel? 🙂 ), habe ich mich letzendlich für das One S von HTC entschieden und habe dies bisher noch nie bereut. Im Gegenteil ich bin begeistert. Schwer zu sagen, ob es daran lag, dass die Messlatte durch das alte Handy schon ziemlich am Boden lag oder ob es generell einfach ein überzeugendes Gerät ist. Ich vermute eine Kombination aus beidem.

Der Akku hält (vermutlich auch durch den S4-Prozessor) sehr lange. Ich habe schon häufig stundenlange Wanderungen mit Endomono aufgezeichnet und dabei auch mit dem Handy Fotos, sowie Videos gemacht, dabei habe ich es noch nie geschafft, den Akku komplett zu leeren. Auch bei  normalen täglichen Gebrauch mit Telefonaten, surfen im Internet, Email lesen/schreiben war der Akku am Abend noch nie leer, sofern er am Morgen aufgeladen war, meistens ist er nach einem normalen Bürotag noch zu ca. 75% gefüllt; kein Vergleich zum alten Hero.

Die Qualtität der Bilder („8 MP“-Kamera) und Videos („Full HD“-Aufnahmen sind möglich) ist ebenfalls ausgezeichnet, voausgesetzt man verwackelt das Bild nicht und hat einigermassen ausreichende Lichtverhältnisse:

Beispiel-Videos findet ihr z.B. unter meinem Artikel „Kunstrad Regionalmeisterschaft 2012 in Uster„.

Falls ihr euch fragt…

  • …wieso kein „One X“?: für meinen Geschmack etwas zu gross geraten, aber von den Spezifikationen natürlich beeindruckend.
  • …wieso kein iPhone?: da ich einen iMac benutze, hätte es sich sicher gut integriert und auch vom Design her sehr ansprechend, jedoch denke ich ist das Preis-/Leistungsverhältnis aktuell nicht gerade sehr verlockend, da ist beim One S einfach mehr drinn für das gleiche Geld. Auch habe ich schon diverse Anwendungen im Google Play-Store (oder wie der App-Market von Google gerade aktuelle auch immer heissen mag) gekauft und habe keine Lust dieselben Apps erneut im „App Store“ von Apple zu erwerben.

Hier noch einige interessante Spezifikationen:

Betriebssystem Android 4.0: Ice Cream Sandwich (ICS)
Benutzeroberfläche Sense UI
Prozessor Qualcomm Snapdragon (1.500 MHz)
Anzahl Kerne 2
Grafikchip Adreno 225
ROM / RAM 1 GByte
Netz
Netzmodus TriMode
Netzstandards GSM
UMTS
WLAN
Frequenz
GSM QuadBand 850, 900, 1800, 1900 MHz
UMTS TriBand 850, 1900, 2100 MHz
LTE nicht vorhanden
Strahlung mittel (0,6-1,0 W/Kg)
SAR Wert 0,69 W/kg
Flugzeugmodus ja
Format Barren (Candybar)
Höhe x Breite x Tiefe 130.9 x 65.0 x 7.9 mm
Gewicht 121 g

Mehr Details zu den Spezifikationen findet ihr z.B. hier bei phonearena.com. Geniale Seite um Handy-Daten zu vergleichen.

Kategorien
IT SharePoint

SharePoint: Assemblies/Dlls in WSP einbinden

Manchmal hat mit in einem SharePoint-Visual-Studio-Projekt abhängigkeiten zu einem anderen Projekt oder gar zu externen DLLs.

Mittels „References“ können die Referenzen auf diese DLLs festgelegt werden, so dass die Klassen, Methoden etc. dieser Objekte zur Verfügung stehen und mittels „Project Dependencies“ kann man die Abhängigkeiten beeinflussen, so dass die korrekte Build-Reihenfolge geplant wird. Aber wir kann man sicherstellen, dass eine externe, welche nicht aus dem aktuellen Projekt kommt, DLL auch wirklich mitausgeliefert wird, wenn man die Solution als WSP auf dem Zielserver installiert?

SharePoint bietet hierfür eine einfache Möglichkeit. Man kann im „Solution Explorer“ innerhalb des gewünschten Projektes den Package-Knoten öffnen und dort das Package öffnen:

In der nun erscheinenden Ansicht des Package muss man im unteren Bereich des Fensters auf „Advanced“ klicken um die Ansicht zu wechseln:

In dieser Advanced-Ansicht werden alle zusätzlichen Assemblies aufgelistet. Mit einem Klick auf „Add“ kann man einen Eintrag hinzufügen. Je nach Quelle der Assembly muss man wählen ob diese aus dem Output eines Projektes entstammt oder aus einer anderen Quelle. Hier zum Beispiel die Ansicht beim hinzufügen einer existierenden Assembly:

SharePoint Package Add Existing Assembly
Dialog für das Hinzufügen einer existierenden Assembly zum Package

Man hat hier zudem die Möglichkeit festzulegen, ob die Assembly auf Stufe WebApplication oder in den GAC deployed werden soll.

Hat man diese Einstellungen vorgenommen, so wird beim nächsten Packaging (Menübefehl: Build -> Package) die jeweilige Assembly ins WSP integriert.

Kategorien
IT SharePoint

SharePoint: Alle Elemente einer Liste mittels PowerShell löschen

Wenn man alle Listen-Elemente einer SharePoint-Liste löschen möchte, dann kann das manuelle Löschen mittels Browser sehr umständlich sein. Selbst in der Datasheet-View ist es sehr mühsam alle Elemente auf einen Schlag zu löschen, da bei grosser Anzahl an Elementen Timeouts auftreten können. Leider fehlt im GUI eine benutzerfreundliche Option im Sinne von „Lösche alle Elemente dieser Liste“.

Mit einem PowerShell-Skript kann man dies Vorhaben jedoch ziemlich einfach und nerven-schonend durchführen:

[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c")

# "Enter the site URL here"
$SITEURL = "http://siteCollectionUrl"

$site = new-object Microsoft.SharePoint.SPSite ( $SITEURL )
$web = $site.OpenWeb()
"Web is : " + $web.Title

# Enter name of the List below
$oList = $web.Lists["InternalListName"];

"List is :" + $oList.Title + " with item count " + $oList.ItemCount

$collListItems = $oList.Items;
$count = $collListItems.Count - 1

for($intIndex = $count; $intIndex -gt -1; $intIndex--)
{
        "Deleting : " + $intIndex
        $collListItems.Delete($intIndex);
}

Das Skript in einer „ps1“-Datei speichern (z.B. „DeleteAllListElements.ps1“), darin den URL der „Site Collection“ den internen Listennamen anpassen, danach direkt ausführen um die Elemente zu löschen.

Möchte man alle Elemente, einschliesslich aller Ordner und aller Elemente in Ordnern/Unterordnern löschen, so kann man das folgende PowerShell-Skript verwenden (auch hier muss man den URL und den Listennamen anpassen):

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

$web = Get-SPWeb "https://siteCollectionUrl"
$list= $web.GetList("/Lists/InternalListName")


foreach ($item in $list.items)
{
	$deleteItem = $list.GetItemById($item.ID)
	$deleteItem.Delete()
}

foreach ($folder in $list.Folders)
{
	$deleteFolder = $list.GetItemById($folder.ID)
	$deleteFolder.Delete()
}

 

Kategorien
IT SharePoint

SharePoint: TaxonomyHiddenList manuell aktualisieren

Unter gewissen Umständen und mit gewissen Cumulativen Updates für den SharePoint 2010 kann es vorkommen, dass die TaxonomyHiddenList nicht mehr auf dem aktuellsten Stand ist, da die Synchronisation mit dem Term-Store (Terminologiespeicher) nicht mehr fehlerfrei durchgeführt werden kann.

Abhilfe (wenn auch eventuell nur temporäre?)  schafft folgendes PowerShell-Skript:

$Assem = (
	"Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ,
	"Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
)

$Source = @"
using Microsoft.SharePoint;
using Microsoft.SharePoint.Taxonomy;
using System;

namespace TaxonomyUpdater
{
	public static class TaxonomyHiddenList
	{
		public static void Update(string SiteUrl)
		{
			SPSite Site2Update = new SPSite(SiteUrl);
			TaxonomySession.SyncHiddenList(Site2Update);
			Site2Update.Dispose();
		}
	}
}
"@

Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp

Das Skript muss man in einen Text-Editor einfügen und als „UpdateTaxonomyHiddenList.ps1“ abspeichern.

Danach das Skript in einer PowerShell einmal ausführen, damit die Klasse verfügbar wird. Zum Schluss mit folgendem Befehl die Synchronisation starten:

[TaxonomyUpdater.TaxonomyHiddenList]::Update(“http://SharePointServer”)

Siehe auch: http://blogs.msdn.com/b/joerg_sinemus/archive/2011/03/03/terms-and-how-to-update-taxonomyhiddenlist-when-the-timer-job-was-not-able-to-update.aspx

Kategorien
misc personal swiss

Kunstrad Regionalmeisterschaft Mitte 2012 in Uster

Heute fand in Uster die Kunstrad Regionalmeisterschaft Mitte 2012 statt.

Meine Freundin fuhr früher in Uster Kunstrad und hilft auch heute noch ihrem Club, wenn Helfer gefragt sind, so wie zum Beispiel heute.

Am Nachmittag habe ich sie begleitet und wir haben uns einige Athleten und Athletinnen angeschaut, welche die Meisterschaft bestritten. Nachfolgend einige Videos:

(Livia Philipp)

(Cara Poletti)

(Rebecca Stössel)

(Anja Eberhart)

(Mario Augsburger)

Das Ganze war ziemlich beeindruckend, wenn aber auch angsteinflössend 😉 – welcher normale Mensch versucht schon stehend vom Fahrrad-Sattel auf den Fahrrad-Ständer zu springen, noch dazu wenn das Fahrrad in Bewegung ist.

Hier findet ihr die Resultate.

Kategorien
IT SharePoint

SharePoint: Aktuelle Seiten-URL in CustomAction verwenden

Manchmal kann es vorkommen, dass man in einer SharePoint-UrlAction innerhalb einer CustomAction die aktuelle Seite mitgeben möchte. Dies kann zum Beispiel sinnvoll sein, wenn man nach dem Klick auf den „OK“-Button auf der aufgerufenen Seite wieder auf die ursprüngliche Seite zurückkehren möchte.

Normalerweise ist eine CustomAction/UrlAction wie folgt aufgebaut:

<?xml version="1.0" encoding="utf-8">
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <CustomAction Id="MyAction" GroupId="PersonalActions" Location="Microsoft.SharePoint.StandardMenu" Sequence="1000" Title="My custom action">
        <UrlAction Url="~sitecollection/_layouts/page.aspx">
    </CustomAction>
</Elements>

Und leider gibt es kein eingebauten Platzhalter für die aktuelle Seite.

Mit etwas JavaScript kann man dieses Problem aber Lösen und den URL-Parameter „Source“ dynamisch abfüllen lassen:

<UrlAction Url="javascript:window.location='{SiteUrl}/_layouts/page.aspx?List={ListId}&Source=' + window.location">

SharePoint verwendet diesen Source-Parameter um den Benutzer auf die jeweilige Seite zu leiten.