以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  表中必填字段禁止为空的通用代码(已解决)  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=27544)

--  作者:zpx_2012
--  发布时间:2013/1/4 11:53:00
--  表中必填字段禁止为空的通用代码(已解决)

各位老师,

 

表中的必填字段保存时不能为空,在每一个表中都单独设置代码时没有问题,且可以自动定位到为空的字段(例子中已将各表的验证代码注释了),

 

但那样每个表去写了代码太麻烦,把代码移动到全局表事件中想实现所有表中必填字段为空时都不能保存且自动定位到为空的字段,但一直出错,请教大家

 

请删除每一个表中的任一字段内容保存

 

谢谢!

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:必填验证.table

[此贴子已经被作者于2013-1-5 10:58:17编辑过]

--  作者:lin_hailun
--  发布时间:2013/1/4 13:53:00
--  
 代码大概这样吧。

\'集合系统表中所有有必填字段的表
Dim tbs As String
tbs = DataTables("必填字段").GetComboListString("表名","必填字段 is not Null ")
If tbs > "" Then
    tbs = "\'" & tbs.replace("|","\',\'")  & "\'" \'将字符串转成in可用的格式
End If

\'保存前检查不为空的列是否为空
If tbs.contains(e.DataTable.Name)  Then
    Dim dr As DataRow = DataTables("必填字段").Find("表名 = \'" & e.DataTable.Name & "\'")
    Dim s As String = dr("必填字段")
    Dim ss() As String = s.split("\\")
    For i As Integer = 0 To ss.Length - 1
        If e.DataRow.IsNull(ss(i)) Then
            MessageBox.Show("\'" & e.DataTable.Name & "\'的" & "\'" & ss(i) & "列\'不能为空!")
            Tables(e.DataTable.Name).Position = Tables(e.DataTable.Name).FindRow(e.DataRow)
            MainTable = Tables(e.DataTable.Name)
            e.Cancel = True
            Exit For
        End If
    Next
End If

--  作者:zpx_2012
--  发布时间:2013/1/4 14:24:00
--  

谢谢林老师,但有个问题就是,当在关联表中删除明细表的内容时,保存提示后定位时不能定位到这个关联表,却定位到明细表了,比如我删除了如下表中的一项

  


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

 

 提示确定后却定位到订单明细表去了,
 


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

能否直接定位在关联表那里呢?。


--  作者:lin_hailun
--  发布时间:2013/1/4 14:31:00
--  
 beforesavedatarow这个事件只是针对datatable的

 最多可以做到的是用一个全局变量记录当前录入的表名称,比如关联表(订单.订单明细),如果e.datatable.name是(订单明细),就定位到记录的那个表。

 也就是关联表优先于实际表。

--  作者:zpx_2012
--  发布时间:2013/1/4 14:44:00
--  
谢谢,我试试看是否可以再请教老师了。
--  作者:zpx_2012
--  发布时间:2013/1/4 16:16:00
--  

再次请教林老师,我加了一个判断可以得到关联表及主表,但无法定位到具体是主表的哪一行下的明细表。

 

\'保存前检查不为空的列是否为空
If tbs.contains(e.DataTable.Name)  Then
    Dim dr As DataRow = DataTables("系统表").Find("表名 = \'" & e.DataTable.Name & "\'")
    Dim s As String = dr("必填字段")
    Dim ss() As String = s.split("\\")
    For i As Integer = 0 To ss.Length - 1
        If e.DataRow.IsNull(ss(i)) Then
            MessageBox.Show("\'" & e.DataTable.Name & "\'的" & "\'" & ss(i) & "列\'不能为空!")
            If e.DataTable.name Like "*明细" Then
                For Each re As Relation In Relations
                    If e.DataTable.Name = re.ChildTable.Name Then  \'如果是明细表
                        Dim tbname As String = re.ParentTable.Name & "." & re.ChildTable.Name \'得到关联表
                        Tables(tbname).Position = Tables(e.DataTable.Name).FindRow(e.DataRow)
                        MainTable = Tables(re.ParentTable.Name)
                    End If
                Next
            Else
                Tables(e.DataTable.Name).Position = Tables(e.DataTable.Name).FindRow(e.DataRow)
                MainTable = Tables(e.DataTable.Name)
            End If
            e.Cancel = True
            Exit For
        End If
    Next
End If


--  作者:lin_hailun
--  发布时间:2013/1/4 16:48:00
--  
呃,你这样没有意义,因为maintable不能定义到关联表。

--  作者:zpx_2012
--  发布时间:2013/1/4 17:01:00
--  
因为如果用一个全局变量记录当前录入的表名称,但用户编辑后可能还没有保存当前表又切换到其他表去操作了,那样当前表又变成其他表了,所以也不好定位。
--  作者:zpx_2012
--  发布时间:2013/1/4 22:15:00
--  
哪位老师帮忙看一下,就是3楼的问题,谢谢!