Announcement

Collapse
No announcement yet.

Schemafehler in Trigger

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

  • Schemafehler in Trigger

    Hallo zusammen,

    Ich bin noch Neuling im Triggern daher ist die Frage vermutlich nicht so komplex für die Könner der Materie.

    Ich habe einen Trigger geschrieben der ein paar Werte abfüllen soll wenn bestimmte Bedingungen erfüllt sind.

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: <Autor>
    -- Create date: <Datum>
    -- Description: <siehe Name>
    -- =============================================
    CREATE TRIGGER Porto_in_dbo.AUF_Dokumente_einfügen_wenn_Position_ Portopflichtig
    ON dbo.AUF_DokumentPos After INSERT
    AS
    BEGIN
    SET NOCOUNT ON

    Declare @Kurs money
    Declare @Artikelnr varchar(50)
    Declare @Portopflicht bit
    Declare @DokNr int
    Declare @Betrag float

    set @DokNr = (Select DokumentNrAUF from inserted)
    set @Artikelnr = (Select isnull(ArtikelNrLAG, 'IstNull') from inserted)
    set @Portopflicht = (Select ArtikelNrLAG from dbo.LAG_Artikel where ArtikelNrLAG = @Artikelnr)
    set @Kurs = (Select Kurs from dbo.AUF_Dokumente where DokumentNrAUF = @DokNr)
    set @Betrag = 99999

    if @Artikelnr != 'istNull'
    Begin
    if @Portopflicht = 1
    Begin
    update dbo.AUF_Dokumente
    set PortoErtrag = '3600' , PortoSW = @Betrag, PortoFW = @Betrag / @Kurs,
    PortoMWStFW = (@Betrag * 0.076) / @Kurs, PortoMWStSW = (@Betrag * 0.076), PortoStCode = 10
    where DokumentNrAUF = @DokNr
    END;
    END;
    END
    GO

    Wenn ich versuche den Trigger zu erstellen kommt folgende Fehlermeldung:

    Meldung 2103, Ebene 15, Status 1, Prozedur AUF_Dokumente_einfügen_wenn_Position_Portopflichti g, Zeile 28
    Erstellen des 'Porto_in_dbo.AUF_Dokumente_einfügen_wenn_Position _Portopflichtig'-Triggers ist nicht möglich, da das Schema nicht mit dem Schema der Zieltabelle oder der Sicht identisch ist.

    Eigentlich bin ich der Meinung das Schema, zumindest die Datentypen, eingehalten zu haben. Wenn ich das mit einem einfachen SQL Statement nachprüfe funktioniert der update:

    update dbo.AUF_Dokumente
    set PortoErtrag = '3600' , PortoSW = 99999, PortoFW = 99999 / 1.55,
    PortoMWStFW = 7599.924 / 1.55, PortoMWStSW = 7599.924, PortoStCode = 10
    where DokumentNrAUF = 100010

    Hat jemand eine Idee wo's bei mir klemmt?

    Gruss
    Opusretis

  • #2
    Hallo Opusretis,

    CREATE TRIGGER Porto_in_dbo.AUF_Dokumente_einfügen_wenn_Position_ Portopflichtig
    ON dbo.AUF_DokumentPos After INSERT

    Das geht schon mal nicht, das Du einen Trigger für eine Tabelle in einem anderen Schema als der Tabelle selbts anlegst (gibt es das Schema überhaupt?) => muss auch dbo sein.

    Umlaute würde ich besser vermeiden, das muss nicht gerade gut gehen. Wenn doch: Objektnamen in eckige Klammern [ ] setzen

    set @DokNr = (Select DokumentNrAUF from inserted)
    Das wird irgendwann zu Laufzeit eine Fehler werfen.
    Ein Trigger wird je Transaktion gezündet, d.h. die virtuelle Tabelle INSERTED kann 1-n Datensätze enhalten.
    Bei der Art der Variablenzuweisung darf das Select aber nur einen einzigen Wert zurückliefern
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Danke für die erste Antwort O.Helper.

      Also das Ziel ist folgendes:
      Wenn in Tabelle dbo.AUF_DokumentePos ein neuer Datensatz geschrieben wird, wird kontrolliert ob es sich hierbei um einen Portopflichtigen Artikel handelt. Wenn ja soll im Portofeld welches sich in der Tabelle dbo.AUF_Dokumente ein Standardporto eingetragen werden.

      Wie würdest Du vorgehen?

      Gruss
      Opusretis

      Comment


      • #4
        Nur zu deiner Fehlermeldung:
        Der kommt vom Punkt im Triggernamen. Ein Punkt hat aber eine Sonderfunktion und sollte daher nicht in einem Namen verwendet werden! Du müsstest entweder
        dbo.[Porto_in_dbo.AUF_Dokumente_einfügen_wenn_Position_ Portopflichtig]
        schreiben (wovon ich nur strikt abraten kann) oder besser
        dbo.Porto_in_dbo_AUF_Dokumente_einfügen_wenn_Posit ion_ Portopflichtig
        bzw.
        dbo.Porto_in_AUF_Dokumente_einfügen_wenn_Position_ Portopflichtig

        Zum Inhalt selber will ich mal nichts sagen, aber du solltest überlegen, entweder zu verhindern, dass mehr als 1 Datensatz in inserted steht oder wie du das machst, wenn mehrere Datesätze in inserted sind. Da geht dann dein jetziges Statement nämlich sicher nicht mehr richtig.

        bye,
        Helmut

        Comment

        Working...
        X