tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
191
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    AlexD1979 AlexD1979 ist offline Mitglied Gold
    Registriert seit
    Feb 2003
    Ort
    Hannover
    Beiträge
    208
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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
    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:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    
    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
    Angehängte Dateien Angehängte Dateien
    Geändert von AlexD1979 (30.08.11 um 10:15 Uhr)
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Als erstes sollten wir mal definieren mit was für einer Datenbank du arbeiten willst. MySQL, Oracle, MS SQL?
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    AlexD1979 AlexD1979 ist offline Mitglied Gold
    Registriert seit
    Feb 2003
    Ort
    Hannover
    Beiträge
    208
    Hallo,
    Sorry, es ist ein MS SQL 2008 R2 Server.

    Was ich schon eingrenzen konnte, aber nicht weiß wie ich es lösen soll ist, dass die gewünschte Kollisiton mit ID 50995 angezeigt wird, wenn ich in der Zeile:

    while (@@fetch_status <> -1)
    begin
    -- Normale Abfrage
    if (@event_event_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1)

    das @weekday=-1 entferne, dann kommt die Kollision mit. Der Wert ist aber 2 durch den SP Aufruf. Leider kommen dann aber auch unerwünschte Ergebnisse mit, die nicht zu meiner Anfrage mit dem Wochentag-Bit = 2 passen.
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Hab zwar kein Schimmer von MS SQL, aber:

    Bitte schreibe deinen Code in die sog. Code-Tags - z.B. [sql][/sql] - die deinen Code formatieren. Danke!
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    AlexD1979 AlexD1979 ist offline Mitglied Gold
    Registriert seit
    Feb 2003
    Ort
    Hannover
    Beiträge
    208
    Zitat Zitat von Yaslaw Beitrag anzeigen
    Hab zwar kein Schimmer von MS SQL, aber:

    Bitte schreibe deinen Code in die sog. Code-Tags - z.B. [sql][/sql] - die deinen Code formatieren. Danke!
    Hallo,
    Na klar mache ich das.

    Viele Grüße
    Alex
     

Ähnliche Themen

  1. Kollisionen mit Xpresso
    Von samurai78 im Forum Cinema 4D
    Antworten: 5
    Letzter Beitrag: 05.09.07, 20:51
  2. Kollisionen?
    Von TOBITULPI im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 19.05.06, 14:27
  3. Quadtrees und Kollisionen in 2D Map
    Von Zhoragh im Forum Java
    Antworten: 0
    Letzter Beitrag: 19.07.05, 01:25
  4. kollisionen
    Von TimN im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 24.01.05, 12:38
  5. Kollisionen mit DDraw
    Von Asmo im Forum Visual Basic 6.0
    Antworten: 0
    Letzter Beitrag: 06.08.04, 11:37

Stichworte