销售记录这个模块,可以查询录入的销售单,查询出来的数据可以分页,单击单据详情可以看到产品明细,可以通过日期范围、付款状态、关键字筛选进行查询,还可以导出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;//给单据编号赋值
}
注:此文章只供学习参考,禁止用于商业用途。