钟表维修管理系统技术解析(二) 销售记录的查询功能

销售记录这个模块,可以查询录入的销售单,查询出来的数据可以分页,单击单据详情可以看到产品明细,可以通过日期范围、付款状态、关键字筛选进行查询,还可以导出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;//给单据编号赋值
        }


注:此文章只供学习参考,禁止用于商业用途。












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值