海马汽车经销商管理系统技术解析(十七)新增出库

本文详细解析了海马汽车经销商管理系统的出库功能实现,包括新增出库界面,强调了选择仓库和配件时的注意事项,以及库存数量充足的验证。功能涉及数据库表设计,如出入库表、库存表和仓库表,并介绍了配件查询仓库、库存数查询及数据保存的相关逻辑流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新增出库

对出库的配件进行记录。主界面入下:

新增界面如下:


选择仓库或者配件时要注意:该仓库里是否存在该配件或该配件是否存在于该仓库。

填写数量时要注意:该仓库库存数是否充足。

从【入库新增】界面可以看到控件有:

控件

说明

文本框(TextBox)

编辑控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以设置事件。

日期控件(DateTimePicKer)

表格(DataGridView)

下拉框(ComboBox)

按钮(Button)

1、数据库功能实现

第一步:数据库

1、表和关系

表1、出入库表(PW_ComeInAndGoOutList)

列名

数据类型

主键/外键

说明

ComeInAndGoOutID

int - Identity

主键

出入库ID

ComeInAndGoOutOddNembers

nchar (20)

 

出入库单号

ComeInAndGoOutGross

decimal (18, 2)

 

出入库总数量

ComeInAndGoOutData

datetime

 

出入库时间

DrawUp_StaffID

int

外键

员工档案表,编制人_员工ID

ExAminePerson_StaffID

int

外键

员工档案表,审核人_员工ID

IfComeIn

bit

 

入库否

IfEffective

bit

 

有效否

表2、出入库明细表(PW_ComeInAndGoOutMinuteList)

列名

数据类型

主键/外键

说明

ComeInAndGoOutMinuteID

int

主键

出入库明细ID

ComeInAndGoOutID

int

外键

出入库表,出入库ID

PartsID

int

外键

配件表,配件ID

StorageID

int

外键

仓库表,仓库ID

AtributeMinuteID_ComeInAndGoOutType

int

外键

属性明细表,属性明细ID_出入库类型

ComeInAndGoOutQuantity

decimal (18, 2)

 

出入库数量

ComeInAndGoOutPrice

decimal (18, 2)

 

出入库单价

表3、库存表(BM_StockList)

列名

数据类型

主键/外键

说明

StockID

int - Identity

主键

库存ID

PartsID

int

外键

配件表,配件ID

StorageID

int

外键

仓库表,仓库ID

StockNumber

decimal (18, 2)

 

库存数

表4、仓库表(BM_StorageList)

列名

数据类型

主键/外键

说明

StorageID

int - Identity

主键

仓库ID

StorageName

nchar (20)

 

仓库名

Dimension

decimal (18, 2)

 

容积

功能实现

1、 根据配件查询所在的所有仓库

第一步:数据库存储过程

IF(@TYPE='FRM_ChuKuGuanLi_Insert_SelectPartsInStorage')
	BEGIN
	SELECT     BM_StockList.StorageID, BM_StorageList.StorageName
    FROM         BM_StockList INNER JOIN
                      BM_StorageList ON BM_StockList.StorageID = BM_StorageList.StorageID
    WHERE   BM_StockList.PartsID=@PartsID               
	END

 

第二步:逻辑层(BLL)

//根据所选配件查询该配件存在的所有仓库
[OperationContract]
        public DataSet FRM_ChuKuGuanLi_Insert_SelectPartsInStorage(int intPartsID)
        {
            SqlParameter[] mySqlParameters =
            {
            new SqlParameter("@TYPE",SqlDbType.NChar),
            new SqlParameter("@PartsID",SqlDbType.Int),
            };
            mySqlParameters[0].Value = "FRM_ChuKuGuanLi_Insert_SelectPartsInStorage";
            mySqlParameters[1].Value = intPartsID;
            DataTable dt = myDALMethod.QueryDataTable("库存管理_FRM_ChuKuGuanLi_Insert", mySqlParameters);
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            return ds; //返回数据集
        }

 

第三步:界面层(UIL)配件名称索引改变事件

BLL海马汽车销售系统.库存管理.FRM_ChuKuGuanLi_Insert.FRM_ChuKuGuanLi_InsertClient myFRM_ChuKuGuanLi_InsertClient = 
            new BLL海马汽车销售系统.库存管理.FRM_ChuKuGuanLi_Insert.FRM_ChuKuGuanLi_InsertClient();
private void cboPartsName_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(intCount==1)
            {                
                //根据所选配件查询仓库
                DataTable dtStorage = myFRM_ChuKuGuanLi_InsertClient.FRM_ChuKuGuanLi_Insert_SelectPartsInStorage(Convert.ToInt32(cboPartsName.SelectedValue)).Tables[0];
                cboStorageName.DataSource = dtStorage;//为【仓库名称】绑定数据源
                cboStorageName.DisplayMember = "StorageName";//设置显示的属性
                cboStorageName.ValueMember = "StorageID";//设置下拉框中的值
            }
        }

 

2、查询库存数—【增加】按钮点击事件

第一步:数据库存储过程

IF(@TYPE='FRM_RuKuGuanLi_Insert_SelectKuCun')
	BEGIN
	SELECT     StockID,StockNumber
    FROM         BM_StockList        
    WHERE  PartsID=@PartsID AND StorageID=@StorageID
	END

 

第二步:逻辑层(BLL)

//根据配件与仓库查询库存数
[OperationContract]
        public DataSet FRM_RuKuGuanLi_Insert_SelectKuCun(int intPartsID, int intStorageID)
        {
            SqlParameter[] mySqlParameters =
        {
        new SqlParameter("@TYPE",SqlDbType.NChar),        
        new SqlParameter("@PartsID",SqlDbType.Int),
        new SqlParameter("@StorageID",SqlDbType.Int),
        };
            mySqlParameters[0].Value = "FRM_RuKuGuanLi_Insert_SelectKuCun";
            mySqlParameters[1].Value = intPartsID;
            mySqlParameters[2].Value = intStorageID;
            DataTable dt= myDALMethod.QueryDataTable("库存管理_FRM_RuKuGuanLi_Insert", mySqlParameters);
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            return ds; //返回数据集
        }

 

第三步:界面层(UIL)

BLL海马汽车销售系统.库存管理.FRM_RuKuGuanLi_Insert.FRM_RuKuGuanLi_InsertClient myFRM_RuKuGuanLi_InsertClient = 
            new BLL海马汽车销售系统.库存管理.FRM_RuKuGuanLi_Insert.FRM_RuKuGuanLi_InsertClient();
private void btnInsert_Click(object sender, EventArgs e)
        {
            if (dgvGoOutMinute.Rows.Count > 0)//dgv不为空
            {
                for (int i = 0; i < dgvGoOutMinute.Rows.Count; i++)//循环dgv
                {
                    //如果dgv中存在相同的配件以相同的出库类型从相同仓库出库的单据
                    if (Convert.ToInt32(cboPartsName.SelectedValue) == Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["配件ID"].Value)
                        && Convert.ToInt32(cboStorageName.SelectedValue) == Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["仓库ID"].Value)
                        && Convert.ToInt32(cboGoOutType.SelectedValue) == Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["出库类型ID"].Value))
                    {
                        MessageBox.Show("该配件以该类型从该目标仓库出库的单据已存在");
                        return;
                    }
                }
            }
            if (txtPrice.Text == "")//出库单价为空
            {
                MessageBox.Show("出库单价不能为空!");
                return;
            }
            if (txtQuantity.Text == "")//出库数量为空
            {
                MessageBox.Show("出库数量不能为空!");
                return;
            }
            //根据配件和仓库查询库存数
            DataTable dtKunCun = myFRM_RuKuGuanLi_InsertClient.FRM_RuKuGuanLi_Insert_SelectKuCun(Convert.ToInt32(cboPartsName.SelectedValue), Convert.ToInt32(cboStorageName.SelectedValue)).Tables[0];
            if (dtKunCun.Rows.Count > 0)//如果有数据
            {
                decimal decKuCunShu = Convert.ToDecimal(dtKunCun.Rows[0]["StockNumber"]);
                if (decKuCunShu > Convert.ToDecimal(txtQuantity.Text))//如果库存充足
                {
                    //dgv增加一行
                    dgvGoOutMinute.Rows.Add();
                    //把信息添加到dgv中
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["配件ID"].Value = Convert.ToInt32(cboPartsName.SelectedValue);
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["配件名称"].Value = cboPartsName.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["配件代码"].Value = txtPartsCode.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["单位"].Value = txtUnit.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["规格"].Value = txtGuiGe.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["出库类型ID"].Value = Convert.ToInt32(cboGoOutType.SelectedValue);
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["出库类型"].Value = cboGoOutType.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["仓库名称"].Value = cboStorageName.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["仓库ID"].Value = Convert.ToInt32(cboStorageName.SelectedValue);
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["出库单价"].Value = txtPrice.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["出库数量"].Value = txtQuantity.Text;
                    dgvGoOutMinute.Rows[dgvGoOutMinute.Rows.Count - 1].Cells["出库金额"].Value = txtMoney.Text;
                }
                else//如果库存不足
                {
                    MessageBox.Show("该仓库库存不足!");
                }
            }
            else//如果没数据
            {
                MessageBox.Show("该仓库不存在该配件!");
            }
            HeJi();
        }

        public void HeJi()
        {
            decimal decZongJiE = 0;
            decimal decZongLiang = 0;
            if (dgvGoOutMinute.Rows.Count > 0) //dgv不为空
            {
                for (int i = 0; i < dgvGoOutMinute.Rows.Count; i++)//循环dgv
                {
                    //合计出库金额与出库数量
                    decZongJiE += Convert.ToDecimal(dgvGoOutMinute.Rows[i].Cells["出库金额"].Value);
                    decZongLiang += Convert.ToDecimal(dgvGoOutMinute.Rows[i].Cells["出库数量"].Value);
                }
            }
            //赋值给【出库金额】与【出库数量】
            txtGross.Text = decZongLiang.ToString().Trim();
            txtAmount.Text = decZongJiE.ToString().Trim();
        }

3、保存

第一步:数据库存储过程

IF(@TYPE='FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOut')
	BEGIN
	INSERT     PW_ComeInAndGoOutList(ComeInAndGoOutOddNembers, ComeInAndGoOutGross, ComeInAndGoOutData, DrawUp_StaffID, ExAminePerson_StaffID, IfComeIn,IfEffective)
    VALUES         (@ComeInAndGoOutOddNembers, @ComeInAndGoOutGross, @ComeInAndGoOutData, @DrawUp_StaffID, @ExAminePerson_StaffID, @IfComeIn,1)
    SELECT  @@IDENTITY
	END
	IF(@TYPE='FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOutMinute')
	BEGIN
	INSERT     PW_ComeInAndGoOutMinuteList(ComeInAndGoOutID, PartsID, StorageID, AtributeMinuteID_ComeInAndGoOutType, ComeInAndGoOutQuantity, ComeInAndGoOutPrice)
	VALUES     (@ComeInAndGoOutID, @PartsID, @StorageID, @AtributeMinuteID_ComeInAndGoOutType, 
	             @ComeInAndGoOutQuantity, @ComeInAndGoOutPrice)         
	END
	IF(@TYPE='FRM_RuKuGuanLi_Insert_btnInsert_ClickUpdateStockNumber')
	BEGIN
	UPDATE     BM_StockList
    SET         StockNumber=@StockNumber         
    WHERE  BM_StockList.StockID=@StockID
	END	
	IF(@TYPE='FRM_RuKuGuanLi_Insert_SelectKuCun')
	BEGIN
	SELECT     StockID,StockNumber
    FROM         BM_StockList        
    WHERE  PartsID=@PartsID AND StorageID=@StorageID
	END

 

第二步:逻辑层(BLL)

//保存出库信息
[OperationContract]
        public int FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOut(string strComeInAndGoOutOddNembers, decimal decComeInAndGoOutGross, DateTime dtmComeInAndGoOutData, int intDrawUp,
            int intExAminePerson, bool blnIfComeIn)
        {
            SqlParameter[] mySqlParameters =
        {
            new SqlParameter("@TYPE",SqlDbType.NChar),
            new SqlParameter("@ComeInAndGoOutOddNembers",SqlDbType.NChar),
            new SqlParameter("@ComeInAndGoOutGross",SqlDbType.Decimal),
            new SqlParameter("@ComeInAndGoOutData",SqlDbType.DateTime),
            new SqlParameter("@DrawUp_StaffID",SqlDbType.Int),
            new SqlParameter("@ExAminePerson_StaffID",SqlDbType.Int),
            new SqlParameter("@IfComeIn",SqlDbType.Bit),
        };
            mySqlParameters[0].Value = "FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOut";
            mySqlParameters[1].Value =strComeInAndGoOutOddNembers;
            mySqlParameters[2].Value =decComeInAndGoOutGross;
            mySqlParameters[3].Value =dtmComeInAndGoOutData;
            mySqlParameters[4].Value =intDrawUp;
            mySqlParameters[5].Value =intExAminePerson;
            mySqlParameters[6].Value = blnIfComeIn;
            DataTable dt = myDALMethod.QueryDataTable("库存管理_FRM_RuKuGuanLi_Insert", mySqlParameters);
            return Convert.ToInt32(dt.Rows[0][0]);
        }
//保存出库明细信息
        [OperationContract]
        public int FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOutMinute(int intComeInAndGoOutID, int intPartsID, int intStorageID, int intComeInAndGoOutType,
            decimal decComeInAndGoOutQuantity, decimal decComeInAndGoOutPrice)
        {
            SqlParameter[] mySqlParameters =
        {
            new SqlParameter("@TYPE",SqlDbType.NChar),
            new SqlParameter("@ComeInAndGoOutID",SqlDbType.Int),
            new SqlParameter("@PartsID",SqlDbType.Int),
            new SqlParameter("@StorageID",SqlDbType.Int),
            new SqlParameter("@AtributeMinuteID_ComeInAndGoOutType",SqlDbType.Int),
            new SqlParameter("@ComeInAndGoOutQuantity",SqlDbType.Decimal),
            new SqlParameter("@ComeInAndGoOutPrice",SqlDbType.Decimal),
        };
            mySqlParameters[0].Value = "FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOutMinute";
            mySqlParameters[1].Value = intComeInAndGoOutID;
            mySqlParameters[2].Value = intPartsID;
            mySqlParameters[3].Value = intStorageID;
            mySqlParameters[4].Value =intComeInAndGoOutType;
            mySqlParameters[5].Value =decComeInAndGoOutQuantity;
            mySqlParameters[6].Value = decComeInAndGoOutPrice;
            return myDALMethod.UpdateData("库存管理_FRM_RuKuGuanLi_Insert", mySqlParameters);
        }
        [OperationContract]
//修改库存数
        public int FRM_RuKuGuanLi_Insert_btnInsert_ClickUpdateStockNumber(decimal decStockNumber, int intStockID)
        {
            SqlParameter[] mySqlParameters =
        {
        new SqlParameter("@TYPE",SqlDbType.NChar),
        new SqlParameter("@StockNumber",SqlDbType.Decimal),
        new SqlParameter("@StockID",SqlDbType.Int),
        };
            mySqlParameters[0].Value = "FRM_RuKuGuanLi_Insert_btnInsert_ClickUpdateStockNumber";
            mySqlParameters[1].Value = decStockNumber;
            mySqlParameters[2].Value = intStockID;
            return myDALMethod.UpdateData("库存管理_FRM_RuKuGuanLi_Insert", mySqlParameters);
        }        
//查询库存数
        [OperationContract]
        public DataSet FRM_RuKuGuanLi_Insert_SelectKuCun(int intPartsID, int intStorageID)
        {
            SqlParameter[] mySqlParameters =
        {
        new SqlParameter("@TYPE",SqlDbType.NChar),        
        new SqlParameter("@PartsID",SqlDbType.Int),
        new SqlParameter("@StorageID",SqlDbType.Int),
        };
            mySqlParameters[0].Value = "FRM_RuKuGuanLi_Insert_SelectKuCun";
            mySqlParameters[1].Value = intPartsID;
            mySqlParameters[2].Value = intStorageID;
            DataTable dt= myDALMethod.QueryDataTable("库存管理_FRM_RuKuGuanLi_Insert", mySqlParameters);
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            return ds;
        }

第三步:界面层(UIL)

BLL海马汽车销售系统.库存管理.FRM_RuKuGuanLi_Insert.FRM_RuKuGuanLi_InsertClient myFRM_RuKuGuanLi_InsertClient = 
            new BLL海马汽车销售系统.库存管理.FRM_RuKuGuanLi_Insert.FRM_RuKuGuanLi_InsertClient();
private void btnSave_Click(object sender, EventArgs e)
        {
            int InsertComeInAndGoOutMinute = 0;
            string strXiaoShouShouKuan = "CK";
            string strComeInAndGoOutOddNembers = ShengChengDanHao(strXiaoShouShouKuan);//生成出库单号
            //给参数赋值
            decimal decComeInAndGoOutGross = Convert.ToDecimal(txtGross.Text);
            DateTime dtmComeInAndGoOutData = Convert.ToDateTime(dtpGoOutData.Value);
            int intDrawUp = Convert.ToInt32(cboDrawUp.SelectedValue);
            int intExAminePerson = Convert.ToInt32(cboExAminePerson.SelectedValue);
            bool blnIfComeIn = false;
            //把出库信息保存到数据库
            int intGoOut = myFRM_RuKuGuanLi_InsertClient.FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOut(strComeInAndGoOutOddNembers, decComeInAndGoOutGross,
                dtmComeInAndGoOutData, intDrawUp, intExAminePerson, blnIfComeIn);
            if (dgvGoOutMinute.Rows.Count > 0) //如果dav不为空
            {
                for (int i = 0; i < dgvGoOutMinute.Rows.Count; i++)//循环dgv
                {
                    //根据配件和仓库查询库存
                    DataTable dtKunCun = myFRM_RuKuGuanLi_InsertClient.FRM_RuKuGuanLi_Insert_SelectKuCun(Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["配件ID"].Value), Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["仓库ID"].Value)).Tables[0];
                    if (dtKunCun.Rows.Count > 0)//如果有数据
                    {
                        //修改库存数
                        decimal decKuCunShu =  Convert.ToDecimal(dtKunCun.Rows[0]["StockNumber"])-Convert.ToDecimal(dgvGoOutMinute.Rows[i].Cells["出库数量"].Value);
                        int intUpdate = myFRM_RuKuGuanLi_InsertClient.FRM_RuKuGuanLi_Insert_btnInsert_ClickUpdateStockNumber(decKuCunShu, Convert.ToInt32(dtKunCun.Rows[0]["StockID"]));
                    }
                    //给参数赋值
                    int intComeInAndGoOutID = intGoOut;
                    int intPartsID = Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["配件iD"].Value);
                    int intStorageID = Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["仓库ID"].Value);
                    int intComeInAndGoOutType = Convert.ToInt32(dgvGoOutMinute.Rows[i].Cells["出库类型ID"].Value);
                    decimal decComeInAndGoOutQuantity = Convert.ToDecimal(dgvGoOutMinute.Rows[i].Cells["出库数量"].Value);
                    decimal decComeInAndGoOutPrice = Convert.ToDecimal(dgvGoOutMinute.Rows[i].Cells["出库单价"].Value);
                    //把出库明细保存到数据库
                    InsertComeInAndGoOutMinute = myFRM_RuKuGuanLi_InsertClient.FRM_RuKuGuanLi_Insert_btnInsert_ClickInsertComeInAndGoOutMinute(intComeInAndGoOutID,
                        intPartsID, intStorageID, intComeInAndGoOutType, decComeInAndGoOutQuantity, decComeInAndGoOutPrice);
                }
            }
            if (intGoOut > 0 || InsertComeInAndGoOutMinute > 0)//如果方法调用成功
            {
                MessageBox.Show("保存成功!");
                txtGoOutOddNember.Text = strComeInAndGoOutOddNembers.Trim();
            }
        }


 以上仅供学习参考,禁止用于商业用途!!!















































 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值