Foxtable(狐表)用户栏目专家坐堂 → 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值


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

主题:未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值

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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值  发帖心情 Post By:2018/9/10 18:16:00 [只看该作者]

click代码如下:

Dim rq As String = e.Form.Controls("DateTimePicker1").Value
Dim cpxh As String = e.Form.Controls("dropbox2").Value
Dim dj As String = e.Form.Controls("textbox5").Value
Dim sl As String = e.Form.Controls("NumericComboBox2").Value
If rq = "" Then
    MessageBox.Show("请输入销售日期,不能为空!", "错误提示")
ElseIf cpxh = "" Then
    MessageBox.Show("The product model cannot be empty,please enter产品型号不能为空,请输入!", "错误提示")
ElseIf sl = "" Then
    MessageBox.Show("The quantity cannot be empty,please enter(请输入数量,不能为空!)", "错误提示")
Else
    Dim tbl As Table = Tables("销售明细表")
    Dim r As Row = tbl.AddNew()
    r("订单号") = e.Form.Controls("TextBox2").Text
    r("产品型号") = e.Form.Controls("dropbox2").Text
    r("产品类别") = e.Form.Controls("产品类别").Text
    r("单价成本") = e.Form.Controls("单价成本").Text
    r("销售单价") = e.Form.Controls("TextBox5").Text
    r("数量") = e.Form.Controls("NumericComboBox2").Text
  
    If e.Form.Controls("NumericComboBox1").Value <> 0 Then
        MessageBox.Show(7)
        Dim r1 As Row = Tables("订单出库明细表").AddNew
        MessageBox.Show(9)
        r1("提货日期") = e.Form.Controls("datetimepicker1").Value
        MessageBox.Show(10)
        r1("订单号") = e.Form.Controls("TextBox2").Value
        MessageBox.Show(11)
        r1("产品型号") = e.Form.Controls("dropbox2").Value
        MessageBox.Show(12)
        r1("数量") = e.Form.Controls("NumericComboBox2").Value
        MessageBox.Show(13)
        r1("已提数量") = e.Form.Controls("NumericComboBox1").Value
        MessageBox.Show(14)
        r1.Save()  
        MessageBox.Show(15)
    End If
End If

代码执行到MessageBox.Show(14)后出现如下错误信息:


此主题相关图片如下:tim图片20180910120911.png
按此在新窗口浏览图片

 


此主题相关图片如下:tim图片20180910120916.png
按此在新窗口浏览图片

 

订单出库明细表:

 
此主题相关图片如下:tim图片20180910121439.png
按此在新窗口浏览图片

 

请帮忙看看,谢谢!



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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/9/10 18:17:00 [只看该作者]

把关联设置删除,重新设置关联,即可。

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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
  发帖心情 Post By:2018/9/10 18:44:00 [只看该作者]

全部删除关联,重新设置过了,问题依旧。如果把r1.Save()  屏蔽就不会。

这种错误经我测试,只是每天第一次新增订单的时候才会出现,后面的新增数据都不会出现该问题


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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
  发帖心情 Post By:2018/9/10 18:56:00 [只看该作者]

把r1.save屏蔽后,保存按钮出现同样错误提示: 

If Tables("销售订单").Current.DataRow.RowState = DataRowState.Added AndAlso Tables("销售订单").Current IsNot Nothing Then
MessageBox.Show(1)
    If Tables("销售明细表").Current Is Nothing Then
        MessageBox.Show("No details cannot be saved 无订单明细,无法保存!", "Error 错误提示")
        Tables("销售订单").Current.Delete
MessageBox.Show(2)
    Else
        Tables("销售订单").Current("客户名称") = e.Form.Controls("DropBox3").Text
        Tables("销售订单").Current("客户电话") = e.Form.Controls("DropBox1").Text
        Tables("销售订单").Current("折扣") = e.Form.Controls("TextBox3").Text
        Tables("销售订单").Current("备注") = Tables("销售订单").Current("备注") & vbcrlf & e.Form.Controls("TextBox4").Text
MessageBox.Show(3)
        If Tables("销售订单").Current IsNot Nothing Then
MessageBox.Show(4)
            Tables("销售订单").Current.Save
MessageBox.Show(5)
            Tables("销售订单").AllowEdit = False
MessageBox.Show(6)
        End If
MessageBox.Show(7)
        For Each dr As Row In Tables("销售明细表").Rows
            dr.Save
        Next
    End If
End If


 问题出在MessageBox.Show(4)后的Tables("销售订单").Current.Save,这句。

为什么都是保存按钮


 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110646 积分:563138 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/9/10 20:14:00 [只看该作者]

有没有在后台数据库里设置表关联?

Dim r As Row = Tables("销售订单").Current
If  r IsNot Nothing AndAlso r.DataRow.RowState = DataRowState.Added Then
MessageBox.Show(1)
    If Tables("销售明细表").Current Is Nothing Then
        MessageBox.Show("No details cannot be saved 无订单明细,无法保存!", "Error 错误提示")
        r.Delete
MessageBox.Show(2)
    Else
        r("客户名称") = e.Form.Controls("DropBox3").Text
        r("客户电话") = e.Form.Controls("DropBox1").Text
        r("折扣") = e.Form.Controls("TextBox3").Text
        r("备注") = r("备注") & vbcrlf & e.Form.Controls("TextBox4").Text
MessageBox.Show(3)

            r.Save
MessageBox.Show(5)
            Tables("销售订单").AllowEdit = False
MessageBox.Show(7)
        Tables("销售明细表").save
    End If
End If

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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
  发帖心情 Post By:2018/9/10 22:11:00 [只看该作者]

后台数据库没有设置表关联。
刚才发现问题所在:
销售订单和销售明细表通过订单号关联
销售订单和订单付款明细表通过订单号关联
销售明细表和订单出库明细表通过订单号、产品型号两个字段关联
订单号按照”网络环境下的复杂编号“生成而来,问题出在:当保存销售订单的时候,订单出库明细表的订单号从临时编号转变为正式编号的瞬间。
该怎么解决这个问题?

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110646 积分:563138 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/9/10 22:39:00 [只看该作者]

建议上传具体实例详细测试

方法1、全部改为模拟关联:http://www.foxtable.com/webhelp/scr/2222.htm
2、不要在BeforeSaveDataRow事件生成编号,而是新增行后马上获取新编号,就是不使用临时编号,而是直接使用正式编号

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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
  发帖心情 Post By:2018/9/10 23:07:00 [只看该作者]

1、采用模拟关联不能解决这个问题,因为还是要用订单号建立关联关系。
2、之前采用的是正式编号方法,但我需要在局域网多人使用,采用正式编号新增行后必须马上保存才能避免订单号重复的问题,立即保存新增行带来的问题是行的状态就无法判断是不是新增行,好几个地方需要用到新增行来做判断。所以采用了临时编号的方案。
 
3、问题会不会是因为销售明细表和订单出库明细表通过订单号关联,是二级关联了。销售订单—销售明细表—订单出库明细表,都是通过订单号关联。之前采用在DataColChanged写代码采用正式编号(没有用临时编号再转正式编号)没有出现这个问题,控件的代码写的都一样,也没有出现这个未能启用约束的错误提示。
[此贴子已经被作者于2018/9/10 23:20:38编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110646 积分:563138 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/9/10 23:19:00 [只看该作者]

1、模拟关联肯定没有问题,因为不需要建立关联表
2、局域网多人使用一样可以使用正式编号,帮助仅仅是提供一种用法,不代表这种用法是上帝而不可侵犯。学习帮助最主要的还是学习帮助解决问题的逻辑,而不是完抄。
其实只需要保存更新[编号]表即可,业务表不保存也一样可以使用正式编号

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


加好友 发短信
等级:童狐 帖子:228 积分:2057 威望:0 精华:0 注册:2017/8/18 17:51:00
  发帖心情 Post By:2018/9/11 3:10:00 [只看该作者]

项目中的订单号有两种方案:

1、采用网络环境下的复杂编号:此方案目前遇到“未能启用约束”的错误提示,应该是订单出库明细表保存的时候订单号从临时编号转为正式编号的瞬间引起。

2、只采用正式编号方案:销售订单的datacolchanged里面有写代码(已屏蔽)。此方案的问题是销售订单新增行后必须立即保存新增行,否则多人使用会出现订单号重复的问题。立即保存新增行带来的问题是行的状态就不是DataRowState.Added状态,好几个地方需要用到DataRowState.Added来做判断。比如导航窗口的TopicLinkClick中的代码(当前窗口有数据未保存需要转到其他窗口时提醒数据的保存)。

希望老师们帮我看看怎么解决局域网多人使用订单号重复的问题(两个方案中的一个,或者有更好的方案)。

 

测试方法:


此主题相关图片如下:tim截图20180910203037.jpg
按此在新窗口浏览图片
按照此图1,2,3,4步骤进行。出现“未能启用约束”的错误信息只是在第一个订单时会出现,新增第二个的时候不会出现,后面的新增都不会(很奇怪)。如果删除今天所有的新增数据再重新打开项目,第一个新增行又会出现类似错误。

密码为888

[此贴子已经被作者于2018/9/11 14:44:50编辑过]

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