组表中的实表,和普通的序表类似,其中的记录是可以增删或修改的。我们通过下面的例子来了解如何修改实表中的记录:
|
A |
B |
1 |
=file("D:/file/dw/employees.ctx") |
|
2 |
=A1.create() |
=A2.attach(stable) |
3 |
=A2.cursor(;EID==3).fetch() |
=B2.cursor(EID,OCount,OAmount;EID<20).fetch() |
4 |
=A3.derive() |
=B3.derive() |
5 |
>A4.run(EID=0) |
>B4.run(OCount=0) |
6 |
=A2.update@n(A4) |
>B2.update(B4) |
7 |
=A2.cursor().fetch() |
=B2.cursor(;EID<20).fetch() |
在这里,打开组表的生成 中使用的组表employees.ctx,A2和B2中分别打开基表和附表stable。A4中取出编号为3的员工记录如下:
为了保留原始值以作对比,在A4中,将A3中数据复制,并在A5中改变了EID,A4中数据如下:
在A6中调用T.update(P) 函数,更新实表T,在这里添加了@n选项,能够返回有变化的记录,返回的就是A4中改变的记录。在A7中,重新从组表基表中取出数据如下:
执行T.update(P) 函数时,将会比较P与T的键值,更新对应的记录。可以发现,在改变了键值EID的情况下,原记录并没有被删除,而是具有新键值的记录被添加到实表中,新记录被添加到实表中时,主键仍然会保持有序。如果需要在更新时只处理更新,则可以添加@u选项,此时新的键值将被忽略。类似的,也可以添加@i选项,仅处理需要添加的记录。
再来看批量修改数据的情况,B4中取出EID小于20的所有销售员记录,注意为了保证更新时的结构统一,这里必须仅获取销售员实表stable本身的字段,结果如下:
在B5中将这些数据复制,并在B6中修改OCount字段的值,修改后结果如下:
在B6中,用B5中修改过的数据来更新实表stable。更新后,在B7中,重新在实表中取出EID小于20的销售人员记录,结果如下:
可以看到,实表中对应的数据被修改了。
如果需要删除记录,可以使用T.delete(P) 函数,如:
|
A |
B |
1 |
=file("D:/file/dw/employees.ctx") |
|
2 |
=A1.create() |
=A2.attach(stable) |
3 |
=A2.cursor().fetch() |
=B2.cursor().fetch() |
4 |
=A3.select(EID<1) |
=B3.select(EID<20) |
5 |
=A2.delete(A4) |
|
6 |
=A2.cursor().fetch() |
>B2.delete(B4) |
在A4中选出将要删除的记录:
A5中删除记录后,A6中读出实表中的数据如下:
在B4中选出了附表stable中EID小于20的记录,准备将它们全部删除:
B6中调用delete时,由于这些记录在组表中会被引用,删除会破坏组表结构,因此是无法执行的。
执行update或者delete时,如果实表有索引,将会自动更新。
组表读取完成后,可以用T.index()函数关闭。
在生成组表时,可以指定组表的读/写密码,在访问组表时也需要输入密码才有相应权限访问。如:
|
A |
B |
1 |
=create(Num,Accu) |
0 |
2 |
>100.run(A1.insert(0,#,B1=B1+#)) |
|
3 |
=file("D:/file/dw/numbers.ctx") |
=A3.create(#Num,Accu;;"wpwd":"rpwd") |
4 |
|
>B3.append(A1.cursor()) |
5 |
=A3.create(;;"wpwd") |
=A5.cursor().fetch() |
6 |
=create(Num,Accu).record([101,5151,102,5253]) |
|
7 |
>A5.append(A6.cursor()) |
=A5.cursor().fetch() |
前两行生成一个简单的数据表,包含正整数列以及累积和,执行后A1中得到数据如下:
在B3中生成组表时,用f.create(C1,C2,…;K;pw:pr) 函数指定了组表的读写密码,其中读文件密码为"rpwd",写文件密码为"wpwd",并在B4中将A1中的数据写入组表的基表。在A5中打开组表时,需要用f.create(;;p) 函数输入密码p来获得相应的权限。A5中输入了写密码,组表可以读也可以被改写。B5中从组表基表中获得的数据和A1相同,如下:
A6中再生成两条后续记录的数据如下:
注意在添加记录时,Accu字段的值会自动解析为整数,和前面计算时得到的长整数显示颜色不同。 A7中将上面的数据添加到组表的基表中,B7中获得结果如下:
如果A5中打开组表时,使用的是读密码rpwd,则只拥有只读权限,如果仍然在A7中尝试添加数据,会提示错误,说明无可写权限:
组表的密码是无法修改的,如果想修改或者去除密码,只能重新生成,如:
|
A |
B |
1 |
=file("D:/file/dw/numbers.ctx") |
|
2 |
=A1.create(;;"rpwd") |
=A2.cursor().fetch() |
3 |
=A1.create@y(#Num,Accu) |
>A3.append(B2.cursor()) |
4 |
=A1.create() |
=A4.cursor().fetch() |
A2中用读密码打开加密后的组表,并在B2中读出其基表中的数据。在A3中重新生成不带密码的新组表,这里添加了@y选项来强制重新创建组表文件。如果没有@y选项,当同名的组表文件已经存在时是不允许重建的,会中断计算并弹出错误信息。
在B3中将B2中的数据写入新组表的基表后,在A4中重新打开组表,此时已经不再需要密码了。B4中读取到的数据如下:
使用f.append(f', p) 函数,可以将一个无密码的组表文件f'中的数据,合并到加密组表文件f中,执行时需要写入f的可写密码p,注意两个组表文件的结构必须相同。如:
|
A |
B |
1 |
=file("D:/file/dw/numbersNew.ctx") |
=A1.create@y(#Num,Accu;;"wpwd":"rpwd") |
2 |
=create(Num,Accu).record([0,0]) |
>B1.append(A2.cursor()) |
3 |
=file("F:/file/dw/numbers.ctx") |
>A1.append(A3,"wpwd") |
4 |
=A1.create(;;"rpwd") |
=A4.cursor().fetch() |
第1行生成加密组表文件numbersNew.ctx,和前面例子中重新生成的无密码组表文件numbers.ctx结构相同。A2中生成了一条记录并在B2中填入组表numbersNew.ctx:
在B3中,将组表文件numbersNew.ctx中的数据添加到numbersNew.ctx中。从B4中可以查看到,执行后数据添加到了原数据的后面:
执行f.append(f', p) 时,如果添加了选项@x,将会在数据添加后删除原组表文件f'。