views:

3070

answers:

3

How can I add a lookup field to a content type in sharepoint using the xml definition? (I'm getting errors).

Things to note: - The lookup list will exist when the content type is added to the document library. - The lookup list will always have the same name. - The lookup list has a space in the name.

This is what I've added to the xml:

  <Field ID="{GUID}"
         Type="Lookup"
         List="$Resources:core,lists_Folder;/List%20Name"
         ShowField="Title"
         Name="MyLookupFieldName"
         DisplayName="MyLookupFieldName"
         StaticName="MyLookupFieldName"
         Hidden="FALSE"
         Required="FALSE"
         Sealed="TRUE"
         >

When I then programatically add the content type to a document library I get an exception (with no useful information), and the following is logged to the sharepoint log:

08/18/2009 17:13:39.50 w3wp.exe (0x08B8) 0x11B0 Windows SharePoint Services Database 6f8g Unexpected Unexpected query execution failure, error code 8114. Additional error information from SQL Server is included below. "Error converting data type nvarchar to uniqueidentifier." Query text (if available): "{?=call proc_GetListMetaDataAndEventReceivers(?,?,?,?,?,?)}"

+1  A: 

Check out this post: Creating a Lookup List for SharePoint with VSeWSS

dahlbyk
I found this that seems to indicate it's ok to use the list name (if you look through the comments, in particular from Donal McWeeney):http://www.sharepoint-tips.com/2007/04/fixing-lookup-fields-in-list-definition.html
zikoziko
But I should add, that it hasn't worked for me :-)
zikoziko
+1  A: 

The problem is that you need to reference the GUID of the list not its title. As you probably won't know the GUID of the list then you can't do this without executing some custom code afterwards.

Even if you aren't using VSeWSS, the last steps in the post dahlbyk has linked to show you how to do this. Chris O'Brien has gone to the trouble of making a CodePlex project that will help you if you aren't using VSeWSS.

Alex Angas
+1  A: 

Ok, so I couldn't get the xml definition of a field for a content type to work for me for some reason. I did find out how to do it in code. The solution that worked for me is:

  • Don’t add the Field definition in xml, it needs to be done in code.
  • Solution is: o add the content type to the list (in site definition code, or wherever). o add a field lookup to the given SPWeb (so the field is a web? field, rather than a site field) o Add a new field link to the list content type. o Update the content type.

For example:

SPContentType myContentType = myWeb.Site.RootWeb.ContentTypes["MyContentType "]; myLib.ContentTypes.Add(myContentType);

        myContentType = myLib.ContentTypes["MyContentType "];

        myWeb.Fields.AddLookup("MyLookupFieldName", myWeb.Lists["MyLookupListName"].ID, false);
        SPFieldLink myFIeldLink = new SPFieldLink(myWeb.Fields["MyLookupFieldName"]);
        myContentType.FieldLinks.Add(myFIeldLink);
        myContentType.Update();
zikoziko