Foxtable(狐表)用户栏目专家坐堂 → [求助][_Identify] 是固定不变的嘛?


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

主题:[求助][_Identify] 是固定不变的嘛?

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


加好友 发短信
等级:五尾狐 帖子:1165 积分:9032 威望:0 精华:1 注册:2011/5/25 16:33:00
[求助][_Identify] 是固定不变的嘛?  发帖心情 Post By:2011/9/12 10:30:00 [只看该作者]

加入 有5行数据   假设 [_Identify] 分别为1,2,3,4,5  如果删除了第三行  其它四行为 1,2,4,5?  不会变成 1,2,3,4?

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


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/9/12 10:44:00 [只看该作者]

你连这个都不知道,谈何编程啊?

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


加好友 发短信
等级:五尾狐 帖子:1165 积分:9032 威望:0 精华:1 注册:2011/5/25 16:33:00
  发帖心情 Post By:2011/9/12 11:17:00 [只看该作者]

没接触过啊! 现在遇到这个问题了~~ 

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


加好友 发短信
等级:超级版主 帖子:521 积分:4910 威望:0 精华:7 注册:2008/9/2 22:22:00
  发帖心情 Post By:2011/9/12 11:20:00 [只看该作者]

以下是引用gaoyong30000在2011-9-12 11:17:00的发言:
没接触过啊! 现在遇到这个问题了~~ 

什么是主键

对于数据管理来说,主键是一个非常重要的概念。

我们每个人都有一个身份证号码,每个身份证号码都是唯一的,在正常情况下,不会再有其他人的身份证号码与你相同,这个号码就是我们的“身份标识”,是社会生活能有序进行的基础。

同样数据表中的每一行,都有一个主键值,每个主键值都是唯一的,不同的行,其主键值绝对不会相同,所以行的主键值类似人的身份证号码,是行的“身份标识”,是数据管理能有序进行的基础。

在设计表的时候,应该指定一列用于存储行的主键值,这一列就是主键列。

我们已经知道,Foxtable的内部表,有一个名为“_Identify”的列,这就是内部表的主键列,每增加一行,该列的值就会自动在上一行的基础上加1,所以对于每一行来说,_Identify列的值都不会相同,是有效的“身份标识”。

内部表的主键列是自动增加的,如果使用外部表,那么必须手工增加主键列。

关于外部表的主键,我们建议:尽量使用自动增量列(也称为自动编号),由系统自动生成编号。

如果主键为自动增量列,那么外部表和内部表在实际使用的时候,表现将完全一样,用户将感受不到任何的差别。

如果主键列不是自动增量列,则每次只能增加一行,且必须输入新增行的主键列内容才能增加下一行。

如果你希望外部表的主键列能够象内部表一样自动隐藏,可以将主键列的名称设置为“_Identify”。




再谈_Identify

我们知道内部表有一个_Identify,这是一个整数型列,每增加一行,该列的值就会自动加1。
该列的值是只读的,我们没有办法使用常规的代码去修改_Identify值。

可以将_Identify值看作是行的身份证号码,因为新增行一旦保存,其_Identify值将终生不变。
这个“身份证号码”就是主键,系统就是根据这个值来识别不同的行的。

实际使用的时候,我们是看不到_Identify列的,但是可以在代码中使用该列,例如:

Dim id1 As Integer = Tables("订单").Current("_Identify")
Dim
id2 As Integer = Tables("订单").Rows(0)("_Identify")
Dim
id3 As Integer = DataTables("订单").DataRows(1)("_Identify")

也可以在表达式中使用该列,例如可以增加一个表达式列,将其表达式设为:

[_Identify]

这样即可通过此列查看_Identify的值。
可以看出_Identify列除了不可见,使用起来和普通的列并无差别。

_Identify值类似行的编号,这个编号表示数据录入的顺序,也就是某个DataRow在DataTable中的顺序。
下面是一个根据输入顺序进行流水账计算的例子,设置在DataColChanged事件中即可:

Dim Val1 As Double
Dim Val2
As Double
Select
Case e.DataCol.Name
Case "收入","支出"
   
For Each dr As DataRow In e.DataTable.Select("[_Identify] >= " & e.DataRow("_Identify") )
        Val1 = e.
DataTable.compute("Sum(收入)","[_Identify] <= " & dr("_Identify"))
        Val2 = e.
DataTable.compute("Sum(支出)","[_Identify] <= " & dr("_Identify"))
        dr(
"余额") = Val1 - Val2
   
Next
End
Select

有一个问题需要明确,很多初学的用户将_Identify等同于下图的行号:

图片点击可在新窗口打开查看

其实这两者没有任何关系;显然,同一行数据,随着筛选和排序,其行号是不断地变化的,而_Identify列的值是终生不变的。
我们可以这样理解:

1、_Identify表示增加行的顺序,也就是DataRow在DataTable中的顺序,同时也是行的“身份证号码”,终生不变。
2、而上图中的行号,表示Row在Table中的顺序,Row有一个Index属性,返回的就是这个行号,这个行号是动态的,因为同一行数据,在排序和筛选后,其在Table中的位置是会变化的。


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


加好友 发短信
等级:五尾狐 帖子:1165 积分:9032 威望:0 精华:1 注册:2011/5/25 16:33:00
  发帖心情 Post By:2011/9/12 11:48:00 [只看该作者]

哦 明白了~

 回到顶部