1.课设要求描述
●实现物料的分类管理;
●实现部门和员工信息管理;
●实现物料的入库和领用管理;
●实现物料的转仓管理;
●创建触发器,实现物料入库和领用时相应物料库存的自动更新;
●创建触发器,实现转仓时转入仓库物料增加、转出仓库物料减少;
●创建存储过程统计各仓库各种物料的现存数量;
●创建存储过程统计指定时间段内各种物料的入库数量和领用数量;
●建立数据库相关表之间的参照完整性约束;
2.制作思路及基础讲解
此项目主要是用于完成大二下半学期的数据库课设,随手记录。技术面大二下之前只学过Java,MySQL/SQLServer。所以此项目没有前端界面,只通过命令行的形式来操作该系统,制作思路:首先是数据库作为存储数据的地方,编写根据课设要求编写好对应的建表语句和存储过程,视图,触发器等。然后编写好对应系统的Java代码,最后通过JDBC将Java代码与数据库连接起来。
部分学生可能学的比较浅,不理解mysql,sqlserver,java,c等一堆名词之间的含义。之前有同学找我做过这类似的课设。问的问题都比较抽象,例如用mysql做一个系统之类的。在此简单说一下我对于这些的理解,mysql,sqlserver都是数据库的一种,只不过是外国的所以都是用英文表示,大部分上课不听的同学看到这一堆英文都会比较懵,其实只需简单把数据库(mysql,SQLServer)理解成存储数据的地方,而java,c等语言是用来编写系统逻辑功能的代码。当然在数据库中的存储过程或者触发器什么的,这些功能也能在代码编程语言中通过特定的逻辑实现类似的功能,只不过我们在数据库中写好的话,免去了Java中代码的编写量,并且查询时速度会更快。
3.使用工具及语言详解
不同的学校要求不同,有的是sqlserver,有的是mysql,但其实这两者的区别在我看来区别不大,大部分的语句格式都是一样的,所以我选择了我熟悉的一种,mysql来进行编写。在语言方面,我大一的时候学过c,但是当时没有认真听,后来也慢慢都忘了,大二时学了Java,并且之后又系统性的学了一遍,所以选择来用Java语言编写。对于编译器我使用的是IDEA,版本随意,这个不影响,但需要注意IDEA不是免费的,可以去试用30天,也可以自行网上找方法安装破解版。数据库可视化工具使用的是Navicat,这个工具同样也不是免费的,但提供14天试用期,有长期需求也需要各位自行找破解版。
PS:这里又提到两个新名词,IDEA和Navicat,这不是编程语言,而是工具的名字,大家需要慢慢熟悉这些名词,简单来说就是他能让你的编程之路变得更顺畅,提供了可视化的界面,不需要一直在黑窗口中输入代码
4.数据库建表代码
-- 创建数据库
CREATE DATABASE IF NOT EXISTS MaterialManagement;
USE MaterialManagement;
-- 创建物料分类表
CREATE TABLE MaterialCategories (
CategoryID INT AUTO_INCREMENT PRIMARY KEY,
CategoryName VARCHAR(255) NOT NULL,
Description TEXT
);
-- 创建部门表
CREATE TABLE Departments (
DepartmentID INT AUTO_INCREMENT PRIMARY KEY,
DepartmentName VARCHAR(255) NOT NULL,
Location VARCHAR(255)
);
-- 创建员工表
CREATE TABLE Employees (
EmployeeID INT AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(255) NOT NULL,
DepartmentID INT,
FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
);
-- 创建仓库表
CREATE TABLE Warehouses (
WarehouseID INT AUTO_INCREMENT PRIMARY KEY,
WarehouseName VARCHAR(255) NOT NULL,
Location VARCHAR(255)
);
-- 创建物料表
CREATE TABLE Materials (
MaterialID INT AUTO_INCREMENT PRIMARY KEY,
MaterialName VARCHAR(255) NOT NULL,
CategoryID INT,
FOREIGN KEY (CategoryID) REFERENCES MaterialCategories(CategoryID)
);
-- 创建物料库存表
CREATE TABLE MaterialStock (
StockID INT AUTO_INCREMENT PRIMARY KEY,
MaterialID INT,
WarehouseID INT,
Quantity INT,
FOREIGN KEY (MaterialID) REFERENCES Materials(MaterialID),
FOREIGN KEY (WarehouseID) REFERENCES Warehouses(WarehouseID)
);
-- 创建物料入库记录表
CREATE TABLE MaterialInbound (
InboundID INT AUTO_INCREMENT PRIMARY KEY,
MaterialID INT,
WarehouseID INT,
Quantity INT,
InboundDate DATETIME,
FOREIGN KEY (MaterialID) REFERENCES Materials(MaterialID),
FOREIGN KEY (WarehouseID) REFERENCES Warehouses(WarehouseID)
);
-- 创建物料领用记录表
CREATE TABLE MaterialIssue (
IssueID INT AUTO_INCREMENT PRIMARY KEY,
MaterialID INT,
EmployeeID INT,
Quantity INT,
IssueDate DATETIME,
FOREIGN KEY (MaterialID) REFERENCES Materials(MaterialID),
FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
);
-- 创建物料转仓记录表
CREATE TABLE MaterialTransfer (
TransferID INT AUTO_INCREMENT PRIMARY KEY,
MaterialID INT,
FromWarehouseID INT,
ToWarehouseID INT,
Quantity INT,
TransferDate DATETIME,
FOREIGN KEY (MaterialID) REFERENCES Materials(MaterialID),
FOREIGN KEY (FromWarehouseID) REFERENCES Warehouses(WarehouseID),
FOREIGN KEY (ToWarehouseID) REFERENCES Warehouses(WarehouseID)
);
-- 创建触发器,物料领用时自动更新库存
DELIMITER //
CREATE TRIGGER AfterMaterialIssue
AFTER INSERT ON MaterialIssue
FOR EACH ROW
BEGIN
-- 声明变量以存储MaterialStock表中对应记录的ID
DECLARE stock_id INT;
-- 通过MaterialID查找对应的MaterialStock记录的ID
SELECT StockID INTO stock_id FROM MaterialStock
WHERE MaterialID = NEW.MaterialID
LIMIT 1;
-- 使用找到的ID来更新MaterialStock表的Quantity字段
UPDATE MaterialStock
SET Quantity = Quantity - NEW.Quantity
WHERE StockID = stock_id;
END; //
DELIMITER ;
-- 创建触发器,物料入库时自动更新库存
DELIMITER //
CREATE TRIGGER AfterMaterialInbound
AFTER INSERT ON MaterialInbound
FOR EACH ROW
BEGIN
UPDATE MaterialStock
SET Quantity = Quantity + NEW.Quantity
WHERE MaterialID = NEW.MaterialID AND WarehouseID = NEW.WarehouseID;
END; //
DELIMITER ;
-- 创建触发器,物料转仓时自动更新库存
DELIMITER //
CREATE TRIGGER AfterMaterialTransfer
AFTER INSERT ON MaterialTransfer
FOR EACH ROW
BEGIN
UPDATE MaterialStock
SET Quantity = Quantity - NEW.Quantity
WHERE MaterialID = NEW.MaterialID AND WarehouseID = NEW.FromWarehouseID;
UPDATE MaterialStock
SET Quantity = Quantity + NEW.Quantity
WHERE MaterialID = NEW.MaterialID AND WarehouseID = NEW.ToWarehouseID;
END; //
DELIMITER ;
-- 创建存储过程统计各仓库各种物料的现存数量
DELIMITER //
CREATE PROCEDURE GetMaterialStockSummary()
BEGIN
SELECT MaterialID, MaterialName, WarehouseID, SUM(Quantity) AS TotalStock
FROM MaterialStock
JOIN Materials ON MaterialStock.MaterialID = Materials.MaterialID
GROUP BY MaterialID, WarehouseID;
END; //
DELIMITER ;
-- 创建存储过程统计指定时间段内各种物料的入库数量和领用数量
DELIMITER //
CREATE PROCEDURE GetMaterialInboundAndIssueSummary(IN startDate DATETIME, IN endDate DATETIME)
BEGIN
SELECT MaterialID, SUM(Quantity) AS TotalInbound, 0 AS TotalIssue
FROM MaterialInbound
WHERE InboundDate BETWEEN startDate AND endDate
GROUP BY MaterialID
UNION ALL
SELECT MaterialID, 0 AS TotalInbound, SUM(Quantity) AS TotalIssue
FROM MaterialIssue
WHERE IssueDate BETWEEN startDate AND endDate
GROUP BY MaterialID;
END; //
DELIMITER ;
5.Java代码思路及结构
此处只放部分代码截图