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:
- das Vorzeichen des Betrags ändern (300)
- 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
yIdTo
Spalten in derTransactions
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).