钟表维修管理系统技术解析(六) 录入保修单
2015-06-01 20:56
543 查看
录入保修单,此模块可以对已经付款的销售单进行保修服务,选择已经付款的销售单,选择要保修的产品,填写要保修的数量,点击保存,完成操作,录入界面如(图1)所示。
2.3.3(图1)
选择销售单界面如(图2)所示。
2.3.3(图2)
从界面上可以看到我们这里用到的控件有
数据库表与关系如(图3)所示:
2.3.3(图3)
表1: 销售单表(pw_XiaoShouDan)
表2: 销售单明细表(pw_XiaoShouDanMingXi)
表3: 销售售后单(pw_XiaoShouShouHouDan)
表4: 销售售后单明细(pw_XiaoShouShouHouDanMingXi)
表5:产品资料表(pw_ChanPinZiLiao)
表6:员工表(sys_YuanGong)
表7:客户表(sys_KeHu)
表8:当日最大单号数表(DangRiZuiDaDanHaoShu)
1、录入保修单窗体的Load事件
第一步:数据库的存储过程
第二步:逻辑层代码
第三步:界面层代码
2、选择销售单功能实现
第一步:选择销售单按钮的单击事件
(1)数据库的存储过程
(2)逻辑层代码
(3)界面层代码,选择销售单按钮的单击事件
第二步:选择销售单窗体的Load事件
(1)数据库的存储过程
(2)逻辑层代码
(3)界面层代码,选择销售单窗体的Load事件
第三步:完成选择
(1) 销售单DGV的双击事件
(2)确定按钮的单击事件
3、选择需要保修的产品,和输入数量,金额功能实现
第一步:产品明细DGV的行完成验证时发生的事件
第二步:产品明细DGV的单击事件
4、保存功能实现
第一步:数据的存储过程
第二步:;逻辑层代码
第三步:界面层,保存按钮的单击事件
注:此文章只供学习参考,禁止用于商业用途。
2.3.3(图1)
选择销售单界面如(图2)所示。
2.3.3(图2)
从界面上可以看到我们这里用到的控件有
控件名称 | 说明 |
日期控件(DateTimePicker) | 控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。 |
下拉框(ComboBox) | |
文本(TextBox) | |
按钮(Button) | |
数据表格(DataGridView) |
2.3.3(图3)
表1: 销售单表(pw_XiaoShouDan)
列名 | 数据类型 | 主键/外键 | 说明 |
XiaoShouDanID | int | 主键 | 销售单ID |
LuRuYuanID | int | 外键 | 员工表,员工ID |
XiaoShouMenDianID | int | 外键 | 备用 |
FuKuanZhuangTaiID | int | 外键 | 属性明细表,付款状态ID |
KeHuID | int | 外键 | 客户表,客户ID |
PinPaiID | int | 外键 | 品牌表,品牌ID |
ZhongBiaoKuanShiID | int | 外键 | 属性明细表,钟表款式ID |
XiaoShouLeiXingID | int | 外键 | 属性明细表,销售类型ID |
XiaoShouFangShiID | int | 外键 | 属性明细表,销售方式ID |
SongHuoFangShiID | int | 外键 | 属性明细表,送货方式ID |
FuKuanFangShiID | int | 外键 | 属性明细表,付款方式ID |
FuKuanLeiXingID | int | 外键 | 属性明细表,付款类型ID |
XiaoShouDanBianHao | nchar(50) | 销售单自动编号 | |
JieZhangBianHao | nchar(50) | 结账单自动编号 | |
DiKeHao | nchar(50) | 底壳号 | |
XiaoShouRiQi | date | 销售日期 | |
YingShouJinE | decimal(18, 4) | 应收金额 | |
ShiShouJinE | decimal(18, 4) | 实收金额 | |
GengXinShiJian | datetime | 更新时间 | |
BeiZhu | nchar(100) | 备注 | |
BaoFeiYuanYin | nchar(100) | 报废时填写报废原因 | |
YouXiaoFou | bit | 有效否 |
列名 | 数据类型 | 主键/外键 | 说明 |
XiaoShouDanMingXiID | int | 主键 | 销售单明细ID |
XiaoShouDanID | int | 外键 | 销售单表,销售单ID |
ChanPinID | int | 外键 | 产品表,产品ID |
CangWeiID | int | 外键 | 仓位表,仓位ID (产品提取处) |
BaoXiuQiID | int | 外键 | 保修期表,保修期ID |
DanJia | decimal(18, 4) | 产品销售单价 | |
ShuLiang | int | 产品数量 | |
YiTuiHuoShu | int | 已退货数(默认为0) | |
YouXiaoFou | bit | 有效否 | |
GengXinShiJian | datetime | 更新时间 | |
BeiZhu | nchar(50) | 备注 |
列名 | 数据类型 | 主键/外键 | 说明 |
XiaoShouShouHouDanID | int | 主键 | 销售售后单ID |
LuRuYuanID | int | 外键 | 员工表,员工ID |
XiaoShouDanID | int | 外键 | 销售单表,销售单ID |
XiaoShouShouHouLeiXingID | int | 外键 | 属性明细表,销售售后类型ID |
XiaoShouShouHouDanBianHao | nchar(50) | 销售售后单自动编号 | |
RiQi | date | 日期 | |
JinE | decimal(18, 4) | 金额 (换货单负数为支出) | |
GengXinShiJian | datetime | 更新时间 | |
YouXiaoFou | bit | 有效否 | |
BeiZhu | nchar(50) | 备注 |
列名 | 数据类型 | 主键/外键 | 说明 |
XiaoShouShouHouDanMingXiID | int | 主键 | 销售售后单明细ID |
XiaoShouShouHouDanID | int | 外键 | 销售售后单表,销售售后单ID |
XiaoShouDanMingXiID | int | 外键 | 销售单明细表,销售单明细ID |
ChanPinID | int | 外键 | 产品表,产品ID |
DanJia | decimal(18, 4) | 单价 (换货单负数为支出) | |
ShuLiang | int | 产品数量 | |
GengXinShiJian | datetime | 更新时间 | |
YouXiaoFou | bit | 有效否 | |
BeiZhu | nchar(50) | 备注 |
列名 | 数据类型 | 主键/外键 | 说明 |
ChanPinID | int | 主键 | 产品ID |
LuRuYuanID | int | 外键 | 录入员ID |
CangKuLeiXingID | int | 外键 | 仓库类型ID |
ChanPinLeiXingID | int | 外键 | 产品类型ID |
ChanPinZhongLeiID | int | 外键 | 产品种类ID |
ChanPinPinPaiID | int | 外键 | 产品品牌ID |
DanWeiID | int | 外键 | 单位ID |
ChanPinBianHao | nchar(10) | 产品编号 | |
ChanPinMingCheng | nchar(10) | 产品名称 | |
CaiGouDanJia | decimal(18, 2) | 采购单价 | |
YiJiXiaoShouJia | decimal(18, 2) | 销售价 | |
JianJie | nchar(50) | 简介 | |
GengXinShiJian | datetime | 更新时间 | |
YouXiaoFou | bit | 有效否 |
列名 | 数据类型 | 主键/外键 | 说明 |
YuanGongID | int | 主键 | 员工ID |
LuRuYuanID | int | 外键 | 录入员ID |
YuanGongZhuangTaiID | int | 外键 | 员工状态ID |
MenDianID | int | 外键 | 门店ID |
ZhiWuID | Int | 外键 | 职务ID |
JueSeID | int | 外键 | 角色ID |
YuanGongBianHao | nchar(50) | 员工编号 | |
YuanGongXingMing | nchar(50) | 员工姓名 | |
XingBie | nchar(50) | 性别 | |
JiGuan | nchar(50) | 籍贯 | |
XueLi | nchar(50) | 学历 | |
ChuShengRiQi | date | 出生日期 | |
ShenFenZhengHao | nchar(18) | 身份证号 | |
RuZhiRiQi | data | 入职日期 | |
RuZhiDiDian | nchar(50) | 入职地点 | |
YiDongShouJi | int | 移动手机 | |
JiaTingDianHua | nchar(50) | 家庭电话 | |
DiXin | decimal(18, 2) | 底薪 | |
JiShiFou | bit | 技术否 | |
HunFou | bit | 婚否 | |
TongXunDiZhi | nchar(50) | 通讯地址 | |
BeiZhu | nchar(50) | 备注 | |
MiMa | nchar(50) | 密码 |
列名 | 数据类型 | 主键/外键 | 说明 |
KeHuID | int | 主键 | 客户ID |
LuRuYuanID | int | 外键 | 录入员ID |
KeHuLeiXingID | int | 外键 | 客户类型ID |
SuoShuMenDianID | int | 外键 | 所属门店ID |
KeHuBianHao | decimal(18, 2) | 客户编号 | |
KeHuXingMing | Nchar(20) | 客户姓名 | |
XingBie | Nchar(10) | 性别 | |
ShenFenZhengHao | Nchar(18) | 身份证号 | |
YiDongShouJi | Nchar(13) | 移动手机 | |
JiaTingDianHua | Nchar(10) | 家庭电话 | |
ChuShenRiQi | Date | 出生日期 | |
TongXunDiZhi | Date | 通讯地址 | |
KeHuJiFen | Nchar(10) | 客户积分 | |
SuoShuDiFang | Nchar(10) | 所属地方 | |
QQHao | Int | QQ号 | |
WeiXinHao | Nchar(10) | 维修号 | |
WeiBoHao | Nchar(10) | 微博号 | |
GenXinShiJian | datetime | 更新时间 | |
BeiZhi | Nchar(10) | 备注 | |
YouXiaoFou | Bit | 有效否 |
列名 | 数据类型 | 主键/外键 | 说明 |
ZuiDaDanHaoShuID | int | 主键 | 最大单号数ID |
CaiGouDanHao | int | 采购单号 | |
CaiGouTuiHuoDanHao | int | 采购退货单号 | |
XiaoShouDanHao | int | 销售单号 | |
XiaoShouTuiHuoDanHao | int | 销售退货单号 | |
XiaoShouBaoXiuDanHao | int | 销售保修单号 | |
XiaoShouHuanHuoDanHao | int | 销售换货单号 | |
GongDanBianHao | int | 工单编号 | |
ChuKuDanHao | int | 出库单号 | |
RuKuDanHao | int | 入库单号 | |
JieZhangDanHao | int | 结账单号 | |
WaiPaiDanJuHao | int | 外派单据号 | |
QuBiaoFuKuanDanJuHao | int | 取表付款单据号 | |
FuKuanBianHao | int | 付款单号 |
第一步:数据库的存储过程
IF (@type='frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai') BEGIN SELECT ShuXingMingXiID AS ShuXingMingXiID,LTRIM(RTRIM(ShuXingMingXiMingCheng))AS ShuXingMingXiMingCheng FROM sys_ShuXingMingXi WHERE ShuXingJiHeID=17 AND YouXiaoFou=1 END
第二步:逻辑层代码
public DataTable frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai() { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char), }; mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai"; return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters); }
第三步:界面层代码
BLL.BLL_XiaoShouGuanLi.frmXiaoShouBaoXiu myfrmXiaoShouBaoXiu = new BLL.BLL_XiaoShouGuanLi.frmXiaoShouBaoXiu();//实例化逻辑层 int intXiaoShouDanID = 0;//销售单ID TabControl myTabControlp;//选项卡页集 /// <param name="myTabControl">主界面的选项卡控件(用于关闭当前选项卡)</param> public frmXiaoShouBaoXiu_Insert(TabControl myTabControl) { myTabControlp = myTabControl;//赋值给此窗体创建的变量myTabControlp InitializeComponent(); btnBaoCun.BackColor = Color.FromArgb(80, 225, 225, 225);//改变Button的样式 } private void frmXiaoShouBaoXiu_Insert_Load(object sender, EventArgs e) { dgvChanPinMingXi.AllowUserToAddRows = false;//设置不让用户手动添加行 dgvChanPinMingXi.AutoGenerateColumns = false;//设置不自动添加列 cboFuKuanZhuangTai.DataSource = myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai();//查询付款状态,绑定下拉框 cboFuKuanZhuangTai.DisplayMember = "ShuXingMingXiMingCheng";//设置显示文本 cboFuKuanZhuangTai.ValueMember = "ShuXingMingXiID";//设置值文本 cboFuKuanZhuangTai.SelectedIndex = -1;//默认为不选中任何数据 txtBaoXiuDanBianHao.Text = "自动生成";//保修单编号是保存的时候自动生成 }
2、选择销售单功能实现
第一步:选择销售单按钮的单击事件
(1)数据库的存储过程
IF (@TYPE = 'frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi') BEGIN SELECT pw_XiaoShouDanMingXi.ChanPinID, pw_XiaoShouDanMingXi.CangWeiID, sys_CangWei.CangWeiMingCheng, sys_KuCun.KuCunShuLiang, pw_XiaoShouDanMingXi.DanJia AS XiaoShouDanJia, pw_XiaoShouDanMingXi.ShuLiang AS XiaoShouShuLiang, sys_ChanPinZiLiao.ChanPinZhongLeiID, sys_ChanPinZiLiao.ChanPinPinPaiID, sys_ChanPinZiLiao.ChanPinMingCheng, sys_ChanPinZiLiao.ChanPinBianHao, pw_XiaoShouDanMingXi.XiaoShouDanMingXiID, pw_XiaoShouDanMingXi.YiTuiHuoShu, sys_PinPai.PinPaiID, sys_PinPai.PinPaiMingCheng, sys_PinZhong.PinZhongMingCheng FROM pw_XiaoShouDanMingXi INNER JOIN sys_ChanPinZiLiao ON pw_XiaoShouDanMingXi.ChanPinID = sys_ChanPinZiLiao.ChanPinID INNER JOIN sys_CangWei ON pw_XiaoShouDanMingXi.CangWeiID = sys_CangWei.CangWeiID INNER JOIN sys_KuCun ON sys_CangWei.CangWeiID = sys_KuCun.CangWeiID AND sys_ChanPinZiLiao.ChanPinID = sys_KuCun.ChanPinID INNER JOIN sys_PinPai ON sys_ChanPinZiLiao.ChanPinPinPaiID = sys_PinPai.PinPaiID INNER JOIN sys_PinZhong ON sys_ChanPinZiLiao.ChanPinZhongLeiID = sys_PinZhong.PinZhongID WHERE pw_XiaoShouDanMingXi.XiaoShouDanID=@XiaoShouDanID AND pw_XiaoShouDanMingXi.YouXiaoFou=1 END
(2)逻辑层代码
public DataTable frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi(int intXiaoShouDanID) { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char), new SqlParameter("@XiaoShouDanID",SqlDbType.Int) }; mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi"; mySqlParameters[1].Value = intXiaoShouDanID; return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters); }
(3)界面层代码,选择销售单按钮的单击事件
private void btnTianJia_Click(object sender, EventArgs e) { frmXuanZeXiaoShouDan myfrmXuanZeXiaoShouDan = new frmXuanZeXiaoShouDan();//实例化选择销售单窗体 myfrmXuanZeXiaoShouDan.ShowDialog();//弹出窗体 if (frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows.Count > 0) { intXiaoShouDanID = Convert.ToInt32(frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["销售单ID"]);//获取选中的销售单ID txtXiaoShouDanBianHao.Text = frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["销售单编号"].ToString().Trim();//获取选中的销售单编号 txtKeHuMingCheng.Text = frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["客户姓名"].ToString().Trim();//获取选中的客户姓名 cboFuKuanZhuangTai.SelectedValue = Convert.ToInt32(frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["付款状态ID"]);//绑定选中的付款状态 DataTable dtXiaoShouMingXi = myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi(intXiaoShouDanID);//用销售单ID查询出销售单明细 dtXiaoShouMingXi.Columns.Add("XiaoShouXiaoJi", typeof(string));//添加销售小计(列) dtXiaoShouMingXi.Columns.Add("DanJia", typeof(string));//添加保修单价(列) dtXiaoShouMingXi.Columns.Add("ShuLiang", typeof(string));//添加保修数量(列) dtXiaoShouMingXi.Columns.Add("XiaoJi", typeof(string));//添加保修小计(列) for (int i = 0; i < dtXiaoShouMingXi.Rows.Count; i++)//循环销售单明细表 { dtXiaoShouMingXi.Rows[i]["XiaoShouXiaoJi"] = (Convert.ToDecimal(dtXiaoShouMingXi.Rows[i]["XiaoShouShuLiang"]) * Convert.ToDecimal(dtXiaoShouMingXi.Rows[i]["XiaoShouDanJia"])).ToString();//计算销售小计=销售数量+销售单价 dtXiaoShouMingXi.Rows[i]["DanJia"] = 0;//保修单价默认为0 dtXiaoShouMingXi.Rows[i]["ShuLiang"] = "1";//保修数量默认为1 dtXiaoShouMingXi.Rows[i]["XiaoJi"] = 0;//保修小计默认为1 } dgvChanPinMingXi.DataSource = dtXiaoShouMingXi;//处理完成的销售单明细表赋值给DGV } JiSuanBaoXiuFeiYong();//调用计算保修费用方法 } private void JiSuanBaoXiuFeiYong() { decimal decZongJinE = 0;//总金额 for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++)//循环产品明细DGV { if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue) == true)//判断是否已选择 { decimal decJiaGe = 0;//每行的保修价格 try { decJiaGe = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value);//获取保修价格,如果转换形态出错,则说明输入错误,跳到catch{} if (decJiaGe < 0) { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修单价】不能小于零!");//保修价格不能小于0 dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value = 0; decJiaGe = 0; } } catch { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修单价】填写不正确!"); dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value = 0; decJiaGe = 0; } decimal decShuLiang = 0;//每行的保修数量 try { decShuLiang = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value);//获取保修数量,如果转换形态出错,则说明输入错误,跳到catch{} if (Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["已退货数"].Value) != Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["销售数量"].Value)) { if (decShuLiang < 1) { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】不能小于一!");//保修数量不能小于1 dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1; decShuLiang = 1; } if (decShuLiang + Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["已退货数"].Value) > Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["销售数量"].Value))//保修数量+已退货数不能大于销售数量 { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】+【已退货数】不能大于销售数量!"); dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1; decShuLiang = 1; } } if (decShuLiang % 1 != 0)//判断保修数量有没有小数 { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】不能为小数!"); dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1; decShuLiang = 1; } } catch { MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】填写不正确!"); dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1; decShuLiang = 1; } dgvChanPinMingXi.Rows[i].Cells["保修小计"].Value = decJiaGe * decShuLiang;//计算每行的保修小计 if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue)) { decZongJinE += Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修小计"].Value);//累加所有选中的行的保修小计 } } } txtBaoXiuFeiYong.Text = decZongJinE.ToString();//总金额赋值给保修费用文本框 if (cboFuKuanZhuangTai.SelectedIndex == 1) { txtBaoXiuFeiYong.Text = "0"; } }
第二步:选择销售单窗体的Load事件
(1)数据库的存储过程
IF (@TYPE = 'frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai') BEGIN SELECT ShuXingMingXiID AS ShuXingMingXiID,LTRIM(RTRIM(ShuXingMingXiMingCheng))AS ShuXingMingXiMingCheng FROM sys_ShuXingMingXi WHERE ShuXingJiHeID=17 AND YouXiaoFou=1 END
(2)逻辑层代码
public DataTable frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai() { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char) }; mySqlParameters[0].Value = "frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai"; return myDALMethod.QueryDataTable("frmXiaoShouKaiDan_Select", mySqlParameters); }
(3)界面层代码,选择销售单窗体的Load事件
private void frmXuanZeXiaoShouDan_Load(object sender, EventArgs e) { cboYeDaXiao.Text = "20";//每页的行数,默认为20 dgvXiaoShouDan.AllowUserToAddRows = false;//设置禁止用户自行添加行 dgvXiaoShouDan.AutoGenerateColumns = false;//设置禁止自动添加列 dgvXiaoShouDan.ReadOnly = true;//设置禁止编辑DGV的内容 DataTable dtFuKuanZhuangTai = myfrmXiaoShouKaiDan_Select.frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai();//查询付款状态明细,并绑定下拉框 dtFuKuanZhuangTai.Rows.Add(2, "全部");//添加一行"2"属于"ShuXingMingXiID","全部"属于"ShuXingMingXiMingCheng" cboFuKuanZhuangTai.DataSource = dtFuKuanZhuangTai;//绑定数据源 cboFuKuanZhuangTai.DisplayMember = "ShuXingMingXiMingCheng";//绑定显示的文本 cboFuKuanZhuangTai.ValueMember = "ShuXingMingXiID";//绑定值文本 cboFuKuanZhuangTai.SelectedIndex = 0;//默认选择第一个值(已付款) dtpKaiShi.Value = DateTime.Now.AddMonths(-3);//默认给开始时间减去3个月 dtpJeiShu.Value = DateTime.Now.AddDays(1);//默认给结束时间加上1天 if (dtXiaoShouDan.Columns.Count < 1)//如果dtXiaoShouDan还没添加过列(第一次打开此界面),则加以下列 { dtXiaoShouDan.Columns.Add("销售单ID", typeof(string));//添加列("列名",typeof(数据类型)) dtXiaoShouDan.Columns.Add("付款状态ID", typeof(string)); dtXiaoShouDan.Columns.Add("销售单编号", typeof(string)); dtXiaoShouDan.Columns.Add("销售日期", typeof(string)); dtXiaoShouDan.Columns.Add("实收金额", typeof(string)); dtXiaoShouDan.Columns.Add("客户姓名", typeof(string)); dtXiaoShouDan.Columns.Add("付款状态", typeof(string)); dtXiaoShouDan.Columns.Add("更新时间", typeof(string)); } dtXiaoShouDan.Rows.Clear();//清空dtXiaoShouDan所有行的集合 btnChaXun_Click(null, null);//调用查询按钮的单击事件,查询功能代码和销售记录中的查询代码一样 }
第三步:完成选择
(1) 销售单DGV的双击事件
private void dgvXiaoShouDan_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { if (dgvXiaoShouDan.Rows.Count > 0)//判断dgvXiaoShouDan是否有数据 { if (dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim() == "已付款")//判断是否已付款 { dtXiaoShouDan.Rows.Clear();//清除所有行 dtXiaoShouDan.Rows.Add(1);//添加一行 dtXiaoShouDan.Rows[0]["销售单ID"] = dgvXiaoShouDan.CurrentRow.Cells["销售单ID"].Value.ToString().Trim();//给刚添加的行赋值 dtXiaoShouDan.Rows[0]["付款状态ID"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态ID"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["销售单编号"] = dgvXiaoShouDan.CurrentRow.Cells["销售单编号"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["销售日期"] = dgvXiaoShouDan.CurrentRow.Cells["销售日期"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["实收金额"] = dgvXiaoShouDan.CurrentRow.Cells["实收金额"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["客户姓名"] = dgvXiaoShouDan.CurrentRow.Cells["客户姓名"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["付款状态"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["更新时间"] = dgvXiaoShouDan.CurrentRow.Cells["更新时间"].Value.ToString().Trim(); this.Dispose();//释放资源 this.Close();//关闭窗体 } else { MessageBox.Show("当前销售单还未付款,不能执行售后服务业务!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } }
(2)确定按钮的单击事件
private void btnQueDing_Click(object sender, EventArgs e) { if (dgvXiaoShouDan.Rows.Count > 0)//判断dgvXiaoShouDan是否有数据 { if (dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim() == "已付款")//判断是否已付款 { dtXiaoShouDan.Rows.Clear();//清除所有行 dtXiaoShouDan.Rows.Add(1);//添加一行 dtXiaoShouDan.Rows[0]["销售单ID"] = dgvXiaoShouDan.CurrentRow.Cells["销售单ID"].Value.ToString().Trim();//给刚添加的行赋值 dtXiaoShouDan.Rows[0]["付款状态ID"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态ID"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["销售单编号"] = dgvXiaoShouDan.CurrentRow.Cells["销售单编号"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["销售日期"] = dgvXiaoShouDan.CurrentRow.Cells["销售日期"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["实收金额"] = dgvXiaoShouDan.CurrentRow.Cells["实收金额"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["客户姓名"] = dgvXiaoShouDan.CurrentRow.Cells["客户姓名"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["付款状态"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim(); dtXiaoShouDan.Rows[0]["更新时间"] = dgvXiaoShouDan.CurrentRow.Cells["更新时间"].Value.ToString().Trim(); this.Dispose();//释放资源 this.Close();//关闭窗体 } else { MessageBox.Show("当前销售单还未付款,不能执行售后服务业务!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } else { MessageBox.Show("请查询并选择销售单,再执行确定!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } }
3、选择需要保修的产品,和输入数量,金额功能实现
第一步:产品明细DGV的行完成验证时发生的事件
private void dgvChanPinMingXi_RowValidated(object sender, DataGridViewCellEventArgs e) { JiSuanBaoXiuFeiYong(); }
第二步:产品明细DGV的单击事件
private void dgvChanPinMingXi_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (dgvChanPinMingXi.Rows.Count > 0)//判断产品明细DGV是否有数据 { if (dgvChanPinMingXi.CurrentCell.ColumnIndex == 2)//判断点击的是不是"选择"这一列 { if (Convert.ToDecimal(dgvChanPinMingXi.CurrentRow.Cells["已退货数"].Value) == Convert.ToDecimal(dgvChanPinMingXi.CurrentRow.Cells["销售数量"].Value))//判断是否已经全部退货 { MessageBox.Show("该产品已经全部退货,不能进行保修", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } if (Convert.ToBoolean(dgvChanPinMingXi.CurrentRow.Cells["选择"].FormattedValue)) { dgvChanPinMingXi.CurrentRow.Cells["选择"].Value = false;//如果之前是已选,则改为未选 } else { dgvChanPinMingXi.CurrentRow.Cells["选择"].Value = true;//如果之前是未选,则改为已选 } } } JiSuanBaoXiuFeiYong();//调用计算保修费用方法 }
4、保存功能实现
第一步:数据的存储过程
IF (@type='frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao') BEGIN BEGIN TRAN UPDATE DangRiZuiDaDanShu SET XiaoShouBaoXiuDanHao+=1 SELECT XiaoShouBaoXiuDanHao FROM DangRiZuiDaDanShu COMMIT TRAN END IF (@type='frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan') BEGIN BEGIN TRAN INSERT pw_XiaoShouShouHouDan(XiaoShouDanID, XiaoShouShouHouLeiXingID, XiaoShouShouHouDanBianHao, RiQi, JinE, BeiZhu,LuRuYuanID) VALUES (@XiaoShouDanID, @XiaoShouShouHouLeiXingID, @XiaoShouShouHouDanBianHao, @RiQi, @JinE, @BeiZhu,@LuRuYuanID) SELECT @@IDENTITY COMMIT TRAN END IF (@type='frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi') BEGIN INSERT pw_XiaoShouShouHouDanMingXi(XiaoShouShouHouDanID, ChanPinID, DanJia, ShuLiang,XiaoShouDanMingXiID) VALUES (@XiaoShouShouHouDanID, @ChanPinID, @DanJia, @ShuLiang,@XiaoShouDanMingXiID) END
第二步:;逻辑层代码
public DataTable frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao() { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char), }; mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao"; return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters); } public DataTable frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan(int intXiaoShouDanID, int intXiaoShouShouHouLeiXingID, string strXiaoShouShouHouDanBianHao, DateTime dtmRiQi, decimal decJinE, string strBeiZhu,int intLuRuYuanID) { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char), new SqlParameter("@XiaoShouDanID",SqlDbType.Int), new SqlParameter("@XiaoShouShouHouLeiXingID",SqlDbType.Int), new SqlParameter("@XiaoShouShouHouDanBianHao",SqlDbType.Char), new SqlParameter("@RiQi",SqlDbType.Date), new SqlParameter("@JinE",SqlDbType.Decimal), new SqlParameter("@BeiZhu",SqlDbType.Char), new SqlParameter("@LuRuYuanID",SqlDbType.Int), }; mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan"; mySqlParameters[1].Value = intXiaoShouDanID; mySqlParameters[2].Value = intXiaoShouShouHouLeiXingID; mySqlParameters[3].Value = strXiaoShouShouHouDanBianHao; mySqlParameters[4].Value = dtmRiQi; mySqlParameters[5].Value = decJinE; mySqlParameters[6].Value = strBeiZhu; mySqlParameters[7].Value = intLuRuYuanID; return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters); } public int frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi(int intXiaoShouShouHouDanID, int intChanPinID, decimal decDanJia, int intShuLiang, int intXiaoShouDanMingXiID) { SqlParameter[] mySqlParameters ={ new SqlParameter("@TYPE",SqlDbType.Char), new SqlParameter("@XiaoShouShouHouDanID",SqlDbType.Int), new SqlParameter("@ChanPinID",SqlDbType.Int), new SqlParameter("@DanJia",SqlDbType.Decimal), new SqlParameter("@ShuLiang",SqlDbType.Int), new SqlParameter("@XiaoShouDanMingXiID",SqlDbType.Int), }; mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi"; mySqlParameters[1].Value = intXiaoShouShouHouDanID; mySqlParameters[2].Value = intChanPinID; mySqlParameters[3].Value = decDanJia; mySqlParameters[4].Value = intShuLiang; mySqlParameters[5].Value = intXiaoShouDanMingXiID; return myDALMethod.UpdateData("frmXiaoShouBaoXiu", mySqlParameters); }
第三步:界面层,保存按钮的单击事件
private void btnBaoCun_Click(object sender, EventArgs e) { if (intXiaoShouDanID == 0 || txtXiaoShouDanBianHao.Text == "")//判断是否已经选择了销售单 { MessageBox.Show("请按绿色加号按钮选择销售单!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } bool bolXuanZe = false;//创建一个bool值,用于判断有没有选择产品 for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++) { if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue))//判断有没有选择产品 { bolXuanZe = true; break; } } if (bolXuanZe == false)//如果没有选择产品,则提示,返回 { MessageBox.Show("请打钩选择要保修的产品!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } int intXiaoShouShouHouLeiXingID = 50;//获取销售售后类型ID,这里默认50是保修类型 string strXiaoShouShouHouDanBianHao = DangRiBaoXiuZuiDaDanJuShu("BX");//获取保修单编号 DateTime dtmRiQi = dtpBaoXiuRiQi.Value;//获取保修日期 decimal decJinE = Convert.ToDecimal(txtBaoXiuFeiYong.Text);//获取保修总金额 string strBeiZhu = txtBaoXiuNeiRong.Text;//获取备注 int intXiaoShouShouHouDanID = Convert.ToInt32(myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan(intXiaoShouDanID, intXiaoShouShouHouLeiXingID, strXiaoShouShouHouDanBianHao, dtmRiQi, decJinE, strBeiZhu, Convert.ToInt32(index2.strYuanGongXinXi[0])).Rows[0][0]);//保存保修单,Convert.ToInt32(index2.strYuanGongXinXi[0])这是获取当前登录的员工ID,作为录入员 if (intXiaoShouShouHouDanID > 0)//判断是否保存成功 { int intXuanZeCiShu = 0;//创建一个int型变量,用于记录选中产品的行数 int intChengGongCiShu = 0;//创建一个int型变量,用于记录成功保存的产品的行数 for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++)//循环产品明细DGV { if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue))//判断是不是已选 { intXuanZeCiShu++;//选中产品的行数自加1 int intXiaoShouDanMingXiID = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["销售单明细ID"].Value); int intChanPinID = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["产品ID"].Value); decimal decDanJia = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value); int intShuLiang = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value); if (myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi(intXiaoShouShouHouDanID, intChanPinID, decDanJia, intShuLiang, intXiaoShouDanMingXiID) > 0) { intChengGongCiShu++;//成功保存的产品的行数自加1 } } } if (intChengGongCiShu == intXuanZeCiShu && intChengGongCiShu > 0)//判断是否全部保存成功 { if (MessageBox.Show("新增成功,销售保修单编号【" + strXiaoShouShouHouDanBianHao + "】\n是否继续新增?", "提示!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) == DialogResult.Yes) { dtpBaoXiuRiQi.Value = DateTime.Now; txtKeHuMingCheng.Text = ""; txtBaoXiuNeiRong.Text = ""; txtBaoXiuFeiYong.Text = ""; txtXiaoShouDanBianHao.Text = ""; cboFuKuanZhuangTai.SelectedIndex = -1; intXiaoShouDanID = 0; dgvChanPinMingXi.DataSource = null; } else { this.Dispose(); this.Close(); myTabControlp.TabPages.Remove(myTabControlp.SelectedTab);//关闭当前选项卡 } } else { MessageBox.Show("新增失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("新增失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private string DangRiBaoXiuZuiDaDanJuShu(string strQianZhui) { string strDanJuShu = (Convert.ToInt32(myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao().Rows[0][0])).ToString();//查询当日最大保修单据数 if (strDanJuShu.Length == 1)//如果是一位数则,在前面加000 { strDanJuShu = "000" + strDanJuShu; } if (strDanJuShu.Length == 2) { strDanJuShu = "00" + strDanJuShu; } if (strDanJuShu.Length == 3) { strDanJuShu = "0" + strDanJuShu; } string Nian = DateTime.Now.Year.ToString();//获取当前年份 string Yue = DateTime.Now.Month.ToString();//获取当前月份 Yue = (Yue.Length < 2) ? ("0" + Yue) : Yue;//如果是一位数,则在前面加0 string Ri = DateTime.Now.Day.ToString();//获取当前天数 Ri = (Ri.Length < 2) ? ("0" + Ri) : Ri;//如果是一位数,则在前面加0 return strQianZhui + Nian + Yue + Ri + strDanJuShu;//返回拼接完成的保修单编号 }
注:此文章只供学习参考,禁止用于商业用途。
相关文章推荐
- Apress Expert Oracle GoldenGate - Topologies and Use Cases
- 噪声与干扰
- Linux文件权限与目录管理
- 第一篇
- leetcode Find Minimum in Rotated Sorted Array
- mulitset,mulitmap
- Linux文件权限与目录管理
- CSU 1654
- linux自学笔记
- VelocityTracker类介绍
- Ansible(14)wait_for模块
- SD.Team回复形象小人偶
- 生成二维码,使用JS技术
- 计算几何小模板
- 黑马程序员———Java基础------集合框架知识点总结(二)
- 数据库简单增删改查
- 编程实现队列的入队、出队、测长、打印
- ScrollView嵌套ListView只显示一行(总结)
- tcp/ip ---------- 网际协议之tcp
- hdu 5248 序列变换【二分】