新增出库
对出库的配件进行记录。主界面入下:
新增界面如下:
选择仓库或者配件时要注意:该仓库里是否存在该配件或该配件是否存在于该仓库。
填写数量时要注意:该仓库库存数是否充足。
从【入库新增】界面可以看到控件有:
控件 |
说明 |
文本框(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();
}
}
以上仅供学习参考,禁止用于商业用途!!!