SQL Server 2008 - триггер вставки: как добавить значения, отсутствующие во вставленной псевдо-таблице - PullRequest
3 голосов
/ 15 июля 2011

Настройка

Я пытаюсь написать действительно простую систему учета двойной записи для малого бизнеса.Это больше для моего личного обучения, чем для чего-либо еще.

У меня есть два стола: Transactions и 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)

... где IdFrom и IdToявляются FK для таблицы Accounts, которая содержит данные для каждой учетной записи.From и To относятся к направлению, в котором идут деньги. То есть их берут из From и дают To.

[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)

Что я хочу:

Когда строка вставляется в Transactions (с веб-сайта MVC 3), я хочу, чтобы триггер вставлял две строки в DebitCredits:

Строка транзакций:

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

...where 1 - это TransactionId, дата - это дата, 33 - это From Account id, а To - To Account Id.300 - это сумма, 2 - это FK для таблицы CostCentres, 1 - это валюта (например, аргентинские песо).

Строки DebitCredits:

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

Проблема:

Я не знаю, как выразить в T-SQL те два оператора вставки, которые мне нужны.Я могу вставить значения, полученные из строки Transactions, но не могу:

  1. изменить знак суммы (300)
  2. Я не знаю, какустановить значение для столбца DorC (дебет или кредит), т. е. «D» или «C», в зависимости от столбцов IdFrom и IdTo в таблице Transactions.

Где я попал:

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

Очевидно, что это не удается, поскольку SQL Server не «знает» столбцы «C» и «D».И это не столбцы, это просто значения (выражения желаний), которые я хочу вставить.

А также суммы будут 300 в обоих случаях вместо -300 и 300.

Есть указатели?(Само собой разумеется, что я никогда не писал триггер в своей жизни ... на самом деле больше веб-разработчика).

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Я думаю, что вы довольно близки, на самом деле!

  • Очевидно, что это не удается, потому что SQL Server не «знает» столбцы «C» и «D».

Ну, вам нужно использовать 'C' и 'D' (одинарные кавычки) в качестве строковых литералов - это будет прекрасно работать.

  • А также суммы будут 300 в обоих случаях вместо -300 и 300.

Нет проблем - просто умножьте одну из сумм на -1, чтобы "поменять" ее знак.

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
0 голосов
/ 15 июля 2011

Вы можете прочитать данные из «вставленной» псевдотаблицы в переменные:

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

Установите «C» как

set @nDorC = YourValueGoesHere

, а затем позже вставьте в дебетовые кредиты, как:

INSERT INTO DebitCredits
        (IdTransaction, TransactionDate, IdAccount, Amount, DorC)
values (@nTranId, @dTrandate, @nIdAccount, @mAmount, @nDorC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...