トリガーで在庫管理 for SQLite3

###SQLite3のトリガーを使って在庫の増減のロジックを作成してみる
SQLite バージョン 3.35.5.
DB Browser for SQLite バージョン 3.12.2
で試してみました。

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

---------------
####概念図
![トリガーで在庫数を管理_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88517/995865b0-30f5-befd-c7e7-3e7007c1f6c7.png)


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

---------------

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

---------------
####1.　商品テーブルの作成　tbl_items

```sql
create table tbl_items (
	i1_id    integer primary key,
	i1_name  text, 
	i1_updd  datetime,	
	i1_price integer, 
	i1_stk   real, 
	i1_stk2  real
);
```
----
####2.　伝票テーブルの作成　tbl_items

```sql
create table tbl_slp2(
	s2_date datetime ,
	s2_id   integer , 
	s2_qty  real
);
```
--------------------------------------------------
####3.　伝票データ追加のトリガーの作成
伝票データが追加されたら、商品テープルの在庫を減らし、最終更新日を変更する。

```sql
create trigger s2ins insert on tbl_slp2
begin
 update tbl_items set i1_stk2 = i1_stk2-new.s2_qty,
 i1_updd = date('now') 
 where i1_id = new.s2_id;
end;
```
--------------------------------------------------
####4.　伝票データ削除のトリガーの作成
　伝票明細データが削除されたら、商品テープルの在庫を増やし、最終更新日を変更する

```sql
create trigger s2del delete on tbl_slp2
begin
 update tbl_items set i1_stk2 = i1_stk2+Old.s2_qty,
 i1_updd = date('now') 
 where i1_id = old.s2_id;
end;
```
--------------------------------------------------
####5.　商品の初期登録

```sql
insert into tbl_items values (1 , 'さかな',date('2021-02-01'), 1234, 10,0);
insert into tbl_items values (2 , 'テレビ',date('2021-03-01'), 2222, 20,0);
insert into tbl_items values (3 , '保管庫',date('now'), 3333,  30,0);
```
--------------------------------------------------
####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),
	(date('now') ,1 , 3);
```
2回目

```sql
insert into tbl_slp2 values (date('2021-02-02'),3 , 2);
insert into tbl_slp2 values (date('2021-02-02'),1 , 2);
insert into tbl_slp2 values (date('2021-03-03'),1 , 3);
insert into tbl_slp2 values (date('now')       ,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=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;
```
-----------------------------------------------------------

#####こういった使用方法も、業務処理でのヒントになれば幸いでございます、また、記述に間違いがありましたら、ご指摘ください。


[DB Browser for SQLiteの画像付きで、もう少し詳しい記事は : a23note](トリガーで在庫管理 SQLite3)