以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  用户自定义列表项目名称更改后如何更新表中引用过的数据  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=23387)

--  作者:zpx_2012
--  发布时间:2012/9/10 21:39:00
--  用户自定义列表项目名称更改后如何更新表中引用过的数据

各位老师,如下问题请教:

 

为方便客户使用系统时自己可以设定一些常用的数据列表项目,我设计了如下一个窗口

其中的子节点客户可以自行增加及重命名,

 


图片点击可在新窗口打开查看此主题相关图片如下:360截图20120910-007.jpg
图片点击可在新窗口打开查看


 

在系统中的很多表的列的列表项目都用到了这些数据,如下

 


图片点击可在新窗口打开查看此主题相关图片如下:360截图20120910-008.jpg
图片点击可在新窗口打开查看

 

我的问题是:当客户重命名子节点的那些数据项目名称时,能否自动找出系统中所有用到该名称的列并自动更新成新的名称?

比如现在将“半成品仓”改为“二楼半成品仓”,原来在所有表中的仓库列录入的“半成品仓”如何自动更新为“二楼半成品仓”?

因为如果不更新,当统计汇总时就会出现很多不同的仓库出来。

 

谢谢!


 


--  作者:czy
--  发布时间:2012/9/10 22:14:00
--  
在重命名按钮中加上替换代码就可以了,参考ReplaceFor方法
--  作者:狐狸爸爸
--  发布时间:2012/9/10 22:17:00
--  
表中的数据可以更新,但是列属性中的设置是没有办法自动更新的
--  作者:zpx_2012
--  发布时间:2012/9/10 22:48:00
--  

主要就是更新表中原来已经录入的数据,列属性是不用的,是我在开发时设计用的。

 

但是因为“项目分类”窗口中有很多不同的类别的数据,每一种重新命名后要怎么样编写代码才能去寻找到哪个表中的哪个列有用到这个数据?

 

请两位老师再提示一下,我一点思路都没有,表及列都可以遍历,但怎么才知道是哪一列中在引用(即代码要怎么知道我设计时哪一列引用到了这些数据),

 

因为不可能说按文字来查找所有的列,如果其他不相关的列也有相同的文字那也被重新命名就错了。

 

我的意思是不同表中的列名不一定和我的项目分类的根目录是相同的名字(即项目分类中根目录是“计量单位”,但在表中引用的那一列名称可能是

 

“单位”),当然如果是每个表中引用的列名都统一成与项目分类中的根目录相同的名字,那样当然就容易多了。

[此贴子已经被作者于2012-9-10 23:00:43编辑过]

--  作者:czy
--  发布时间:2012/9/10 22:56:00
--  

如果实在不确定哪些列会有这样的数据出现,直接遍历涉及的表所有字符列了


--  作者:zpx_2012
--  发布时间:2012/9/10 23:04:00
--  

因为不可能说按文字来查找所有的列,如果其他不相关的字符列也有相同的文字那也被重新命名就错了。

 

我的意思是不同表中的列名不一定和我的项目分类的根目录是相同的名字(即项目分类中根目录是“计量单位”,但在表中引用的那一列名称可能是

 

“单位”),当然如果是每个表中引用的列名都统一成与项目分类中的根目录相同的名字,那样当然就容易多了。


--  作者:czy
--  发布时间:2012/9/10 23:19:00
--  

你只开放了子节点的重命名,根节点是固定的,所以设计时是完全知道哪些表、哪些列与这个根节点相关的,用户增加或重命名子节点后你直接替换根节点相关表的相关列数据就可以了。

[此贴子已经被作者于2012-9-10 23:18:51编辑过]

--  作者:zpx_2012
--  发布时间:2012/9/11 0:08:00
--  

谢谢CZY,我考虑了一下,还是决定将相关表中的列名称都统一成项目分类中的根节点名称,这样代码很容易就通用,不然比如“计量单位”很多表中都引用到,那还要在编码时针对每一项都把引用到的表及列列举出来,太麻烦了。谢谢!

 


--  作者:zpx_2012
--  发布时间:2012/9/11 16:04:00
--  

各位老师,我按上面的思路设计了如下代码:

If e.NewText = "" Then
    e.Cancel = True
    Return
End If
Dim pth() As String = e.Node.FullPath.Split("\\")
Select Case e.node.Level
    Case 0
        DataTables("项目分类").ReplaceFor("项目名称",e.NewText,"项目名称 = \'" & pth(0) & "\'")
    Case 1
        DataTables("项目分类").ReplaceFor("罗列值",e.NewText,"项目名称 = \'" & pth(0) & "\' And 罗列值 = \'" & pth(1) & "\'")
        For Each tb As DataTable In DataTables
            For Each dc As DataCol In tb.DataCols
                If dc.name = e.node.ParentNode.Text Then
                    Dim dr As DataRow
                    Dim s As String = dr(dc.name)
                    DataTables(tb).ReplaceFor(dc.name,e.NewText,"dr(dc.name) = \'" & pth(1) & "\'")
                End If
            Next
        Next
End Select
e.Node.Name = e.NewText

 

 


此主题相关图片如下:360截图20120911-001.jpg
按此在新窗口浏览图片


 

 

但红色那句通不过,意思是在表中找到目标列后,用e.NewText替换掉dc.name列中 = \'" & pth(1) & "\'的值,请指点

 

谢谢!



[此贴子已经被作者于2012-9-11 16:08:34编辑过]

--  作者:lin_hailun
--  发布时间:2012/9/11 16:32:00
--  
If dc.name = e.node.ParentNode.Text Then
    Dim dr As DataRow
    Dim s As String = dr(dc.name)
    DataTables(tb).ReplaceFor(dc.name,e.NewText,"dr(dc.name) = \'" & pth(1) & "\'")
End If

不清楚上面代码的含义

If dc.name = e.node.ParentNode.Text then
    DataTables(tb).ReplaceFor(dc.name, e.NewText, dc.name & " = \'" & pth(1) & "\'")
End If