Creating an Update Operation for an External Content Type

by Troy Scott

2010/07/17

* Please note that the following post is based on SharePoint 2010 Foundation Server and not SharePoint 2010 Server. 

In a previous post , I created an External Content Type with 2 operations and then created an External List based on the External Content Type.  In short this means that you are now able to create a SharePoint List based on some external data (e.g. database table or store procedure in this example).   But currently the external data is read only because we only created the following operations for the External Content Type:

  • Read List
  • Read Item

Given that the example was based on Sales Forecast data at the very least we need to give the user the ability to update the data.  In order to do this a new operation needs to be added and a new stored procedure is required to support the operation.  Before we add the  the Update Operation to the BcsSalesForecast External Content Type we need to create a store procedure which will be used for this operation called dbo.BcsSalesForecastUpdate:

CREATE procedure [dbo].[BcsSalesForecastUpdate] @ID nvarchar(512), @ForecastAmount int as set nocount on update dbo.WeeklySalesForecast set ForecastAmount = @ForecastAmount from dbo.WeeklySalesForecast where EnglishMonthName + '-' + WeekNumber + '-' + SalesTerritoryRegion + '-' + Category = @ID

Now that the store procedure is created, SharePoint Designer can be used to add the new operation to the BcsSalesForecast External Content Type.  Navigate to the BcsSalesForecast External Content Type and click “Edit External Content Type” on the Ribbon:

image

Now click on the “Operations Design View” Menu item on the Ribbon:

image

Right-click on the Routine folder and select Refresh.   The dbo.BcsSalesForecastUpdate stored procedure should appear.  Right-click on the stored procedure and select “New Update Operation”. 

image

Make sure the @ID is select as the “Map to Identifier”:

select * from dbo.WeeklySalesForecast where ForecastAmount is not null

image

The BcsSalesForecastReadItem and the BcsSalesForecastReadList have to be updated too.  The following fields must be set to “Read Only” or the new Edit Form will not work:

  • MonthName
  • WeekNumber
  • SalesGroup
  • SalesRegion
  • ProductCategory
  • LastYearAmount

Below is an example of setting a field to read only.  Remember this must be performed on both the Read Item and Read List operations:

image 

Click Finish and the new operation has been created.  The solution is not finished yet.  Remember, we also have an External List called “Sales Forecast”.  If you view the Sales Forecast list and right-click on a row you will notice that there is a new menu item called “Edit Item” and the “Edit Item” button in the ribbon is no longer grayed out.   Try to edit the row.  You should receive the following error:

image

The reason for this is that an Edit Form does not exist for the list.  To work around this we can simply create a new External List and call it “Sales Forecast 2010” and the SharePoint designer will create the necessary forms depending on what operations have been defined for the External Content Type:

image

Select the list in SharePoint Designer and click the “Preview in Browser” button on the Ribbon to try out the new “Edit” functionality.  Right-click on any row on the list and select Edit item.  The following form will pop-up:

image

Click Save and the the SharePoint List and the External Data will be updated.   Use Management Studio and execute the following query against the dbo.WeeklySalesForecast:

select * from dbo.WeeklySalesForecast where ForecastAmount is not null

Now this example may not be practical especially if one person was responsible for updating all of the forecast data.  But this example shows how easy it is to create a simple CRUD (Create, Read, Update, Delete) based application based on External data with little or no code.   This example only implemented the Read and Update operations but the Create and Delete operations would be very easy to implement and would require 2 more stored procedures (dbo.BcsSalesForecastCreate, dbo.BcsSalesForecastDelete)