Foxtable(狐表)用户栏目专家坐堂 → 如何实现允许符合条件数据修改,不允许删除


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

主题:如何实现允许符合条件数据修改,不允许删除

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/18 11:06:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:象棋排赛11141.zip



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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/18 12:09:00 [显示全部帖子]

改为

Dim s As String = "不允许基本信息表删除已引用到比赛积分表的数据"
Select Case e.DataCol.Name
    Case "棋赛名称","姓名"
        e.DataRow.Save
        If e.NewValue Is Nothing AndAlso e.OldValue > ""
            Dim Filter As String
            If e.DataCol.Name = "姓名" Then
                Filter = "[棋赛名称] = '" & e.DataRow("棋赛名称") & "'And 姓名 = '" & e.OldValue & "'"
            Else
                Filter = "[棋赛名称] = '" & e.OldValue & "'And 姓名 = '" & e.DataRow("姓名") & "'"
            End If
            Dim dt As DataRow
            dt = DataTables("比赛积分").SQLfind( Filter )
            If dt IsNot Nothing Then
                MessageBox.Show(s,"提示")
                e.Cancel= True
            ElseIf e.DataCol.Name ="姓名"
                dt = DataTables("对阵表").SQLfind("红方_姓名 = '" & e.DataRow("姓名") & "' Or 黑方_姓名 = '" & e.DataRow("姓名") & "'")
                If dt IsNot Nothing  Then
                    MessageBox.Show(s,"提示")
                    e.Cancel= True
                End If
            End If
        End If
End Select
Select Case e.DataCol.Name
    Case "棋赛名称","编号"
        e.DataRow.Save
        If e.DataCol.Name = "棋赛名称" AndAlso e.NewValue Is Nothing AndAlso e.OldValue > "" OrElse e.DataCol.Name = "编号" AndAlso e.NewValue = Nothing AndAlso e.OldValue <> Nothing Then
            Dim Filter As String
            If e.DataCol.Name = "编号" Then
                Filter = "[棋赛名称] = '" & e.DataRow("棋赛名称") & "'And 编号 = " & e.OldValue
            Else
                Filter = "[棋赛名称] = '" & e.OldValue & "'And 编号 = " & e.DataRow("编号")
            End If
            
            Dim dt As DataRow
            dt = DataTables("比赛积分").SQLfind(Filter )
            If dt IsNot Nothing Then
                MessageBox.Show(s,"提示")
                e.Cancel= True
            End If
        End If
End Select

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/18 16:44:00 [显示全部帖子]

我测试没有问题。列出测试步骤

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/18 17:08:00 [显示全部帖子]

我以为是删除单元格数据,如果是整行删除要到BeforeDeleteDataRow事件处理:http://www.foxtable.com/webhelp/topics/0632.htm

原来的代码都没有针对新增的处理,参考

Select Case e.DataCol.Name
    Case "棋赛名称","姓名"
        e.DataRow.Save
        If e.OldValue > ""
            Dim Filter As String
            If e.DataCol.Name = "姓名" Then
                Filter = "[棋赛名称] = '" & e.DataRow("棋赛名称") & "'And 姓名 = '" & e.OldValue & "'"
            Else
                Filter = "[棋赛名称] = '" & e.OldValue & "'And 姓名 = '" & e.DataRow("姓名") & "'"
            End If
            Dim drs As List(Of DataRow) = DataTables("比赛积分").Select(Filter)
            If drs.Count = 0 Then
                Dim nr As DataRow = DataTables("比赛积分").AddNew
                nr("棋赛名称") = e.DataRow("棋赛名称")
                nr("姓名") = e.DataRow("姓名")
                nr("编号") = e.DataRow("编号")
            Else
                For Each dr As DataRow In drs
                    dr(e.DataCol.Name) = e.NewValue
                Next
            End If
        End If
End Select

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/19 22:09:00 [显示全部帖子]

1、比赛积分表的姓名下拉选项中没有同步添加 --因为没有保存,基本信息表里添加人必须保存
积分表prepareedit事件
If e.IsFocusCell Then
    If e.Col.Name = "姓名" Then
        e.Col.Combolist = DataTables("基本信息").SQLGetComboListString("姓名","[身份] = '参赛人' and 棋赛名称='" & e.Row("棋赛名称") & "'")
    End If
End If


2、基本信息表BeforeDeleteDataRow事件
Dim dt As DataRow = DataTables("比赛积分").SQLfind("棋赛名称 = '" & e.DataRow("棋赛名称") & "'And (姓名 = '" & e.DataRow("姓名") & "' or 编号 = '" & e.DataRow("编号") & "')")
If dt Is Nothing Then
    dt = DataTables("对阵表").SQLfind("棋赛名称 = '" & e.DataRow("棋赛名称") & "'And (红方_姓名 = '" & e.DataRow("姓名") & "' or 黑方_姓名 = '" & e.DataRow("姓名") & "')")
End If
If dt IsNot Nothing Then
    MessageBox.Show("不允许基本信息表删除已引用数据","提示")
    e.Cancel = True
End If


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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/20 8:34:00 [显示全部帖子]

自相矛盾的事情,既然做了有数据引用就不能删除,肯定就无法删除。如果要删除,设计窗口做个按钮,先删除比赛积分表、对阵表对应的数据,再删除基本信息表里的数据

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/20 9:13:00 [显示全部帖子]

如果要一行数据所有单元格都不能删除,除棋赛名称、姓名外其他列也在datacolchanging事件判断一下啊,用法都差不多的

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/20 10:03:00 [显示全部帖子]

自己给自己挖坑。之前编号是整数列,现在是字符列。字符列需要使用单引号,数值列不需要单引号

            If e.DataCol.Name = "编号" Then
                Filter = "[棋赛名称] = '" & e.DataRow("棋赛名称") & "'And 编号 = '" & e.OldValue & "'"
            Else
                Filter = "[棋赛名称] = '" & e.OldValue & "'And 编号 = '" & e.DataRow("编号") & "'"
            End If

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/20 11:47:00 [显示全部帖子]

表格keydown事件

If (e.Control AndAlso e.KeyCode = keys.X OrElse e.KeyCode = keys.Delete) AndAlso e.Table.Current IsNot Nothing Then
    Dim r  As  Row = e.Table.Current
    Dim Filter As String= "[棋赛名称] = '" & r("棋赛名称") & "'And (姓名 = '" & r("姓名") & "' or 编号 = '" & r("编号") & "')"
    Dim dt As DataRow
    dt = DataTables("比赛积分").SQLfind( Filter )
    If dt IsNot Nothing Then
        MessageBox.Show("不允许基本信息表删除已引用数据","提示")
        e.Cancel= True
    Else
        dt = DataTables("对阵表").SQLfind("红方_姓名 = '" & r("姓名") & "' Or 黑方_姓名 = '" & r("姓名") & "'")
        If dt IsNot Nothing  Then
            MessageBox.Show("不允许基本信息表删除已引用数据","提示")
            e.Cancel= True
        End If
    End If
End If

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/20 12:10:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:象棋排赛11141(2).zip


 回到顶部
总数 15 1 2 下一页