以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  自动输入并更新的问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=26186)

--  作者:zcw728909
--  发布时间:2012/11/26 19:30:00
--  自动输入并更新的问题

有两个表:委外表和委外明细,委外明细是根据委外表的内容按档案编号分割表示,代码如下:

Select Case e.DataCol.Name
    Case "档案编号", "序号"
        e.DataRow("颜色") = StrToNarrow(e.DataRow("颜色"))
        Dim ys() As Char  = {","}
        Dim xh() As Char  = {",", ";"}
        Dim ary_ys() As String = e.DataRow("颜色").Split(ys)
        Dim ary_xh() As String = e.DataRow("序号").Split(xh)
        Dim ary_xh1() As String = e.DataRow("序号").Split(",")
        DataTables("委外明细").DeleteFor("档案编号 = \'" & e.DataRow("档案编号") & "\'")
        For i As Integer = 0 To ary_xh1.Length - 1
            Dim ary_xh2() As String = ary_xh1(i).Split(";")
            For j As Integer = 0 To ary_xh2.Length - 1
                Dim dr As DataRow  = DataTables("委外明细").AddNew
                dr("档案编号") = e.DataRow("档案编号")
                dr("颜色") = ary_ys(i)
                dr("序号") = ary_xh2(j)
            Next
        Next
End Select

现在的问题是,上面的红色代码保证了委外明细的内容可以更新,但是这种更新方法是把委外明细相同档案编号的行全部删除再重新添加,当委外明细的其它列写有内容时,这种更新方法就会产生矛盾,有没有更好的更新方法呢,也就是说更新时只替换掉颜色或序号不相同的行


图片点击可在新窗口打开查看此主题相关图片如下:111.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:222.jpg
图片点击可在新窗口打开查看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目49改.table

[此贴子已经被作者于2012-11-26 19:34:14编辑过]

--  作者:lin_hailun
--  发布时间:2012/11/26 20:37:00
--  
 大概这样子吧。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目49改.table



--  作者:czy
--  发布时间:2012/11/26 21:11:00
--  

好像这样效率高一点吧。

 

Select Case e.DataCol.Name
    Case "颜色","序号"
        Dim dt As DataTable = DataTables("委外明细")
        Dim ys As String = StrToNarrow(e.DataRow("序号"))
        dt.DeleteFor("档案编号 = \'" & e.DataRow("档案编号") & "\' And [序号] Not In (\'" & ys.Replace(",","\',\'") & "\')") 

        Dim Vs() As String = StrToNarrow(ys).Split(",")
        Dim s As String = "|" & dt.GetComboListString("序号","[档案编号] = \'" & e.DataRow("档案编号") & "\'","_Identify") & "|"
        For i As Integer = 0 To Vs.Length - 1
            If not s.Contains(Vs(i))
                Dim dr As Row  = Tables("委外明细").AddNew
                dr("档案编号") = e.DataRow("档案编号")
                dr("序号") = Vs(i)
                If e.DataRow("颜色").Split(",").Length -1 >= i
                    dr("颜色") = e.DataRow("颜色").Split(",")(i)
                End If
            End If
        Next
End Select

[此贴子已经被作者于2012-11-26 21:11:14编辑过]

--  作者:zcw728909
--  发布时间:2012/11/26 21:25:00
--  

两种方法都能行,正在研究中


--  作者:czy
--  发布时间:2012/11/26 21:52:00
--  
以下是引用zcw728909在2012-11-26 21:25:00的发言:

两种方法都能行,正在研究中

 

如果用二楼的要加个判断,否则如果颜色列的分隔数据少于序号列会报错的。


--  作者:zcw728909
--  发布时间:2012/11/26 21:53:00
--  

两位前辈不好意思,刚才没有说清楚,应该是:

1.当颜色不一样而序号一样时,只把颜色更新,不用更新整个行;当序号不一样时才更新整个行

2.我以前的代码里有个分号“;”,主要是当序号里有值用分号隔开时,对应的颜色是一样的,如下图:


图片点击可在新窗口打开查看此主题相关图片如下:555.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:666.jpg
图片点击可在新窗口打开查看
C版的代码好像没有这种功能
[此贴子已经被作者于2012-11-27 8:15:20编辑过]

--  作者:lin_hailun
--  发布时间:2012/11/27 8:49:00
--  
 大概这样吧。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目49改.table