アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

python 在庫管理システムを作ってみた

pythonTkinterの使い方が慣れてきたので、ここで以前からやってみたかった「在庫管理システム」を作ってみる。

中身はたいしたことはなく、

CSVファイル読込み、sqlite3(DB)に格納

Tkinter/TreeViewに表示

Tkinter/Entryに表示、入力、sqlite3(DB)に書き込み

というだけ。

 

◆在庫管理ウィジェット

f:id:game-allergy:20210901180010j:plain

 

ウィジェットの説明

f:id:game-allergy:20210901182805j:plain

ウィジェットは、大きく分けて4ブロックに分かれている。

・button

・Entry(TreeView上でマウスクリック選択したものを表示)

・TreeView(DBから呼び出した情報)

・TreeView2(TreeViewの情報をまとめ集計した情報)

 

要は、TreeViewがメインの情報表示箇所で、TreeView2はその補足情報。

情報の書き換えは、Entryから行うって感じ。

ただ、Entryを真っ白な状態から自分で書いていくのはムリゲーなので、TreeView情報をマウスでクリックしてEntryに選択した情報が入ってくるようにしてある。これで書込みは楽になるはず。

 

CSVファイルを読み込む

f:id:game-allergy:20210901180048j:plain

初期のデータベースへの情報書込みは、CSVファイルから行う。

とりあえずCSVファイル読み込めばデータベースに入る。

ただし、ordernum(発注番号)が重複していると処理しないので注意。

※DB側でunique設定にしているため

この手の発注CSVファイルって、発注番号が連番で吐き出しているから同じ番号が発行されることはない。そのため、このようにはじく処理をしている。

これで、「データベース内には同じ発注番号のものはない」という仕組みになる。

 

◆データベースからウィジェットに情報呼び出し

f:id:game-allergy:20210901180126j:plain

 

 

◆データベースからウィジェットに情報呼び出し(pj単位に絞り込み)

f:id:game-allergy:20210901180212j:plain

データベースにはどんどこ情報が入っていくが、pjname(プロジェクトごと)で管理をしていく仕組みを想定。プロジェクトごとに1つの組立製品を製造するとし、それに関係する部品が発注/納入されて、数量管理をするようにしている。

 

◆データベースからウィジェットに情報呼び出し(category単位に絞り込み)

f:id:game-allergy:20210901180239j:plain

categoryは、「assy」「parts」の2種あり、assyは組立品で要はクライアントへ納入するべき完成品のこと。そのため、assyでフィルタすると、クライアントから依頼されている、された組立品の一覧になる。

 

◆データベースへ書き込み(データ更新)

f:id:game-allergy:20210901180316j:plain

 

f:id:game-allergy:20210901180333j:plain

 

肝心なことは、工場に納入された部品に関してその内訳を記載、現状の部品数を確認できるようにすることだ。これを操作する人は「工場の責任者」という視点なので。

 

 

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

◆感想

作ってみてどうだったか。

ある程度ひな型ができているとはいえ、今回もそれなりに苦労した。。。

システム開発やってる人ってすごいな。。。

 

Tkinterの選択状態について

f:id:game-allergy:20210901180420j:plain

マウスでクリックした箇所は青色になって見やすくなる。

これはいたって当たり前のこと。

しかし、これを実現するのにすげ~ハマった。

 

というのも、元々の仕組みが良くなかった…

このウィジェット、書込み指示をすると、データベースへ書込み、TreeViewはいったん全消しして、そのあとにデータベースから再読み込みで持ってくる…ということにしていたので、、、書込み前の情報を覚えておいて、どうやって書込み/呼び出した情報上で青色表示するか…こんなややこしいことをやる仕様にしてしまったのがまずかったなぁ。

 

解決策として、

・書込み前にidを覚えておく(idはデータベース上で使用、重複しない数字)

・TreeViewへinsertするときに、iidとidをセットで持ってくる

・idでマッチングし、iidを突き止める

・focus(iid)、selection_set(iid)で選択状態にする

 

いろいろやってみて驚いたのが、TreeViewのiidって、呼び出すごとに連番になるのね。書き込み前のiidと、書込み後のiidを見てマッチングしようと思ったら連番~~~、そんなぁ~~~みたいな(汗)

なので、上記のような面倒なマッチングをかけている。

 

あややこしい、後でスクリプト載せよう。。

 

◆そのほか

リスト、タプル、辞書について理解が深まってきた。

なるほどなるほど。

またdetaframeの便利さが分かってきた。

というか、このあたりの扱いが分からないとデータの授受ができないし。

 

いや~pythonって分かりやすいな~。

 

もとはVBAからコードに興味が出てプログラミング始めたけど、今になってVBAを思い起こすと、、、もうVBAいじりたくなくないなぁ。

配列の扱いに不便なところがあるし、ユーザーフォームもいちいち書くことが多くて面倒。大昔の簡易的なスクリプト?と比較するのもおかしな話だけど…。

 

あ~、python使いやすい~。

個人的にはswitch文が欲しかったけどな~。