以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助] 优化代码  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=66260)

--  作者:wangyinming
--  发布时间:2015/4/2 9:37:00
--  [求助] 优化代码
每天汇总数据,但是到月底的时候数据多了以后,系统就有点慢了,请问如何可以优化一下代码?  还有以下代码不能实现多个文件合并,代码看看是不是错了?
代码如下:

Dim pr As Integer = DataTables("加硫").DataRows.Count     \'查询表行数
Dim dlg As New OpenFileDialog \'定义一个新的OpenFileDialog
dlg.Filter= "excel文件|*.xls" \'设置筛选器
dlg.MultiSelect = True   \'允许选择多个文件
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    Dim mg As New Merger
    For Each fl As String In dlg.FileNames
        mg.SourcePath =dlg.FileName \'指定数据文件
        mg.Format = "excel" \'指定格式
        mg.SourceTableName = "data$" \'指定要合并的表
        mg.DataTableName = "加硫" \'指定接收数据的表
        mg.Merge() \'开始合并
    Next


Dim i As Integer
For i  = DataTables("加硫").DataRows.Count-1 To 0 Step -1
    Dim dr As DataRow = DataTables("加硫").DataRows(i)
    Dim dr2 As DataRow = DataTables("加硫").Find("管理号码=\'" & dr("管理号码") & "\' and 良品=\'" & dr("良品") & "\'and 管理号码1=\'" & dr("管理号码1") & "\'and 工号=\'" & dr("工号") & "\'  and _Identify <> " & dr("_Identify"))
    If dr2 IsNot Nothing Then
        dr2.Delete
    End If
Next  \'去重复值

DataTables("加硫").DeleteFor("[管理号码] is null or [良品] is null")  \'删除空白行

pr = DataTables("加硫").DataRows.Count - pr \'查询表行数


MessageBox.Show("成功导入数据"& pr &"条","提示")

Syscmd.Table.ToggleSortAndFilter()
DataTables("加硫").Save()
End If

--  作者:Bin
--  发布时间:2015/4/2 10:21:00
--  
合并文件,可以把文件名写为同一个即可
--  作者:wangyinming
--  发布时间:2015/4/2 10:24:00
--  
怎么理解这句话,是把要导入的文件名写成一样吗?
--  作者:Bin
--  发布时间:2015/4/2 10:25:00
--  
我好像搞错了你的意思,你的意思是什么?
--  作者:有点甜
--  发布时间:2015/4/2 10:33:00
--  

1、数据多,你这样删除重复值,肯定会慢;

 

2、不能实现多个文件

 

mg.SourcePath =dlg.FileName \'指定数据文件

 

改成

 

mg.SourcePath = fl \'指定数据文件


--  作者:wangyinming
--  发布时间:2015/4/2 10:36:00
--  
谢谢你回复!
1.希望可以合并多个EXCEl文件,但是我现在的代码不可以。
2.现在的代码,数据多了以后,系统变得很慢,因为要逐行匹配重复的数据。希望可以优化一下代码

--  作者:wangyinming
--  发布时间:2015/4/2 10:40:00
--  

1、数据多,你这样删除重复值,肯定会慢; 难道这个就没有其它办法吗?


--  作者:有点甜
--  发布时间:2015/4/2 10:44:00
--  

试试用下面的方法。

 

Dim str As String = "第一列,第二列"
Dim idx As String = ""
Dim ary() As String = str.Split(",")
Dim pdr As DataRow = Nothing
Dim count As Integer = 0
For Each dr As DataRow In DataTables("表A").Select("第一列 is not null", str)
    Dim flag As Boolean = False
    For Each a As String In ary
        If pdr IsNot Nothing AndAlso dr(a) <> pdr(a) Then
            flag = True
        End If
    Next
    If flag = False Then
        count += 1
    Else
        \'If count = 1 Then
            idx &= pdr("_Identify") & ","
        \'End If
        count = 1
    End If
    pdr = dr
Next

For Each a As String In ary
    If pdr IsNot Nothing AndAlso Tables("表A").Rows(Tables("表A").Rows.count-2)(a) <> pdr(a) Then
        idx &= pdr("_Identify") & ","
    End If
Next

DataTables("表A").DeleteFor("_Identify not in (" & idx.trim(",") & ")")

[此贴子已经被作者于2015/4/2 10:45:36编辑过]

--  作者:wangyinming
--  发布时间:2015/4/2 10:57:00
--  
可以把代码的大概意思告诉我。或注解一下代码,谢谢
--  作者:有点甜
--  发布时间:2015/4/2 11:17:00
--  
 意思是:按顺序取出表数据;判断此行和上一行是否为相同的内容,如果是,不操作,如果不是,就加入到idx里面去;最后根据idx删除那些相同的内容