Freitag, 26. November 2010

The VM session was closed before any attempt to power it on

Meine VM VirtualBox hatte oben genannten Error beim Starten. Hierzu habe ich folgendes geändert:
Ich habe "Ändern" geklickt. Dem Button neben "Neu". Dort habe ich die Bootreihenfolge geändert. Also HD zuerst. Danach lief die Maschine wieder.

My VM VirtualBox had the above mentioned error, when trying to start. Therefore I made the following changes:
I clicked "change" right next to "new" and then changed the sort order of the boot-steps and have set the HD first. Then it worked and started correctly.

Donnerstag, 21. Oktober 2010

Custom Field Type -> User : <Field Name="ParentType">User</Field>

Wenn man ein Custom Field Type des ParentTypes User erstellen will, dann geht man vor wie bisher, nur an zwei Stellen müsste man etwas ändern.

1. fldtypes_[your name].xml
Dort muss man den folgenden ParentType definieren:
<Field Name="ParentType">User</Field>

2. FieldControl verlangt beim get der überschriebenen Methode Value ein gewisses Format [Sharepoint UserId];#[Sharepoint UserName] als String.
public override object Value
{
get
{
return "1;#Mein Name";
}
}


Sharepoint UserId bzw. UserName erhält man wie folgt:
Aktueller User:
SPSite oSiteCollection = SPContext.Current.Site;
using (SPWeb oWebsite = oSiteCollection.RootWeb)
{
SPUser oUser = oWebsite.CurrentUser;
oUser.Name; //Der Sharepoint UserName
oUser.ID; //Die Sharepoint UserId
}


Ein User aus einer Gruppe:
using (SPSite spSite = new SPSite("[URL zu meiner Sharepointinstanz]"))
{
using (SPWeb spWeb = spSite.RootWeb)
{
foreach (SPUser user in spWeb.SiteGroups["[Mein Gruppenname]"].Users)
{
user.Name;
user.ID;
}
}
}


3. Ihre Field Klasse erbt bei normalen Custom Field Types von der Basisklasse SPField. In diesem Fall muss es SPFieldUser sein. Der restliche Code bleibt gleich. Wenn man einen Defaultwert setzen will, kann man die dazugehörige Eigenschaft überschreiben.
public class [Ihr Name]Field : SPFieldUser
{ ...

HINWEIS: Wenn Sie SPField als Basisklasse benutzen, dann bleibt der Wert in der Liste leer.


If you want to create a custom-field-type of parent-type User, then you just create your custom-field-type like any other and make changes at two spots.

1. fldtypes_[your name].xml
There you have to define the following ParentType:
<Field Name="ParentType">User</Field>

2. FieldControl requires a special format in the get function of the overridden method Value. [Sharepoint UserId];#[Sharepoint UserName] as string.
public override object Value
{
get
{
return "1;#My name";
}
}


You can get the values of Sharepoint UserId or UserName like this:
Current user:
SPSite oSiteCollection = SPContext.Current.Site;
using (SPWeb oWebsite = oSiteCollection.RootWeb)
{
SPUser oUser = oWebsite.CurrentUser;
oUser.Name; //The Sharepoint UserName
oUser.ID; //The Sharepoint UserId
}


User from a specified group:
using (SPSite spSite = new SPSite("[URL of my Sharepoint-instance]"))
{
using (SPWeb spWeb = spSite.RootWeb)
{
foreach (SPUser user in spWeb.SiteGroups["[My group-name]"].Users)
{
user.Name; //The Sharepoint UserName
user.ID; //The Sharepoint UserId
}
}
}


3. Usual custom-field-types inherit from the base-class SPField. In this case your class needs to inherit from SPFieldUser. The rest of the code remains the same. If you want to set a default-value, then you need to override the property DefaultValue.
public class [Your name]Field : SPFieldUser
{ ...

HINT: If you do use SPField as the base class, then the value in the list will remain empty.

Mehrere SP.UI.ModalDialog.showModalDialog - CallBack

Wenn man mehrere SP.UI.ModalDialog.showModalDialog Fenster auf einer Seite platziert, ist es wichtig, dass die Callback Methoden unterschiedlich heissen. Ansonsten funktioniert immer nur ein Dialog Callback. Deshalb in den Properties des Dialogs immer einen anderen Methodennamen verwenden.

If you are using multiple SP.UI.ModalDialog.showModalDialog windows on your page, be aware to have different callback methods defined. Otherwise there will be just one callback working. Therefore set in the properties of your dialog always a different method.

Dialog 1:

function OpenDialog1()
{
var options1 = {
url: '/_layouts/MyDialog.aspx',
title: 'MyDialog',
allowMaximize: false,
showClose: true,
width: 400,
height: 400,
dialogReturnValueCallback: DialogCallback1 };

SP.UI.ModalDialog.showModalDialog(options1);
}

function DialogCallback1(dialogResult, returnValue) {
[Your code on callback]
}

Dialog 2:

function OpenDialog2()
{
var options2 = {
url: '/_layouts/MySecondDialog.aspx',
title: 'MySecondDialog',
allowMaximize: false,
showClose: true,
width: 400,
height: 400,
dialogReturnValueCallback: DialogCallback2 };

SP.UI.ModalDialog.showModalDialog(options2);
}

function DialogCallback2(dialogResult, returnValue) {
[Your code on callback]
}


Es existiert noch eine andere Schreibweise ->
There is also another way of defining the dialog ->

Dialog 1:

function OpenDialog1()
{
SP.UI.ModalDialog.showModalDialog(options);
var options1 = SP.UI.$create_DialogOptions();
options1.url = '/_layouts/MyDialog.aspx';
options1.width = 400;
options1.height = 400;
options1.allowMaximize = false;
options1.showClose = true;
options1.dialogReturnValueCallback = DialogCallback1;

SP.UI.ModalDialog.showModalDialog(options1);");
}

function DialogCallback1(dialogResult, returnValue) {
[Your code on callback]
}

Dialog 2:

function OpenDialog2()
{
SP.UI.ModalDialog.showModalDialog(options);
var options2 = SP.UI.$create_DialogOptions();
options2.url = '/_layouts/MySecondDialog.aspx';
options2.width = 400;
options2.height = 400;
options2.allowMaximize = false;
options2.showClose = true;
options2.dialogReturnValueCallback = DialogCallback2;

SP.UI.ModalDialog.showModalDialog(options2);
}

function DialogCallback2(dialogResult, returnValue) {
[Your code on callback]
}

Mittwoch, 20. Oktober 2010

Timerjob does not fire

Wenn Sie einen Timerjob erstellt und deployed haben, jedoch dieser keine Funktion auszuführen scheint, dann liegt es evtl. daran, dass die Assembly nicht neu instanziert wurde. Hierzu unter Verwaltung -> Services -> Sharepoint Timer neu starten. Danach den Timerjob nochmals starten.

When you created and deployed a timer-job, this seems not to work or functionallity seems not to fire, then the reason might be that the assembly was not initialized properly. Therefore restart Administrative Tools -> Services -> Sharepoint Timer. Then run your timer-job again.

Freitag, 15. Oktober 2010

Import spreadsheet als Liste

Bei dem Import eines Spreadsheets als Liste in Sharepoint 2010 hatte ich folgende Fehlermledungen:
1. "Automation server can't creat object"
ActiveX Controls sind nicht aktiviert oder Sie verwenden nicht den IE.

2. "The specified file is not a valid spreadsheet or contains no data to import"
Gehen Sie im Internet Explorer unter Tools -> Internet Options -> Security -> Trusted Sites -> Sites (Button) und fügen Sie die Seite hinzu. Sollte es dort eine Fehlermeldung geben, dann die Checkbox uncheck, denn Sie wollen wahrscheinlich eine http:// Seite hinzufügen.


When importing a spreadsheet as a list in Sharepoint 2010 I had the following error-messages:
1. "Automation server can't creat object"
ActiveX controls are either not activated or you are not using the IE.

2. "The specified file is not a valid spreadsheet or contains no data to import"
Go to Internet Explorer under Tools -> Internet Options -> Security -> Trusted Sites -> Sites (Button) and add this site to your trusted sites. If there is also an error-message, then uncheck the checkbox below, because you are trying to add a http:// site.

Montag, 11. Oktober 2010

Sharepoint 2010 -> Javascript API window dialog

Wer in seiner Sharepointseite ein windows bzw. dialog selbst erstellen und öffnen will, der muss lediglich auf ein wenig Sharepoint API zurückgreifen:

If someone wants to use the window/dialog of Sharepoint in his Sharepoint instance, you can use the Sharepoint API like this:

<script type="text/javascript">
function MyDialog() {
var thisdialog = SP.UI.$create_DialogOptions();
thisdialog.url = "/_layouts/DialogDemo/MyDialog.htm";
thisdialog.width = 400;
thisdialog.height = 300;
SP.UI.ModalDialog.showModalDialog(thisdialog);
}
</script>


More information can be found here (thanks to the authors):
External blog
External blog

Mittwoch, 6. Oktober 2010

Incompatible Web Part markup detected. Use *.dwp Web Part XML instead of *.webpart Web Part XML.

Wenn Sie ein eigenes Webpart erstellt haben und oben genannte Fehlermeldung erhalten, dann liegt es daran, dass das Webpart von der falschen Klasse erbt. Sie muss von folgender Klasse erben:
System.Web.UI.WebControls.WebParts.WebPart
und NICHT:
Microsoft.SharePoint.WebPartPages.WebPart

If you get the above mentioned error message, then you inherit from the wrong class in your custom webpart. It is supposed to inherit from:
System.Web.UI.WebControls.WebParts.WebPart
and NOT:
Microsoft.SharePoint.WebPartPages.WebPar

Hier ein kleines Beispiel, wie man ein eigenes Webpart erstellt:
Here is a little example how to create your custom webpart:
Link 1

Mittwoch, 29. September 2010

sharepoint 2010 page layout disabled in ribbon

Wenn der Page Layout Button im Ribbon disabled ist kann dies folgende Ursachen haben:
1. Der User, welcher eingeloggt ist und das Layout ändern will hat nicht genug Rechte. Es einmal mit einem Adminuser versuchen.
2. Es gibt einfach keine Page Layouts auszuwählen. Hierzu Settings -> Look and feel -> Page Layouts und dort in der mittleren Spalte ein paar Layouts zur Verfügung stellen.
3. Die eigen erstellen Layouts wurden von einem User mit minderer Berechtigung hochgeladen. Sie sind zwar in den Settings zu sehen, können aber nicht ausgewählt werden. Hierzu als Admin einloggen und unter Settings -> Galleries -> master pages and page layouts, die einzelnen aspx Dateien auschecken und einchecken. Der Modified By User dürfte dadurch ändern. Anschliessend nochmals checken ob Punkt 2 erfüllt ist und nochmals in der Seite sehen ob der Button noch disabled ist.

When the page-layout-button in the ribbon is disabled, the reason therefore can be:
1. The user, who is logged in and wants to change the layout, does not have enough permissions. Try the admin-user.
2. There are no page-layouts to choose from. Go to settings -> look and feel -> page layouts and take the selection boxes in the middle to provide some layouts.
3. The custom layouts have been uploaded by a user, that does not have enough permissions. You can then see the layouts in the settings, but they can't be chosen in the page. Therefore login as an admin and go to settings -> galleries -> master pages and page layouts, there check out the different aspx files and check in. The Modified By User is suppsoed to be changed. Then check again if you topic no 2 is correct set and if it works and the button is enabled.

Mittwoch, 22. September 2010

$('#s4-ribbonrow').show(); Javascript error: object expected

Dieser Fehler taucht auf, wenn man den ...<div id="s4-ribbonrow">... Layer irgendwie auf hidden, oder display none gesetzt ist.

This error happens, when the layer ...<div id="s4-ribbonrow">... is set to hidden or display:none.

Freitag, 10. September 2010

AgilePoint - Sharepoint can't add workflow

Wenn Sie beim Versuch, einen Workflow in Sharepoint mit einem Processtemplate des AgilePoint Servers zu verbinden, folgende Fehlermeldung erhalten "Object reference not set to an instance of an object", dann liegt es vielleicht daran, dass Sharepoint und der AgilePoint Server nicht kommunizieren. Kann sein, dass ein AD User ein neues Passwort besitzt oder der User geändert wurde. Hierzu unter Listen die AgilePoint Configuration Liste öffnen und überprüfen ob die Userdaten noch korrekt sind.

If you get the following error: "object reference not set to an instance of an object", when trying to add a process-template for a workflow in Sharepoint. Reason therefore might be, that the communication between Sharepoint and AgilePoint server is not working correctly. Maybe the AD user got deleted or password changed. Please go to the AgilePoint-configuration list, under Sharepoint lists, and check the credentials there.

AgilePoint form does not open in browser - AgilePoint Formular öffnet nicht im Browser

Wenn man vom AgilePoint Server aus einen Workflow deployed, welcher dann mit eigenem InfoPath Formular kommt und dieses sich beim hinzufügen von Items in Infopath öffnet, sollten folgende Einstellungen untersucht werden:
InfoPath, wenn man ein neues Formular erstellt: -> "nur browserkompatible Features aktivieren" anklicken. Sollte das Formular schon erstellt sein, dann unter Extras -> Formularoptionen -> Kompatibilität kontrollieren, ob die Checkbox ("Formularvorlage entwerfen, die in einem...) aktiviert ist. Anschliessend in Sharepoint auf der Liste unter List-settings -> Advanced settings -> Opening Documents in browser, dort prüfen ob die Einstellung stimmt.

When you deploy a workflow from the AgilePoint server, that uses an InfoPath form and opens up in InfoPath instead of the browser, than you should check those settings:
InfoPath when creating a new form: -> "enable browser compatible features only", check-box needs to be clicked. If the form is already created, then go to Tools -> Form Options -> Compatibility and check if the check-box ("Design a form-template that can...") is activated. Afterwards go to the sharepoint-list and go to list-settings -> advanced settings -> opening documents in browser, check if this setting is correct.

datasource , 'xy', contains an ImpersonationMode that is not supported for processing operations

Als ich ein Analysis Service Projekt deployen wollte, hatte ich den Fehler, dass die Datenquelle einen nicht unterstützen ImpersonationMode enthält.
Der Fehler scheint die Authentifizierung am Server zu sein. Hierzu bitte die Datenquelle neu erstellen und einen spezifischen User (User muss auch entsprechende Rechte auf dem DB Server haben) angeben. Danach hat es bei mir funktioniert das Projekt zu deployen.

When trying to deploy an Analysis Service project, I received the error, that the datasource contains an ImpersonationMode, that is not supported.
This error seems to happen when the authentification to the server fails. Therefore create a datasource and enter a specific user (user needs to have the right permissions on the db-server). Afterwards it worked for me to deploy the project.

Donnerstag, 9. September 2010

The Microsoft Secure Store Service application Secure Store Service failed to retrieve credentials. The error returned was 'Access is denied.'

Ich hatte beim Zugriff über den Dashboard Designer immer dieses Problem, wenn ich per unattended user die Datenbank oder Analysis Service öffnen wollte. Nach verschiedenen Versuchen, von Neuerstellen der Application Services (PerformancePoint Service, Secure Store Service) bis mehrfachen setzen der User hat diese Lösung geholfen:
Central Administration -> Manage service applications -> Secure Store Service -> anklicken der Applikation und "Bearbeiten" im Ribbon wählen. -> Auf der dritten Seite befindet sich eine Text-area mit dem Begriff "Members". Dort sollte der User/Gruppe angelegt sein.

I always had the problem, when I wanted to access the database or analysis-service through the dashboard-designer. After different approaches, like re-creation of the application-services (PerformancePoint Service, Secure Store Service), setting the user several times, this solution helped me to make ist work:
Central Administration -> Manage service applications -> Secure Store Service -> click the application-checkbox and choose "edit" in the ribbon. -> On the third page, there is a text-area with the topic "Members". There your user/group is supposed to appear.

Related help page
Related help page
Related help page
Related help page
Related help page

Dienstag, 7. September 2010

Dashboard Designer does not connect with Sharepoint site

Wenn man den Dashboard Designer aufruft und eine Verbindung zur Site ist nicht möglich, auch die Eingabe der URL ergibt, dass er folgende Fehlermeldung ausgibt: "the url must be in one of the following zones ... local intranet, trusted", dann liegt es an den Einstellungen der Browserzonen. Dort muss man die URL zu den Trusted Sites unter Options hinzufügen. Anschliessend kann man den Dashboard Designer öffnen und er verbindet automatisch.

If you open Dashboard Designer and the connect to the site is not possible, even when entering the URL and the error you get is the following one: "the url must be in one of the following zones ... local intranet, trusted", then you need to check the settings of your browser. There under options you have to add the URL to the trusted sites. Afterwards you can open Dashboard Designer and you will be connected automatically.

BDC not visible in central administration after deployment

Mir ist es passiert, dass ich mehrere BDC entwickelt habe, diese anschliessend deployen wollte. Mir sagte das Visual Studio bei jedem Deployment, dass es successful war. Jedoch konnte ich in der Central Administration die BDCs nicht finden bis auf einen. Was war passiert? Ich hatte vergessen die Namen zu ändern. Visual Studio hat somit versucht BDC mit dem Namespace BdcModel1 mehrmals zu deployen, was fehlschlug. Somit ging ich in jedes Projekt der BDC und habe dort mit der Suche nach BdcModel1 gesucht und alles umbenannt in einen eigenen Namen. Anschliessend auch FileName und FolderName geändert. Nichts in meinem Projekt war mehr BdcModel1. Weder in den Feature-, Package-XML noch im Namespace, etc. Wichtig ist, dass man alles umbenennt. Dies habe ich mit jedem Projekt gemacht, überall einen anderen Namen vergeben und voila, alle BDC wurden korrekt deployed. Komisch ist nur, dass das Deployment nicht gleich fehlschlägt.

Something happens to me. I was developing several BDC, that I wanted to deploy. Everytime I got the confirmation from Visual Studio, that the deployment was successful. But I could not find them in central administration except one BDC I developed. What happend? I had forgotten to change the naming. Visual Studio tried to deploy several BDC with the namespace BdcModel1, that did not work. Now I went in every BDC project and searched for the BdcModel1 and replaced it with an own name. Also file-name and folder-name had to be changed. Nothing in my project was left to BdcModel1. Not any feature-, package-xml, no namespace, etc. It is important to rename everything. I did that with every project and renamed with unique names and voila, I saw every BDC in the central administration after deployment. Strange thing is, that deployment does not fail, when this error happens.

Lassen Sie auch mal den ULS laufen während des Deployments.
Das ist die ULS Fehlermeldung (vssphost4.exe):
You can run the ULS during deployment.
That is the ULS error-message (vssphost4.exe):
Ignoring LobSystem (External System) with Name 'xy' (and its LobSystemInstances (External System Instances)) as it is already loaded in the current context. Entity (External Content Type) with Namespace 'xy.BdcModel1' and Name 'Entity1' and Version '1.0.0.11' already exists and will not be recreated.

Freitag, 13. August 2010

Admin application pool stops when running AgilePoint

1. Application pool beendet - application pool stops
Wenn der Admin Application Pool beendet wird sobald man AgilePoint Enterprise Manager startet, dann folgende Einstellung vornehmen: Im IIS -> Applications Pools -> Admin -> Advanced Settings -> Process Models, dort unter Identity nochmals den User definieren, welcher die korrekten Rechte besitzt.

If the Admin application pool stops as soon as you start the AgilePoint Enterprise Manager, then you are supposed to check the following settings: in the IIS -> application pools -> Admin -> advanced settings -> process models, there under identity set the user once again, that has the needed permissions.

2. 500 oder 503 Fehlermeldung beim öffnen der Seite - 500 or 503 error message when opening the page
Wenn jetzt eine 5er Fehlermeldung erscheint, dann muss der User ebenfalls hier neu gesetzt werden:
IIS -> Sites -> AgilePoint - 8085* -> Advanced Settings -> Physical Path Credentials, dort den User neu setzen.

If now a type 5 error message is diplayed, then this user needs to be set here as well:
IIS -> sites -> AgilePoint - 8085* -> advanced settings -> physical path credentials, there set the user once again.

*Port kann je nach Installation variieren - port can differ depending on the installation

Donnerstag, 5. August 2010

AgilePoint: dynamic connector does not link to activities properly

Wenn man auf diese Fehlermeldung im AgilePoint Envision stösst, dann liegt es daran, dass man anscheinend Activities verwendet, welche nicht zusammenpassen. Einfach den Connector verwenden, wie für jeden anderen Workflow. Anschliessend in den Eigenschaften schauen, ob es eine Source- und Targetactivity gibt. Wenn nicht, dann ist die Activity nicht kombinierbar und man sollte andere wählen.

If you will get the (in the headline mentioned) error in AgilePoint Envision, then you are trying to connect activities, that are not supposed to be connected. Try to use the connector, like you would for each regular workflow. Then check the properties, if there is a source- and target-activity. If not, then those activities are not combineable and you should take different ones.

Montag, 2. August 2010

The connector must be connected to two workflow shapes.

Wenn Sie mit Visio ein Workflowdiagramm erstellen und bei Prüfung dieses Diagramms die oben genannte Fehlermeldung erhalten, Sie aber keinen Fehler entdecken, doppelklicken Sie auf die Fehlermeldung und wenn irgendwo ein blauer Kasten im Diagram erscheint, dann ist dort ein versteckter Connector, welcher nicht verbunden wurde, jedoch auch so klein ist, dass man ihn im Diagramm selbst nicht sieht. Entweder Sie entfernen diese, oder erweitern ihn mit dem Connector-Cursor.

When working with Visio and creating a workflow diagram and you are getting the mentioned error-message, convinced, that there is nothing wrong in your diagram, then double click the error message. If there is then a blue squared item in your diagram, then it seems a hidden connector was not used and appears so small, that you don't see it in your diagram. Either delete it or extend it with the connector-cursor.

Freitag, 30. Juli 2010

Sharepoint Designer workflow does not react on if -> else if

Wenn in dem Schritt, welchen Sie bearbeiten ein Approvalprozess gestartet wird und folgende Abfrage stattfindet:
If Aktuelles Element:Approval Status equals 1;#Rejected,
diese aber im Workflow nie abgehandelt wird, liegt es daran, dass der Statuswert nicht gesetzt wird.
Man muss sich das so vorstellen, dass der Approval Prozess ebenfalls aus einem Workflow besteht und man dort
definieren muss, was passieren soll, bzw. welche Werte wo gesetzt werden müssen, damit es funktioniert.
Ein simpler Workflow von mir sah so aus:

When there is the following if-clause in the apporval process, that you started:
If Current Element:Approval Status equals 1;#Rejected,
but the workflow never reacts on that, then the reason is, that the value is never set.
You have to consider, that the approval-process contains out of a workflow definition itself and you have to define there, what
has to happen, or what values need to be set, to make it work.
A simple workflow of mine looked like that:
WorkflowStep1

Grossansicht anzeigen - Show large image


Dort hatte ich das Problem, dass if und else einfach immer Approved ausgegeben haben. Das ist damit zu erklären, dass
der Prozess an sich immer approved = true ist, ausser der gesamte Workflow wird gelöscht oder beendet.
Was Sie gerne hätten wäre aber, wie der Prozess abgehandelt wurde, ob der Nutzer approved oder rejected hat.
Hierzu den Prozess einmal dort anklicken wie in der Grafik unten, damit man den Workflow des Porzesses bearbeiten kann.

There I had the problem, that if and else always returned approved. The explanation for that is, that the process itself always
returns approved = true, except you delete the workflow or cancel it.
What you want to know is, did the user approve or reject during the process.
Therefore click the process, like the image below shows you, to be able to edit the process itself.
WorkflowStep1

Grossansicht anzeigen - Show large image

Sie gelangen dann in die Eigenschaftenübersicht des Prozesses. Dort befinden sich auf der linken Seite die wichtigsten Einstellungen.
Klicken Sie den 3. Item in der Liste an, dann gelangen Sie in den Prozessworkflow. Der 2. Item könnte auch interessant sein,
wenn Sie Eigenschaften nach dem Prozess definieren wollen.

You will get to the settings overview of this process. On the left hand side you will see the major settings. Click on the 3rd item
in the list, then you will get to the process workflow. The 2nd item might be also very interesting for you,
when you want to set properties after the process happens.
WorkflowStep1

Grossansicht anzeigen - Show large image

WorkflowStep1

Grossansicht anzeigen - Show large image

Wenn Sie den 3. Item geklickt haben, sehen Sie den Workflow und dort gehen Sie bis zum Ende der einzelnen Schritte.
Am Ende befindet sich "When a task completes". Dort müssten Sie die Werte setzen, wie es in der Grafik markiert hervorgehoben
wird.

When you clicked on the 3rd item, you see the workflow and there go to the last step. There you will find the "When a task completes" step.
There you have to set the values, like I highlighted in the image below.
WorkflowStep1

Grossansicht anzeigen - Show large image

Dadurch werden die Werte während des Approvalprozesses gesetzt und man kann diese dann im eigenen Workflow auslesen und verwenden.

This way, the values are set during the approval-process and you can use those in your own workflow.

Donnerstag, 29. Juli 2010

Timer job and workflow - timer job does not execute workflow

Wenn der Timer Job keinen Workflow auslöst, liegt das daran, dass der Timer Job evtl. vom System Account gesteuert wird und dieser (siehe vorheriger Post) den Workflow überspringt. Deshalb am besten einen eigenen User einrichten, mit System Account Rechten und über diesen den Timer Job laufen lassen.

If your timer-job does not execute a workflow, the reason might be, that the timer-job is handled through the system-account (check previous post). Therefore it might be best, to create a new user with the same permissions like the system-account, and let this one execute the timer-job.

Code not running - Code funktioniert nicht

Liebe Leser dieses Blogs (sind mittlerweile erstaunlicherweise 300 pro Monat), sollte es vorkommen, dass ein Code, welchen ich publiziere, nicht funktioniert, wäre ich über eine kurze Nachricht oder einen Kommentar dankbar.

Dear reader of this blog (I was surprised, that there are more than 300 each month), when a code, that I published, is not working, let me know in sending me a message or leave a comment.

Workflow does not start when list item is created or edited

Workflow does not start when list item is created or edited - Workflow automatisch starten wenn ein Element erstellt/geändert wird funktioniert nicht.

In meinem Fall habe ich im Sharepoint Designer angegeben, dass der Workflow automatisch bei Änderung oder neuem Element gestartet werden soll. Das hat er während meiner Tests nicht gemacht. Grund hierfür ist folgender: Workflows werden nicht gestartet, wenn es sich um den System Account handelt, der Elemente ändert oder neu einstellt. Einfach mit einem anderen Account einloggen und nochmals probieren.

In my case I have set in the Sharepoint Designer, that the workflow is supposed to start automatically, when a new item is created or an item changed. This did not work in my testing. Reason therefore was: workflows are not running automatically, when the system-account is doing those changes or creates new items. Login with a different user and try again.

Donnerstag, 22. Juli 2010

Create your custom webpart property - eigene Webpart Eigenschaft erstellen

Wenn man ein eigenes Webpart entwickelt, kommt es vor, dass man zur Darstellung Daten vom Webpartnutzer benötigt um Inhalte vollständig anzuzeigen. Hierzu gibt es beim Bearbeiten des Webparts die Eigenschaften, welche Einstellungen am webpart vornehmen.
Dieser Blogpost soll zeigen, wie man diese Eigenschaften mit eigenen Eigenschaften erweitert.
Man erstellt zuerst ein neues Visual Webpart in Visual Studio 2010. Das Visual Webpart erstellt eine .cs Datei in gleicher Hierarchie, wie die .webpart Datei.

When you develop your own webpart, there might be the need to gather data from the webpart-user to display content correctly.
Therefore the webpart does have the properties you see, when clicking "edit webpart", that set things of the webpart.
This blog-post is supposed to show, how you can extend those properties with custom properties.
First you have to create a new Visual Webpart in Visual Studio 2010. This Visual Webpart creates a .cs file in the same directory level like the .webpart file.

sharepoint project


Öffnen Sie diese Datei und dann können Sie zu der VisualWebPart1 Klasse folgende Eigenschaft hinzufügen:

Open this file and then you can add to the VisualWebPart1 class the following property:

[WebBrowsable(true), Category("Own Category"), Personalizable(PersonalizationScope.Shared), DefaultValue(""), WebDisplayName("Property Title"), WebDescription("Property Description")]
public string MyCustomProperty
{
get { return _mycustomproperty; }
set { _mycustomproperty = value; }
}
public static string _mycustomproperty;

Category definiert die Kategorie, in welche die Eigenschaft angezeigt wird. Man kann hier auch eine eigene Kategorie erstellen.
Einfach hier einen neuen Namen hineinschreiben. Alle anderen Eigenschaften der Eigenschaft sprechen für sich und können mit anderen Inhalten getestet werden.

Category defines the category, where the property will be displayed. You can create also your own category. Just enter a new name. All other properties of this property talk for themselves and can be tested with different content.

Im VisualWebPart1UserControl.ascx.cs kann man einfach wie folgt auf diese Eigenschaft zugreifen:

In the VisualWebPart1UserControl.ascx.cs file you can access this property easily like that:

litOutput.Text = VisualWebPart1._mycustomproperty;


Deployen Sie jetzt das Webpart und dann gehen Sie auf "Webpart bearbeiten". Sie sehen dann einen eigenen Reiter und in diesem die Eigenschaft. Geben Sie etwas ein und wenn Sie den Wert im Webpart Usercontrol ausgeben, werden Sie ihn auf der Webseite sehen.

Deploy the webpart and then go to "Edit webpart". You will see your own tab and in there your property. Enter something and if you output the value in the webpart usercontrol, you will see something in the webpage.

Grundsätzlich werden bei folgenden Eigenschaften folgende Controls erstellt:

Basically the following properties generate the following controls:
bool -> Check box
DateTime -> Text box
enum -> Dropdown
int -> Text box
string -> Text box

Aber was macht man, wenn man z.B. Radiobuttons oder andere Controls verwenden will? Dann kann man diese auch selbst erstellen.
In der VisualWebpart1.cs Datei muss die VisualWebpart1 Klasse von folgender Klasse erben: Microsoft.SharePoint.WebPartPages.WebPart.
Anschliessend die GetToolParts() Methode überschreiben.

But what if you want to use controls like radio-buttons or other controls? You can create them on your own.
In the VisualWebpart1.cs file the VisualWebpart1 class needs to inherit from this class: Microsoft.SharePoint.WebPartPages.WebPart.
Then you need to override the GetToolParts() method.

public override ToolPart[] GetToolParts()
{
ToolPart1 mytoolpart = new ToolPart1();
mytoolpart.Title = "My Tab";

List lstToolParts = new List(base.GetToolParts());
lstToolParts.Insert(0, mytoolpart);
return lstToolParts.ToArray();
}


Dieser Code wird die ToolPart1 Klasse dem bestehenden Array hinzufügen, der aus den Default Toolparts besteht.
Dann müssen wir nur noch die ToolPart1 Klasse erstellen.

This code will add the ToolPart1 class to the existing array, that already contains the default toolparts.
Then we need to create the ToolPart1 class.


public class ToolPart1 : Microsoft.SharePoint.WebPartPages.ToolPart
{
public ToolPart1()
{
}

private RadioButtonList myRadioButtons = new RadioButtonList();

//Override the method to create the existing controls and then add your control
protected override void CreateChildControls()
{
base.CreateChildControls();
myRadioButtons.ID = "myRadioButtons";
myRadioButtons.Items.Add("Item 1");
myRadioButtons.Items.Add("Item 2");
myRadioButtons.Items.Add("Item 3");
myRadioButtons.Items.Add("Item 4");
this.Controls.Add(myRadioButtons);
}

//This method happens, when someone will click "OK" or "Apply" and the value will be added to the webpart class-property
public override void ApplyChanges()
{
base.ApplyChanges();
VisualWebPart1 parentWebPart = (VisualWebPart1)this.ParentToolPane.SelectedWebPart;
if (!string.IsNullOrEmpty(myRadioButtons.SelectedItem.Value))
parentWebPart.MyCustomProperty = myRadioButtons.SelectedItem.Value;
}
}


Das war alles. Man kann den Code anpassen und abändern und so ziemlich jedes Control selbst einfügen. Auch Telerikcontrols können hier verwendet werden.

This is it. You can edit or extend this code and insert almost any control. You can also add Telerik controls.

Mittwoch, 21. Juli 2010

Create custom timer-job - einen benutzerdefinierten Time-Job in Sharepoint 2010 erstellen

Um einen benutzerdefinierten TimerJob zu erstellen, einfach ein neues Visual Webpart Projekt im Visual Studio 2010 erstellen.
Dort braucht es dann nur eine Klassendatei, welche den Job definiert, so dass die Struktur wie folgt aussieht:

To create a custom timer-job, you just create a new Visual Webpart project in Visual Studio 2010.
There you just need one class-file, that defines the job, so the structure will look like this:
sharepoint project

Grossansicht anzeigen - Show large image


Was man noch benötigt ist den Feature.EventReceiver. Diesen erstellt man, in dem man auf die .feature Datei rechts klickt und
dort, wie in der Grafik unten, Add EventReceiver anklickt. Diese Datei enthält Code, welcher den Job initialisieren wird und
in diversen state-levels Code ausführen kann.

What you need then is an event-receiver. You can create on, in right clicking on the .feature file, like shown in the image,
and click on "Add EventReceiver". This file contains code, that will initialize the job and you can add code to different state-levels
to run code.
sharepoint project

Grossansicht anzeigen - Show large image


When das Projekt deployed wurde, kann man unter Site Settings -> Site collection features den Job aktivieren.

When you deployed the project, you can activate the job under site-settings -> site collection features.
sharepoint project

Grossansicht anzeigen - Show large image


Sobald dieser aktiviert ist, muss er unter Central Administration -> Monitoring -> Check job status -> Job Defenitions sichtbar sein.
(Seite hat meist mehrere Seiten)

As soon as the job is activated, it is supposed to be visible under central administration -> monitoring -> check job-status -> job-defenitions.
(Page usually has more pages)

In der linken Navigation befinden sich Punkte, welche man durchklicken kann und sieht, ob und wann der Job gelaufen ist, oder
laufen wird.

The left-hand side navigation has topics, that you can click through. There you can see if and when a job is run or will be run.
sharepoint project

Grossansicht anzeigen - Show large image


In die EventReceiver Datei kommt in die Methode FeatureActivated folgender Code zum initialisieren des Jobs:
Into the EventReceiver file, into the FeatureActivated method, you can add the following code to initialize the job:

SPSite spSite = (SPSite)properties.Feature.Parent;

SPWebApplication webApp = spSite.WebApplication;
//SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

if (webApp == null)
throw new SPException("Error obtaining reference to Web application.");

// Ensure the job is not already registered.
foreach (SPJobDefinition job in webApp.JobDefinitions)
{
if (job.Name == JOB_NAME)
{
job.Delete();
}
}

// Install job.
MyCustomTimerJob customTimerJob = new MyCustomTimerJob(webApp);
// Schedule the job to run every 5 minute all the time.
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 5;
customTimerJob.Schedule = schedule;
// Save changes.
customTimerJob.Update();


In die FeatureDeactivating Methode kommt dieser Code:
Into the FeatureDeactivating method you can add this code:

SPSite spSite = (SPSite)properties.Feature.Parent;

SPWebApplication webApp = spSite.WebApplication;
foreach (SPJobDefinition job in webApp.JobDefinitions)
if (job.Name == JOB_NAME) job.Delete();


In die MyCustomTimerJob.cs Datei wird folgender Code eingefügt:
Insert the following code into the MyCustomTimerJob.cs file:

public class MyCustomTimerJob : SPJobDefinition
{
private static const string JOB_NAME = "MyCustomTimerJob";
public MyCustomTimerJob() : base() { }
public MyCustomTimerJob(SPWebApplication webApp)
: base(JOB_NAME, webApp, null, SPJobLockType.Job)
{
Title = JOB_NAME;
}

public override void Execute(Guid targetInstanceId)
{
//Code here, what the timer job is supposed to do
}
}


TIP:
Versuchen Sie in der Execute Methode eine Assembly oder ein Objekt aufzurufen, Hier nicht unbedingt den ausführenden Code einfügen.
Try to call just some assemblies and objects from the Execute method. Don't put the execution code directly in there.

Donnerstag, 8. Juli 2010

Custom Timer Job - Access denied when activating

Sie haben einen Custom-Timer-Job erstellt und wollen diesen jetzt aktivieren, bekommen aber eine "Access denied" Fehlermeldung. Dann loggen Sie sich bitte einmal in den Sharepoint bzw. die Site Collection Administration mit dem Account ein, welcher auch die Application Pools verwaltet. So hat es bei mir funktioniert.
FBA kann zu Fehlern führen, man sollte es mit Windows Authentifizierung probieren. Ebenso kann es sein, dass wenn der Application Pool Ping Enable false hat, dass dies ein Fehler sein kann.

You have created a custom-timer-job and you want to activate it now, but receive the "access denied" error-message. Then login into Sharepoint, the Site Collection Administration, with the account that you are using to run the application-pools with. This worked for me.
FBA can also create this error, you are supposed to login with Windows authentication. In addition, it can be that ping enable = false in the application-pool settings, executes this error message.

Error occurred in deployment step recycle IIS Application Pool provider load failure

Wenn Sie in Visual Studio 2010 ein Projekt deployen wollen und dies an der oben genannten Fehlermeldung scheitert, dann einfach unter Windows Services -> den Sharepoint 2010 Administration Service neu starten. Ich hatte dieses Problem, nachdem ich in der Domäne mein Passwort ändern musste. Ich vermute einmal, dass evtl. das alte Password hängen blieb und dadurch meine Rechte für den Zugriff auf den Application Pool Recycle nicht gewährleistet waren.

If you want to deploy a project in Visual Studio 2010 and you get the error mentioned above in the headline, then just go to the windows services -> choose the Sharepoint 2010 Administration Service and restart this one. I had this problem after having to change my password in the domain. I asume it could be, that the old password was still stuck somewhere and I had not the permission to recycle the app-pool.

Mittwoch, 7. Juli 2010

Create a custom field-type - ein benutzerdefiniertes Field-type erstellen

Wie man ein benutzerdefinierten FieldType erstellt.
Es kommt vor, dass man beim Erstellen einer Spalte in einer Liste gerne einen FieldType hätte, der benutzerdefiniert ist, weil man vielleicht Daten separat speichern will oder eine Interaktion durchführen. Hierzu kann man einen Feldtyp benutzerdefinieren.
Als erstes ein leeres Sharepointprojekt in Visual Studio 2010 erstellen. Dann die folgenden Punkte durchgehen:

How to create a custom field-type.
Sometimes you might want to use a field-type when creating a new column in a list. This can be useful, when wanting to save data in a different place or interact with the data inserted. Therefore you can create a custom field-type.
First create an empty Sharepoint-project in Visual Studio 2010 and then follow this instruction:

1. Mappen Sie folgende Sharepoint Ordner, indem man das Projekt mit rechter Maustaste -> Hinzufügen -> Sharepointverzeichnis mappen anklickt.
Map the following sharepoint-directories, in clicking the project with the right mouse-key -> Add -> Sharepoint Mapped Folder
map the sharepoint folders

Grossansicht anzeigen - Show large image


2. Bitte folgende Verezichnisse mappen: Template\Controltemplates, Template\XML, Template\Layouts\XSL
Please map the following folders: : Template\Controltemplates, Template\XML, Template\Layouts\XSL

3. Fügen Sie Ihrem Projekt 3 Klassendateien hinzu: [Ihr Name].Field.cs, [Ihr Name].FieldControl.cs, [Ihr Name].ValidationRule.cs
Then add three class-files to your project: [Your name].Field.cs, [Your name].FieldControl.cs, [Your name].ValidationRule.cs

!!Hinweis: [Ihre Name].FieldControl.cs wird die Codebehinddatei Ihres Usercontrols!!
!!Hint: [Your name].FieldControl.cs will be the code-behind file of your user-control!!

4. Fügen Sie den mapped Verzeichnissen folgende Dateien hinzu, so dass zum Schluss Ihr Projekt wie folgt aussieht: [Ihr Name]FieldControl.ascx (CONTROLTEMPLATES), fldtypes_[Ihr Name].xml (XML), fldtypes_[Ihr Name].xsl (XSL)
Add the following files to your mapped folders, so your project will look like this: [Your name]FieldControl.ascx (CONTROLTEMPLATES), fldtypes_[Your name].xml (XML), fldtypes_[Your name].xsl (XSL)
sharepoint project

Grossansicht anzeigen - Show large image


5. Fügen Sie die Referenzen hinzu, welche in der Grafik angezeigt werden.
Add the references shown in the image.
references

Grossansicht anzeigen - Show large image



Verantwortlichkeiten:
Responsibilities:
- Wenn man Neu, Bearbeiten oder Anzeigen eines Listitems anklickt, erscheint ein Fenster. Zuständig für diese Anzeige ist die ascx Datei.
When clicking new, edit or display of a list-item, then a window opens. Responsible for the display style is the ascx file.
- Wie der Item in der Liste angezeigt wird, das regelt die xsl Datei.
How the item will be displayed in the list, that is handled through the xsl file.
- Die Eigenschaften, sowie die Bezeichnung links, neben dem ascx Inhalt, wird in der xml Datei bearbeitet.
The properties, and the name on the left side, next to the ascx content, will be defined in the xml file.
Hier eine Grafik zu der Erklärung:
Here you see an image to the explanation:
Overview diagram

Grossansicht anzeigen - Show large image



5. In der ascx Datei definieren Sie über die Rendering Templates die Darstellung in den verschiedenen Modi.
In the ascx file you define through the rendering-templates the different display variations in the different modes.
Ascx file

Grossansicht anzeigen - Show large image


6. Die folgenden Grafiken zeigen die Formatierung der XML und XSL Datei.
The following images show you the format of the xml and xsl file.
XML and XSL file

Grossansicht anzeigen - Show large image

XML and XSL file

Grossansicht anzeigen - Show large image


Hier ein Beispiel Code für die [Ihr Name].Field.cs.
Here is a sample code for the [Your name].Field.cs.

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;

using System.Windows.Controls;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Security.Permissions;

namespace [Your namespace]
{
public class MyCustomField : SPField
{
//You have to use those constructors. Leave them like they are or extend with custom code if you need to.
public MyCustomField(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}

public MyCustomField(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}

//This method will call and start render the control. You can keep it this way.
public override BaseFieldControl FieldRenderingControl
{
[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
get
{
//In case your control does have a different name, initialize it here
BaseFieldControl fieldControl = new MyCustomFieldControl();
fieldControl.FieldName = this.InternalName;
return fieldControl;
}
}

//This method validates the value. The validation-class will be initialized (MyCustomFieldValidationRule)
//That means you can leave everything, like it is, just be sure your correct validation-class is called
public override string GetValidatedString(object value)
{
if ((this.Required == true)
&&
((value == null)
||
((String)value == "")))
{
throw new SPFieldValidationException(this.Title
+ " must have a value.");
}
else
{
//Your custom validation class is supposed to be called here
MyCustomFieldValidationRule rule = new MyCustomFieldValidationRule();
ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);

if (!result.IsValid)
{
throw new SPFieldValidationException((String)result.ErrorContent);
}
else
{
return base.GetValidatedString(value);
}
}
}
}
}



Hier ein Beispiel Code für die [Ihr Name].FieldControl.cs.
Here is a sample code for the [Your name].FieldControl.cs.

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace [Your namespace]
{
public class MyCustomFieldControl : BaseFieldControl
{
protected global::System.Web.UI.WebControls.Label AdditionalInfoNew;
protected global::System.Web.UI.WebControls.TextBox TextFieldNew;
protected global::System.Web.UI.WebControls.Label AdditionalInfoEdit;
protected global::System.Web.UI.WebControls.TextBox TextFieldEdit;
protected global::System.Web.UI.WebControls.Label AdditionalInfoDisplay;
protected global::System.Web.UI.WebControls.Label DisplayText;

//This method initializes the correct rendering-template, depending on the mode.
protected override string DefaultTemplateName
{
get
{
if (this.ControlMode == SPControlMode.Display)
{
//This template will be called, if the mode is display
return this.DisplayTemplateName;
}
else if (this.ControlMode == SPControlMode.Edit)
{
//This template will be called, if the mode is edit
return "RenderingTemplateEdit";
}
else
{
//This template will be called, if the mode is new or invalid, you can also set one for each
return "RenderingTemplateNew";
}
}
}

//You need to override this template-name, otherwise there seems to be a default one and your web-controls won't be recognized in the
//CreateChildControls method and it will throw an exception. Tell explicit, which renderingtemplate to use for display.
public override string DisplayTemplateName
{
get
{
return "RenderingTemplateDisplay";
}
set
{
base.DisplayTemplateName = value;
}
}

//This method creates the child-controls and runs some major code.
protected override void CreateChildControls()
{
if (this.Field != null)
{
//Make sure inherited child controls are completely rendered.
base.CreateChildControls();

//Associate child controls in the .ascx file with the
//fields allocated by this control.
this.AdditionalInfoNew = (Label)TemplateContainer.FindControl("AdditionalInfoNew");
this.TextFieldNew = (TextBox)TemplateContainer.FindControl("TextFieldNew");
this.AdditionalInfoEdit = (Label)TemplateContainer.FindControl("AdditionalInfoEdit");
this.TextFieldEdit = (TextBox)TemplateContainer.FindControl("TextFieldEdit");
this.AdditionalInfoDisplay = (Label)TemplateContainer.FindControl("AdditionalInfoDisplay");
this.DisplayText = (Label)TemplateContainer.FindControl("DisplayText");

//This code runs if not display mode
if (this.ControlMode != SPControlMode.Display)
{
if (!this.Page.IsPostBack)
{
if (this.ControlMode == SPControlMode.New)
{
//The method 'GetCustomProperty' gets the value set, that depends on the property-schema field in the xml.
this.TextFieldNew.Text = (String)base.Field.GetCustomProperty("MyPropertyintheXML");
this.AdditionalInfoNew.Text = "You are in 'new' mode: ";
//!!!Take care to use the correct controls, otherwise there won't be anything visible!!!!!!
}

else if (this.ControlMode == SPControlMode.Edit)
{
//The method 'GetCustomProperty' gets the value set, that depends on the property-schema field in the xml.
this.TextFieldEdit.Text = (String)base.Field.GetCustomProperty("MyPropertyintheXML");
this.AdditionalInfoEdit.Text = "You are in 'edit' mode: ";
//!!!Take care to use the correct controls, otherwise there won't be anything visible!!!!!!
}
}

}
else
{
//Assign current value from database to the label control
if (!string.IsNullOrEmpty(this.ItemFieldValue.ToString()))
DisplayText.Text = (String)this.ItemFieldValue;
this.AdditionalInfoDisplay.Text = "You are in 'display' mode: ";
//!!!Take care to use the correct controls, otherwise there won't be anything visible!!!!!!
//!!!Exception? web-controls are not recognized? then check if the property is overriden: DisplayTemplateName !!!!!!
}
}
}

//The value object is the final value that will be stored in the list-column.
public override object Value
{
get
{
EnsureChildControls();
//Here you return the value, that finally will be written into the column value.
//Start custom code ************************************************************************

//End custom code **************************************************************************
return "[This is the column value]";
}
}

//The UpdateFieldValueInItem method stores the value in the database and runs code, that needs to be done before doing the update and finalizing the insert.
public override void UpdateFieldValueInItem()
{
Page.Validate();
if (Page.IsValid)
{
//Code that is supposed to be executed before everything is stored and the update is done.
//Start custom code ************************************************************************

//End custom code **************************************************************************
base.UpdateFieldValueInItem();
}
else
{
//Code that is supposed to be executed in case the page is not valid and the update failed.
}
}
}
}



Hier ein Beispiel Code für die [Ihr Name].ValidationRule.cs.
Here is a sample code for the [Your name].ValidationRule.cs.

namespace [Your namespace]
{
public class MyCustomFieldValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
//The overloaded value is the one you have to validate against.
//Start custom code ************************************************************************

//End custom code **************************************************************************
//Your custom code needs to return a ValidationResult like the one below. Set either true or false and an error-message
//in your code to return, depending on your validation.
return new ValidationResult(true, "Everything is OK.");
}
}
}

Montag, 14. Juni 2010

No User Profile Application Available - Error

In dem Fall sind die Berechtigungen nicht korrekt gesetzt. Unter Central Administration -> Manage Service Applications -> die Service Applikation auswählen, welche in einem Webpart auf der besagten Errorseite läuft. In meinem Fall war das BDC. Dann nicht die Service Applikation direkt anwählen sondern diese auswählen. Das macht man, indem man neben den Link klickt. Daraufhin aktiviert sich der Ribbon.
Dort unter Administrator und Permissions prüfen, ob alles korrekt gesetzt ist und der Account, welcher auf den BDC zugreift genug berechtigt ist.

In this case the permissions are not set correctly. Check under Unter Central Administration -> Manage Service Applications -> choose the service-application you use in the webpart where this error happens. In my case it was BDC. Then don't open the service-application, but choose it in clicking next to the link. After that, the ribbon activates. You wil find the button administrator and permissions, check there if everything is set correctly and if the account, using the BDC has enough permissions to do so.

Dienstag, 1. Juni 2010

XSLT auf eine Liste, using xslt to display a list

Ich hatte ein paar Stunden damit verschwendet, dass ich mir eine Liste nach eigenen XSLT Angaben darstellen lassen wollte. Hierzu hatte ich ein XSL File erstellt, dieses dann in den Webpart Eigenschaften verlinkt, dennoch wurde nichts angezeigt. Gründe hierfür waren:
1. Man sollte nach jeder XSLT Änderung einen IISRestart tätigen.
2. Vorsicht bei der View, welche man verwendet. Am besten eine eigene View anlegen, diese auswählen. Bei jeder Änderung an der View, wird die Verknüpfung des Webparts mit der View gelöscht, also anschliessend immer wieder neu referenzieren.

I wasted some hours wanting to display a list depending on my own XSLT settings. Therefore I created a XSL file, linked to it in the webpart-properties, but nothing was shown. Reasons therefore were:
1. You are supposed to perform after each XSLT change an iisrestart.
2. Take care with views you use. I would prefer to create an own view and pick it in the webpart-properties. Be aware, that with each change to the view, you need to link to it again in the properties, because the reference to the view will be reset to default view.

Error when trying to write to a Sharepoint group

Error:
The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation again.<nativehr>[xy]</nativehr><nativestack></nativestack>


Wenn man in eine Gruppe schreibt, dies auch mit "RunWithElevatedPriviliges" macht und dennoch so einen Fehler wie oben erhält, dann liegt es an einer Zeile Code, welche vergessen wurde:

spWeb.AllowUnsafeUpdates = true;

When you try to write to a group or list and you also perform this with "RunWithElevatedPriviliges" and still get the error mentioned above, then you should add this line of code to yours:

spWeb.AllowUnsafeUpdates = true;

Freitag, 14. Mai 2010

Search core results XSLT Sharepoint

Das Webpart search core results ist ziemlich eindrucksvoll, vor allem, da man wirklich einfach Resultate anzeigen kann. Wenn man gerne die Total Results zeigen will, kann man im XSLT folgende Variable eingeben und verwenden:
<xsl:variable name="Rows" select="/All_Results/Result" />
<xsl:variable name="RowCount" select="count($Rows)" />
<xsl:value-of select="$RowCount" />


Anbei noch eine Darstellung des Search Result XML:
<All_Results>
<Result>
<id>1</id>
<rank>713</rank>
<title>Microsoft.SharePoint Namespace</title>
<author />
<size>39058</size>
<url>http://msdn.microsoft.com/library/default.asp?url=/library/en- us/spptsdk/html/tsnsMicrosoftSharePoint_SV01017995.asp</url>
<description>Microsoft.SharePoint Namespace</description>
<sitename> http://msdn.microsoft.com/library</sitename>
<collapsingstatus>0</collapsingstatus>
<hithighlightedsummary>
<…>
</hithighlightedsummary>
<hithighlightedproperties>
<…>
</hithighlightedproperties>
<…>
</Result>
<Result>
<…>
<…>
</Result>
</All_Results>


The webpart called search core results is very impressive, especially, when you want to display results simply. If you want to display the total results, then you can use this code in your XSLT file:
<xsl:variable name="Rows" select="/All_Results/Result" />
<xsl:variable name="RowCount" select="count($Rows)" />
<xsl:value-of select="$RowCount" />


Here is the structure of the search-result XML:
<All_Results>
<Result>
<id>1</id>
<rank>713</rank>
<title>Microsoft.SharePoint Namespace</title>
<author />
<size>39058</size>
<url>http://msdn.microsoft.com/library/default.asp?url=/library/en- us/spptsdk/html/tsnsMicrosoftSharePoint_SV01017995.asp</url>
<description>Microsoft.SharePoint Namespace</description>
<sitename> http://msdn.microsoft.com/library</sitename>
<collapsingstatus>0</collapsingstatus>
<hithighlightedsummary>
<…>
</hithighlightedsummary>
<hithighlightedproperties>
<…>
</hithighlightedproperties>
<…>
</Result>
<Result>
<…>
<…>
</Result>
</All_Results>

Mittwoch, 12. Mai 2010

Webpart - default ohne Chrome.

Wer sein Webpart deployen will und beim Insert in die Seite dann gerne den Chrome Defaultwert "none", also ohne Chrome hätte, muss in die vom Webpart geerbte Klasse folgende Methode anfügen:
PartChromeType chromeType = PartChromeType.None;
public override PartChromeType ChromeType
{
get
{
return chromeType;
}
set
{
chromeType = value;
base.ChromeType = value;
}
}


Who wants to deploy his webpart and have the chrome set default to "none", needs to insert a method into his webpart inherited class:
PartChromeType chromeType = PartChromeType.None;
public override PartChromeType ChromeType
{
get
{
return chromeType;
}
set
{
chromeType = value;
base.ChromeType = value;
}
}

Access denied by Business Data Connectivity

Diese Fehlermeldung in Sharepoint 2010 im Bereich External Lists BDC bedeutet, dass die Berechtigungen nicht richtig gesetzt sind. Eine gute Erklärung gibt es hier. Nicht vergessen bei den Usern den "Add" Button zu betätigen umd diese User auch in das unten liegende Textfeld zu übernehmen.
http://blog.libinuko.com/2010/04/11/sharepoint-2010-howto-configure-business-data-connectivity-access-rights/

This error-message in Sharepoint 2010, when working with external-lists, means, that the permissions are not set correctly. A good description gives you the following website. Don't forget to use the "Add" button, when having some user chosen, so the user are applied to the text-box below.
http://blog.libinuko.com/2010/04/11/sharepoint-2010-howto-configure-business-data-connectivity-access-rights/

Visual Studio 2010 BDC - Add Solution Deployment crashed

Wenn man ein BDC Projekt in Visual Studio 2010 erstellt, dieses deployen will und folgende Fehlermeldung erhält:
The BDC Service application Business Data Connectivity Service is not accessible. The full exception text is: The HTTP service located at xy.svc/http is too busy.
Dann einfach den Application Pool mit einem guidähnlichen Namen neu starten. Ist auch einer der Application Pools, welcher vom Serviceaccount-Nutzer verwaltet wird. Wenn man nicht weiss, welcher genau, dann sollte man alle nochmals starten.

When trying to deploy a BDC project in Visual Studio 2010 and you receive the following error-message:
The BDC Service application Business Data Connectivity Service is not accessible. The full exception text is: The HTTP service located at xy.svc/http is too busy.
Then you should restart the application-pool with the guid-stlye name. Is supposed to be one of the app-pools, that is administered by a service-account-user. If you are not sure, which one, you can also restart all of them.

Dienstag, 11. Mai 2010

Sharepoint 2010 sign in - The operation has timed out

Heute morgen hatte ich das Problem, dass ich eine Sharepoint 2010 Page öffnen konnte, aber dann beim Sign in die Fehlermeldung - The operation has timed out - erhalten habe. Man konnte weder über Windows Auth noch über FBA einloggen. Event-viewer gab folgende Fehlermeldung aus:
Source: SharePoint Foundation
Event ID: 8306
Level: Error
Task Category: Claims Authentication
Ein simpler Neustart des SecurityTokenServiceApplicationPool - Application-pools hat gereicht, dass es wieder läuft.

This morning I had the problem, that I could open a Sharepoint 2010 page, but when trying to sign in, I received the error - The operation has timed out. I was unable to login neither Windows nor FB-authentication. In the event-viewer, I had the following error information:
Source: SharePoint Foundation
Event ID: 8306
Level: Error
Task Category: Claims Authentication
A simple restart of the SecurityTokenServiceApplicationPool - application-pool was enough to make it working again.

Montag, 10. Mai 2010

Error occurred in deployment step 'Recycle IIS Application Pool': 0x80070005Access deniied

In dem Fall reicht es bei Sharepoint nicht aus, dass man Farmadmin und Siteadmin ist, man muss auch Owner sein, damit man über Visual Studio 2010 das Deployment ausführen kann. Überprüfe die Berechtigungen.

In this case it is not enough in Sharepoint to be farm-admin and site-admin. You need to be owner, to be able to deploy out of Visual Studio 2010. Check your permissions.

Donnerstag, 6. Mai 2010

The request failed with HTTP status 405: Method not allowed - Webservice

Ich hatte vor ein paar Tagen einen Webservice in mein Projekt integriert. Dabei von einem Drittanbieter den Webservice als Webreference eingetragen, dazu die wsdl Adresse verwendet. Jedoch kam beim Testen einiger Methoden immer folgender Fehler: " The request failed with HTTP status 405: Method not allowed ". Im Internet habe ich nicht viel gefunden, ausser, dass man Einstellungen an der machine.config vornehmen sollte. Die Lösung war dann doch trivialer. Ich habe die wsdl Adresse im Browser aufgerufen. Dort im unteren Bereich die zuständige asmx Adresse gefunden. Die Url der Webservice Referenz überschrieben mit der asmx Url und schon hat es funktioniert. Resultat, wsdl ruft das Schema auf, asmx führt die Methode aus.
- überschreiben der Url heisst, die Klasse, welche ich aufgerufen habe über den Webservice, hatte eine Property mit Url, dort die asmx Adresse eingegeben und anschliessend den Request ausgeführt -
!Immer aufpassen ob es sich um http oder https handelt!

A few days ago, I integrated a third party web-service into my project. Therefore I created a web-reference and added the wsdl address of the web-service. When testing some calls to the methods of this service, I received the following error: " The request failed with HTTP status 405: Method not allowed ". On the internet I just found articles about changes in the machine.config. The solution was more trivial. I looked at the wsdl address in the browser and in the bottom part I found the asmx address for the web-service. I overwrote the property of the web-service reference and it worked. Result, wsdl calls the schema and asmx performs the methods.
- overwriting of the url means, that the class I called through the web-service, had a property called Url, and there I passed the asmx address und after that I performed the request -
!Always check if it is a http or https address!

Montag, 3. Mai 2010

Webservice certificate invalid

Ich hatte folgendes Problem. Beim Aufrufen eines Webservice, bekam ich folgenden Error:
The remote certificate is invalid according to the validation procedure
Dieser besagt, dass das Zertifikat, welches benutzt wird anscheinend nicht gültig ist. Damit man diesen Fehler ignorieren kann, vor dem Aufruf und der Arbeit mit dem Webservice folgenden Code einfügen:
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

// add this to your code before you make your web service call.
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslError)
{
bool validationResult = true;
return validationResult;
};


I had the following problem. When calling a webservice I received this error:
The remote certificate is invalid according to the validation procedure
This error means, that the certificate of the requested page is not valid. To ignore this error, you have to add the following code, before working and calling with the webservice:
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

// add this to your code before you make your web service call.
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslError)
{
bool validationResult = true;
return validationResult;
};

Donnerstag, 29. April 2010

Sharepoint 2010 File Share Search does not work

Das Einrichten einer Verzeichnis Suche ist teilweise mit ein paar Hindernissen verbunden. Folgendes sollte beachtet werden, damit es funktioniert:
1. Zuerst auf dem Server ein Verzeichnis erstellen.
2. Anschliessend dort als Share und Security den User mit Read Permission ausstatten, welcher auch im Sharepoint die nötigen Berechtigungen hat.
3. Anschliessend durch mappen des Verzeichnisses mit dem gewählten User testen, ob man direkt Zugriff hat. Wenn nicht, dann stimmen die Berechtigungen nicht.
4. Sollte alles funktionieren, dann diese Server-adresse, welche man zum Mappen benutzt hat in den Crawler in Sharepoint eingeben.

Setting um the file-share-search does have some obsticles sometimes. You should consider the following steps, to make it work:
1. Create a directory on the server.
2. Then set the user (is supposed to be your SP user) you want to have access to as a share and give him in the security tab the read-permissions.
3. Try to map the directory with the user credentials that your Sharepoint would use. If the mapping works, then sharepoint should be able to get to this directory as well. If it did not work, your permissions are not set correctly.
4. Enter the address you used for mapping into the crawler in Sharepoint.

Sharepoint 2010 Crawler

Wenn man beim Einrichten eines Crawlers den Eindruck hat, dass er nicht die komplette Webseite gecrawled hat, dann liegt das vielleicht daran, dass man die Crawl Rule für "Crawl complex URLs (URLs that contain a question mark - ?)" vergessen hat. Hierzu einfach neue Crawl Rule erstellen und als Pfad http://* eingeben. Somit werden auch URLs mit einem Fragezeichen gecrawled.

While setting up a crawler, if you have the impression, that not the complete website has been crawled, then the reason might be, that you have forgotten to set the crawl-rule for "Crawl complex URLs (URLs that contain a question mark - ?)". There for setup a new crawl rule and use the path http://*. Now also URLs with a question mark will be crawled.

Mittwoch, 28. April 2010

Probleme beim local-sites search in Sharepoint - Issues with local-sites search

Wenn es Probleme beim Crawlen der local-site gibt. Folgendes hat mir geholfen.

If you are experiencing problems with the local-site search. This one helped me.

http://svengillis.blogspot.com/2008/10/access-denied-when-crawling-moss.html

Meine Fehlermeldung im crawling-log war/my error in the crawling-log was:
Access is denied. Verify that either the Default Content Access Account has access to this repository, or add a crawl rule to crawl this repository. If the repository being crawled is a SharePoint repository, verify that the account you are using has "Full Read" permissions on the SharePoint Web Application being crawled. (The item was deleted because it was either not found or the crawler was denied access to it.)

Can't deploy feature - Feature kann nicht deployed werden

Man muss beim deployen aufpassen. In SP 2010 muss man Siteowner sein, wenn man Features deployen will. Siteadmin reicht da nicht aus.

You have to take care when deploying. In SP 2010 you need to be site-owner, when you want to deploy features. Site-admin is not enough.

Mittwoch, 21. April 2010

Domänenwechsel Sharepoint - switch domain in Sharepoint

Wenn man einen Domänenwechsel einer Sharepointinstanz vornehmen will, dann muss man den Sharepoint neu installieren, da der Service-Account häufig nicht genug Rechte hat um die nötigen Services zu starten.
Backup DB, deinstallieren des Sharepoint, Neuinstallation DB wieder anhängen.

When you want to switch the domain of your sharepoint instance, then you will have to reinstall Sharepoint, because usually the service-account does not have the necessary rights to start certain services.
Backup the db, deinstall sharepoint, re-install and hook up with the db.

Montag, 19. April 2010

ERROR: The request failed with an empty response - Webservice

Ich habe einen fremden Webservice in mein .NET Projekt integriert. Anschliessend bei dem Response folgenden Fehler erhalten:
ERROR: The request failed with an empty response
Grund hierfür war, dass der Webservice eine falsche Url, besser gesagt keine SSL Verbindung hatte. Somit einfach die Url Eigenschaft meines Webservice Objektes überschrieben und auf die selbe Url gesetzt wie der Webservice und schon hat es funktioniert.
myWebServiceObject.Url = "https://...";

I used a foreign web-service in my .NET Projekt. When handling the response, I got this error-message:
ERROR: The request failed with an empty response
Reason for that was, that the web-service dealed with a wrong URL, in detail, it did not use a SSL connection. Therefore I just overwrote the property of my web-service object and it worked.
myWebServiceObject.Url = "https://...";

Dienstag, 13. April 2010

Cannot save URL for int.js

Nicht alle Sprachvarianten scheinen in der Sharepointinstallation installiert zu sein.

It seems, that there are not all language-packs installed in your current sharepoint-install.

Montag, 12. April 2010

cannot start service SPUserCodeV4

Wenn beim Deployment für Sharepoint 2010 folgender Fehler erscheint: cannot start service SPUserCodeV4, dann muss in den Windows Services der Sharepoint 2010 User Code Host gestartet sein, damit ein Deployment funktioniert.

If you get an error like this: cannot start service SPUserCodeV4, while deploying for Sharepoint 2010, then you need to start the Windows service called Sharepoint 2010 User Code Host. Afterwards the deployment should work.

Mittwoch, 7. April 2010

Sharepoint config file SolutionId

Was genau ist eigentlich bei einer Sharepoint Solutions die Id? Es ist nicht die Guid, welche in der AssemblyInfo.cs steht. Erstelle ein Package und dann gehe in folgendes Verzeichnis: pkg/Debug/[Dein Solutionname]/manifest.xml. Öffne die Datei und Du siehst oben die SolutionId.

What exactly is the solution-id in a Sharepoint solution? It is not the guid that is found in the AssemblyInfo.cs file. Build a package and then go to this folder of your solution: pkg/Debug/[your solution-name]/manifest.xml. Open this file and on top you find the solution-id.

Setup Tool Sharepoint 2010 Error: SharePoint Server 2010 is not installed

Wenn man seine Controls/Features mit dem Setup Tool installiert, dort dann bei der Installation den oben genannten Error erhält, dann liegt das daran, dass im setup.exe.config File ein Eintrag nachgebessert werden muss. Es steht vermutlich drin, muss aber von Server auf Foundation geändert werden, also so aussehen: . Installation nochmals starten und es müsste funktionieren.

If you are installing your controls/features with the Sharepoint setup tool, then it can happen that you receive the above mentioned error. The error is caused, because the setup.exe.config has a false entry. It seem you have the following node in your config file . You need to change that from server to foundation, that means your node has to look like that: . Restart your installation and it should work.

Mittwoch, 31. März 2010

Sharepoint Items.Count, Count

Folgenden Fehler hatten wir heute bei der Programmierung eines Jobs, welcher vom Sharepoint Timer Dienst ausgelöst wird. Es wurde gegen Sharepoint programmiert, dabei eine Liste ausgelesen. Der Rückgabewert hatte im Debugmodus items = 2 und items.Count = null oder 0. D.h. eigentlich hat er über die Query etwas gefunden, man kann aber nicht iterieren, da nichts angezeigt wird. Folgender Fehler steckt hinter diesem Zustand. PERMISSIONS! In dem obigen Fall hatte der User nicht genügend Berechtigungen und da nützt es nichts den Code mit RunWithElevatedPrivilages laufen zu lassen. In die Liste gehen, dort dem User die nötigen Berechtigungen geben und es läuft. Sharepoint nutzt den System Account wenn mit dem Timer Dienst operiert wird. D.h. man sollte diesem "Nutzer" die korrekten Berechtigungen auf die Liste geben. Normalerweise würde man erwarten, dass man keinen Rückgabewert erhält, wenn Berechtigungen fehlen, aber es scheint, dass es immer einen Rückgabewert gibt, nur einmal ist er nicht aufrufbar.

The following error showed up today, while working on developing a job, that was supposed to be called from the Sharepoint Timer service. We developed against Sharepoint, in reading out a list. The return value of the code in the debug mode was items = 2, items.count = null oder 0. That means that the query worked and it found something, but you could not iterate through the result. Following error was the reason. PERMISSIONS! In our case the user did not have the correct permissions and to RunWithEvelatedPrivilages does not help either. You need to go to the list and give the user the correct permissions. You should be aware that a system account is used to run the Timer service. That means give the user the right permissions on the list. Usually you would expect, that it does not return any value, when you don't have the right permissions, but it seems, there is always a return value. When having not the correct permissions you can't access it.

Freitag, 19. März 2010

Guid im webpart

In einem Webpart muss man eine Guid angeben, jedoch, welche soll das sein. Hierzu einfach die Applikation erstellen und versuchen zu veröffentlichen und schon zeigt einem die Fehlermeldung den Guid an, welchen man verwenden sollte.

When creating a new webpart you are supposed to insert a guid into some files. But which one should you insert? Therefore just build and deploy your webpart and the error message will display a guid, that you should use.

Cannot import webpart

Bin gerade an meinen ersten Versuchen mit Sharepoint 2010. Eine neue Instanz und eigene Sitecollections erstellt. Um sich mit den Listen vertraut zu machen wollte ich ein Visual Webpart erstellen und dort ein wenig probieren. Doch das erstellen eines Webparts mit Visual Studio 2010 RC und dem Deployment auf Sharepoint 2010 war nicht so einfach wie ich dachte. Zwar ist das Deployment generel einfacher wie Sharepoint 2007, jedoch gibt es noch ein paar kleine "Bugs". Ein Fehler, welcher mich Stunden gekostet hat war "Cannot import webpart". In einem Blog habe ich ein Vorgehen entdeckt, wie man herausfinden kann, was an einem Webpart fehlerhaft ist, da die Exceptions in Sharepoint nicht gerade aussagekräftig ist.
1. Site actions -> Site settings -> Galleries -> Webparts
Dort muss das Webpart enthalten sein, ist es das nicht, besteht bereits der
Fehler beim Deployment.
2. Wenn man in der Gallery das Webpart direkt anklickt, müsste es sichtbar sein.
Jetzt kann es sein, dass bei Punkt 2 schon eine Fehlermeldung erscheint. Bei mir hat VS 2010 einfach Probleme mit der Versionierung. Hierzu folgendes beachten:
- Feature1.Template.xml, hier muss die Version und Guid die gleiche sein wie in
der AssemblyInfo.cs (.vb)
- [Name].webpart. In dieser Datei befindet sich unter type ein Placeholder,
welcher von VS generiert wird. Am besten diesen ersetzen durch statische
Werte (bei mir wurde hier immer die falsche Version generiert).
$SharePoint.Project.AssemblyFullName$ ersetzen durch ->
[Assemblyname], Version=[meine aktuelle Version], Culture=neutral
When Feature, Webpart und AssemblyInfo Datei die gleiche Version und Id haben, dann einfach Deployment erneut durchführen und manuell nochmals AppPool und IIS neu starten.
Im GAC (Windows -> assemblies) anschliessend nachsehen ob die Assembly kopiert wurde und die richtige Version hat. Im web.config der Sharepoint Webapplikation sollte die Assembly noch registriert sein.

Wenn alle diese Punkte beachtet wurden, sollte man zurück zu Punkt 2 und nochmals in der Webpart Gallery nachsehen, ob man das Webpart darstellen kann. Wenn ja, dann müsste es auch möglich sein das Webpart in der Seite einzufügen.


I am currently doing my first steps in Sharepoint 2010. Installed a new instance and created a site-collection. To get in touch with the lists and different actions, I created a visual webpart and wanted to play around in the code-behind.
But the creation of the webpart with VS 2010 RC and the deployment to Sharepoint 2010 was not that easy as I thought. Although deployment is now easier then Sharepoint 2007, still there seem to be some little "bugs". One error that required hours of bug fixing was "cannot import webpart". In a blog I found a very good introduction with steps to follow, when errors like that happen, because Sharepoint does not throw informative exceptions.
1. site actions -> site settings -> galleries -> webparts
There the webpart must be listed, when you deployed correctly. If it is not
listed, then something went wrong with deployment.
2. When clicking the webpart in the gallery, then the webpart is supposed to
display it's content. Now it is possible, that you already have an error now.
In my case VS 2010 had problems with the different versions. You should consider the following things:
- Feature1.Template.xml, here you need to have the same version as in the
AssemblyInfo.cs (.vb)
- [Name].webpart. In this file you have a placeholder, where VS generates the
version and some other things (in my case a wrong version has been generated).
$SharePoint.Project.AssemblyFullName$ replace with ->
[Assembly-name], Version=[your current version], Culture=neutral
When feature, webpart and assemblyinfo files do have the same version and Id, then deploy again and restart the application pool and iis manually.
In the global assembly cache (Windows -> assemblies) you should check if the assembly was deployed and if it has the correct version number. In the web.config of your sharepoint web-application this assembly is supposed to be registered as well.

When you checked all those things, then go back to number 2 and check once again if you can display the webpart in the gallery. If it is so, then you might be able to insert the webpart to your page.

Donnerstag, 4. März 2010

Going Sharepoint

Seit dem 1. März arbeite ich als Software Engineer bei der 4 Screen in Luzern. Meine neue Aufgabe und Herausforderung dort wird Sharepoint 2010 sein. Aus diesem Grund werde ich vermehrt in Zukunft Sachen zum Thema Sharepoint posten. Meine ersten Schritte, Fehler, etc.
Since March 1st I am working as a software engineer at 4 Screen in Lucerne. My new job and challange in future will be Sharepoint 2010. That will be the reason, why I will post more about Sharepoint in future. To leave some facts about my first steps, errors, etc.