以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  代码优化问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=164286)

--  作者:zaq3574020
--  发布时间:2021/5/4 19:11:00
--  代码优化问题
For Each r As Row In Tables("门店进销存_门店进销存").Rows
    Dim dr As DataRow = DataTables("直调入库单明细").Find("款号=\'" & r("款号") & "\' and 仓库=\'" & r("仓库") & "\' ")
    If dr IsNot Nothing Then
        r("第一次上货日期") = dr("日期")
        r("今天日期") = Date.Today
        Dim t1 As TimeSpan =  r("今天日期") - r("第一次上货日期")
        r("第一次上货天数") = t1.TotalDays
    End If
Next
以上代码怎么优化
问题1:这个遍历查询需要怎么改
问题2:
DataTables("直调入库单明细")初始加载40W条数据,如果不加载,那每次一个ROW执行后台查询一次。这个会提高效率吗。Tables("门店进销存_门店进销存")是组合统计生成的临时表

--  作者:有点蓝
--  发布时间:2021/5/5 11:56:00
--  
每次一个ROW执行后台查询一次会更慢,可能慢上几十倍。

数据多,如果门店进销存也是数据里的表,建议直接使用sql处理

如果门店进销存是临时表
1、如果门店进销存数据也多,建议把数据合成为xml,或者字符串传入存储过程,在存储过程里处理
2、如果数据不多,建议先根据门店进销存的"款号和仓库添加先加载"直调入库单明细"符合条件的数据,再处理

--  作者:zaq3574020
--  发布时间:2021/5/5 13:40:00
--  
业务逻辑是这样的:
1、通过多个GroupTablesBuilder生成临时表 门店进销存
2.然后遍历(门店进销存)根据A门店A款商品,在出入库明细查询第一次入库的信息。并填充。

--  作者:有点蓝
--  发布时间:2021/5/5 14:02:00
--  
GroupTablesBuilder改为使用sql分组统计,然后直接使用sql填充,比如:

update a  set 第一次上货日期=日期,今天日期=getdate() from 表A as a inner join (Select 产品名称,sum(数量),min(日期) FROM {订单} INNER JOIN {产品} ON {订单}.产品ID = {产品}.产品ID group by 产品名称) as b on a.xxx = b.xxx

如果一条sql搞不定的,也可以使用存储过程,分步处理