出库单细表:
单号    行号    物料编号  入库数量  生产订单
IN986    1         A         100     PO97
IN986    2         B         200     PO97
IN986    3         A         400     PO86
IN986    4         B         600     PO86
-------------------
仓库库存表
物料编号     批号        库存量
   A         LOT91         80
   A         LOT96        600
   B         LOT75        150
   B         LOT82        900
------------------
如果不用存储过程,直接用.net业务处理层去做出库记帐,最佳效率的方案是怎样的?
------------------
我见过这样的.net方案:
1. 在一个出库单的业务组件 提取出库单数据集合 , 对DataRow集合遍历;
2. 对每一出库DataRow对仓库库存表的业务组件提取相同物料编号的数据集合,遍历扣减库存,在事务中持久化一次 ;
3. 继续遍历下一个出库DataRow对象,对仓库库存表的业务组件提取相同物料编号的数据集合,遍历扣减库存,再在事务中持久化一次
4. 直到DataRow集合遍历完成,提交事务;
这样对数据库的往返次数是不是太频繁了吗,这是不是一个可以接受的好的解决方案?有没有更好的解决方案
5. 如果说有,用sql server存储进程,就可以很好解决这个问题,但如果不用存储过程呢?
------------------

解决方案 »

  1.   

    谢谢Mark2WIN , lowver !1. 象这样的业务逻辑肯定非常多;
    2. 但很多高手都建议用业务规则层去处理业务逻辑,此程序健壮性来说是好的;
    3. 如果用存储过程去做,整个应用程序维护性会差一些;
    4. 另外,我个人判断用业务逻辑组件去组织构造非常健壮 ,因为我们会用很多的低层组件的成熟的方法组合,抽象业务操作转化为对象,方法建立业务规则组件非常好;
    5. 但就是在用这些低层组件方法的代价是有的,如数据库查询的往返行程会增多;
    6. 即获得了程序的健壮,却失去了性能,真是不好,强烈高手继续指点一下 !!,关注的网友请顶一下
      

  2.   

    google可以搜出很以下
    http://www.68asp.com/Article/CJ/200409/845.html
    关于数据访问层设计框架设计其中的一个业务逻辑组件算法:public void StoreIntoWarehouse(EntityData IndepotForm)
    {
    DataTable tbl=IndepotForm.Tables["InDepotFormDetail"];
    try
    {
    ProductEntityDAO ped=new ProductEntityDAO();
    for(int i=0;i<tbl.Rows.Count;i++)
    {
    DataRow formdetail=tbl.Rows[i];
    string productID=formdetail["ProductID"].ToString();
    decimal
    inCount=(decimal)formdetail["InCount"];
    EntityData product=ped.FindByPrimaryKey(productID);
    DataRow productRow=product.GetRecord("Product");
    productRow["CurrentCount"]=(decimal)productRow["CurrentCount"]+inCount;
    ped.UpdateEntity(product);
    }
    ped.Dispose();
    InDepotFormEntityDAO inDepotForm=new 
    InDepotFormEntityDAO();
    inDepotForm.InsertEntity(IndepotForm);
    IndepotForm.Dispose();
    ContextUtil.SetComplete();
    }
    catch(Exception ee)
    {
    ContextUtil.SetAbort();
    throw ee;
    }
    }