/// <summary> /// 执行扣减待入仓结存,若有之前的批量卡清单和数量则先写入再扣减 /// </summary> /// <param name="tran">当前事务</param> /// <param name="strLotCardList">当前扣减的批量卡清单和数量</param> /// <param name="billNum">送货单号</param> /// <param name="rowId">当前行号</param> /// <param name="productNum">之前的生产编号</param> private void DeductionWaitInStoreBalance( SqlTransaction tran, string strLotCardList, string billNum, byte rowId, string productNum ) { //***扣减当前输入的批量卡和数量*** //检测输入的内容 string strReg = "[^>]+(?=</div>)"; var matchs = Regex.Matches(strLotCardList, strReg); //查询或插入命令 using (var daLotCard = new t_delivery_bill_lot_cardTableAdapter()) using (var cmd = new SqlCommand()) { //设置连接 daLotCard.Connection = cmd.Connection = tran.Connection; //设置事务 daLotCard.Transaction = cmd.Transaction = tran; //取出匹配到的数据 foreach (Match match in matchs) { //通过冒号分出批量卡号和数量 string[] strs = match.Value.Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries); string strLotId = strs[0]; int iQty = int.Parse(strs[1]); //部门名称 string procName = "成品仓"; //待入仓成品结余pcs总数 int totalPnlQty; int totalPcsQty; //获取该批量卡在待入仓成品仓的结存数 ydOperateBalanceLotCrad.GetProcBalanceQty( tran, procName, strLotId, null, out totalPnlQty, out totalPcsQty ); //检测pcs数量必须大于0 if (totalPcsQty < iQty) { if (totalPnlQty > 0) { throw new Exception(string.Format("批量卡 {0} 在待入仓成品的结存为pnl数!", strLotId)); } else { throw new Exception(string.Format("批量卡 {0} 在待入仓成品的结存不足扣数 {1} pcs!", strLotId, iQty)); } } //保存当前批量卡出数清单 daLotCard.InsertData(billNum, rowId, strLotId, iQty, string.Empty); //从待入仓结存中扣取数据 cmd.CommandText = "UPDATE a " + "SET [pcs_qty]=[pcs_qty]-@PcsQty OUTPUT [inserted].[pcs_qty] " + "FROM (" + "SELECT TOP 1 * " + "FROM [t_complete_lot_card_wait] " + "WHERE [proc_name]=@ProcName AND [lot_id]=@LotId AND [pcs_qty]>0 " + "ORDER BY [id] DESC" + ") a"; //设置参数值 cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@PcsQty", iQty); cmd.Parameters.AddWithValue("@ProcName", procName); cmd.Parameters.AddWithValue("@LotId", strLotId); //取得扣减后的pcs数量 int iLastQty = Convert.ToInt32(cmd.ExecuteScalar()); while (iLastQty < 0) { cmd.Parameters["@PcsQty"].Value = -iLastQty; iLastQty = Convert.ToInt32(cmd.ExecuteScalar()); } //修改查询语句删除结存小于或等于0的项 cmd.CommandText = "DELETE FROM [t_complete_lot_card_wait] " + "WHERE [proc_name]=@ProcName AND [lot_id]=@LotId AND [pcs_qty]<=0"; //设置参数值 cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@ProcName", procName); cmd.Parameters.AddWithValue("@LotId", strLotId); //执行删除 cmd.ExecuteNonQuery(); } } }