21
Jun
For a client of ours we wanted to create a Custom SP2010 Document ID Provider. For this provider I wanted to be able to adjust and configure it so I can use it for other customers also. First I needed to know how to create a Document ID Provider and found that: Tobias Zimmergren had an excelent article on creating you own SP2010 Document ID Provider.
Next in order to create a unique sequenced number I immediatly thought of SQL Server. And found that Ton Stegeman had an equally usefull post on how to create your own SPDatabase object in a SharePoint Farm.
Now I was set to create "the last Document ID Provider" for SP2010 I was ever going to write. Perhaps not but still, it should suffice for a LOT of clients of us!
I wanted to end up with an admin page like this: This should then result in this document id: So how to do this? Step 1 Create a Database with a Table where I can store my generated document id's
CREATE TABLE [dbo].[scoped_docid]( [id] [bigint] IDENTITY(1,1) NOT NULL, [scopeid] [uniqueidentifier] NOT NULL, [objectid] [uniqueidentifier] NOT NULL, [scopedocid] [bigint] NULL, [scope] [varchar](100) NULL, [generateddocid] [varchar](150) NULL, [listid] [uniqueidentifier] NULL, [webid] [uniqueidentifier] NULL, [siteid] [uniqueidentifier] NULL, [webapplicationid] [uniqueidentifier] NULL, [farmid] [uniqueidentifier] NULL, [created] [datetime] NULL, CONSTRAINT [PK_scoped_docid] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
And a stored procedure to Get/Insert ID's:
-- ============================================= -- Author: Stef van Hooijdonk -- Create date: juni 2010 -- Description: -- ============================================= CREATE PROCEDURE GetNextScopedDocID -- Add the parameters for the stored procedure here @scopeid uniqueidentifier , @scope varchar(100), @itemid uniqueidentifier AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION declare @result bigint declare @scopedindex bigint select @scopedindex=COALESCE([scopedocid],-1),@result=[id] from scoped_docid where [objectid] = lower(@itemid) if (@scopedindex is null) begin -- coalesce for the first record will have MAX = null, and then we add 1 select @scopedindex=COALESCE(MAX(scopedocid),0)+1 from scoped_docid where scope = lower(@scope) insert into [scoped_docid] (scopeid ,scope,objectid, scopedocid ) values( lower(@scopeid), lower(@scope),LOWER( @itemid), @scopedindex) select @result = SCOPE_IDENTITY() end COMMIT select @result as record,@scopedindex as docid END GO
There is more to it than this, but you can check out the downloads for all the details. Step 2 Create an SPDatabase object for this Database, see the Ton Stegeman post!
Step 3 Create a Document ID Provider that uses this SPDatabase and generates Document ID's based on some settings. What I did was generate the sequenced number in SQL and then format that in a method with the other variables. Generating a YEAR or DAY into a string is fairly easy.
Step 4 Create an Central Admin page to change the settings of our Document ID Provider ( see screenshot ). You can use the SPFarm.Local.Properties to score your settings Farm Wide:
/// <summary> /// The default farm wide scope setting for this DocumentProvider /// </summary> public ProviderScope Scope { get { ProviderScope result = ProviderScope.Farm; try { string setting = Settings.GetFarmSetting("CustomDocumentIDProvider.Scope"); if (!string.IsNullOrEmpty(setting)) result = (ProviderScope)Enum.Parse(typeof(ProviderScope), setting); } catch (Exception exc) { LogException(exc); } return result; } set { Settings.SetFarmSetting("CustomDocumentIDProvider.Scope", value.ToString()); } }
The scope:
/// <summary> /// Scopes for the Document ID Provider /// </summary> public enum ProviderScope { /// <summary>Farm wide scope</summary> Farm=1, /// <summary>Webapplication scope</summary> Webapplication = 2, /// <summary>SPSite/Site collection scope</summary> SiteCollection = 3, /// <summary>Site/Subweb (SPWeb) scope</summary> Site = 4, /// <summary>List scope</summary> List = 5, /// <summary>No scope</summary> None = 100 }
Downloads Download solution Download sources
How to use the solution
(Crosspost of: http://stefvanhooijdonk.com/2010/06/21/document-id-provider-the-last-one )
Comments (0)
Tam Tam brengt je wereld online.