しばらくブログを書いていませんでした。
反省。
リハビリがてら、簡単なシステムを作ります。
仕事ではガンガンプログラム書いているので、
ブログに載せる用のリハビリにはまぁ妥当かな、のレベルです。
ちょっとした背景
プログラム自体は家でもいろいろ試して書いてます。
その中でたまにするのが
「〇時間チャレンジ」
〇時間(これは自分で決める)で、
どれくらいのシステムが作れるか、
という、自分の腕試し的な奴です。
設計から考え、システムを完成させます。
今回は少し前に自分で挑戦した、
「6時間チャレンジ」に使った題材、
在庫管理システムをブログにします。
結論、
トータル時間では6時間で完成できました。
(途中色々邪魔が入ったのはノーカンで…)
設計
画面遷移
今回は6画面作ります。

こんな感じ。
大雑把に書いてるので、
細かい作りは途中色々説明します。
各画面、省いてはいますが、
当然遷移用のボタンは必須です。
なお、編集ボタン、以降の編集画面は、
権限を持った人しか触れないことにします。
つまり一般の人は履歴を見るだけ。
テーブル情報
例によって、MySQLを使用します。
スキーマ名はinventory_managementにします。
その中に、テーブルを3つ作成。

*印は主キーです。
(#はミスです、気にしないでください…)
logsテーブルのproduct_idとproductテーブルのproduct_idは
外部キーで関連付けます。
後、今回、productには「商品削除」機能を付けますが、
DELETE文を使いません。
履歴画面で、破棄したかの情報を得たいためです。
なので、削除する時はdiscontinue列にフラグを立てます。
基本非NULL、discontinue列だけNULL許容に。
後、カテゴリーについては今回テーブルに置いていません。
今回はシステム内に情報を持つつもりです。
かなり雑な説明から始まりましたが、作りましょう。
テーブル作成
まずスキーマ作成。
MySQL Workbenchから作成します。
使い方は別のサイトをご参考に。
スクリプト文だと以下のよう。
CREATE SCHEMA `inventory_management` ;続いて作成したスキーマ下に、テーブルを作成。
userテーブル
ユーザテーブルはこのように
CREATE TABLE `inventory_management`.`user` (
`user_id` VARCHAR(5) NOT NULL,
`user_name` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`admin` TINYINT(1) NOT NULL,
PRIMARY KEY (`user_id`))
COMMENT = 'user_id:ユーザID\nuser_name:ユーザ名\npassword:パスワード\nadmin:権限 1=管理者、0=一般';ユーザIDは5桁の数字を文字列として格納します。
adminは1か0か。
productテーブル
続いて商品テーブル
CREATE TABLE `inventory_management`.`product` (
`product_id` VARCHAR(5) NOT NULL,
`product_name` VARCHAR(255) NOT NULL,
`category` VARCHAR(255) NOT NULL,
`unit_price` INT NOT NULL,
`product_count` INT NOT NULL,
`product_alert` INT NOT NULL,
`discontinue` TINYINT(1) NULL,
PRIMARY KEY (`product_id`))
COMMENT = 'product_id:商品ID\nproduct_name:商品名\ncategory:カテゴリー\nunit_price:単価\nproduct_count:在庫数\nproduct_alert:在庫アラート数\ndiscontinue:1=廃棄項目';単価、本当はdouble値の方がいいんでしょうけど、
簡単なシステムのためINT型でご勘弁…。
discontinueだけNULL許容です。
編集の度、product_countの数が変わる仕様です。
product_alertについては固定値。
logsテーブル
履歴テーブルを作成。
CREATE TABLE `inventory_management`.`logs` (
`log_id` INT NOT NULL AUTO_INCREMENT,
`operation` VARCHAR(255) NOT NULL,
`product_id` VARCHAR(5) NOT NULL,
`time_stamp` DATETIME NOT NULL,
PRIMARY KEY (`log_id`))
COMMENT = 'log_id:ログ番号\noperation:操作内容(作成、入庫、出庫、削除)\nproduct_id:対象商品ID\ntime_stamp:タイムスタンプ';コメント記載通り、操作内容は作成、入庫、出庫、削除の4パターンです。
これもシステム内に保持します。
外部キー紐づけ
商品テーブルのproduct_idと履歴テーブルのproduct_idを紐づけます。
ALTER TABLE `inventory_management`.`logs`
ADD INDEX `product_FK_idx` (`product_id` ASC) VISIBLE;
;
ALTER TABLE `inventory_management`.`logs`
ADD CONSTRAINT `product_FK`
FOREIGN KEY (`product_id`)
REFERENCES `inventory_management`.`product` (`product_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;まぁ、特に記載することはないです…。
さて、ここまでできたら、A5M2でER図でも見てみます。

一応、予定通り…なはず。
ユーザ作成
最後に、ユーザ作成だけします。
今回ユーザ作成をシステム内で作ってないので、SQL直打ちです。
権限を持つ人物と、持たない人物をそれぞれ。
つまりadminが1と0を作ります。
INSERT INTO `inventory_management`.`user` (`user_id`, `user_name`, `password`, `admin`) VALUES ('00000', 'Admin User', '16534377278781491704', '1');
INSERT INTO `inventory_management`.`user` (`user_id`, `user_name`, `password`, `admin`) VALUES ('12345', 'General User', '16653392337757490594', '0');パスワードのところ、なんか変な文字列使ってますね(笑)。
これ、後々説明しますが、簡単なパスワードをハッシュ化させた値です。
今回使うハッシュ化関数では、
12345⇒16534377278781491704
aaa⇒16653392337757490594
に変換されます。
なので管理者ユーザの00000さんは12345、
一般ユーザの12345さんはaaaとパスワードを打てばログインできるように。
※試す際は一度ご自身でチェックしてください。
AfxMessageBoxなどでハッシュ後の値をご確認を。

登録されました。
プロジェクト作成
最後にプロジェクト作成&少々設定だけして今回は終了に。
使用するのはVisual Studio 2022です。
そもそもですが、MySQLConnector C++をインストールしていないと始まらないので、
そこはインストール済前提です。
気になる方は、以前記事にしたので、
良ければご参考に。
プロジェクトの新規作成から、MFCアプリを選択。
名前はInventoryManagementSystemに。

アプリケーションの種類は「ダイアログベース」で作成。

できました。
毎度のことながら、
個人情報載ってないよなーって確認するの、ちょっと疲れますね…。
そういうの、設定で表示非表示切り替えることができればいいのに、って思いますが。
忘れないうちに、Releaseモードに切り替えます。
なんでかって?
昔、Debugモードで試して、散々な目に会ったんですよ…。
プロジェクトのプロパティを選択。
インクルードディレクトリ
「C/C++」→「全般」から、
「追加のインクルードディレクトリ」を選択。
次のパスを入れます。
C:\Program Files\MySQL\MySQL Connector C++ 8.0\include
これは、ご自身がどこにインストールしたか、
どのバージョンをインストールしたかでパス名が変わるはずなので、
そこは自身の端末を確認してください。
ライブラリディレクトリ
「リンカー」→「全般」から、
「追加のライブラリディレクトリ」を選択。
次のパスを。
C:\Program Files\MySQL\MySQL Connector C++ 8.0\lib64\vs14
これも先と同様です。
次で紹介しますが、
要はmysqlcppconn.libが入っているパスを指定します。
追加の依存ファイル
「リンカー」→「入力」から、
「追加の依存ファイル」を選択。
使用するライブラリを入力します。
mysqlcppconn.lib
後は適用を押し、OKボタンで閉じます。
最後に念のため、ビルドを通して
エラーが出てこなければ設定完了。
終わりに
今回はここまで。
在庫管理システムを作り始めました。
いやはや、久々にプログラムブログ書くと、
ちょっと時間かかっちゃいます….。
実は、別のプラットフォームで
趣味記事を書き始めてはいます。
なので「ブログを書く」こと自体は継続しているのですが。
流石にプログラムそっちのけにするわけにはいかなかったので、
ひとまずこちらに戻ります。
一応目安は、3日に1回投稿、6~8回で完結、です。

コメント