トリガーで在庫管理 for InterBase2020

###トリガーで在庫管理 for InterBase2020



####InterBase2020のトリガーを使って在庫の増減のロジックを作成してみる
InterBase バージョン 2020
IBConsole   バージョン 14.0.0.469 (64-Bit Edition)
で試してみました。

-------
####トリガーの仕様
伝票データが追加されたら、商品テープルの在庫を減らし、最終更新日を変更する。
伝票データが削除されたら、商品テープルの在庫を増やし、最終更新日を変更する。

-------
####概念図
![トリガーで在庫数を管理_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/fc35111a-cbcb-148e-0007-024b9beae9c0.png)

-------
####トリガーの仕様
伝票データが追加されたら、商品テープルの在庫を減らし、最終更新日を変更する。
伝票データが削除されたら、商品テープルの在庫を増やし、最終更新日を変更する。

作成するデータベース名　Inventory_Control_test
作成するテーブル
　商品テーブル　tbl_items
　伝票テーブル　tbl_slp2
とします。
-------

####1.　商品テーブルの作成　tbl_items
```sql
create table tbl_items (
	i1_id integer not null primary key,
	i1_name varchar(20),	
	i1_UPDD  date,	
	i1_price integer, 
	i1_stk real, 
	i1_stk2 real
);
```

####2.　伝票テーブルの作成　tbl_items
```sql
create table tbl_slp2(
  s2_date date ,
  s2_id integer , 
  s2_qty real
);
```

####3.　伝票データ追加のトリガーの作成
伝票データが追加されたら、商品テープルの在庫を減らし、最終更新日を変更する。

```sql
CREATE TRIGGER s2ins FOR tbl_slp2
AFTER INSERT
AS
BEGIN
 update tbl_items set i1_stk2 = i1_stk2-new.s2_qty
 ,i1_updd =  current_date
 where i1_id = new.s2_id;
END
```

####4.　伝票データ削除のトリガーの作成
　伝票明細データが削除されたら、商品テープルの在庫を増やし、最終更新日を変更する。

```sql
CREATE TRIGGER s2del FOR tbl_slp2
AFTER DELETE
AS
BEGIN
 update tbl_items set i1_stk2 = i1_stk2+Old.s2_qty 
 ,i1_updd =  current_date
 where i1_id = old.s2_id;
END
```

####5.　商品の初期登録
```sql
insert into tbl_items values (1 , 'さかな',current_date, 1234, 10,0);
insert into tbl_items values (2 , 'テレビ',(select cast('now' as date) from rdb$database), 2222, 20,0);
insert into tbl_items values (3 , '保管庫','2021-02-01', 3333, 30,0);
```
※エラーメッセージ
![err_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/6df55abf-8fdc-b460-6bf2-818c2992088b.png)
<font color="Red">attempted update during read-only transaction</font>
![err_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/0371722a-df04-6fbe-21ed-7da370046667.png)
のエラーとなる場合、read-onlyを解除する必要があるようなので、こちらを参照してみてください。
[interbase 2020 attempted update during read-only transaction](http://a23.sblo.jp/article/188775055.html)

####6.　商品在庫数を確認
```sql
select i1_id,i1_name,i1_price,i1_updd,i1_stk,i1_stk2,(i1_stk+i1_stk2)As stk3 from tbl_items
order by i1_id;
```

####7.　　伝票データの追加　
商品　id　3 を　1
商品　id　1 を　1と2と3を日付を変えて追加
SQL文の記述を少し変えて、2回実行してみます

```sql
INSERT INTO tbl_slp2
    (s2_date,s2_id, s2_qty)
VALUES
    ('2021-02-02',3 , 1),
    ('2021-02-02',1 , 1),
    ('2021-03-03',1 , 2),
    (current_date,1 , 3);
```
![07_err.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/03dc6ebd-6fc6-b5bf-22fa-08cfdc048d00.png)
<font color="Red">この記述は、ダメみたいなので下記に変更</font>

1回目
```sql
insert into tbl_slp2 values ('2021-02-02' ,3 , 1);
insert into tbl_slp2 values ('2021-02-02' ,1 , 1);
insert into tbl_slp2 values ('2021-03-03' ,1 , 2);
insert into tbl_slp2 values (current_date ,1 , 3);
```

2回目

```sql
insert into tbl_slp2 values ('2021-02-02',3 , 2);
insert into tbl_slp2 values ('2021-02-02',1 , 2);
insert into tbl_slp2 values ('2021-03-03',1 , 3);
insert into tbl_slp2 values (current_date ,1 , 4);
```

####8.　伝票データの入力内容を確認　(数量の合計は　18)
```sql
SELECT * FROM tbl_slp2
order by s2_date,s2_id;
```

####9.　商品在庫数を確認 　(入出荷数の合計　-18)
```sql
select i1_id,i1_name,i1_price,i1_updd,i1_stk,i1_stk2,(i1_stk+i1_stk2)As stk3 from tbl_items
order by i1_id;
```

####10.　伝票データのデータ削除
```sql
delete from tbl_slp2 where s2_date='2021-03-03';
```

削除の対象となるのは、商品id=1　数量=2と数量=3　の2行　
('2021-03-03',1 , 2)
('2021-03-03',1 , 3)
明細データの削除の数量は　5

####11.　伝票明細データの入力内容を確認　(数量の合計　13)
```sql
select * from tbl_slp2
order by s2_date,s2_id;
```

####12.　商品在庫数を確認 　(入出荷数の合計　-13)
```sql
select i1_id,i1_name,i1_price,i1_updd,i1_stk,i1_stk2,(i1_stk+i1_stk2)As stk3 from tbl_items
order by i1_id;
```
------
[トリガーで在庫管理 for SQLite3](https://qiita.com/workword_jp/items/481cef535d7423d7435f)
[トリガーで在庫管理 for PostgreSQL13](https://qiita.com/workword_jp/items/77dcf21d97880b30f5a5)
[トリガーで在庫管理 for MySQL8](https://qiita.com/workword_jp/items/3b9fc39a88e1b4bc1b7a)
[トリガーで在庫管理 for MariDB10]
(https://qiita.com/workword_jp/items/8ff77fa84dd19e83cb00)

のInterBase2020版です、SQL文のコピペで動作しますので、データベースでのSQL文の書き方の少しの違いや、データベース初学者の方の参考や業務処理でのヒントになれば幸いでございます。

また、記述に間違いがありましたら、ご指摘ください。

[IBConsoleの画像付きで、もう少し詳しい記事は:a23note](http://a23.sblo.jp/article/188775170.html)