Foxtable(狐表)用户栏目专家坐堂 → 导入excel表 匹配字段后 且选择了是否唯一为是的接收字段后 怎么写判断 对应的接收字段值如果已经有了来源字段的内容时,跳过该行数据,避免重复值录入


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

主题:导入excel表 匹配字段后 且选择了是否唯一为是的接收字段后 怎么写判断 对应的接收字段值如果已经有了来源字段的内容时,跳过该行数据,避免重复值录入

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
导入excel表 匹配字段后 且选择了是否唯一为是的接收字段后 怎么写判断 对应的接收字段值如果已经有了来源字段的内容时,跳过该行数据,避免重复值录入  发帖心情 Post By:2021/11/19 0:59:00 [显示全部帖子]

导入excel表 匹配字段后  且选择了是否唯一为是的接收字段后  怎么写判断  对应的接收字段值如果已经有了来源字段的内容时,跳过该行数据,避免重复值录入图片点击可在新窗口打开查看

假定我的接收字段里面有一个身份证号  乡镇  单位列  想新增一个禁止重复身份证号 乡镇  单位的判断,实现当导入的数据如果表里已经有了一个身份证号或者其他设定了 是否唯一=是  的值之后,不在输入这个身份证号对应及其对应的整行数据,下述代码该怎么补充呢?
Dim r As Row
Dim i,j As Integer
Dim t1,t2 As Table
Dim str1,str2 As String
Dim str As String
t1 = Tables(Vars("btname11"))
t2 = e.form.Controls("Table1").Table
str1 = e.form.Controls("TextBox1").value
str2 = e.form.Controls("ComboBox1").value
Dim prb As WinForm.ProgressBar = e.Form.Controls("ProgressBar1")
If str1 = "" OrElse str2 = "" Then
    Return
End If
Dim Book As New XLS.Book(str1)
Dim Sheet As XLS.Sheet = Book.Sheets(str2)
If e.Form.Controls("CheckBox1").checked = False Then
    For Each r In t2.Rows
        If r.IsNull("来源字段") OrElse r.IsNull("接收字段") Then
            MessageBox.Show("字段匹配未完成!")
            Return
        End If
    Next
    prb.Visible = True
    prb.Maximum = Sheet.Rows.Count - 1
    For i = 1 To Sheet.Rows.Count -1
        r = t1.AddNew()
        For j = 0 To t2.Rows.count - 1
            'r(t2.Rows(j)(1)) = Sheet(i,j).Value
            Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value


            r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
        Next
        prb.Value = i
    Next
Else
    For j = 0 To Sheet.Cols.count - 1
        If t1.cols.Contains(Sheet(0,j).value) Then
            If str = "" Then
                str = Sheet(0,j).value
                str = str.Replace(" ", "").Trim
            Else
                str = str & "," & Sheet(0,j).value
                str = str.Replace(" ", "").Trim
            End If
        End If
    Next
    If str = "" Then
        MessageBox.Show("对不起,没有匹配字段!")
        Return
    End If
    If MessageBox.Show("是否只导入匹配字段?","询问",MessageBoxButtons.YesNo,MessageBoxIcon.Question) = DialogResult.Yes Then
        prb.Visible = True
        prb.Maximum = Sheet.Rows.Count - 1
        For i = 1 To Sheet.Rows.Count -1
            r = t1.AddNew()
            For j = 0 To str.split(",").Length - 1
                Dim sss As String =Sheet(i,j).Value
                r(str.split(",")(j)) = sss.Replace(" ", "").Trim
            Next
            prb.Value = i
        Next
    Else
        Return
    End If
End If
t1.DataTable.save
MessageBox.Show("数据导入完毕!")
'e.Form.close

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)使用find查询:http://www.foxtable....  发帖心情 Post By:2021/11/19 9:06:00 [显示全部帖子]

    For i = 1 To Sheet.Rows.Count -1
            For j = 0 To t2.Rows.count - 1
                Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
                Dim dr As DataRow = DataTables(Vars("btname11")).Find(r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim)
                If dr Is Nothing Then '如果不存在同值的数据
                r = t1.AddNew()

                r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
                End If
            Next   
        prb.Value = i
    Next

运行提示  列“姓名”不属于表 导入Excel_Table1。 

如果改成如下:【红色部分代码该怎么写呢?又要适应匹配的来源字段和接收字段,又要匹配是否唯一值等于是的条件】
    For i = 1 To Sheet.Rows.Count -1
        
        Dim dr As DataRow = DataTables(Vars("btname11")).Find(“”)
        If dr Is Nothing Then '如果不存在同编号的订单
            r = t1.AddNew()
        Else
            MessageBox.Show("存在相同内容,即将跳过")
        End If
        For j = 0 To t2.Rows.count - 1
            Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
            r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
        Next
        prb.Value = i
    Next

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)http://www.foxtable.com/webhelp/to...  发帖心情 Post By:2021/11/19 9:46:00 [显示全部帖子]

 For i = 1 To Sheet.Rows.Count -1
        
        DataTables(Vars("btname11")).Find(r(t2.Rows(j)("接收字段")) & " = '" & ss.Replace(" ", "").Trim & "'")   
是不是顺序不对  提示没有SS  此时t2表也还没有进行判断
        If dr Is Nothing Then '如果不存在同编号的订单
            r = t1.AddNew()
        Else
            MessageBox.Show("存在相同内容,即将跳过")
        End If
        For j = 0 To t2.Rows.count - 1
            Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
            r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
        Next
        prb.Value = i
    Next


如果采用一楼的第一个代码的顺序    还是一样提示  某某不存在这个t2表中

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)For j = 0 To t2.Rows.count - 1dim ...  发帖心情 Post By:2021/11/19 10:18:00 [显示全部帖子]

For i = 1 To Sheet.Rows.Count -1
        For j = 0 To t2.Rows.count - 1
            Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
            Dim dr As DataRow = DataTables(Vars("btname11")).Find(r(t2.Rows(j)("接收字段")) & " = '" & ss.Replace(" ", "").Trim & "'")
            If dr Is Nothing Then '如果不存在同值的数据
                r = t1.AddNew()
                
                r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
            Else
                MessageBox.Show("存在相同数据,不予新建,即将跳过")
            End If
        Next
        prb.Value = i
    Next

图片点击可在新窗口打开查看

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)提示很明显,张冠李戴,表B的列名用到...  发帖心情 Post By:2021/11/19 10:48:00 [显示全部帖子]

嗯  刚刚已经试过了楼上的操作    
是从DataTables(Vars("btname11"))表中查找T2表接收字段中如果有来源列数对应的值的  且是否唯一等于是 时 就跳过   反之是否唯一不等于是就新建
还得麻烦老师指导下
For i = 1 To Sheet.Rows.Count -1               
        Dim dr As DataRow = DataTables(Vars("btname11")).Find(“”)   '在这里怎么写find条件
        If dr Is Nothing Then '如果不存在同编号的订单
            r = t1.AddNew()
            For j = 0 To t2.Rows.count - 1
                  Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
                  r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
             Next
        Else
            MessageBox.Show("存在相同内容,即将跳过")
        End If
        prb.Value = i
 Next

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


加好友 发短信
等级:七尾狐 帖子:1571 积分:11238 威望:0 精华:0 注册:2021/1/17 17:06:00
回复:(有点蓝)类似:http://www.foxtable.com/bbs/...  发帖心情 Post By:2021/11/19 19:13:00 [显示全部帖子]

  参照练习了一下  还是没有得到要领   要麻烦老师继续指导一下了


当前代码如下:
Dim r As Row
Dim i,j As Integer
Dim t1,t2 As Table
Dim str1,str2 As String
Dim str As String
t1 = Tables(Vars("btname11"))
t2 = e.form.Controls("Table1").Table
str1 = e.form.Controls("TextBox1").value
str2 = e.form.Controls("ComboBox1").value
Dim prb As WinForm.ProgressBar = e.Form.Controls("ProgressBar1")
If str1 = "" OrElse str2 = "" Then
    Return
End If
Dim Book As New XLS.Book(str1)
Dim Sheet As XLS.Sheet = Book.Sheets(str2)
If e.Form.Controls("CheckBox1").checked = False Then
    For Each r In t2.Rows
        If r.IsNull("来源字段") OrElse r.IsNull("接收字段") Then
            MessageBox.Show("字段匹配未完成!")
            Return
        End If
    Next
    prb.Visible = True
    prb.Maximum = Sheet.Rows.Count - 1
    
    
    Dim s11 As String
    For Each c1 As Col In t1.Cols
        s11 = s11 & "," & c1.name
    Next
    s11 = s11.trim(",")
    Dim cs As String =  s11
    msgbox(cs)
    
    
    Dim s22 As String
    Dim zd1 As New Dictionary(Of Integer, String)
    For i = 0 To Sheet.Cols.count - 1
        If Sheet(0,i).text > ""
            zd1.Add(i,Sheet(0,i).Value)
            s22 = s22 & "," &  Sheet(0,i).Value
        End If
    Next
    s22 = s22.trim(",")
    Dim cs22 As String =  s22
    msgbox(cs22)
    
    Dim filter As String = "1=2"
    Dim ss11() As String = s11.split(",")
    Dim s111 As String = ss11(0)
    
    Dim ss22() As String = s22.split(",")
    Dim s222 As String = ss22(0)
    
    For i11 As Integer = 0 To ss11.length -1
        For i22 As Integer = 0 To ss22.length -1
            filter = filter & " or " & ss11(i11) & " <> " & ss22(i22)
        Next
    Next
    msgbox(filter)
           
    For i = 1 To Sheet.Rows.Count -1
        Dim dr As DataRow = DataTables(Vars("btname11")).Find(filter)   '在这里怎么写find条件
        If dr Is Nothing Then '如果不存在同编号的订单
            r = t1.AddNew()
            For j = 0 To t2.Rows.count - 1
                Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
                r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
            Next
        Else
            MessageBox.Show("存在相同内容,即将跳过")
        End If
        prb.Value = i
    Next
    
    
Else
    For j = 0 To Sheet.Cols.count - 1
        If t1.cols.Contains(Sheet(0,j).value) Then
            If str = "" Then
                str = Sheet(0,j).value
                str = str.Replace(" ", "").Trim
            Else
                str = str & "," & Sheet(0,j).value
                str = str.Replace(" ", "").Trim
            End If
        End If
    Next
    If str = "" Then
        MessageBox.Show("对不起,没有匹配字段!")
        Return
    End If
    If MessageBox.Show("是否只导入匹配字段?","询问",MessageBoxButtons.YesNo,MessageBoxIcon.Question) = DialogResult.Yes Then
        prb.Visible = True
        prb.Maximum = Sheet.Rows.Count - 1
        For i = 1 To Sheet.Rows.Count -1
            r = t1.AddNew()
            For j = 0 To str.split(",").Length - 1
                Dim sss As String =Sheet(i,j).Value
                r(str.split(",")(j)) = sss.Replace(" ", "").Trim
            Next
            prb.Value = i
        Next
    Else
        Return
    End If
End If
t1.DataTable.save
MessageBox.Show("数据导入完毕!")
'e.Form.close

上述得到的内容:
不想显示所有的表列名  只想显示对应已经选择了接收字段的匹配列名  其他没有匹配的不显示

想实现的预期效果不是如图这样的那么多字段内容,只想实现就已经选择的来源字段和接收字段之间的不存在重复值就如下:
怎么实现是从DataTables(Vars("btname11"))表中查找T2表接收字段中如果有来源列数对应的值的  且是否唯一等于是 时 就跳过   反之是否唯一不等于是就新建呢?
For i = 1 To Sheet.Rows.Count -1               
        Dim dr As DataRow = DataTables(Vars("btname11")).Find(“”)   '在这里怎么写find条件
        If dr Is Nothing Then '如果不存在同编号的订单
            r = t1.AddNew()
            For j = 0 To t2.Rows.count - 1
                  Dim ss As String  =Sheet(i,t2.Rows(j)("来源列数")).Value
                  r(t2.Rows(j)("接收字段")) = ss.Replace(" ", "").Trim
             Next
        Else
            MessageBox.Show("存在相同内容,即将跳过")
        End If
        prb.Value = i
 Next
[此贴子已经被作者于2021/11/19 22:17:46编辑过]

 回到顶部