UFN_CONFLICTCHECK_GETLOCATIONCONFLICTSFORMULTIPLETIMES
For a large amount of non overlapping events with dates, return all events with location conflicts.
Return
Return Type |
---|
table |
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@EVENTDATES | xml | IN | |
@LOCATIONS | xml | IN |
Definition
Copy
CREATE function dbo.UFN_CONFLICTCHECK_GETLOCATIONCONFLICTSFORMULTIPLETIMES
(
@EVENTDATES xml,
@LOCATIONS xml
)
returns @CONFLICTS TABLE
(
EVENTID uniqueidentifier
)
as
begin
declare @EVENTDATESTABLE table
(
EVENTID uniqueidentifier,
STARTDATETIME datetime,
ENDDATETIME datetime
)
insert into @EVENTDATESTABLE
select
T.c.value('(EVENTID)[1]','uniqueidentifier') as 'EVENTID',
T.c.value('(STARTDATETIME)[1]','datetime') as 'STARTDATETIME',
T.c.value('(ENDDATETIME)[1]','datetime') as 'ENDDATETIME'
from @EVENTDATES.nodes('/EVENTDATES/ITEM') T(c)
--Build a table of the locations based on the xml passed in
declare @LOCATIONSTABLE table
(
LOCATIONID uniqueidentifier
)
insert into @LOCATIONSTABLE (LOCATIONID)
select
T.c.value('(EVENTLOCATIONID)[1]','uniqueidentifier')
from @LOCATIONS.nodes('/LOCATIONS/ITEM') T(c)
-- Check the events to see if we have any conflicts
insert into @CONFLICTS(EVENTID)
select distinct
EVENTDATES.EVENTID
from
(
select
EVENT.ID as ID,
EVENT.STARTDATETIME as STARTDATETIME,
EVENT.ENDDATETIME as ENDDATETIME
from dbo.EVENT
left outer join dbo.PROGRAMEVENTLOCATION on
EVENT.ID = PROGRAMEVENTLOCATION.EVENTID
left outer join dbo.PROGRAM on
EVENT.PROGRAMID = PROGRAM.ID
inner join @LOCATIONSTABLE as CONFLICTPROGRAMEVENTLOCATION on
CONFLICTPROGRAMEVENTLOCATION.LOCATIONID = PROGRAMEVENTLOCATION.EVENTLOCATIONID or
EVENT.EVENTLOCATIONID = CONFLICTPROGRAMEVENTLOCATION.LOCATIONID
where
(PROGRAM.ISACTIVE = 1 or EVENT.PROGRAMID is null)
union all
select
ITINERARYITEM.ID as ID,
ITINERARYITEM.STARTDATETIME as STARTDATETIME,
ITINERARYITEM.ENDDATETIME as ENDDATETIME
from dbo.ITINERARYITEM
inner join dbo.ITINERARY on
ITINERARYITEM.ITINERARYID = ITINERARY.ID
inner join dbo.SALESORDER on
SALESORDER.ID = ITINERARY.RESERVATIONID
inner join @LOCATIONSTABLE as CONFLICTLOCATIONS on
ITINERARYITEM.EVENTLOCATIONID = CONFLICTLOCATIONS.LOCATIONID
where
SALESORDER.STATUSCODE <> 5 and -- No cancelled reservation locations
ITINERARYITEM.INVALIDREASONCODE = 0 and -- Make sure that the itinerary item does not have an invalid reason
ITINERARYITEM.ITEMTYPECODE <> 3 and -- Make sure the itinerary item is showing as scheduled
(
ITINERARYITEM.ITEMTYPECODE <> 2 or ITINERARYITEM.BLOCKEVENT = 1 --Make sure the item is either not a custom item, if it is a custom item only count it if the location is marked busy
)
) as LOCATIONS
inner join @EVENTDATESTABLE as EVENTDATES on
(
(EVENTDATES.STARTDATETIME >= LOCATIONS.STARTDATETIME and EVENTDATES.STARTDATETIME < LOCATIONS.ENDDATETIME) or
(EVENTDATES.ENDDATETIME > LOCATIONS.STARTDATETIME and EVENTDATES.ENDDATETIME <= LOCATIONS.ENDDATETIME) or
(EVENTDATES.STARTDATETIME < LOCATIONS.STARTDATETIME and EVENTDATES.ENDDATETIME > LOCATIONS.ENDDATETIME)
)
return;
end