销售记录这个模块,可以查询录入的销售单,查询出来的数据可以分页,单击单据详情可以看到产品明细,可以通过日期范围、付款状态、关键字筛选进行查询,还可以导出Excel,付款,新增,修改,报废操作。主界面如(图1)所示:
图1
单据详细内容如(图2)所示:
图2
从界面上可以看到我们这里用到的控件有
控件名称 |
说明 |
日期控件(DateTimePicker) |
控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。 |
下拉框(ComboBox) | |
文本(TextBox) | |
按钮(Button) | |
数据表格(DataGridView) |
查询功能实现:
1、数据库表与关系如(图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:库存表(sys_KuCun)
列名 |
数据类型 |
主键/外键 |
说明 |
KuCunID |
int |
主键 |
库存ID |
LuRuYuanID |
int |
外键 |
录入员ID |
CangWeiID |
int |
外键 |
仓位ID |
ChanPinID |
int |
外键 |
产品ID |
KuCunShuLiang |
int |
|
库存数量 |
GengXinShiJian |
datetime |
|
更新时间 |
表4:产品资料表(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 |
|
有效否 |
表5:仓位表(pw_CangWei)
列名 |
数据类型 |
主键/外键 |
说明 |
CangWeiID |
int |
主键 |
仓位ID |
MenDianID |
int |
外键 |
门店ID |
CangWeiLeiXingID |
int |
外键 |
仓位类型ID |
CangWeiMingCheng |
nchar(50) |
|
仓位名称 |
PaiXuHao |
int |
|
排序号 |
GengXinShiJian |
datetime |
|
更新时间 |
YouXiaoFou |
bit |
|
有效否 |
BeiZhu |
nchar(50) |
|
备注 |
表6:出入库表(pw_ChuRuKuDanJu)
列名 |
数据类型 |
主键/外键 |
说明 |
ChuRuKuDanID |
int |
主键 |
出入库单据ID |
LuRuYuanID |
int |
外键 |
录入员ID |
DanJuBianHao |
nchar(10) |
|
单据编号 |
DanJuRiQi |
date |
|
单据日期 |
ShenHeFou |
bit |
|
审核否 |
BeiZhu |
nchar(50) |
|
备注 |
RuKuFou |
bit |
|
入库否 |
YouXiaoFou |
bit |
|
有效否 |
表7:出入库明细表(pw_ChuRuKuDanJuMingXi)
列名 |
数据类型 |
主键/外键 |
说明 |
ChuRuKuDanMingXiID |
int |
主键 |
出入库明细ID |
ChuRuKuDanJuID |
int |
外键 |
出入库单据ID |
ChanPinID |
int |
外键 |
产品ID |
CangWeiID |
int |
外键 |
仓位ID |
ShuLiang |
int |
外键 |
数量 |
JinE |
decimal(18, 2) |
|
金额 |
YouXiaoFou |
bit |
|
有效否 |
表8:员工表(sys_YuanGong)
列名 |
数据类型 |
主键/外键 |
说明 |
YuanGongID |
int |
主键 |
员工ID |
LuRuYuanID |
int |
外键 |
录入员ID |
YuanGongZhuangTaiID |
int |
外键 |
员工状态ID |
MenDianID |
int |
外键 |
门店ID |
ZhiWuID |
Int |
外键 |
职务 |
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) |
|
密码 |
表9:品牌表(sys_PinPai)
列名 |
数据类型 |
主键/外键 |
说明 |
PinPaiID |
int |
主键 |
品牌ID |
LuRuYuanID |
int |
外键 |
录入员 |
PinPaiMingCheng |
Nchar(10) |
|
品牌名称 |
PaiXuHao |
int |
|
排序号 |
GengXinShiJian |
decimal(18, 2) |
|
更新时间 |
YouXiaoFou |
Bit |
|
有效否 |
BeiZhu |
Nchar(50) |
|
备注 |
表10:客户表(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 |
|
有效否 |
表11:当日最大单号数表(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 |
|
付款单号 |
2、日期控件
第一步:界面层(UIL)代码,写进窗体的Load事件
dtpKaiShi.Value = DateTime.Now.AddMonths(-3);//给开始时间减掉三个月
dtpJeiShu.Value = DateTime.Now.AddDays(1);//给结束时间加一天
3、设置表格(DataGridView)控件
第一步:界面层(UIL)代码,写进窗体的Load事件
dgvXiaoShouDan.AllowUserToAddRows = false;//设置不能手动添加行
dgvXiaoShouDan.AutoGenerateColumns = false;//设置不能自动添加列
dgvXiaoShouDan.ReadOnly = true;//设置不能编辑表格的内容
4、绑定下拉框
第一步:数据库的存储过程
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
第二步:逻辑层(BLL)代码
DALPublic.DALMethod myDALMethod = new DALPublic.DALMethod();
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);
}
第三步:界面层(UIL)代码,在窗体的Load事件中绑定下拉框的数据
BLL.BLL_XiaoShouGuanLi.frmXiaoShouKaiDan_Select myfrmXiaoShouKaiDan_Select = new BLL.BLL_XiaoShouGuanLi.frmXiaoShouKaiDan_Select();
/// <summary>
///
/// </summary>
/// <param name="sender">触发者</param>
/// <param name="e">触发环境</param>
private void frmXiaoShouKaiDan_Select_Load(object sender, EventArgs e)
{
DataTable dtFuKuanZhuangTai = myfrmXiaoShouKaiDan_Select.frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai();//查询付款状态
dtFuKuanZhuangTai.Rows.Add(0, "全部");//添加一行"0"属于"ShuXingMingXiID"这一列,"全部"属于"ShuXingMingXiMingCheng"这一列
cboFuKuanZhuangTai.DataSource = dtFuKuanZhuangTai;//给下拉框绑定数据源
cboFuKuanZhuangTai.DisplayMember = "ShuXingMingXiMingCheng";//设置下拉框显示的属性(列)
cboFuKuanZhuangTai.ValueMember = "ShuXingMingXiID";//设置下拉框中的项的值(列)
cboFuKuanZhuangTai.SelectedIndex = 2;//默认给下拉框赋值"全部"(赋值2是因为在此"全部"的索引是2)
}
5、条件分页查询的实现
第一步:数据库的存储过程
CREATE PROCEDURE ShuJuBiaoGe_FenYeChaXun
@tblName varchar(4000), -- 表名
@strGetFields varchar(4000) = '*', -- 需要返回的列
@fldName varchar(255)='''', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit output, -- 返回记录总数, 非0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非0 值则降序
@strWhere varchar(1500) = '''' -- 查询条件(注意: 不要加where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @temp varchar(100)--截取后的临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
end
--以上代码的意思是如果@doCount传递过来的不是,就执行总数统计。以下的所有代码都是@doCount为的情况:
else
begin
if @OrderType != 0--升序
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @fldName +' desc'
--如果@OrderType不是,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @fldName +' asc'
end
if @PageIndex = 1
begin
if @strWhere != ''''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '
from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '
from '+ @tblName + ' '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @temp=(select SUBSTRING(@fldName,charindex('.',@fldName,1)+1,len(@fldName)) )
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '(tblTmp.'+ @temp + ')
from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + '
from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '(tblTmp.'
+ @temp + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
print @strSQL
exec (@strSQL)
第二步:逻辑层(BLL)代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
namespace BLL
{
public class BLLGongGongFenYe
{
DALPublic.DALMethod myDALMethod = new DALPublic.DALMethod();
public DataTable frmXiaoShouDan_select_TongYongFenYe(string strTblName, string strGetFields,string strFldName, int intPageSize, int intPageIndex,bool blDoCount, bool blOrderType, string strWhere)
{
SqlParameter[] mySqlParameters = {
new SqlParameter("@tblName",SqlDbType.VarChar,4000 ),
new SqlParameter("@strGetFields",SqlDbType.VarChar,4000 ),
new SqlParameter("@fldName",SqlDbType.VarChar,255 ),
new SqlParameter("@PageSize",SqlDbType.Int ),
new SqlParameter("@PageIndex",SqlDbType.Int ),
new SqlParameter("@doCount",SqlDbType.Bit ),
new SqlParameter("@OrderType",SqlDbType.Bit ),
new SqlParameter("@strWhere",SqlDbType.VarChar,1500 ),
};
mySqlParameters[0].Value = strTblName;
mySqlParameters[1].Value = strGetFields;
mySqlParameters[2].Value = strFldName;
mySqlParameters[3].Value = intPageSize;
mySqlParameters[4].Value = intPageIndex;
mySqlParameters[5].Value = blDoCount;
mySqlParameters[6].Value = blOrderType;
mySqlParameters[7].Value = strWhere;
DataTable dt = myDALMethod.QueryDataTable("ShuJuBiaoGe_FenYeChaXun", mySqlParameters);
return dt;
}
}
}
第三步:界面层(UIL)代码
(1)声明一系列字段(变量)并赋值,实例化BLL
#region 销售单统计需要用到的字段
string detKaiShiRiQi; //开始日期
string detJiShuRiQi; //结束日期
decimal decYueShu; //页数
#endregion
#region 数据库查询需要的参数,表名,字段名,排序字段,每页的大小,查询第几页,where条件
string strTblName = " pw_XiaoShouDan INNER JOIN sys_YuanGong ON pw_XiaoShouDan.LuRuYuanID = sys_YuanGong.YuanGongID INNER JOIN sys_KeHu ON pw_XiaoShouDan.KeHuID = sys_KeHu.KeHuID INNER JOIN sys_ShuXingMingXi ON pw_XiaoShouDan.FuKuanZhuangTaiID = sys_ShuXingMingXi.ShuXingMingXiID";
string strGetFields = " pw_XiaoShouDan.XiaoShouDanID, pw_XiaoShouDan.LuRuYuanID, RTRIM(LTRIM(sys_YuanGong.YuanGongXingMing)) AS YuanGongXingMing, pw_XiaoShouDan.FuKuanZhuangTaiID, pw_XiaoShouDan.KeHuID, "
+" RTRIM(LTRIM(sys_KeHu.KeHuXingMing)) AS KeHuXingMing, RTRIM(LTRIM(pw_XiaoShouDan.XiaoShouDanBianHao)) AS XiaoShouDanBianHao, pw_XiaoShouDan.XiaoShouRiQi, pw_XiaoShouDan.YingShouJinE, pw_XiaoShouDan.ShiShouJinE, "
+" pw_XiaoShouDan.GengXinShiJian, pw_XiaoShouDan.YouXiaoFou, RTRIM(LTRIM(sys_KeHu.YiDongShouJi)) AS YiDongShouJi, RTRIM(LTRIM(sys_KeHu.TongXunDiZhi)) AS TongXunDiZhi,RTRIM(LTRIM(sys_ShuXingMingXi.ShuXingMingXiMingCheng)) AS FuKuanZhuangTai ";
string strFldName = " pw_XiaoShouDan.XiaoShouDanID ";//排序的字段名
int intPageSize = 20;//页尺寸
int intPageIndex = 1;//页码
string strWhere = " pw_XiaoShouDan.YouXiaoFou=1 "; //查询条件 (注意: 不要加 where)
#endregion
BLL.BLLGongGongFenYe myBLLGongGongFenYe = new BLL.BLLGongGongFenYe();
(2)创建一个方法,里面判断累加查询条件、页数、查询出结果并返回结果
/// <param name="intXianShiHang">每页显示的行数</param>
/// <param name="intDangQianYeShu">当前页数</param>
/// <param name="bolChaXingZhongShu"></param>
/// <param name="bolDaoXu">如果是true就是倒序</param>
/// <returns></returns>
DataTable ChaXunShuJu(int intXianShiHang, int intDangQianYeShu, bool bolChaXingZhongShu, bool bolDaoXu)
{
strWhere = " pw_XiaoShouDan.YouXiaoFou=1 ";//初始化查询条件
detKaiShiRiQi = dtpKaiShi.Value.AddDays(-1).ToString();//给开始时间减一天
detJiShuRiQi = dtpJeiShu.Value.AddDays(1).ToString();//给结束时间加一天
strWhere += " and (pw_XiaoShouDan.XiaoShouRiQi >'" + detKaiShiRiQi + "'and pw_XiaoShouDan.XiaoShouRiQi <'" + detJiShuRiQi + "')";//累加查询条件,大于开始时间,小于结束时间
if (cboFuKuanZhuangTai.Text != "" && cboFuKuanZhuangTai.Text != "全部")//判断下拉框选择内容
{
if (Convert.ToInt32(cboFuKuanZhuangTai.SelectedValue) != 0)//防止报错,可以不加这个判断
{
strWhere += " and pw_XiaoShouDan.FuKuanZhuangTaiID = " + Convert.ToInt32(cboFuKuanZhuangTai.SelectedValue);//累加查询条件
}
}
if (txtMoHu.Text != "")//判断文本框有没有输入内容
{
strWhere += " and (sys_YuanGong.YuanGongXingMing like '%'+'" + txtMoHu.Text.Trim() + "'+'%' or sys_KeHu.KeHuXingMing like '%'+'" + txtMoHu.Text.Trim() + "'+'%'" +
" or pw_XiaoShouDan.XiaoShouDanBianHao like '%'+'" + txtMoHu.Text.Trim() + "'+'%' or sys_KeHu.YiDongShouJi like '%'+'" + txtMoHu.Text.Trim() + "'+'%'" +
" or sys_KeHu.TongXunDiZhi like '%'+'" + txtMoHu.Text.Trim() + "'+'%')";
//累加模糊查询内容
}
decYeShu = Convert.ToDecimal(myBLLGongGongFenYe.frmXiaoShouDan_select_TongYongFenYe(strTblName, strGetFields, strFldName, intPageSize, intPageIndex, true, true, strWhere).Rows[0][0]);//获取查询结果的行数
if (decYeShu / intXianShiHang <= Convert.ToInt32(decYeShu / intXianShiHang))//判断有多少页
{
decYeShu = Convert.ToInt32(decYeShu / intXianShiHang);
}
else
{
decYeShu = Convert.ToInt32(decYeShu / intXianShiHang) + 1;
}
if (intDangQianYeShu > decYeShu)//如果当前页数大于最大页数,则重新复制为最大页数
{
intPageIndex = (int)decYeShu;
intDangQianYeShu = (int)decYeShu;
}
if (intPageIndex == 0 || intDangQianYeShu == 0)//如果当前页数为0,则重新赋值为1
{
intPageIndex = 1;
intDangQianYeShu = 1;
}
lblZhongShu.Text = "/" + decYeShu.ToString();
txtDangQianYeShu.Text = intDangQianYeShu.ToString();
return myBLLGongGongFenYe.frmXiaoShouDan_select_TongYongFenYe(strTblName, strGetFields, strFldName, intXianShiHang, intDangQianYeShu, bolChaXingZhongShu, bolDaoXu, strWhere);//返回查询出来的结果
}
(3)查询按钮的单击事件
private void btnChaXun_Click(object sender, EventArgs e)
{
intPageIndex = 1;//默认第一页
dgvXiaoShouDan.DataSource = ChaXunShuJu(intPageSize, intPageIndex, false, true);//调用自己创建的方法,返回结果后赋值给数据表格
}
7、点击单据详细弹出产品明细窗体
第一步:数据库存储过程
IF (@TYPE = 'frmXiaoShouKaiDan_Select_btnDanJuXiangXi_SelectXiaoShouDanMingXi')
BEGIN
SELECT pw_XiaoShouDanMingXi.XiaoShouDanID, sys_ChanPinZiLiao.ChanPinMingCheng, sys_ChanPinZiLiao.ChanPinBianHao, pw_XiaoShouDanMingXi.DanJia, pw_XiaoShouDanMingXi.ShuLiang,
pw_XiaoShouDanMingXi.YiTuiHuoShu
FROM pw_XiaoShouDanMingXi INNER JOIN
sys_ChanPinZiLiao ON pw_XiaoShouDanMingXi.ChanPinID = sys_ChanPinZiLiao.ChanPinID
WHERE (pw_XiaoShouDanMingXi.XiaoShouDanID = @XiaoShouDanID)
END
第二步:逻辑层(BLL)代码
public DataTable frmXiaoShouKaiDan_Select_btnDanJuXiangXi_SelectXiaoShouDanMingXi(int intXiaoShouDanID)
{
SqlParameter[] mySqlParameters ={
new SqlParameter("@TYPE",SqlDbType.Char),
new SqlParameter("@XiaoShouDanID",SqlDbType.Int)
};
mySqlParameters[0].Value = "frmXiaoShouKaiDan_Select_btnDanJuXiangXi_SelectXiaoShouDanMingXi";
mySqlParameters[1].Value = intXiaoShouDanID;
return myDALMethod.QueryDataTable("frmXiaoShouKaiDan_Select", mySqlParameters);
}
第三步:界面层(BLL)代码,数据表格的单击事件
private void dgvXiaoShouDan_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if(dgvXiaoShouDan.Rows.Count>0)//判断数据表格有没有数据
{
if(dgvXiaoShouDan.CurrentCell.ColumnIndex==10)//判断点的列是不是"单据详情"
{
DataTable dtMingXi=myfrmXiaoShouKaiDan_Select.frmXiaoShouKaiDan_Select_btnDanJuXiangXi_SelectXiaoShouDanMingXi(Convert.ToInt32(dgvXiaoShouDan.CurrentRow.Cells["销售单ID"].Value));//获取数据表格当前行的销售单ID,根据销售单ID查询单据详细
dtMingXi.Columns.Add("XiaoJi", typeof(string));//给单据明细表添加一个"小计"的列,列名为"XiaoJi"
for (int i = 0; i < dtMingXi.Rows.Count; i++)
{
dtMingXi.Rows[i]["XiaoJi"] = Convert.ToDecimal(dtMingXi.Rows[i]["DanJia"]) * (Convert.ToDecimal(dtMingXi.Rows[i]["ShuLiang"]) - Convert.ToDecimal(dtMingXi.Rows[i]["YiTuiHuoShu"]));//计算"小计"数值
}
frmXiaoShouDanMingXi_Select myfrmXiaoShouDanMingXi_Select = new frmXiaoShouDanMingXi_Select(dtMingXi, dgvXiaoShouDan.CurrentRow.Cells["销售单编号"].Value.ToString().Trim());//实例化产品明细窗体
myfrmXiaoShouDanMingXi_Select.ShowDialog();//弹出产品明细窗体
}
}
}
第四步:产品明细窗体的代码,下面为构造方法
/// <param name="dtMingXi">产品明细表格</param>
/// <param name="strDanJuBianHao">单据编号</param>
public frmXiaoShouDanMingXi_Select(DataTable dtMingXi,string strDanJuBianHao)
{
InitializeComponent();
dgvXiaoShouDanMingXi.AutoGenerateColumns = false;//设置不能自动添加列
dgvXiaoShouDanMingXi.AllowUserToAddRows = false;//设置不能手动添加行
dgvXiaoShouDanMingXi.ReadOnly = true;//设置不能编辑表格的内容
if (strDanJuBianHao.IndexOf("XD", 0) >= 0)//如果是销售单(还有保修、退货、换货单)的产品明细,则显示"已退货数"列,同时调整列宽度
{
单价.Width = 90;
数量.Width = 90;
已退货数.Width = 90;
已退货数.Visible = true;
小计.Width = 90;
}
dgvXiaoShouDanMingXi.DataSource = dtMingXi;//给数据表格的数据源赋值
txtDanJuBianHao.Text = strDanJuBianHao;//给单据编号赋值
}
注:此文章只供学习参考,禁止用于商业用途。