Foxtable(狐表)用户栏目专家坐堂 → execl导入合并的问题


  共有3488人关注过本帖树形打印复制链接

主题:execl导入合并的问题

帅哥哟,离线,有人找我吗?
zhchling
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
execl导入合并的问题  发帖心情 Post By:2015/8/30 16:46:00 [显示全部帖子]

 execl表中有 “入住时间,姓名,房间号,手机“ 等字段。

我需要定期导入到远程的mssql 导入“客户资料“表中。导入的时候,如果有同样的数据行存在,就跳过。 

问题1:数据行并没有唯一的ID字段。  只能依据(判断) 入住时间,姓名,房间号等信息完全一致的数据行跳过。

怎样写代码呢?
貌似能参考以下的帖子代码,
下面的代码执行后,有重复数据。
且我看有些地方看不太懂, 哪位老师可否注释以下代码,并且修改成我需要解决的问题。



---------------------------------------------------------------------------------------------------------
看到以前的帖子 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=72804&skin=0


参考代码

Dim dlg As new OpenFileDialog
dlg.MultiSelect = True
If dlg.ShowDialog = DialogResult.OK Then
    For Each f As String In dlg.FileNames
        Dim  Book As New XLS.Book(f)
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Dim dic As new Dictionary(Of String, Integer)
        For i As Integer = 0 To sheet.Cols.Count - 1
            If sheet(0,i).Text <> Nothing
                dic.Add(sheet(0,i).Text,i)
            End If
        Next
        For  n As Integer = 1 To Sheet.Rows.Count -1
            Dim dr As DataRow =  DataTables("表A").AddNew()
            For Each c As String In dic.Keys
                If DataTables("表A").datacols.Contains(c) Then
                    dr(c) = sheet(n, dic(c)).Text
                End If
            Next
        Next
    Next
   
End If



[此贴子已经被作者于2015/8/30 16:52:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zhchling
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/8/30 16:58:00 [显示全部帖子]

依照上述代码执行后,运行后,有 20-30秒时间,之后出现错误


.NET Framework 版本:2.0.50727.3655
Foxtable 版本:2014.11.11.1
错误所在事件:窗口,浏览主界面,Button79,Click
详细错误信息:
The expression contains invalid date constant '## and 姓名 = '' and 房间号 = '''.


貌似  "入住时间 = #" & sheet(n, dic("入住时间")).Text & "#   导致的空值

请教: sheet(n,dic("入住时间").text 是什么意思?

[此贴子已经被作者于2015/8/30 17:00:01编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zhchling
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/8/30 19:50:00 [显示全部帖子]

 我只能说,论坛技术支持很强大,而且神速。

还有个愿望。上述代码正常运行,但耗费时间较多,能否进一步优化速度?

 回到顶部
帅哥哟,离线,有人找我吗?
zhchling
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/8/30 22:02:00 [显示全部帖子]

 有点蓝和大红袍的代码都很快。


 回到顶部
帅哥哟,离线,有人找我吗?
zhchling
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/8/31 13:44:00 [显示全部帖子]

 出现新情况了。

导入的execl 是一段日期的数据, 比如2015年 7月15日-8月23日期间的数据,  我需要在导入数据前,把原来的表里,7月15日-8月23日期间的所有数据都删掉。

问题1:怎么获得EXECL表里的这个日期段?  

日期是连续的。  execl的入住时间这列里有很多重复的日期, 只需要知道最小日期和最大日期,或者查询都有哪些日期,不知道怎么写代码。


问题2:怎样删掉表里的这个日期段的数据。  


DataTables("导入客户资料").DeleteFor("[入住时间] <= #日期2# and [入住时间] >= #日期1#")


delete 表名 where 条件语句


这两种删除有什么区别吗?



删掉原来表里的这些日期的数据,就不用比较是否存在同日期、同姓名、同房间号的数据了。 效率应该更高了。

这段代码怎么改写呢?
[此贴子已经被作者于2015/8/31 13:56:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zhchling
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:397 积分:4008 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/8/31 15:20:00 [显示全部帖子]

 Dim dlg As new OpenFileDialog
Dim Dateda As Date
Dim Datexiao As Date
Dim Datezhongjian As Date
Dateda= "1900-01-01"
Datexiao=Dateda
Datezhongjian=Dateda

dlg.MultiSelect = True
If dlg.ShowDialog = DialogResult.OK Then
    For Each f As String In dlg.FileNames
        Dim  Book As New XLS.Book(f)
        Dim Sheet As XLS.Sheet = Book.Sheets(0)
        Dim dic As new Dictionary(Of String, Integer)
        For i As Integer = 0 To sheet.Cols.Count - 1
            If sheet(0,i).Text <> Nothing
                dic.Add(sheet(0,i).Text,i)
            End If
        Next
        
        '以下代码是在execl表中找到最小日期和最大日期
        Dim dic3 As new Dictionary(Of DataRow,Integer)
        For  n1 As Integer = 1 To Sheet.Rows.Count -1
            If sheet(n1, dic("入住时间")).Text > "" Then
                Dateda=(sheet(n1,dic("入住时间")).Text)
                
                If Datexiao="1900-01-01" Then
                    '为了获得最小日期和最大日期
                    Datexiao=Dateda  '初次设置日期
                    Datezhongjian=Dateda
                Else
                    If Datexiao<=Dateda Then
                        If Dateda >= Datezhongjian Then
                            Datezhongjian=Dateda  '如果dateda总是大于datezhongjian, 则让datezhongjian=dateda
                        Else
                            '出现dateda小于datezhognjian,则不变datezhongjian
                        End If
                        
                    Else
                        Datexiao=Dateda  '发现更小的日期了
                    End If
                End If
            End If
        Next
        messagebox.show("最小的日期是" & Datexiao & "最大的日期是" & Datezhongjian & ",系统会把这段日期的上次导入的客户资料删除.然后重新导入选择的番茄EXECL数据" )
       
        DataTables("番茄导入客户资料").DeleteFor("[入住时间] <= #" & Datezhongjian & "# and [入住时间] >= #" & Datexiao & "#")
        

        Dim dic2 As new Dictionary(Of DataRow,Integer)
        For  n As Integer = 1 To Sheet.Rows.Count -1
            If sheet(n, dic("入住时间")).Text > "" Then
                Dim filter As String = "入住时间 = #" & sheet(n, dic("入住时间")).Text & "# and 姓名 = '" & sheet(n, dic("姓名")).Text & "' and 房间号 = '" & sheet(n, dic("房间号")).Text & "'"
                Dim dr As DataRow =  DataTables("番茄导入客户资料").find(filter)
                If dr Is Nothing Then dr = DataTables("番茄导入客户资料").AddNew
                dic2.Add(dr,n)
            End If
        Next
        
        For Each dr As DataRow In dic2.Keys
            For Each c As String In dic.Keys
                If DataTables("番茄导入客户资料").datacols.Contains(c) Then
                    dr(c) = sheet(dic2(dr), dic(c)).Text
                End If
            Next
        Next
    Next
End If

上述代码中红色部分应该有更简便的代码,我用的是笨方法。  
既然把日期范围内的数据删掉了,那么红色下面的判断代码其实就没必要了?
[此贴子已经被作者于2015/8/31 15:22:11编辑过]

 回到顶部