LoginSignup
4
4

More than 1 year has passed since last update.

トリガーで在庫管理 for SQLite3

Posted at

SQLite3のトリガーを使って在庫の増減のロジックを作成してみる

SQLite バージョン 3.35.5.
DB Browser for SQLite バージョン 3.12.2
で試してみました。


トリガーの仕様

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


概念図

トリガーで在庫数を管理_10.png


トリガーの仕様

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


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


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

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

create table tbl_slp2(
    s2_date datetime ,
    s2_id   integer , 
    s2_qty  real
);

3. 伝票データ追加のトリガーの作成

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

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. 伝票データ削除のトリガーの作成

 伝票明細データが削除されたら、商品テープルの在庫を増やし、最終更新日を変更する

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. 商品の初期登録

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. 商品在庫数を確認

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回実行してみます

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回目

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)

SELECT * FROM tbl_slp2
order by s2_date,s2_id;

9. 商品在庫数を確認  (入出荷数の合計 -18)

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. 伝票データのデータ削除

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)

select * from tbl_slp2
order by s2_date,s2_id;

12. 商品在庫数を確認  (入出荷数の合計 -13)

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4