以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关联表子表条件禁止重复  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87301)

--  作者:manyifuwu
--  发布时间:2016/7/7 19:24:00
--  关联表子表条件禁止重复
关联表子表条件禁止重复,比如第二列,第三列,第三列。如果内容一样,子表不能添加。只有父表的其中列改后才能添加子行。
我按帮助里的不行,是什么原因。谢谢!

--  作者:manyifuwu
--  发布时间:2016/7/7 19:25:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:关联表条件禁止重复.table


--  作者:大红袍
--  发布时间:2016/7/7 20:15:00
--  

BeforeAddDateRow事件

 

Dim r As Row = Tables("表A").Current
If r("第二列") = r("第三列") AndAlso r("第三列") = r("第四列") Then
    msgbox("三列不能重复")
    e.cancel = True
End If


--  作者:大红袍
--  发布时间:2016/7/7 20:15:00
--  

或者参考

 

http://www.foxtable.com/webhelp/scr/2481.htm

 


--  作者:manyifuwu
--  发布时间:2016/7/7 21:22:00
--  

我上传的就是按这个帮助弄的。但是就是不对,麻烦你帮忙看看,是那出错了呢?

 

 

 

假定产品表有型号和规格两列,禁止输入型号和规格相同的产品,可以将这个表的DataColChanging事件代码设置为:

Select Case e.DataCol.name
    Case "型号","规格"
        Dim xh As String
        Dim gg As String
        If e.DataCol.Name= "型号" Then
            xh = e.NewValue
            gg = e.DataRow("规格")
        Else
            gg = e.NewValue
            xh = e.DataRow("型号")
        End If
        If xh > "" AndAlso gg  > "" Then
            Dim dr As DataRow = e.DataRow
            If e.DataTable.Find("型号 = \'" & xh & "\' And 规格 = \'" & gg & "\'") IsNot Nothing Then
                MessageBox.Show("已经存在相同型号和规格的行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
                e.Cancel = True
            End If
        End If
End Select

上面的代码有点繁琐。

我们可以变通一下,改为DataColChanged事件事件代码 ,同样可以禁止输入型号和规格相同的行,而且代码会简洁一些:

Select Case e.DataCol.name
    Case
"型号","规格"
       
Dim dr As DataRow = e.DataRow
       
If dr.IsNull("型号") = False AndAlso dr.IsNull("规格") = False Then
            If e.DataTable.Compute("Count([_Identify])","型号 = \'" & dr("型号") & "\' And 规格 = \'" & dr("规格") & "\'") > 1 Then
                MessageBox.Show(
"已经存在相同型号和规格的行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
                e.
DataRow(e.DataCol.Name) = e.OldValue \'取消输入
           
End If
        End
If
End
Select


--  作者:大红袍
--  发布时间:2016/7/7 23:42:00
--  

DataColChanged事件

 

Select Case e.DataCol.name
    Case "第二列","第三列"
        Dim count As Integer = e.DataTable.compute("count(_Identify)", "第三列 = \'" & e.DataRow("第三列") & "\' and 第二列 = \'" & e.DataRow("第二列") & "\'")
        If count > 1 Then
            msgbox("重复了")
        End If
End Select


--  作者:manyifuwu
--  发布时间:2016/7/8 1:24:00
--  

夜深了,水平有限,还是没有搞定!

是想实现:如果父表表第二列、第三列、第四列没有变化。则子表不能添加重复列。是增加子表行前执行,如果子行重复复了就不能增加。帮帮我!谢

[此贴子已经被作者于2016/7/8 1:30:55编辑过]

--  作者:manyifuwu
--  发布时间:2016/7/8 1:25:00
--  

DataColChanged事件

 

Select Case e.DataCol.name
    Case "第二列","第三列"
        Dim count As Integer = e.DataTable.compute("count(_Identify)", "第三列 = \'" & e.DataRow("第三列") & "\' and 第二列 = \'" & e.DataRow("第二列") & "\'")
        If count > 1 Then
            msgbox("重复了")
        End If
End Select

 

可以提示重复了,但还是会增加。希望第二列、第三列、第四列重复了,就不能添加子行。

[此贴子已经被作者于2016/7/8 1:25:39编辑过]

--  作者:Hyphen
--  发布时间:2016/7/8 8:48:00
--  
BeforeAddDateRow事件

Dim parent As DataRow = e.DataRow.GetParentRow("父表")
Dim count As Integer = DataTables("父表").compute("count(_Identify)", "第三列 = \'" & parent("第三列") & "\' and 第二列 = \'" & parent("第二列") & "\'and 第四列 = \'" & parent("第四列") & "\'"))
If count > 1 Then
    msgbox("重复了")
    e.Cancel = True
End If

--  作者:大红袍
--  发布时间:2016/7/8 9:32:00
--  

Select Case e.DataCol.name
    Case "第二列","第三列"
        Dim count As Integer = e.DataTable.compute("count(_Identify)", "第三列 = \'" & e.DataRow("第三列") & "\' and 第二列 = \'" & e.DataRow("第二列") & "\'")
        If count > 1 Then
            msgbox("重复了")

            e.DataRow.Delete
        End If
End Select