欧派项目: 循环调用 BusinessDataServiceHelper.Save报连接池
金蝶云社区-云社区用户5kC73565
云社区用户5kC73565
0人赞赏了该文章 1226次浏览 未经作者许可,禁止转载编辑于2016年04月09日 20:03:36

循环调用 BusinessDataServiceHelper.Save报连接池错误
请求解决方法:

项目:广州欧派采购Excel导入。。。


错误如下:

调用代码场景如下:

采购订单Excel导入二次开发, 调用Save方法,生成采购订单保存,循环次数很大

代码如下:

// FourS.K3.Common.Business.CommonUtil
// 调用保存操作
///


/// 保存物料,并显示保存结果
///

///
///
public static IOperationResult SaveBill(Context ctx, IBillView billView, OperateOption saveOption)
{
// 设置FormId
Form form = billView.BillBusinessInfo.GetForm();
if (form.FormIdDynamicProperty != null)
{
form.FormIdDynamicProperty.SetValue(billView.Model.DataObject, form.Id);
}
// 调用保存操作
IOperationResult saveResult = BusinessDataServiceHelper.Save(ctx,billView.BillBusinessInfo, billView.Model.DataObject,
saveOption,"Save");
return saveResult;

}

[u]已经采用了多线程调用方式片断代码:[/u]

OperateOption saveOption = OperateOption.Create();
if (isFirst)
{
//System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = processValue;
isFirst = false;
}
else
{
processValue +=1;
if (processValue >= 100)
{
processValue -= 60;
}
this.View.Session["ProcessRateValue"] = processValue;
}


IOperationResult result = FourS.K3.Common.Business.CommonUtil.SaveBill(this.Context, billView, saveOption);
if (!result.IsSuccess)
{
//if (result.ValidationErrors.Count > 0)
// this.View.ShowErrMessage(result.ValidationErrors.FirstOrDefault().Message, "", MessageBoxType.Error);
if (result.ValidationErrors.Count > 0)
ErssMessg += Convert.ToString(result.ValidationErrors[0].Message);
else ErssMessg += "保存失败";
int RowCount = billView.Model.GetEntryRowCount("FPOOrderEntry");
billView.Model.DeleteEntryRow("FPOOrderEntry", RowCount - 1);
// billView.Model.DeleteEntryData("FPOOrderEntry");
k--;
}
else
{
ErssMessg += "保存成功";
//purImportDetail.SetDynamicObjectItemValue("F_Ho_Fail", );
}

完整代码如下:


private void CreatePurOrder()
{
FormMetadata formMetadata = MetaDataServiceHelper.GetFormMetaData(this.Context, "PUR_PurchaseOrder");
BusinessInfo purBuninessInfo = formMetadata.BusinessInfo;
Entity POOrderEntry = purBuninessInfo.GetEntity("FPOOrderEntry");
Entity POOrderEntryDeliPlanEntry = purBuninessInfo.GetEntity("FEntryDeliveryPlan");
Entity entity = this.Model.BusinessInfo.GetEntity("FEntity");
DynamicObjectCollection detailDatas = this.Model.GetEntityDataObject(entity);

bool isFirst = true;
int processValue = 20;
foreach (var groupByOrg in detailDatas.GroupBy(item => (item["F_Ho_PurOrgId_Id"])))
{
if (groupByOrg.Key == null)
{
return;
}
string purOrderId = groupByOrg.Key.ToString();
foreach (var groupBySupply in groupByOrg.ToList().GroupBy(item => (item["Ho_SupplyId_Id"])))
{
string supplyId = groupBySupply.Key.ToString();
List purImportDetails = groupBySupply.ToList();
// 构建一个IBillView实例,通过此实例,可以方便的填写物料各属性
IBillView billView = FourS.K3.Common.Business.CommonUtil.CreateBillView(this.Context, "PUR_PurchaseOrder");
((IBillViewService)billView).LoadData();
// 填写各属性

#region Import

billView.Model.SetValue("FPurchaseOrgId", purOrderId);
billView.Model.SetValue("FSupplierId", supplyId);
billView.Model.SetValue("FDate", DateTime.Now);
billView.Model.SetValue("FBillTypeID", "83d822ca3e374b4ab01e5dd46a0062bd"); //单据类型
billView.Model.DataObject["FFormId"] = "PUR_PurchaseOrder";
billView.Model.SetValue("FBusinessType", "CG"); //业务类型
billView.Model.SetValue("FCloseStatus", "A"); //关闭状态
billView.Model.SetValue("FCancelStatus", "A"); //作废状态

//财务明细
if (billView.Model.GetEntryRowCount("FPOOrderFinance") <= 0)
billView.Model.CreateNewEntryRow("FPOOrderFinance");

billView.Model.SetItemValueByNumber("FExchangeTypeId", "HLTX01_SYS", 0);
billView.Model.SetValue("FExchangeRate", 1, 0);
billView.Model.SetItemValueByNumber("FSettleCurrId", "PRE001", 0);
billView.Model.DeleteEntryData("FPOOrderEntry");

//billView.Model.BatchCreateNewEntryRow("FPOOrderEntry", purImportDetails.Count * 4);
int k = 0;
foreach (var purImportDetail in purImportDetails)
{
string ErssMessg = "";
for (int j = 0; j < 4; j++)
{
billView.Model.BatchCreateNewEntryRow("FPOOrderEntry", 1);
long unitId = Convert.ToInt64(purImportDetail["Ho_UnitId_Id"]);
long baseUnitId = Convert.ToInt64(purImportDetail["F_Ho_BaseUnitID_Id"]);
long materialId = Convert.ToInt64(purImportDetail["Ho_MaterialId_Id"]);
//物料¥单位
billView.Model.SetValue("FMaterialId", materialId, k);
billView.Model.SetValue("FUnitId", unitId, k);
billView.Model.SetValue("FBaseUnitId", baseUnitId, k);
//收料组织¥结算组织
billView.Model.SetValue("FRequireOrgId", purOrderId, k);
billView.Model.SetValue("FReceiveOrgId", purOrderId, k);
billView.Model.SetValue("FEntrySettleOrgId", purOrderId, k);
try
{
if (purImportDetail["AUXPROPID_Id"] != null)
{
long AUXPROPID = Convert.ToInt64(purImportDetail["AUXPROPID_Id"]);
billView.Model.SetValue("FAUXPROPID", AUXPROPID, k);
}
}
catch
{

}
//交货明细
DynamicObjectCollection purOrderDelDetails = billView.Model.DataObject["POOrderEntry"] as DynamicObjectCollection;
DynamicObject pOOrderEntryDeliPlan = purOrderDelDetails[k] as DynamicObject;
DynamicObjectCollection pOOrderEntryDeliPlanDetails = pOOrderEntryDeliPlan["POOrderEntryDeliPlan"] as DynamicObjectCollection;
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("PlanUnitID_Id", unitId);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("PlanBaseUnitID_Id", baseUnitId);
decimal qty = 0;
decimal baseUnitQty = 0;
DateTime deliveryDate = DateTime.Now;

#region 日期与数量

if (j == 0)
{
qty = Convert.ToDecimal(purImportDetail["F_Ho_Qty"]);
deliveryDate = Convert.ToDateTime(purImportDetail["F_Ho_Date"]);
baseUnitQty = ConvertServiceHelper.GetBaseUnitQty(this.Context, materialId, unitId, qty);
}
else if (j == 1)
{
qty = Convert.ToDecimal(purImportDetail["F_Ho_Qty1"]);
deliveryDate = Convert.ToDateTime(purImportDetail["F_Ho_Date1"]);
baseUnitQty = ConvertServiceHelper.GetBaseUnitQty(this.Context, materialId, unitId, qty);
}
else if (j == 2)
{
qty = Convert.ToDecimal(purImportDetail["F_Ho_Qty2"]);
deliveryDate = Convert.ToDateTime(purImportDetail["F_Ho_Date2"]);
baseUnitQty = ConvertServiceHelper.GetBaseUnitQty(this.Context, materialId, unitId, qty);
}
else if (j == 3)
{
qty = Convert.ToDecimal(purImportDetail["F_Ho_Qty3"]);
deliveryDate = Convert.ToDateTime(purImportDetail["F_Ho_Date3"]);
baseUnitQty = ConvertServiceHelper.GetBaseUnitQty(this.Context, materialId, unitId, qty);
}

//2016-01-20 修改!
string strSql = "SELECT * FROM t_bd_MaterialPurchase WHERE FMATERIALID=" + materialId;
IDataReader reader = DBServiceHelper.ExecuteReader(this.Context, strSql);
decimal OutStockLmtH = 0;
while (reader.Read())
{
OutStockLmtH = reader["FRECEIVEMAXSCALE"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["FRECEIVEMAXSCALE"]);
}
if (OutStockLmtH > 0)
{
// 100*(1+10%)
decimal MaxQty = qty * (1 + OutStockLmtH / 100);
billView.Model.SetValue("FDeliveryMaxQty", MaxQty, k);
billView.Model.SetValue("FBaseDeliveryMaxQty", MaxQty, k);
//billView.Model.SetValue("FBASEJOINQTY", MaxQty, k);
}
else
{
billView.Model.SetValue("FDeliveryMaxQty", qty, k);
billView.Model.SetValue("FBaseDeliveryMaxQty", qty, k);
//billView.Model.SetValue("FBASEJOINQTY", qty, k);
}
//2016-01-20

billView.Model.SetValue("FDeliveryDate", deliveryDate, k);
billView.Model.SetValue("FQty", qty, k);
billView.Model.SetValue("FBaseUnitQty", baseUnitQty, k);

pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("PlanQty", qty);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("BasePlanQty", baseUnitQty);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("DeliRemainQty", qty);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("BaseDeliRemainQty", baseUnitQty);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("PlanDeliveryDate", deliveryDate);
pOOrderEntryDeliPlanDetails[0].SetDynamicObjectItemValue("FPREARRIVALDATE", deliveryDate);
k++;

#endregion

OperateOption saveOption = OperateOption.Create();
if (isFirst)
{
//System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = processValue;
isFirst = false;
}
else
{
processValue +=1;
if (processValue >= 100)
{
processValue -= 60;
}
this.View.Session["ProcessRateValue"] = processValue;
}
IOperationResult result = FourS.K3.Common.Business.CommonUtil.SaveBill(this.Context, billView, saveOption);
if (!result.IsSuccess)
{
//if (result.ValidationErrors.Count > 0)
// this.View.ShowErrMessage(result.ValidationErrors.FirstOrDefault().Message, "", MessageBoxType.Error);
if (result.ValidationErrors.Count > 0)
ErssMessg += Convert.ToString(result.ValidationErrors[0].Message);
else ErssMessg += "保存失败";
int RowCount = billView.Model.GetEntryRowCount("FPOOrderEntry");
billView.Model.DeleteEntryRow("FPOOrderEntry", RowCount - 1);
// billView.Model.DeleteEntryData("FPOOrderEntry");
k--;
}
else
{
ErssMessg += "保存成功";
//purImportDetail.SetDynamicObjectItemValue("F_Ho_Fail", );
}
}
this.View.Model.SetValue("F_Ho_Memo", ErssMessg, Convert.ToInt32(purImportDetail["seq"]) - 1);

}
//result = BusinessDataServiceHelper.Save(this.Context, purBuninessInfo, purOrderModel.DataObject);
#endregion Import

}
}
this.View.Session["ProcessRateValue"] = 100;
this.View.UpdateView();
//this.View.Refresh();
this.View.GetControl("F_DM_CreateCGDD").Enabled = false;
this.View.GetControl("F_DM_Import").Enabled = false;
}