Monday, September 29, 2008

Impersonation in SharePoint 2007

In SharePoint 2003 there was no easy way to use impersonation. In SharePoint 2007 there is a nice and easy build in way to use impersonation:

SPSite site = new SPSite("SiteCollection_Url");
SPWeb web = site.OpenWeb();
SPUser user = web.AllUsers["User_Name"]; 

SPUserToken token = user.UserToken;
SPSite impersonatedSiteCollection = new SPSite("SiteCollection_Url", token); 

You can also check whether an SPSite object is using impersonation:

SPSite siteCollection = SPControl.GetContextSite(HttpContext.Current);
bool impersonating = siteCollection.Impersonating;

Thursday, September 25, 2008

Enable Anonymous Access In SharePoint 2007 / WSS 3.0



  1. From Central Administration > Application Management > Application Security > Authentication Providers, select a Web application and the zone you want to modify. This is usually default.




  2. In the middle of the page, check Enable Anonymous Access and choose Save




  3. All site collections in that Web application can now have anonymous access enabled.




  4. Go to a site collection in the Web application you just enabled anonymous access for




  5. From Site Actions > Site Settings, open Advanced Permissions




  6. From the Settings drop-down menu, select Anonymous Access




  7. For this example, enable anonymous access for Lists and Libraries and click OK




  8. Browse to any document library in this site collection




  9. From the Settings drop-down menu, select Document Library Settings




  10. In the Permissions and Management column, select Permissions for this document library




  11. From the Actions menu, select Edit Permissions to break inheritance




  12. From the newly appeared Settings drop-down menu, select Anonymous Access




  13. Check View Items and click OK.



Wednesday, September 10, 2008

CAML - Query Lookup Field by ID; not by Value

When lookup fields are created, sharepoint stores them as
ID;#Value format in related list.

for e.g.
in list “Contacts” there is column called “Country”.
There is item in contact with value “India” assigned in Country, having item ID=10.

Now for another list “List2″ when column “Country” is stored as Lookup column named “refCountry”; and for certain data item “India” is selected from combo box, Sharepoint stores it in,

10;#India in “List 2″ -> “refCountry” column.

When having CAML query in List2

The typical query looks like
<Query>
<Where>
<Eq>
<FieldRef Name=”RefCountry” />
<Value Type=”Lookup”>India</Value>
</Eq>
</Where>
</Query>

The disadvantage of this way is If list Contacts is having more than one entry(item or row) having value India for Country it will return the only first one. This may give inconsistent data for further.

To avoid this query should be base on ID not by Value.
This can be achieved thru :

<Query>
<Where>
<Eq>
<FieldRef Name=”RefCountry” LookupId=”TRUE” />
<FieldRef Name=”RefCountry” LookupId=”TRUE” />
<Value Type=”Lookup”>10</Value>
</Eq>
</Where>
</Query>

where 10 is the ID for item having country=”India”

Hide fields in New, Display or View forms in SharePoint




One of the limiting factors in using the default forms (NewForm.aspx, EditForm.aspx) is that there is no obvious way to hide columns from appearing in the form.  By default all columns in a list or document library will appear in your forms. 


After doing quite a bit of research on this I found a fairly easy way to hide fields by using JavaScript within the form pages themselves.  In my research I found several different sets of JavaScript code, but some of the scripts are easier to implement than others.  Below I provide the best and most straight forward JavaScript and some simple steps to guide you along.


To hide fields in a SharePoint 2007 form, follow these steps (I will use the NewForm.aspx in my example)



  1. Open SharePoint Designer and navigate to the site that contains the list or document library you wish to customize.
  2. Expand the folder named “Forms” under the desired list or document library.  You should see about seven .aspx pages (AllItems.aspx, EditForm.aspx, NewForm.aspx, etc)
  3. Open the NewForm.aspx page and switch to the “code” view to edit the HTML of the page.
  4. Paste the JavaScript code immediately below the the following HTML tag <asp:Content ContentPlaceHolderId=”PlaceHolderMain” runat=”server”>  This will add the JavaScript to the HTML inside the content placeholder tag.  Note: be sure to include the entire script below, including the <script and </script> tags.
  5. Modify the “hidefields()” section of the JavaScript code to refer to each SharePoint list field name to hide.  For example, the code sample below will hide the SharePoint fields named Title, Document Link, and PublishDate    Notice that you do not need to worry about internal field names or field types like other JavaScript techniques, you simply need to know the name of the field.
  6. Save the changes.  Select “Yes” when prompted to “…customize the page from the site definition…”
  7. Test the form


 



<script language="javascript" type="text/javascript">

_spBodyOnLoadFunctionNames.push("hideFields");

function findacontrol(FieldName) {

var arr = document.getElementsByTagName("!");
// get all comments
for (var i=0;i < arr.length; i++ )
{
// now match the field name
if (arr[i].innerHTML.indexOf(FieldName) > 0)
{ return arr[i]; }
}
}

function hideFields() {

var control = findacontrol("Title");
control.parentNode.parentNode.style.display="none";
control = findacontrol("Document Link");
control.parentNode.parentNode.style.display="none";
control = findacontrol("PublishDate");
control.parentNode.parentNode.style.display="none";

}
</script>

Friday, September 5, 2008

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

I used query with left outer joins.

First i used Server Explorer to drag and drop my table, than i modified query.

When i draged and droped my table there was unique field (id) with key logo. Because of joins, query returned more than one unique id, so solution is:

Make this unique field (id) property "Unique" into False.

That solved my problem.