以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  关于统计表  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=106214)

--  作者:做自己
--  发布时间:2017/9/4 18:05:00
--  关于统计表
一个表里面有多个仓库的数据,我想在表里面统计名字相同的数据,把数量统计一个和到统计表里面,但是每个仓库的单价可能不一样,这样用统计表貌似就不合适了,我应该怎么处理
--  作者:有点蓝
--  发布时间:2017/9/4 18:11:00
--  
上传实例,并截图详细说明要实现什么最终效果
--  作者:做自己
--  发布时间:2017/9/4 18:47:00
--  
由于数据表数据较多,有什么好办法能提高效率吗?
--  作者:有点蓝
--  发布时间:2017/9/4 20:11:00
--  
具体上传实例说明。不同表结构,不同需求处理方法不一样
--  作者:做自己
--  发布时间:2017/9/5 9:51:00
--  
我描述一下把,就是一个表里面有仓库名称,物料名称,数量,想把物料名称一样的数量加起来,生成一个新的表
--  作者:有点甜
--  发布时间:2017/9/5 9:57:00
--  

直接对物料名称分组统计不就好了?

 

请具体做一个foxtable例子发上来说明。


--  作者:做自己
--  发布时间:2017/9/5 13:22:00
--  
\'\'\'
Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls|Excel文件|*.xlsx" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
Else
    Return
End If
Dim Book As New XLS.Book(dlg.FileName)
Dim Sheet As XLS.Sheet = Book.Sheets(0)

‘注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
Dim nms() As String = {"仓库名称""存货编码","全球代码","存货分类名称","存货名称","原现存数量","原可用数量","原参考售价标准","现存数量","可用数量","参考售价标准","批号"}
Dim nmsX() As String = {"仓库名称","存货编码","全球代码","存货分类名称","存货名称","现存数量","可用数量","参考售价标准","批号"}
’注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题
Dim pattern As String = "[\\u4e00-\\u9fa5| ]"
Dim strSta As String
For n As Integer = 1 To Sheet.Rows.Count -1
    \' If Sheet(n,5).Value.Contains("(") Or Sheet(n,5).Value.Contains(")") Or Sheet(n,6).Value.Contains("(") Or Sheet(n,6).Value.Contains(")") Or Sheet(n,7).Value.Contains("(") Or Sheet(n,7).Value.Contains(")") Then
    \' Else
    Dim drDaoRu As DataRow = DataTables("存货信息导入数据表").AddNew()
    For m As Integer = 0 To nmsX.Length - 1
        If m=0 Then
        Else If m=2 Then
        Else If m=8 Then
        Else  If m=5 Then
            If Sheet(n,5).Value = "充足" Then
                drDaoRu(nmsX(5)) = 12
            Else If Sheet(n,5).Value.Trim() = ""  Then
                drDaoRu(nmsX(5)) = 0
            Else
                drDaoRu(nmsX(5)) = CSng(Sheet(n,m).Value)
            End If
        Else If  m=6 Then
            If Sheet(n,6).Value = "充足" Then
                drDaoRu(nmsX(6)) = 12
            Else If Sheet(n,6).Value.Trim() = ""
                drDaoRu(nmsX(6)) = 0
            Else
                drDaoRu(nmsX(6)) = CSng(Sheet(n,m).Value)
            End If
        Else If m=7 Then
            If Sheet(n,7).Value.Trim() = "" Then
                drDaoRu(nmsX(7)) = 0
            Else If Sheet(n,7).Value.Trim() = "*" Then
                drDaoRu(nmsX(7)) = 0
            Else
                Dim Multi As String = Sheet(n,m).Value
                Dim Values1() As String
                Values1 = Multi.split("(")
                Dim Values2() As String
                Values2 = Values1(0).split(" ")
                Dim Values() As String
                Values = Values2(0).split("-")
                strSta = System.Text.RegularExpressions.Regex.Replace(Values(Values.Length-1), pattern ,"")
                drDaoRu(nmsX(7)) = CSng(strSta.Trim())
            End If
        Else
            drDaoRu(nmsX(m)) = Sheet(n,m).Value
        End If
    Next
    drDaoRu.Save
    \'End If
Next
Dim g As New GroupTableBuilder("存货统计表", DataTables("存货信息导入数据表"))
g.Groups.AddDef("存货编码")
g.Groups.AddDef("存货分类名称")
g.Groups.AddDef("存货名称")
g.Totals.AddDef("现存数量")
g.Totals.AddDef("可用数量")
g.Totals.AddDef("参考售价标准")
g.Build()
Tables("存货信息表").StopRedraw()
Dim drListDaoRu As List (of DataRow)
Dim drNew As DataRow
Dim dr As DataRow
Dim drFind As DataRow
drListDaoRu = DataTables("存货统计表").Select("[存货编码]<>\'\'")
For Each drTongJi As DataRow In drListDaoRu
    dr = DataTables("存货信息表").Find("[存货编码] = \'"& drTongJi("存货编码") &"\' And [存货名称] = \'"& drTongJi("存货名称") &"\'")
    If dr IsNot Nothing Then
        dr("原现存数量") = dr("现存数量")
        dr("原可用数量") = dr("可用数量")
        dr("原参考售价标准") = dr("参考售价标准")
        dr("原日期") = dr("现日期")
        dr("现日期") = Date.Today
        dr("现存数量") = drTongJi("现存数量")
        dr("可用数量") = drTongJi("可用数量")
        dr("参考售价标准") = drTongJi("参考售价标准")
    Else
        drNew = DataTables("存货信息表").AddNew
        drNew("现日期") = Date.Today
        drNew("存货编码")=drTongJi("存货编码")
        drNew("存货分类名称")=drTongJi("存货分类名称")
        drNew("存货名称")=drTongJi("存货名称")
        drNew("现存数量")=drTongJi("现存数量")
        drNew("可用数量")=drTongJi("可用数量")
        drNew("参考售价标准") = drTongJi("参考售价标准")
        drNew.Save
    End If
Next
Tables("存货信息表").ResumeRedraw()
DataTables("存货信息表").Save
Dim fenLei As WinForm.ComboBox = e.Form.Controls("CboFenLei")
Dim s As String  = DataTables("存货信息表").GetComboListString("存货分类名称")
fenLei.ComboList =s
Dim tv As WinForm.TreeView
tv =e.Form.Controls("TreeView1")
tv.Nodes.Clear
For Each ss As String In s.split("|")
    Dim nd As WinForm.TreeNode = tv.nodes.Add(ss)
Next
Tables("存货信息表").Filter = ""
DataTables("存货信息导入数据表").DeleteFor("")
DataTables("存货信息导入数据表").Save
DataTables("存货统计表").DeleteFor("")
DataTables("存货统计表").Save
MessageBox.Show("导入成功","提示")
代码是这么写的,一个两万多条数据的表需要十几分钟导入时间,能不能优化一下?

--  作者:有点甜
--  发布时间:2017/9/5 14:28:00
--  

加入代码分别测试读取excel的时间、分组查询计算的时间、保存代码的时间。

 

一般是select、find、save比较耗时。请上传具体例子测试。


--  作者:做自己
--  发布时间:2017/9/5 14:33:00
--  
那我获取一个表的所有行有什么好办法吗?不用select
--  作者:有点甜
--  发布时间:2017/9/5 14:45:00
--  
以下是引用做自己在2017/9/5 14:33:00的发言:
那我获取一个表的所有行有什么好办法吗?不用select

 

修改和查询,不要并存 http://www.foxtable.com/webhelp/scr/2225.htm