Hallo,
Ich habe eine Datenbank, die Termine eines Buchungssystems enthält. Nun habe ich eine SP, die Kollisionen erkennen soll und dementsprechend die IDs der kollidierenden events ausgibt.
Die SP befindet sich im Anhang.
Die Daten sind wie folgt:
Das ist das (Teil-)Ergebnis der Abfrage in Reihe 39 till 44:
Der Aufruf der Funktion ist:
SELECT event_id FROM dbo.checkA('18.10.2011 09:46', '08.11.2011 10:44', 2, 586, 644, null, null, null)
Liefert:
event_id
50316
50965
51874
Aber es sollte ebenso das Event mit der ID 50995 in der Liste sein, denn das ist ein Termin Dienstag 25.10.2011 die die Ressource blockiert und daher eine Kollision gibt.
Hier die SP:
Ich habe eine Datenbank, die Termine eines Buchungssystems enthält. Nun habe ich eine SP, die Kollisionen erkennen soll und dementsprechend die IDs der kollidierenden events ausgibt.
Die SP befindet sich im Anhang.
Die Daten sind wie folgt:
Das ist das (Teil-)Ergebnis der Abfrage in Reihe 39 till 44:
Code:
event_id event_event_type event_series_type event_weekday event_date_from event_time_from event_date_to event_time_to
50648 0 0 NULL 2011-10-19 00:00:00.000 465 2011-10-19 00:00:00.000 1005
50823 0 0 NULL 2011-10-24 00:00:00.000 1080 2011-10-24 00:00:00.000 1200
50877 0 0 NULL 2011-11-03 00:00:00.000 1125 2011-11-03 00:00:00.000 1260
50965 1 1 15 2011-11-02 00:00:00.000 465 2011-12-06 00:00:00.000 990
50995 0 0 NULL 2011-10-25 00:00:00.000 390 2011-10-25 00:00:00.000 1230
50996 0 0 NULL 2011-10-26 00:00:00.000 390 2011-10-26 00:00:00.000 540
51036 0 0 NULL 2011-10-28 00:00:00.000 525 2011-10-28 00:00:00.000 735
SELECT event_id FROM dbo.checkA('18.10.2011 09:46', '08.11.2011 10:44', 2, 586, 644, null, null, null)
Liefert:
event_id
50316
50965
51874
Aber es sollte ebenso das Event mit der ID 50995 in der Liste sein, denn das ist ein Termin Dienstag 25.10.2011 die die Ressource blockiert und daher eine Kollision gibt.
Hier die SP:
SQL:
USE [lkshg4_test]
GO
/****** Object: UserDefinedFunction [dbo].[checkA] Script Date: 08/29/2011 21:47:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[checkA] (@datefrom datetime, @dateto datetime, @weekday int,@timefrom int, @timeto int, @monthly int, @quartal int, @yearly int)
returns @result table (event_id int NOT NULL, chk_from datetime NULL, chk_to datetime NULL, serial int NULL) as
begin
declare @event_id INT
declare @event_series_type int
declare @event_weekday int
declare @event_weekday_ret int
declare @event_date_from datetime
declare @event_time_from int
declare @event_date_to datetime
declare @event_time_to int
declare @event_event_type int
declare @i int
declare @e int
declare @datum1 datetime
declare @datum2 datetime
declare @uhrzeit1 int
declare @uhrzeit2 int
if (@weekday is null) set @weekday=-1
if (@monthly is null) set @monthly = -1
if (@quartal is null) set @quartal =-1
if (@yearly is null) set @yearly = -1
set @uhrzeit1 = @timefrom
set @uhrzeit2 = @timeto
if (@uhrzeit1 is null)
begin
set @uhrzeit1 = cast((datepart(hh, @datefrom)*60)+datepart(mi, @datefrom) as int)
end
if (@uhrzeit2 is null)
begin
set @uhrzeit2 = cast((datepart(hh, @dateto)*60)+datepart(mi, @dateto) as int)
end
declare event_records cursor local for
SELECT event_id, event_event_type, event_series_type, event_weekday, event_date_from, event_time_from, event_date_to, event_time_to
FROM rrv_event
WHERE ( dbo.isEqualNot(@datefrom, @dateto, dbo.getDateFull(event_date_from_internal,event_time_from_internal), dbo.getDateFull(event_date_to_internal,event_time_to_internal))=1 and event_event_type=0)
OR ( event_event_type=1
AND dbo.isEqualNot(dbo.truncDate(@datefrom), dbo.truncDate(@dateto), event_date_from, event_date_to)=1
)
open event_records
fetch next from event_records into @event_id, @event_event_type, @event_series_type, @event_weekday, @event_date_from, @event_time_from, @event_date_to, @event_time_to
while (@@fetch_status <> -1)
begin
-- Normale Abfrage
if (@event_event_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1)
begin
insert into @result (event_id, chk_from, chk_to, serial ) values (@event_id, dbo.getDateFull(@datefrom, @uhrzeit1), dbo.getDateFull(@dateto, @uhrzeit2), 0)
end
-- Täglich
if (@event_event_type=1 and @event_series_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1)
begin
if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
begin
insert into @result (event_id, chk_from, chk_to, serial) values (@event_id, dbo.getDateFull(@datefrom, @uhrzeit1), dbo.getDateFull(@dateto, @uhrzeit2), 1)
end
end
-- Wöchentlich
if (@event_event_type=1 and @event_series_type=1 and @weekday<>-1)
begin
if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
begin
set @event_weekday_ret = 0
set @e = 1
while (@e<129)
begin
if(@event_weekday_ret=0)set @event_weekday_ret = dbo.isEqualInt((@weekday & @e),(@event_weekday & @e))
set @e = @e + @e
end
if(@event_weekday_ret=1) insert into @result (event_id) values (@event_id)
end
end
-- Monatlich
if (@event_event_type=1 and @event_series_type=2 and @monthly <>-1)
begin
if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
begin
if (day(@datefrom)=day(@event_date_from))
begin
if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
begin
insert into @result (event_id) values (@event_id)
end
end
end
end
-- Quartal
if (@event_event_type=1 and @event_series_type=3 and @quartal <>-1)
begin
if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
begin
if ( day(@datefrom)=day(@event_date_from) AND (datediff(mm, @datefrom, @event_date_from) % 3)=0 )
begin
if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
begin
insert into @result (event_id) values (@event_id)
end
end
end
end
fetch next from event_records into @event_id, @event_event_type, @event_series_type, @event_weekday, @event_date_from, @event_time_from, @event_date_to, @event_time_to
-- Jaehrlich
if (@event_event_type=1 and @event_series_type=4 and @yearly <>-1)
begin
if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
begin
if ( day(@datefrom)=day(@event_date_from) AND month(@datefrom)=month(@event_date_from))
begin
if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
begin
insert into @result (event_id) values (@event_id)
end
end
end
end
end
close event_records
deallocate event_records
return
end
Anhänge
Zuletzt bearbeitet von einem Moderator: