C#餐饮管理系统 加菜模块的改进
这套餐饮管理系统可能已经有年头了,但是作为像我们大学生这样初学者是还是可以的
对于点加菜模块,老师为我们提出了新要求:可以显示菜系的图片,可以查看菜的排名情况
在此做一个简单的总结,关于将图片上传到数据库可以参考C#从数据库上传和下载图片
首先,先来看一下排名的显示
如果我们用程序实现数据库数据的排序是一件非常麻烦的事,当然要选用数据库的sql语句来排序就方便多了,问题是怎么排序。我们很容易知道食物的排名完全要看销量
所以我们不妨在数据库新建一个视图用来显示
create view foodPMasselect Row_Number() over (ORDER BY foodXL DESC) as 排名 ,foodname as 菜名,foodtype as 类别,foodXL as 销量from tb_food,tb_foodtypewhere tb_food.ID = tb_foodtype.ID--这里需要查找两个表,菜系表是一定的,为了客户方便也要说明一下类别所以还需要类别表的信息
最重要的代码就是第一句Row_Number() over (ORDER BY foodXL DESC) as 排名
排名是怎么来的呢?是根据销量(foodXL)来排序的,排序后我们要生成一个新列,利用Row_Number() 函数可以自动形成一个排名,这个函数类似与自增长可以自动的填好排名1,2…
把foodXL参数填进去就可以显示出排名信息了
之后还有一点就是动态更新,在用户输入需要的菜系数量后,要及时的更新销量并重新排名,由此可见使用视图是明智的,我们不需要重复的写代码,如果我们的销量更新也是需要建立数据库连接然后读出数据在更新数据,我认为这没有必要,毕竟这样很麻烦,而且不断的连接数据库也会增大系统的开销,所以建立一个触发器
CREATE TRIGGER food_InsertON [dbo].[tb_GuestFood]after INSERTasBEGINdeclare @number int;SELECT @number = foodsum from inserted;UPDATE tb_foodSET foodXL = foodXL + @numberwhere foodnum in (select foodnum from inserted)END
这里的变量@number是用户点菜的数量,添加触发器后inserted就是插入的记录,我们从插入的记录中查找出数量并赋值给变量,更新的位置就是插入的菜系,之后在更新tb_food表就很容易了而且简单,漂亮。
还有一个问题就是为DataTree控件添加菜名,做的真的是老土,不想说啥了,原文中只给出了四中类别,而且他是逐个列出的,如果该酒店做的很大,很厉害,菜品种类很多呢,一一列出那岂不是要累坏了
所以做了如下改进:
con = DataBase.DataBaseCon.GetConnection();cmd = con.CreateCommand();cmd.CommandText = \"select * from tb_foodtype\";adapter = new SqlDataAdapter(cmd);DataSet dataSet = new DataSet();adapter.Fill(dataSet,\"foodtype\");DataTable table = dataSet.Tables[\"foodtype\"];//先利用datatable来存储类别的信息再遍历类别,为每个类别添加子节点//因为类别的信息放在DataRow中,所以只要读取row中的信息就可以了//这时候再去通过改变sdr来进行每个类别的读取并添加到节点,所以就不用为每个类别都去写了foreach (DataRow row in table.Rows){TreeNode node = tvFood.Nodes.Add(row[\"foodtype\"].ToString().Trim());cmd.CommandText = \"select foodname from tb_food where foodty = \'\" + row[\"ID\"].ToString().Trim() + \"\'\";sdr = cmd.ExecuteReader();while (sdr.Read()){node.Nodes.Add(sdr[\"foodname\"].ToString().Trim());}sdr.Close(); //这里要关闭 因为他们公用一个sdr}tvFood.ExpandAll();//这一句和以上无关,只是判断的时候还要一个一个的判断父节点(类别),也没有必要,所以在这里列举出来//我们只要判断当前点击的节点是不是叶子节点就行了,因为叶子节点代表了具体的菜名称if (tvFood.SelectedNode.Nodes.Count == 0) //当前选择节点的子节点个数为0,代表这个节点是叶子节点
一点关于触发器的
关于Sql Sever触发器和sql有点不同,起码在我的认知范围内,因为我没有很正经的学过sql的编程,只是会用简单的查询和更新语句
在此为MySql的触发器也做一个简单的总结,我也只使用过简单的添加
CREATETRIGGER `员工信息表_insert` AFTER INSERT ON `员工信息表`FOR EACH ROW --AFTER INSERT意思为插入后在员工信息表触发BEGINdeclare qx int default 0;IF(new.`职称`=\'董事长\' OR new.`职称`=\'总经理\')THENSET qx=1;END IF;if(new.`职称`=\'部门经理\')THENSET qx=2;END IF;if(new.`职称`=\'员工\')THENSET qx=3;END IF;INSERT INTO `用户信息表` VALUES (NEW.`工号`, NEW.`联系方式`,\'Image/Headimage.jpg\', qx);END;CREATETRIGGER `员工信息表_update` AFTER UPDATE ON `员工信息表`FOR EACH ROW --修改后触发BEGINdeclare qx int default 0;IF(new.`职称`=\'董事长\' OR new.`职称`=\'总经理\')THENSET qx=1;END IF;if(new.`职称`=\'部门经理\')THENSET qx=2;END IF;if(new.`职称`=\'员工\')THENSET qx=3;END IF;UPDATE `用户信息表`SET `权限`=qxWHERE `工号`=new.`工号`;END;show triggers
这里的new和sqlSever中的inserted效果是一样的,我也不太清楚是为什么写法不一样,也是我对sql不了解不知道具体的用法,网上的例子一查一大堆,大部分都是这样的
这里的MySql触发器是因为需要为每个员工设置成一个系统的用户,初始密码是手机号
并根据不同的职称来判断权限,这样就不用自己使用代码插入了,在修改职称后也是同样更改权限。
- 点赞
- 收藏
- 分享
- 文章举报
醉雪成歌发布了8 篇原创文章 · 获赞 0 · 访问量 198私信关注