Monday, June 23, 2014

Common Error: The site is not valid. The 'Pages' document library is missing.

The site is not valid. The 'Pages' document library is missing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: Microsoft.SharePoint.Publishing.InvalidPublishingWebException: The site is not valid. The 'Pages' document library is missing.
The interesting piece here is that the Pages library indeed existed but could not be found.
Background Information
To understand this we need to look into how the Publishing feature find the Pages library in a Publishing site. As the Pages library does not need to have the name "Pages" - e.g. in German version it has the name "Seiten" SharePoint does not search for the Pages library by name.
Instead the Publishing feature stores the unique ID of the Pages library in the __PagesListId property which resides in the property bag of the publishing site.
The above listed error will occur if the value stored in the __PagesListId does not match the ID of the actual Pages library.
What can cause this problem?
Honestly: I don't know. I have not managed to forcefully cause such an inconsistency - if one of you has repro steps, please post a comment here!
How to fix the problem?
To fix the issue it is required to update the value of the __PagesListId property value to match the ID of the Pages library.
This can be done (e.g.) through the following Powershell script:


$web = get-spweb http://site-collection/path-to-affected-site
$correctId = $web.Lists["Pages"].ID
$web.AllProperties["__PagesListId"] = $correctId.ToString()
$web.Update()

Tuesday, March 25, 2014

SharePoint: Adding hyperlinks to document libraries

Sometimes you have external content that you would like to make available from your document library without uploading a file. Examples include documents in other SharePoint sites or libraries, and even links to other web pages including SharePoint pages and external web sites.

Turns out SharePoint already has this built-in, just well hidden. There is a built-in Content Type called "Link to a Document". Just add this to your library and then just click the "New" dropdown and select "Link to a Document"! It will simply ask you for a document name and url. You can supply a URL to anything that starts with "http://", including both SharePoint documents and external web pages. It does not support a link to a network share such as "\\myfileserver\folder1\somedoc.doc".
  1. Display your library (Example: Shared Documents)
  2. Click Settings and Library Settings
  3. Click Advanced Settings
  4. Check "Allow management of content types" and then OK
  5. In the Settings page scroll down to Content Types and click "Add from existing site content types"
  6. Select "Link to a Document", click Add and then Click OK
  7. Go back to your library and click the New dropdown and select "Link to a Document"
  8. Enter a display name (Document Name) and the URL (must start with http://) and click OK
So how does it work? The Content Type has a template that is an ASPX page that contains a server side control named SharePoint:UrlRedirector. When this page is rendered it simply redirects to the address listed in the items URL property. Also experiment with adding these built-in content types to your library:
  • Basic Page
  • Web Part Page
  • Dublin Core Columns (Do a web or wikipedia.com search for "Dublin Core")
  • Picture
You can also add customized folders to the New dropdown. See here. Need to add custom columns / meta data to any of the above? Just create a new Content Type based on one of the above and add it to your library. See here.

Note:
First Enabled "SharePoint Server Publishing Infrastructure" features under in Site Action --> Site Settings --> Site Collection Administration

Wednesday, March 19, 2014

Intermittent InfoPath Forms Services Error

No errors were logged in Event Logs. We have identified the root cause of the problem to be connectivity with SharePoint User Profile web service as we are using it to populate the properties of logged-in user at form-load.
On the other hand, this seems to be an issue only in a specific environment. So, we wanted to check the settings on the environment.
Resolution Steps:
1) Made sure all the data connection files have the environment specific List GUIDs, URLs and so on
2) Made sure all the settings related to InfoPath Forms Services under Central Admin are proper: Enable web service proxy, Enable cross-data connections, Disable Anonymous access
3) Made sure all the relevant user profiles are properly imported under SSP
4) Made sure that the authentication Loopbackcheck registry entry is disabled on the WFE server
Disable the authentication loopback check
Re-enable the behavior that exists in Windows Server 2003 by setting the DisableLoopbackCheck registry entry in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa registry subkey to 1. To set the DisableLoopbackCheck registry entry to 1, follow these steps on the client computer:
  1. Click Start, click Run, type regedit, and then click OK.
  2. Locate and then click the following registry subkey: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
  3. Right-click Lsa, point to New, and then click DWORD Value.
  4. Type DisableLoopbackCheck, and then press ENTER.
  5. Right-click DisableLoopbackCheck, and then click Modify.
  6. In the Value data box, type 1, and then click OK.
  7. Exit Registry Editor.
  8. Restart the computer.
5) Made sure the alternate access mappings or managed paths are not breaking the web service calls in the interim
None worked. Finally, we have added a host file entry on the WFE server (we have only one WFE in our case) to point to its own IP, did a IIS reset  and it worked.
I have actually found this resolution on one of the blogs:
If the WFE servers are load-balanced, we need to add a host file entry on WFE pointing to its own IP on each of WFE. This is to deal with a known issue with InfoPath browser forms; all browser form calls to SharePoint web services will be made to the current machine that invoked the form.

-----------------------------------------------------
I recently came across this baby quite frequently when developing a form that used the user profile web service to automatically populate a ‘contact information’ section. For step by step instructions on how to achieve this, check out Itay Shakury’s terrific blog here: http://blogs.microsoft.co.il/blogs/itaysk/archive/2007/04/05/InfoPath-_2D00_-Get-the-current-user-without-writing-code.aspx
Anyway, despite this solution working for me on a single server environment, when I migrated it to a multi-server farm (NTLM) it intermittently stopped working. Although it didn’t seem necessary as the web service was a local resource rather than an external one; I looked into UDC files and Administrator approved form publishing. The authentication token was obviously being lost between serving the form and making the request to the web service because I was seeing these kinds of errors in the logs:
04/15/2008 17:01:05.39 w3wp.exe Forms Server Forms Services Runtime – Data C 82fy Warning The following query failed: GetUserProfileByName (User: ***, Form Name: ***, IP: , Request: *** Form ID: urn:schemas-microsoft-com:office:infopath:***, Type: DataAdapterException, Exception Message: The remote server returned an error: (401) Unauthorized. The remote server returned an error: (401) Unauthorized.)
After some digging through the server logs it became clear that the web service request was being sent via the load balancing server which was assigning it to 1 of the 3 MOSS servers in the farm. If the server that was serving the form got the request, the form worked perfectly and displayed the user details but if another server received the request then the error above was displayed because the server had no idea where the original request was from.
So after playing around with the web service data connection for a while- trying to use localhost or the server name instead of the host header (which Forms Services doesn’t like), I finally added a simple entry to all 3 server hosts files and mapped the host header name to 127.0.0.1. This ensured that once a server was assigned a request by the LB, any secondary requests to a farm resource would then be served by the same server (localhost) instead of being directed back to the LB.

Monday, February 24, 2014

SharePoint 2010 - List inline editing

SharePoint 2010 - List inline editing

How to enable inline editing on list.
1. Go to the list and click on the List in the Ribbon.
2. Click on the "Modify this View"
clip_image002
3. Go to the button and expand "Inline Editing", click the "Allow inline editing" checkbox on. And click on the OK button.
clip_image004
4. Go back to the list (the modified view) and now there is a little 'create new list item' icon at the button of view.
clip_image006
5. Click on the create new list item icon and a inline form is show. Fill out the required fields and click on the save icon.
clip_image008
6. And vola, you just create a list item through inline editing :)
Change this settings through API
Find the view (SPView) you wish to change and update the InlineEdit property with the text string TRUE
Remember to .Update() the SPView after updating the property.

Thursday, February 13, 2014

Generate Auto increment number of repeating section infopath

1. Open your infopath form.
2. Add an column named is Sr. No in your repeating table/section.
3. Add a textbox control in the column.
4. Right click on textbox say Textbox Properties.
5. Simply add the following formula to the Default Value field,

count(../preceding-sibling::*[local-name() = "YourRepeatingGroupName"])

OR

count(../preceding-sibling::*) + 1



Thursday, February 6, 2014

Move Sharepoint server from Domain to another domain

Move SharePoint server from Domain to another domain

Move/migrate Sharepoint server  from one domain to another domain
Example: Move sharepont fron mumbai domain to chennai domain.
1.       We have to take the backup of all sharepoint databases and all webconfig and if we have any customization.
2.       Need to take the list of web application pool identity Accounts details.
3.       Now Remove the mumbai domain and join to new domain chennai.com
4.       Create the sharepoint account and add that sharepoint Account to the below groups in the sharepoint machine.
Local administrators,WSS_WPG,WSS_admin and IIS_WPG

5.       Now we need to do 3rd step in SQL machine and add the sharepoint Account in local administrator group and  Open the sql management studio and do the following steps
5a. create a new login for sharepoint account and assign the following roles DB creater and security Admin.
               5b.  Give the DB owner permission for the sharepoint account  for all sharepoint DB using user Mapping option in the user Account property.
6.       Now login to the sharepoint server using sharepoint Account and run the following stsadm commands
6a. stsadm.exe –o updatefarmcredentials –userlogin chennai\testspuser –password test@123
6b. stsadm.exe –o updateaccountpassword –userlogin chennai\testspuser –password test@123 -noadmin
6c. stsadm.exe –o spsearch –farmserviceaccount chennai\testspuser –farmservicepassword test@123
6d. stsadm.exe – o osearch –farmserviceaccount chennai\testspuser –farmservicepassword test@123
6e. the below command for SSP
      Stsadm.exe –o editssp –title SSPname –ssplogin chennai\testspuser –ssppassword test@123
Finally restart IIS with noforce

7.       Check that central admin pool and Sharepoint service account are changed using IIS and Service manager.

8.       Now open the central admin and change the all web application pool account and change the site collection administrator credentails

9.       Then migrate the old  domain users to new domain account using the below stsadm command
9a.stsadm.exe –o migrateusers –oldlogin mumbai\testuser –newlogin chennai\testuser -ignoresidhistory

Sunday, February 2, 2014

InfoPath form to upload an image to SharePoint (no code)

InfoPath SharePoint integration can be implemented in several ways. You can integrate InfoPath 2010 with SharePoint 2010 through SharePoint web services, SharePoint workflows, SharePoint event handlers, or by writing code in InfoPath forms that makes use of the SharePoint client object model or the SharePoint server object model.
Where the two latter means of integration are concerned, you will always have to give your form Full Trust to be able to call those two object models.
If you do not want to write code to integrate InfoPath with SharePoint, your best bet is to explore what theSharePoint web services have got to offer.
Where the uploading of images are concerned, you can either write code to upload images to SharePoint document or picture libraries, or you can use one of two web services: 
1. SharePoint Copy web service, or 
2. SharePoint Imaging web service without having to write code.
Both SharePoint web services offer similar functionality, however, the Imaging web service can be used to upload an image to a SharePoint picture library, while the Copy web service can be used to upload an image to any SharePoint document library.
In addition, if you want to create an InfoPath form that can upload one image to a library, you do not have to write code to get such functionality, and you can use either the Copy web service or the Imaging web service to do so.
Because the Copy web service is a bit more involved than the Imaging web service, this article shows you how to use the Imaging web service to upload an image from an InfoPath form to SharePoint. However, the same techniques you use for hooking up the Imaging web service to an InfoPath form using an InfoPath data connection and rules, would apply to the Copy web service.


In the following 4-minute InfoPath 2010 tutorial video, I show you how easy it is to use rules to connect an InfoPath form to SharePoint's Imaging web service to be able to upload an image to a SharePoint picture library using an InfoPath browser form or Filler form.