实表中的数据可以读入内存中成为内表,类似序表一样使用,如:
|
A |
1 |
=file("D:/file/dw/employees.ctx") |
2 |
=A1.open() |
3 |
=A2.memory(;right(Name,6)=="Garcia") |
4 |
=A3(4) |
在A2中,打开组表employees.ctx中的基表。在A3中,使用函数T.memory(C,…;w)从内表T中筛选出满足条件w的数据,生成姓为Garcia的员工数据的内表。内表在集算器中可以类似序表一样直接查看,A3中得到结果如下:
类似普通的序表,内表中的记录可以直接根据序号访问,如A4中得到内表中的第4条记录如下:
除了用实表表生成内表,还可以用cs.memory()函数,用游标生成内表,如:
|
A |
1 |
=file("D:/file/dw/employees.ctx") |
2 |
=A1.open() |
3 |
=A2.cursor(EID,Dept,Name; right(Name,6)=="Garcia") |
4 |
=A3.memory() |
5 |
=A4.len() |
A3中,从实表中选出StateID为11的员工数据生成游标,在A4中,直接用游标生成内表如下:
由于游标中并未包含实表的所有字段,内表中也只会包含游标中的字段。在A5中,用T.len() 函数,可以得到内表的记录数:
内表可以用T.keys(K…) 函数设定主键,设定主键后,可以使用T.find(k)或k.row(T)函数查找记录,如:
|
A |
1 |
=file("D:/file/dw/employees.ctx") |
2 |
=A1.open() |
3 |
=A2.memory(;right(Name,6)=="Garcia") |
4 |
>A3.keys(EID) |
5 |
=A3.find(8888) |
6 |
=8888.row(A3) |
由于内表的主键仍然是EID,A4中的表达式也可以不再重新设置,A5和A6中根据主键值8888,查找到对应的记录,得到的结果是相同的,如下:
设定内表主键后,也可以用T.index() 函数为其创建索引,以提升检索性能。
设定主键后,可以用update和delete函数更新内表。更新函数的使用与普通序表类似,如:
|
A |
B |
1 |
=file("D:/file/dw/employees.ctx") |
=A1.open() |
2 |
=B1.memory(;right(Name,6)=="Garcia") |
|
3 |
=[176,213,324].(~.row(A2)) |
=A2.select(Gender=="F").derive() |
4 |
>A3(1).Gender="UNKNOWN" |
>B3.run(Gender="Female") |
5 |
>A2.delete(A3) |
>A2.update(B3) |
6 |
=B1.cursor(;right(Name,6)=="Garcia").fetch() |
|
为了查看内表更新的情况,使用分步执行上面的网格代码,执行到A2时,A2中获取的内表如下:
从A3中选出EID为24、78和226的记录如下:
B3从内表中选出女员工的数据,并用derive函数复制:
在A4中,修改A3的第一条记录:
修改后可以发现,内表A2中的数据也同时被修改了:
B4中修改了B3中的记录,此时由于B3中的序表是复制的,所以并不会影响原始内表。执行B4后,B3中数据如下:
执行A5后,B2的内表中,EID为176、213和324的3条记录都被删除了:
再执行B5,内表中的女员工数据都被修改,特别的,EID为176和213的员工记录又被添加到了内表中:
在A6中,重新从实表中取出数据,如下:
可以发现,内表生成之后,实际上就与实表本身没有关系了,内表的变化并不会影响到实表。