How to track EPM Resource field changes in your Reporting Database
Leveraging the EPM 2007 Eventing service as well as the Reporting database here is a way of tracking all changes made to a Resource's fields. A common request I heard from customers is the ability to track when a Resource changes from one node to another node in the RBS.
Steps to do it (code download below!!!):
- Created a custom table in the Reporting database called: MCS_EpmResource_UserView_Tracking
- Created a custom stored procedure in the Reporting database called: MCS_EPM_InsertResourceChange that takes the RES_UID as a parameter
DECLARE @ResourceTimesheetManagerUID uniqueidentifier
DECLARE @ResourceModifiedDate datetime
SELECT @ResourceModifiedDate = ResourceModifiedDate,
@ResourceTimesheetManagerUID = ResourceTimesheetManagerUID
FROM MSP_EpmResource
WHERE ResourceUID = @ResourceUID
IF NOT EXISTS(SELECT * FROM dbo.MCS_EpmResource_UserView_Tracking WHERE ResourceUID = @ResourceUID AND ResourceModifiedDate = @ResourceModifiedDate)
Note that I only INSERT a new row in my history table if the Modified Date has changed.
- Created a custom event handler that gets called every time a Resource is changed (OnResourceChanged)
public override void OnResourceChanged(PSContextInfo contextInfo, ReportingPostResourceChangedEventArgs e)
{
// Standard processing
base.OnResourceChanged(contextInfo, e);
// Load settings from Microsoft.Office.Project.Server.Eventing.exe.config
LoadSettings();
// Build T-SQL command
string cmdText = string.Format("EXEC MCS_EPM_InsertResourceChange '{0}'",e.ResourceUid.ToString());
// Store Resource field update
ConnectAndExecuteNonQuery(connectionString, cmdText);
}
- Deploy event handler in GAC and define an entry in the PWA configuration (refer to SDK for more details)
- and voila!
From now on, every time a Resource's field is changed (for instance it's name, RBS tec ...) and entry will be inserted in the tracking table mentioned above.
Eventually you will want to build a report that leverages that historical data to show you a view before and after the change was made for instance.