前言
紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善_c#web程序设计-CSDN博客
统计功能是管理系统很常见的功能,例如仓库管理系统要统计某时间段的出入库以整合利润情况,再例如论文管理系统要统计男女生的分数情况等等
不可否认的是其实现思路与上一篇实现的出库管理功能中的【查询】按钮的功能基本相同,都是通过编写按钮的脚本,实现select查询sql语句,然后将查询的结果通过合适的控件显示出来
一,新建tj(统计的拼音)文件夹
希望你养成这个好习惯,将不同功能的脚本分门别类的放在不同的文件夹中
创建一个【包含母版页的Web窗体】,将其命名为tjgl.aspx(统计管理)
点击添加后再弹出的【选择母版页】窗口中选择唯一一个母版页Site.Master
二,添加控件并配置控件
按具体需求添加控件并给出配置
表格的设置就不赘述了,相信看到这里的你应该都懂这些套路了
用到的控件,【DropDownList】,,【Button】,和一个【Panel】
前两样都是老朋友,【Panel】的作用是方便我们能显示查询的结果
然后我们添加一些【Label】控件,来显示对应的想要的结果,你可以做一些个性化的设置,例如将利润标红显示,在属性的【Font】对字体大小进行设置,【ForeColor】设置颜色,很简单,你试试就知道了
三,DropDownList配置
(一)下拉菜单选择货品
我们希望*按货品统计*之后的下拉菜单的选项中,能够自动显示出数据库中拥有的货品,该怎么做?希望你还有印象,因为这个问题在上一篇中是完整实现过的!
为货品号这个字段的下拉式菜单添加一个新的数据源,流程和前面配置数据源时基本一致
到【配置Select语句】这个窗口时注意切换成货品表
自定义语句只需要一条查询语句,此处的查询语句读者根据自己的管理系统来决定想要查询的内容
此处采用一种“货品号和货品名绑定显示”的查询机制,因此使用了如下这条SQL语句
select hno, concat(hno, hname) as hpm from hpb
(二)下拉菜单选择年份
同理,需要只显示数据库中出现过出入库操作的年份
年份的数据源配置,其它都是一样的,主要是*自定义Select语句*
select distinct year(rk_date) as rkn from rkb union
select distinct year(ck_date) as ckn from ckb
解释一下这里的sql,分别是查询入库表*rkb*中的入库日期的年份*year(rk_date)*和出库表*ckb*中的出库日期的年份*year(ck_date)*,查询结果只要一个(即不重复,因此用distinct关键字),as关键字为查询字段重命名
最后用union关键字将两条语句的结果取并集
(三)下拉菜单选择月份
这个是最简单的,毕竟每年12月是固定的
我们选择*编辑项*
添加并修改节点的文本(这里如果想修改成具体的*一月*这种中文选项,需要在后续的脚本做格外处理)
(四)效果展示
四,所有控件脚本
在设置脚本前先添加三个【CheckBox】控件,并在它们的【Text】属性中输入一个空格(让名字为空)
打开【rkgl.aspx.cs】文件,将下面的代码复制到该文件中,即可实现所有控件的功能,实现思路见代码注释!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Odbc; //ODBC命名空间
namespace ckgl.admin.tj {
public partial class tjgl : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
}
protected void Button1_Click(object sender, EventArgs e) {
OdbcConnection con = DB.Lianjie();
con.Open();
//这里有两天sql,sql1用于查询入库相关、sql2查询出库相关
string sql1 = " select IFNULL(sum(hno),0) as rksl, IFNULL(sum(rk_zprice), 0) as rkje from rkb where "; //IFNULL用于判断求和是否位null,如果是则取0,否则null会影响字符串转整数
string sql2 = " select IFNULL(sum(hno),0) as cksl, IFNULL(sum(ck_zprice), 0) as ckje from ckb where ";
//然后根据对应的CheckBox来决定sql要怎么查询
if (CheckBox1.Checked == true) {//按货品统计,查询货品号
sql1 += " hno='" + DropDownList1.Text + "' and ";
sql2 += " hno='" + DropDownList1.Text + "' and ";
}
if (CheckBox2.Checked == true) {//按年份统计,查询出入库年份
sql1 += " year(rk_date)=" + DropDownList2.Text + " and ";
sql2 += " year(ck_date)=" + DropDownList2.Text + " and ";
}
if (CheckBox3.Checked == true) {//按月份统计,查询出入库年份
sql1 += " month(rk_date)=" + DropDownList3.Text + " and ";
sql2 += " month(ck_date)=" + DropDownList3.Text + " and ";
}
sql1 += " '1'='1' ";
sql2 += " '1'='1' ";//依旧是复合查询的关口,需要将最后一个and关键字吞掉使sql语法正确
OdbcCommand mycommand1 = new OdbcCommand(sql1, con);
OdbcCommand mycommand2 = new OdbcCommand(sql2, con);
OdbcDataReader sdr1 = mycommand1.ExecuteReader();
OdbcDataReader sdr2 = mycommand2.ExecuteReader();
//结果查到了,接下来提取需要显示的关键数据,以下变量分别代表——
//入库总数-出库总数-入库总额-出库总额-库存量-总利润
int rkzs = 0, ckzs = 0, rkze = 0, ckze = 0, kcl = 0, zlr = 0;
if (sdr1.Read()) {
//如果sql1查询入库相关有结果,那么将其中的入库总数和入库总额记录下来
rkzs = Convert.ToInt32(sdr1["rksl"]);
rkze = Convert.ToInt32(sdr1["rkje"]);
}
if (sdr2.Read()) {
//如果sql2查询出库相关有结果,那么将其中的出库总数和出库总额记录下来
ckzs = Convert.ToInt32(sdr2["cksl"]);
ckze = Convert.ToInt32(sdr2["ckje"]);
}
kcl = rkzs - ckzs;//库存量 = 入库总数 - 出库总数
zlr = ckze - rkze;//总利润 = 出库总额 - 入库总额
//最后对相应的Label标签设置文本,即可显示出结果!
Label1.Text = rkzs.ToString();
Label2.Text = ckzs.ToString();
Label3.Text = rkze.ToString();
Label4.Text = ckze.ToString();
Label5.Text = kcl.ToString();
Label6.Text = zlr.ToString();
con.Close();
}
protected void Button2_Click(object sender, EventArgs e) {
//重置的常规操作,这么多篇了,相信你能明白!
CheckBox1.Checked = false;
CheckBox2.Checked = false;
CheckBox3.Checked = false;
Label1.Text = Label2.Text = Label3.Text = Label4.Text = Label5.Text = Label6.Text = "";
}
}
}
五,添加菜单
在母版页【Site.Master】中添加相应的出入库菜单,这一步博主偷懒一下罢~你一定会的!