views:

29

answers:

1

I'm having an issue with an event handler in SharePoint.

I have a list of items (List A) which has an event handler attached to it with code for ItemAdded and ItemUpdated.

When either of these events triggers, I want another list (List B) to be updated with the minimum value of all similarly names items in List A. Think almost like Min(FieldX).

e.g.

ListA
ItemName     Value
CategoryA    2
CategoryA    4
CategoryA    3
CategoryB    1
CategoryB    8

List B
ItemName     Value
CategoryA    2
CategoryB    1

If someone updates one of the CategoryA items in ListA to have a value of 0, then the event handler would replace the CategoryA item within ListB with the new value of 0.

Currently I am doing this by deleting all items in ListB, then getting all unique ItemNames from ListA and inserting the lowest value of each into ListB.

This works fine if you edit one item at a time, but if you Edit in Datasheet, it gets in a right mess due to the asynchronous nature. Sometimes it will work, sometimes it won't and that is no good.

What would be the best practice way of doing something like this? With so many items being edited asynhronously, how would you update a rollup table like this in a consistent manner?

Thanks

+1  A: 

Which event are you catching - the Synchronous *ing (ItemAdding) events or the Async *ed (ItemAdded) events?

One suggestion is for the event to kick off a timer job to update the summary list. Your event handler then simply cheks to see if the job is scheduled (for a minutes time?) and if not schedules it. Then it won't matter about multiple quick updates.

Long Running Operations: Consider creating a custom SharePoint timer job. Kick off/ Schedule the Timer Job from the event rather than running all the logic inside the event. This will allow you to use the features of SharePoint to view whether the Timer Job ran successfully

Event Handlers - Part 1: Everything you need to know about ... SharePoint ... Event Handlers.

Another suggestion - do you need to precalculate this and store it in a list? If its just for display could you not write a custom web part do this on the fly, cache the results and clear the cache depending on the SPList.ListItemModified and .LastItemDeleted times?

Ryan
I like the idea of the job - thanks! When items are edited, I'll enable the job for a minutes time (if it isn't already) and when the job runs, it will update the rollup list. Is it possible to pass in parameters into the job? i.e. process listA from subsite X?
Graeme
I'm in the middle of implementing the Job solution - is it possible to schedule a job to run in a minutes time just once then stop? I see there is scheduling but I can't see how I can just run once and then never again
Graeme
Think I may have found the answer - SPOneTimeSchedule
Graeme