If you have any doubt in the post please post comments. I will try to solve your problem.
In CRM, audit is a super feature to track a record in CRM. It is very useful at the time of production issue. When we view the audit, as you can see except record column other fields we can filter.
But in real time we would need filter audit record based on particular record.
By using the below query you will filter audit based on record. In that query you can
Output
There are 6 columns in the output.
Description:
Entity Name : Name of the entity
AttributeName :Logging field name
UserName : by which user this record create
OldFieldValue :old value of the field
CurrentValue : new value of the field
LogDateTime :When it was created
In CRM, audit is a super feature to track a record in CRM. It is very useful at the time of production issue. When we view the audit, as you can see except record column other fields we can filter.
But in real time we would need filter audit record based on particular record.
By using the below query you will filter audit based on record. In that query you can
- {0}: Start date
- {1}: End date
- {2}: Record guid(example: if you look into account record then put particular account guid.)
drop table #temp1 Declare @attributes VarChar(Max), @values VarChar(Max), @ObjectTypeCode int, @LogDateTime DateTime, @RecordId uniqueidentifier, @UserId Uniqueidentifier, @ActionId int Declare @Result Table(AttributeId int, Value VarChar(Max), ObjectTypeCode int, LogDateTime DateTime, RecordId uniqueidentifier, UserId uniqueidentifier, ActionId int) Declare @CurrentAttribute VarChar(max), @CurrentValue VarChar(Max) DECLARE DataAuditCursor CURSOR FOR Select top 200 Case When IsNull(a.AttributeMask, '') = '' Then '' Else Substring(a.AttributeMask, 2, Len(a.AttributeMask) - 2) End , a.ChangeData ,a.ObjectTypeCode ,a.CreatedOn ,a.ObjectId ,a.UserId ,a.[Action] From dbo.Audit a where -- Createdon > '2014-11-01 00:00:00.000'{0} -- Edit this to match your scenario --and Createdon < '2014-11-19 00:00:00.000' {1}-- Edit this to match your scenario a.ObjectId= '3A780EAA-1327-E511-9405-0050568106FE' --{2} and Action = 2 --(1=Create, 2=Update, 3=Delete) order by Createdon desc OPEN DataAuditCursor FETCH NEXT FROM DataAuditCursor INTO @attributes, @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId WHILE @@FETCH_STATUS = 0 BEGIN WHILE CHARINDEX(',',@attributes,0) <> 0 BEGIN SELECT @CurrentAttribute=RTRIM(LTRIM(SUBSTRING(@attributes,1,CHARINDEX(',',@attributes,0)-1))), @attributes=RTRIM(LTRIM(SUBSTRING(@attributes,CHARINDEX(',',@attributes,0)+1,LEN(@attributes)))), @CurrentValue=RTRIM(LTRIM(SUBSTRING(@values,1,CHARINDEX('~',@values,0)-1))), @values=RTRIM(LTRIM(SUBSTRING(@values,CHARINDEX('~',@values,0)+1,LEN(@values)))) IF LEN(@CurrentAttribute) > 0 INSERT INTO @Result Values(CAST(@CurrentAttribute as int), @CurrentValue, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId) END INSERT INTO @Result Values(( Case When IsNull(@attributes, '') = '' Then Null Else CAST(@attributes as int) End ), @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId) FETCH NEXT FROM DataAuditCursor INTO @attributes, @values, @ObjectTypeCode, @LogDateTime, @RecordId, @UserId, @ActionId END CLOSE DataAuditCursor; DEALLOCATE DataAuditCursor; Select ( Select Top 1 Name From MetadataSchema.Entity e Where r.ObjectTypeCode = e.ObjectTypeCode ) EntityName , (Select Top 1 a.Name From MetadataSchema.Attribute a Inner Join MetadataSchema.Entity e On a.EntityId = e.EntityId and a.ColumnNumber = r.AttributeId and e.ObjectTypeCode = r.ObjectTypeCode ) AttributeName , u.fullname UserName , r.Value OldFieldValue , r.RecordId ModifiedRecordId, r.LogDateTime into #temp1 From @Result r Left Join dbo.FilteredSystemUser u On r.UserId = u.systemuserid create table ##temp2 (AttributeName varchar(200), currentValue varchar(400), RecId uniqueidentifier) declare @EntityName varchar(100), @AttributeName varchar(100), @UserName varchar(100), @OldFieldValue varchar(700), @ModifiedRecordId uniqueidentifier, @Temp2LogDateTime DateTime declare @SQLStatement nvarchar(400) declare @getOldValue varchar(400) DECLARE TempCursor CURSOR FOR Select top 10 EntityName, AttributeName, UserName, OldFieldValue, ModifiedRecordId from #temp1 OPEN TempCursor FETCH NEXT FROM TempCursor INTO @EntityName, @AttributeName, @UserName, @OldFieldValue, @ModifiedRecordId WHILE @@FETCH_STATUS = 0 BEGIN select @SQLStatement = 'insert into ##temp2 select '+ ''''+@AttributeName +''' as AttributeName, ' + @AttributeName+' as currentValue, '+ @EntityName+'id as RecId from dbo.'+@EntityName+' where '+@EntityName+'id'+' = '+ ''''+'{'+convert(varchar(38),@ModifiedRecordId)+'}'+'''' --select @SQLStatement EXEC sp_executesql @SQLStatement; --select @EntityName, @AttributeName, @UserName, @OldFieldValue, @ModifiedRecordId FETCH NEXT FROM TempCursor INTO @EntityName, @AttributeName, @UserName, @OldFieldValue, @ModifiedRecordId END CLOSE TempCursor; DEALLOCATE TempCursor; select #temp1.EntityName,#temp1.AttributeName,#temp1.UserName, #temp1.OldFieldValue, ##temp2.currentValue ,#temp1.LogDateTime from #temp1 join ##temp2 on (##temp2.RecId = #temp1.ModifiedRecordId and ##temp2.AttributeName = #temp1.AttributeName collate Latin1_General_CI_AI) drop table ##temp2 -- Clean up some trash... delete from tempTrashChanges where OldFieldValue = '' and currentValue is null -- Don't need to see this delete from tempTrashChanges where OldFieldValue = currentValue |
There are 6 columns in the output.
Description:
Entity Name : Name of the entity
AttributeName :Logging field name
UserName : by which user this record create
OldFieldValue :old value of the field
CurrentValue : new value of the field
LogDateTime :When it was created
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.