SQLite Trigger для вычисления значения и фильтрации вставки по выражению регистра - PullRequest
0 голосов
/ 29 марта 2020

У меня есть три таблицы с именами "Worker_stock", "Sent_inputs" и "Received_inputs"

CREATE TABLE "Sent_inputs" (
    "ID"         INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Date"       TEXT DEFAULT Datetime('now','%d/%m/%Y'),
    "Name"       TEXT NOT NULL,
    "Material"   TEXT NOT NULL,
    "Amount"     INTEGER NOT NULL
);

CREATE TABLE "Received_inputs" (
    "ID"         INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Date"       TEXT DEFAULT Datetime('now','%d/%m/%Y'),
    "Name"       TEXT NOT NULL,
    "Material"   TEXT NOT NULL,
    "Amount"     INTEGER NOT NULL,
    "Payed"      REAL NOT NULL
);

CREATE TABLE "Worker_stock" (
    "Name"      TEXT NOT NULL,
    "Material"  TEXT NOT NULL,
    "Amount"    REAL NOT NULL,
    PRIMARY KEY("Name", "Material")
);

Я хочу, чтобы при вставке в Received_inputs или Sent_inputs была вставка ( или обновите существующую запись) в таблице Worker_stock.

Проблема в том, что

Для производства productX мне нужно 1 productY и 2 материалA

Для производства productY мне нужно 1 материалB

Если я отправил 100 materialA и 50 из materialB (на основе вставки в Sent_inputs) триггер должен выполнить:

INSERT INTO Employers_stock (Name, Material, Amount)
VALUES ("Jane Doe", "materialA", "100"),
       ("Jane Doe", "materialB", "50");

На следующий день Джейн Доу вернет мне 50 productX (основано на вставке в Received_inputs), и триггер должен выполняться так, чтобы в конце SELECT * FROM Worker_stock; вернул меня:

  Name   | Material  | Amount 
-----------------------------
Jane Doe | MaterialA | 50
Jane Doe | MaterialB | 25

Чем я не полностью закончил было:

CREATE TRIGGER deduce_from_stock AFTER INSERT ON Received_inputs
    BEGIN
        CASE
            WHEN NEW.Material = "productY" THEN
                INSERT OR REPLACE INTO Worker_stock (Name, Material, Amount)
                VALUES (NEW.Name, "materialB", Amount - NEW.Amount);
            WHEN NEW.Material = "productX" THEN
                INSERT OR REPLACE INTO ESTOQUE (Name, Material, Amount)
                VALUES (NEW.Name, "productY", Amount - NEW.Amount);
                INSERT OR REPLACE INTO ESTOQUE (Name, Material, Amount)
                VALUES (NEW.Name, "materialA", Quantidade - (NEW.Quantidade)*2);
        END;
END;

но так как я здесь, это явно не сработало. Что мне здесь не хватает?

...