以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]自定义复合主键问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=49163)

--  作者:arthurshoe
--  发布时间:2014/4/13 10:21:00
--  [求助]自定义复合主键问题
外部数据做了一个复合主键表 冲裁中转进度表,主键是 轮次单号 + 部件名称, 没有了默认的 _identify, _locked,  _sorted... 
用代码执行新增操作,发现新记录上的轮次单号和部件名称都是空值,不能被正确赋值。。
Tables("冲裁中转进度表").AddNew()
Tables("冲裁中转进度表").current("部件名称") =  "我的部件"
Tables("冲裁中转进度表").current("轮次单号") = "单号"

以为是赋值出现问题。。测试已经存在的记录,记录是可以被赋值的
Tables("冲裁中转进度表").current("部件名称") =  "我的部件"
Tables("冲裁中转进度表").current("轮次单号") = "单号"

用foxtable界面建另外一个表,也即是表默认有_identify, _locked,  _sorted, 用系统的 新增行 功能
发现在记录的所有列都是空值是 该记录已经有一个 行号。。。
而上面的外部复合主键表用 新增行, 在所有记录列空值是 系统是不会自动产生 行号,只有在手动在表里用编辑后才能产生行号。。。
用代码的话,会发生上面的赋值问题。。。应该是主键相关问题。。

请高手帮忙!
[此贴子已经被作者于2014-4-13 10:23:18编辑过]

--  作者:有点甜
--  发布时间:2014/4/13 22:13:00
--  

 赋值这样写

 

Dim nr As Row = Tables("冲裁中转进度表").AddNew()

nr("部件名称") = "xxx"

nr("轮次单号") = "yyy"


--  作者:arthurshoe
--  发布时间:2014/4/14 2:48:00
--  
结果是一样的。。还是不能赋值啊!
--  作者:pengjiam
--  发布时间:2014/4/14 6:43:00
--  
_identify, _locked,  _sorted中一定有不允许为空的字段,要不把表中这些字段属性设置为可以为空。
--  作者:有点甜
--  发布时间:2014/4/14 9:26:00
--  
以下是引用pengjiam在2014-4-14 6:43:00的发言:
_identify, _locked,  _sorted中一定有不允许为空的字段,要不把表中这些字段属性设置为可以为空。

 

在你的表中,有这三列,还是没有这三列?默认_Identify是主键。

 

方案一,你可以使用_Identify + 其它列 做复合主键;

 

方案二,你可以删除_Identify,然后在狐表里,重新引用一次这个外部表


--  作者:arthurshoe
--  发布时间:2014/4/14 20:11:00
--  
谢谢大家的回复。。
前面我讲过 我的表示直接自己建立的  没有_identiy, _locked, _Sortkeys等。。。
出现只能在表格编辑状态才能新增直接输入数值。。但是在代码内不能赋值。。。

试过了各种方案还是不行:
-允许identify locked sortkeys 为空。。其他两列做组合主键。。。不行
-不允许identify 为空也不行。。。同样的问题。。。
-删除identify重新引用也不行。。。。

楼上的方案
方案一,你可以使用_Identify + 其它列 做复合主键;。。。因为identify一定是不同的。。这样做就失去了我要保证其他两列在表里面唯一性的意义了

看过foxtable 为解决上面问题。。。是在beforesave前先检查记录是不是存在。。。
这样做 如果数据表原有上万条记录是。。。效率好像有问题。。。如果是批量增加可能更大问题。。。而且还有可能出现不同用户并发问题吧。。
如果动态加载数据的话还得做datatable重新加载。。还是后台筛选?

Foxtable 有什么好办法 解决这个问题了(保持几列的组合在数据库的唯一性)?

谢谢!


--  作者:有点甜
--  发布时间:2014/4/14 20:50:00
--  

 复合主键在狐表里使用是很麻烦的,必须输入唯一的值,才能再新增行。

 

 而且新增的行,是不能直接赋值的,你可以新增两行,然后给上一行赋值。

 

 参考下面的代码

 

Dim nr As Row = CurrentTable.AddNew
CurrentTable.Rows(nr.Index-1)("bbb") = Date.now
CurrentTable.Rows(nr.Index-1)("ccc") = Date.now

 

 


--  作者:arthurshoe
--  发布时间:2014/4/14 22:58:00
--  
只能先这样了。。。不过在保存时又要先把最后一个空记录删除。。确实有点麻烦啊。。。
不知道在将来的foxtable能不能比较好的支持

--  作者:逛逛
--  发布时间:2014/4/15 8:23:00
--  

建议楼主用组合索引的方法,效果是相同的,


--  作者:有点甜
--  发布时间:2014/4/15 9:53:00
--  
以下是引用逛逛在2014-4-15 8:23:00的发言:

建议楼主用组合索引的方法,效果是相同的,

 

这个方法怎么具体实现?印象中索引好像不是这么用的