MFCで在庫管理システム作成 1

しばらくブログを書いていませんでした。

反省。

リハビリがてら、簡単なシステムを作ります。

仕事ではガンガンプログラム書いているので、
ブログに載せる用のリハビリにはまぁ妥当かな、のレベルです。

ちょっとした背景

プログラム自体は家でもいろいろ試して書いてます。

その中でたまにするのが
「〇時間チャレンジ」

〇時間(これは自分で決める)で、
どれくらいのシステムが作れるか、
という、自分の腕試し的な奴です。

設計から考え、システムを完成させます。

今回は少し前に自分で挑戦した、
「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回で完結、です。

MFCで在庫管理システム作成 2
前回までの記事。ユーザ情報・カテゴリーまずは、ユーザに関する情報ユーザID、ユーザ名、ユーザ権限の変数とゲットセット関数を作ります。ついでに、今回カテゴリーはシステム内に保持させるので、それも作成。InventoryManagementSy...

コメント

タイトルとURLをコピーしました