3 Stimmen

SQL Server 2008 - Einfüge-Trigger: Wie man Werte hinzufügt, die nicht in der eingefügten Pseudotabelle sind

Einrichtung

Ich versuche, ein wirklich einfaches System der doppelten Buchführung für ein kleines Unternehmen zu schreiben. Es ist mehr für meine persönliche Ausbildung als alles andere.

Ich habe zwei Tabellen, Transactions y DebitCredits :

    [dbo].[Transactions](
    [TransactionId] [int] IDENTITY(1,1) NOT NULL,
    [TransactionDate] [date] NOT NULL,
    [IdFrom] [int] NOT NULL,
    [IdTo] [int] NOT NULL,
    [Amount] [decimal](18, 2) NOT NULL,
    [IdCostCentre] [int] NOT NULL,
    [IdCurrency] [int] NOT NULL)

...wo IdFrom y IdTo sind FKs für eine Accounts Tabelle, die die Details für jedes Konto enthält. Von und Nach beziehen sich auf die Richtung, in die das Geld fließt. D.h., es wird von Von genommen und an Nach gegeben.

[dbo].[DebitCredits](
    [DebitCreditId] [int] IDENTITY(1,1) NOT NULL,
    [TransactionDate] [date] NOT NULL,
    [IdAccount] [int] NOT NULL,
    [Amount] [money] NOT NULL,
    [DorC] [char](1) NOT NULL)

Was ich will:

Wenn eine Zeile in die Datenbank eingefügt wird Transactions (von einer MVC 3-Website), möchte ich einen Trigger zum Einfügen von zwei Zeilen in DebitCredits :

Reihe der Transaktionen:

1, 01/01/2012, 33, 44, 300, 2, 1

...wo 1 ist die TransactionId das Datum ist das Datum, 33 ist die From Account id und To ist die To Account Id . 300 ist der Betrag, 2 ist ein FK für eine CostCentres-Tabelle und 1 ist die Währung (z. B. argentinische Pesos).

DebitCredits Zeilen:

3, 01/01/2012, 33, -300, "D"
4, 01/01/2012, 44, 300, "C"

Das Problem:

Ich weiß nicht, wie ich die beiden benötigten Einfügeanweisungen in T-SQL ausdrücken kann. Ich kann die Werte einfügen, die ich aus der Transactions Reihe, aber ich kann nicht:

  1. das Vorzeichen des Betrags ändern (300)
  2. Ich weiß nicht, wie ich den Wert für die Spalte DorC (Debit oder Credit) festlegen kann, d.h. "D" oder "C", je nach IdFrom y IdTo Spalten in der Transactions Tisch.

Wohin ich gekommen bin:

ALTER TRIGGER [dbo].[tgInsertDebitCreditRows] ON [dbo].[Transactions]
FOR INSERT
AS
  INSERT INTO DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
     SELECT
        TransactionId, TransactionDate, IdFrom, Amount, "C"
     FROM inserted

  INSERT INTO DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
    SELECT
        TransactionId, TransactionDate, IdTo, Amount, "C"
    FROM inserted

Dies schlägt natürlich fehl, weil SQL Server die Spalten "C" und "D" nicht kennt. Und das sind keine Spalten, sondern nur die (Wunsch-)Werte, die ich einfügen möchte.

Und auch die Beträge wären in beiden Fällen 300, statt -300 und 300.

Haben Sie einen Tipp? (Es versteht sich von selbst, dass ich noch nie in meinem Leben einen Trigger geschrieben habe... ich bin eigentlich eher ein Webentwickler).

3voto

marc_s Punkte 701497

Ich glaube, Sie sind ziemlich nah dran!

  • Offensichtlich schlägt dies fehl, da SQL Server die Spalten "C" und "D" nicht "kennt".

Nun, Sie müssen Folgendes verwenden 'C' y 'D' (einfache Anführungszeichen) als Zeichenkettenliterale zu verwenden - das funktioniert einwandfrei.

  • Und auch die Beträge wären in beiden Fällen 300, statt -300 und 300.

Kein Problem - multiplizieren Sie einfach einen der Beträge mit -1 sein Vorzeichen zu "wechseln".

ALTER TRIGGER [dbo].[tgInsertDebitCreditRows] ON [dbo].[Transactions]
FOR INSERT
AS
    INSERT INTO dbo.DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
       SELECT
          TransactionId, TransactionDate, IdFrom, Amount, 'C'
       FROM inserted

    INSERT INTO dbo.DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
      SELECT
        TransactionId, TransactionDate, IdTo, -1.0 * Amount, 'D'
      FROM inserted

-4voto

Tobias Punkte 1

Sie könnten die Daten aus der "eingefügten" Pseudo-Tabelle in Variablen lesen:

select @nTranId = TransactionId,
       @dTranDate = TransactionDate, and so on...
from   inserted

Stellen Sie Ihr "C" wie folgt ein

set @nDorC = YourValueGoesHere

und dann später in DebitCredits einfügen wie:

INSERT INTO DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
values (@nTranId, @dTrandate, @nIdAccount, @mAmount, @nDorC)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X