录入保修单,此模块可以对已经付款的销售单进行保修服务,选择已经付款的销售单,选择要保修的产品,填写要保修的数量,点击保存,完成操作,录入界面如(图1)所示。
2.3.3(图1)
选择销售单界面如(图2)所示。
2.3.3(图2)
从界面上可以看到我们这里用到的控件有
控件名称 | 说明 |
日期控件(DateTimePicker) | 控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。 |
下拉框(ComboBox) | |
文本(TextBox) | |
按钮(Button) | |
数据表格(DataGridView) |
数据库表与关系如(图3)所示:
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 |
| 有效否 |
表2: 销售单明细表(pw_XiaoShouDanMingXi)
列名 | 数据类型 | 主键/外键 | 说明 |
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) |
| 备注 |
表3: 销售售后单(pw_XiaoShouShouHouDan)
列名 | 数据类型 | 主键/外键 | 说明 |
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) |
| 备注 |
表4: 销售售后单明细(pw_XiaoShouShouHouDanMingXi)
列名 | 数据类型 | 主键/外键 | 说明 |
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) |
| 备注 |
表5:产品资料表(pw_ChanPinZiLiao)
列名 | 数据类型 | 主键/外键 | 说明 |
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 |
| 有效否 |
表6:员工表(sys_YuanGong)
列名 | 数据类型 | 主键/外键 | 说明 |
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) |
| 密码 |
表7:客户表(sys_KeHu)
列名 | 数据类型 | 主键/外键 | 说明 |
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 |
| 有效否 |
表8:当日最大单号数表(DangRiZuiDaDanHaoShu)
列名 | 数据类型 | 主键/外键 | 说明 |
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 |
| 付款单号 |
1、录入保修单窗体的Load事件
第一步:数据库的存储过程
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;//返回拼接完成的保修单编号
}
注:此文章只供学习参考,禁止用于商业用途。