以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  求相同结构的二个表合并  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=150136)

--  作者:nbsugu_z
--  发布时间:2020/5/21 19:18:00
--  求相同结构的二个表合并
二个相同结构的表合并,就是A表向B表追加记录,同时要验证是否有重复(只能追加一次)  结构为C1列、C2列  年  月  编号 共5列

A表中的行的 年、月  编号 三列数值、完全同B表中的行年、月  编号三列完全相同视为重复行,终止追加并提示
最好是在添加前先验证并有提示,求代码,想做个窗口按钮 执行此动作

Dim nma() As String
Dim nmb() As String
Systemready = False
For Each r As Row In Tables("表A").Rows
    Dim dr As DataRow = DataTables("表B").AddNew   
    For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = r(nma(i))
    Next
Next
Systemready = True

追加完成后 ,把A表中C1列数据更换为C2列数据 ,同时清除C2列数据为空 保存表

以上求代码


[此贴子已经被作者于2020/5/21 19:56:31编辑过]

--  作者:y2287958
--  发布时间:2020/5/21 20:01:00
--  
直接用filler
--  作者:有点蓝
--  发布时间:2020/5/21 20:54:00
--  
Dim nma() As String
Dim nmb() As String
Systemready = False
For Each r As Row In Tables("表A").Rows
    Dim dr As DataRow = DataTables("表B").find("年= " & r("年") & " and 月=" & r("月") & " and  编号=‘" & r("编号") & "’")
if dr is nothing then 
dr  = DataTables("表B").AddNew   
    For i As Integer = 0 To nma.Length - 1
        dr(nmb(i)) = r(nma(i))
    Next
end f
r("c1") = r("c2")
r("c2")=nothing
Next
Systemready = True

--  作者:nbsugu_z
--  发布时间:2020/5/29 10:41:00
--  
For Each r As Row In Tables("wy_sgd0").Rows
    Dim dr As DataRow = DataTables("wy_sgd").find("yy= " & r("yy") & " and yy1=" & r("yy1") & " and  khbh=\'" & r("khbh") & "\'")
    If dr Is Nothing Then
        
        Dim nms As String() = {"wy_sgd0"}  \'指定来源表,可以任意多个
        For Each nm As String In nms
            Dim f As New  Filler
            f.SourceTable = DataTables(nm) \'指定这次的来源表
            f.SourceCols = "khbh,fymc,yy,yy1,je,bz1,je1,je2"  \'指定数据来源列
            f.DataTable = DataTables("wy_sgd") \'指定数据接收表
            f.DataCols = "khbh,fymc,yy,yy1,je,bz1,je1,je2"  \'指定数据接收列
            f.Fill() \'填充数据
        Next
    End If
Next

可以了刚才写错了。在这代码上如何实现   填充完好,源表的月份yy1加1 ,如果是源表是12月 就为1月,同时年份加1 
                           同时源表je1 替换为je2 ,je2清空
[此贴子已经被作者于2020/5/29 11:23:13编辑过]

--  作者:有点蓝
--  发布时间:2020/5/29 11:17:00
--  
不要使用Filler。至少不能用在4楼这种代码里。用回3楼的用法
--  作者:y2287958
--  发布时间:2020/5/29 11:20:00
--  
上个例子,不好吗
--  作者:nbsugu_z
--  发布时间:2020/5/29 11:24:00
--  
For Each r As Row In Tables("wy_sgd0").Rows
    Dim dr As DataRow = DataTables("wy_sgd").find("yy= " & r("yy") & " and yy1=" & r("yy1") & " and  khbh=\'" & r("khbh") & "\'")
    If dr Is Nothing Then
        
        Dim nms As String() = {"wy_sgd0"}  \'指定来源表,可以任意多个
        For Each nm As String In nms
            Dim f As New  Filler
            f.SourceTable = DataTables(nm) \'指定这次的来源表
            f.SourceCols = "khbh,fymc,yy,yy1,je,bz1,je1,je2"  \'指定数据来源列
            f.DataTable = DataTables("wy_sgd") \'指定数据接收表
            f.DataCols = "khbh,fymc,yy,yy1,je,bz1,je1,je2"  \'指定数据接收列
            f.Fill() \'填充数据
        Next
    End If
Next

可以了刚才写错了。在这代码上如何实现   填充完后,源表的月份yy1加1 ,如果是源表是12月 就为1月,同时年份加1 
                           同时源表je1 替换为je2 ,je2清空

[此贴子已经被作者于2020/5/29 11:24:35编辑过]

--  作者:有点蓝
--  发布时间:2020/5/29 11:31:00
--  
上传实例说明
--  作者:nbsugu_z
--  发布时间:2020/5/29 15:39:00
--  
For Each dr1 As Row In Tables("wy_sgd0").Rows
    Dim dr2 As DataRow = DataTables("wy_sgd").find("yy= " & dr1("yy") & " and yy1=" & dr1("yy1") & " and  khbh=\'" & dr1("khbh") & "\'")
    If dr2 Is Nothing Then
        dr2 = DataTables("wy_sgd").AddNew()
    End If
    For Each dc As DataCol In DataTables("wy_sgd0").DataCols
        dr2(dc.Name) = dr1(dc.name)
    Next
       dr1("yy") =dr1("yy1")
       dr1("yy1")=Nothing
Next

这样可以了,谢谢老师提示。
再问一个问题,就是Dim dr2 As DataRow = DataTables("wy_sgd").find("yy= " & dr1("yy") & " and yy1=" & dr1("yy1") & " and  khbh=\'" & dr1("khbh") & "\'")这个条件
太复杂,我目的是如果WY_sgd表中已经存在同wy_sgd0相同的记录,(非一定是三个条件),则覆盖原记录,有没有简洁的代码(二表结构完全一样的)
[此贴子已经被作者于2020/5/29 15:43:06编辑过]

--  作者:有点蓝
--  发布时间:2020/5/29 16:15:00
--  
怎么样才算是相同的记录?如果一个条件能够区分,就只需要1个条件;如果需要2个条件才能够区分,就必须是2个条件,以此类推