Announcement

Collapse
No announcement yet.

Problem mit Insert Trigger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Insert Trigger

    Hallo!

    Ich habe mal wieder eine Frage und zwar soll bei einem Insert überprüft werden, ob das vonDatum zwischen vonDatum und bisDatum schon vorhanden ist und die verz_ID auch schon vorhanden ist. Das soll die letzte Zeile überprüfen. Ist sie schon vorhanden darf die Zeile nicht eingefügt werden und es sollte eine Fehlermeldung ausgegeben werden.

    Der erste Teil setzt eigentlich nur das bisDatum auf 31.12.2099.

    Leider kann man trotz der letzten Zeile immer noch mehrere Zeilen mit der gleichen verz_ID und wo das vonDatum zwischen dem vDatum und dem bDatum liegt einfügen.

    Code:
    ALTER TRIGGER [dbo].[ProdZuOrdnung] 
       ON  [dbo].[ProdZuOrdnung]
       AFTER INSERT
    AS 
    update p
    set bDate = isnull( ( select top 1 dateadd(day, -1, p2.vDate) 
    		from dbo.ProdZuOrdnung p2 
    		where p2.Verz_ID = p.Verz_ID and p2.vDate > p.vDate
    		order by p2.vDate asc ), 
    		convert( datetime, '2099-12-31', 120 ) )
    
    from inserted i
    inner join dbo.ProdZuOrdnung p on p.ProdZuOrdnung_ID = i.ProdZuOrdnung_ID
    where  i.vDate not between p.vDate AND p.bDate AND i.Verz_ID = p.zugverz_ID
    Danke im Vorraus

  • #2
    where i.vDate not between p.vDate AND p.bDate
    AND i.Verz_ID = p.zugverz_ID
    so?
    Code:
    where  i.vDate not between p.vDate AND p.bDate 
    AND  NOT  EXISTS (SELECT  * FROM [dbo].[ProdZuOrdnung] P
    WHERE i.Verz_ID = p.zugverz_ID
    )

    Comment


    • #3
      hallo ebis,

      danke für die Antwort, es kann die verz_ID aber schon vorhanden sein, zb:

      verz_ID: vonDatum: bisDatum:
      1 1.1.2008 1.2.2008
      1 2.2.2008 31.12.2099

      hast du vielleicht noch eine Idee?

      Comment


      • #4
        Bin mir zwar nicht sicher ob ich dein Problem richtig verstanden habe,
        aber ich würde das einfach über zwei verschachtelte IF anweisungen machen.

        Code:
        IF i.vDate BETWEEN p.vDate AND p.bDate
        BEGIN
        IF i.Verz_ID = p.zugverz_ID (PRINT 'Fehler, ID schon vorhanden!')
        else 
        BEGIN
        update p
        set bDate = ....
        END
        END
        So in etwa zumindest. Vielleicht hilft dir das ja weiter...
        Achja, für mich sieht das auf den ersten Blick so aus also möchtest du hiermit:
        Code:
        ( select top 1 dateadd(day, -1, p2.vDate) 
        		from dbo.ProdZuOrdnung p2 
        		where p2.Verz_ID = p.Verz_ID and p2.vDate > p.vDate
        		order by p2.vDate asc )
        das kleinste Datum finden...
        Das würde ich über die MIN() funktion machen...

        Comment


        • #5
          Danke für die Antwort hat mir schon weitergeholfen.

          Übrigens, hier fehlt nur die letzte Zeile:

          Code:
          ( select top 1 dateadd(day, -1, p2.vDate) 
          		from dbo.ProdZuOrdnung p2 
          		where p2.Verz_ID = p.Verz_ID and p2.vDate > p.vDate
          		order by p2.vDate asc ),
          nämlich :

          Code:
          convert( datetime, '2099-12-31', 120 ) )
          Es setzt das Datum immer auf 31.12.2099

          Comment

          Working...
          X